1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.client.console.wizards.any;
20
21 import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.stream.Collectors;
27 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
28 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
29 import org.apache.syncope.client.console.panels.DirectoryPanel;
30 import org.apache.syncope.client.console.rest.ResourceRestClient;
31 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
32 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
33 import org.apache.syncope.client.console.wizards.any.MergeLinkedAccountsReviewPanel.LinkedAccountsReviewDirectoryPanel.LinkedAccountsDataProvider;
34 import org.apache.syncope.client.ui.commons.Constants;
35 import org.apache.syncope.common.lib.to.LinkedAccountTO;
36 import org.apache.syncope.common.lib.to.UserTO;
37 import org.apache.wicket.PageReference;
38 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
39 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
40 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
41 import org.apache.wicket.extensions.wizard.WizardStep;
42 import org.apache.wicket.model.CompoundPropertyModel;
43 import org.apache.wicket.model.IModel;
44 import org.apache.wicket.model.ResourceModel;
45 import org.apache.wicket.model.StringResourceModel;
46 import org.apache.wicket.spring.injection.annot.SpringBean;
47
48 public class MergeLinkedAccountsReviewPanel extends WizardStep {
49
50 private static final long serialVersionUID = 1221037007528732347L;
51
52 @SpringBean
53 protected ResourceRestClient resourceRestClient;
54
55 public MergeLinkedAccountsReviewPanel(
56 final MergeLinkedAccountsWizardModel wizardModel,
57 final PageReference pageRef) {
58
59 super();
60 setOutputMarkupId(true);
61 setTitleModel(new StringResourceModel("mergeLinkedAccounts.reviewAccounts.title"));
62 add(new LinkedAccountsReviewDirectoryPanel("linkedAccounts", resourceRestClient, pageRef, wizardModel));
63 }
64
65 protected static class LinkedAccountsReviewDirectoryPanel extends
66 DirectoryPanel<LinkedAccountTO, LinkedAccountTO, LinkedAccountsDataProvider, ResourceRestClient> {
67
68 private static final String PAGINATOR_ROWS = "linked.account.review.paginator.rows";
69
70 private static final long serialVersionUID = 6005711052393825472L;
71
72 private final MergeLinkedAccountsWizardModel wizardModel;
73
74 LinkedAccountsReviewDirectoryPanel(
75 final String id,
76 final ResourceRestClient restClient,
77 final PageReference pageRef,
78 final MergeLinkedAccountsWizardModel wizardModel) {
79
80 super(id, restClient, pageRef, true);
81 this.wizardModel = wizardModel;
82 modal.size(Modal.Size.Large);
83 setOutputMarkupId(true);
84 disableCheckBoxes();
85 initResultTable();
86 }
87
88 @Override
89 protected LinkedAccountsDataProvider dataProvider() {
90 return new LinkedAccountsDataProvider(this.rows);
91 }
92
93 @Override
94 protected String paginatorRowsKey() {
95 return PAGINATOR_ROWS;
96 }
97
98 @Override
99 protected List<IColumn<LinkedAccountTO, String>> getColumns() {
100 List<IColumn<LinkedAccountTO, String>> columns = new ArrayList<>();
101 columns.add(new PropertyColumn<>(new ResourceModel("resource"), "resource", "resource"));
102 columns.add(new PropertyColumn<>(
103 new ResourceModel("connObjectKeyValue"), "connObjectKeyValue", "connObjectKeyValue"));
104 columns.add(new PropertyColumn<>(
105 new ResourceModel(Constants.USERNAME_FIELD_NAME),
106 Constants.USERNAME_FIELD_NAME, Constants.USERNAME_FIELD_NAME));
107 columns.add(new BooleanPropertyColumn<>(
108 new ResourceModel("suspended"), "suspended", "suspended"));
109 return columns;
110 }
111
112 @Override
113 protected Collection<ActionLink.ActionType> getBatches() {
114 return List.of();
115 }
116
117 protected List<LinkedAccountTO> previewAccounts() {
118 UserTO mergingUser = wizardModel.getMergingUser();
119
120
121 List<LinkedAccountTO> accounts = mergingUser.getLinkedAccounts().stream().map(acct -> {
122 LinkedAccountTO linkedAccount =
123 new LinkedAccountTO.Builder(acct.getResource(), acct.getConnObjectKeyValue())
124 .password(acct.getPassword())
125 .suspended(acct.isSuspended())
126 .username(acct.getUsername())
127 .build();
128 linkedAccount.getPlainAttrs().addAll(acct.getPlainAttrs());
129 linkedAccount.getPrivileges().addAll(acct.getPrivileges());
130 return linkedAccount;
131 }).collect(Collectors.toList());
132
133
134 accounts.addAll(mergingUser.getResources().stream().map(resource -> {
135 String connObjectKeyValue = restClient.getConnObjectKeyValue(resource,
136 mergingUser.getType(), mergingUser.getKey());
137 return new LinkedAccountTO.Builder(resource, connObjectKeyValue).build();
138 }).collect(Collectors.toList()));
139
140
141 String connObjectKeyValue = restClient.getConnObjectKeyValue(
142 wizardModel.getResource().getKey(),
143 mergingUser.getType(), mergingUser.getKey());
144 LinkedAccountTO linkedAccount =
145 new LinkedAccountTO.Builder(wizardModel.getResource().getKey(), connObjectKeyValue)
146 .password(mergingUser.getPassword())
147 .suspended(mergingUser.isSuspended())
148 .username(mergingUser.getUsername())
149 .build();
150 linkedAccount.getPlainAttrs().addAll(mergingUser.getPlainAttrs());
151 linkedAccount.getPrivileges().addAll(mergingUser.getPrivileges());
152 accounts.add(linkedAccount);
153
154 return accounts;
155 }
156
157 protected final class LinkedAccountsDataProvider extends DirectoryDataProvider<LinkedAccountTO> {
158
159 private static final long serialVersionUID = -185944053385660794L;
160
161 private final SortableDataProviderComparator<LinkedAccountTO> comparator;
162
163 private LinkedAccountsDataProvider(final int paginatorRows) {
164 super(paginatorRows);
165 setSort("resource", SortOrder.ASCENDING);
166 comparator = new SortableDataProviderComparator<>(this);
167 }
168
169 @Override
170 public Iterator<LinkedAccountTO> iterator(final long first, final long count) {
171 List<LinkedAccountTO> list = previewAccounts();
172 list.sort(comparator);
173 return list.subList((int) first, (int) first + (int) count).iterator();
174 }
175
176 @Override
177 public long size() {
178 return previewAccounts().size();
179 }
180
181 @Override
182 public IModel<LinkedAccountTO> model(final LinkedAccountTO object) {
183 return new CompoundPropertyModel<>(object);
184 }
185 }
186 }
187 }