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.resources;
20
21 import java.io.Serializable;
22 import java.util.List;
23 import java.util.stream.Collectors;
24 import org.apache.commons.lang3.StringUtils;
25 import org.apache.syncope.client.console.panels.ProvisionAuxClassesPanel;
26 import org.apache.syncope.client.console.rest.ConnectorRestClient;
27 import org.apache.syncope.client.console.wizards.BaseAjaxWizardBuilder;
28 import org.apache.syncope.client.console.wizards.mapping.ItemTransformersTogglePanel;
29 import org.apache.syncope.client.console.wizards.mapping.JEXLTransformersTogglePanel;
30 import org.apache.syncope.client.ui.commons.ConnIdSpecialName;
31 import org.apache.syncope.client.ui.commons.Constants;
32 import org.apache.syncope.client.ui.commons.ajax.form.IndicatorAjaxFormComponentUpdatingBehavior;
33 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxCheckBoxPanel;
34 import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
35 import org.apache.syncope.common.lib.to.Provision;
36 import org.apache.syncope.common.lib.to.ResourceTO;
37 import org.apache.syncope.common.lib.types.AnyTypeKind;
38 import org.apache.wicket.PageReference;
39 import org.apache.wicket.ajax.AjaxRequestTarget;
40 import org.apache.wicket.extensions.wizard.WizardModel;
41 import org.apache.wicket.extensions.wizard.WizardModel.ICondition;
42 import org.apache.wicket.extensions.wizard.WizardStep;
43 import org.apache.wicket.markup.html.WebMarkupContainer;
44 import org.apache.wicket.model.Model;
45 import org.apache.wicket.model.PropertyModel;
46 import org.apache.wicket.model.ResourceModel;
47 import org.apache.wicket.model.StringResourceModel;
48
49 public class ProvisionWizardBuilder extends BaseAjaxWizardBuilder<ResourceProvision> {
50
51 private static final long serialVersionUID = 3739399543837732640L;
52
53
54
55
56 protected static final class AuxClasses extends WizardStep implements ICondition {
57
58 private static final long serialVersionUID = 5315236191866427500L;
59
60 protected final ResourceProvision provision;
61
62 AuxClasses(final ResourceProvision resourceProvision) {
63 this.provision = resourceProvision;
64
65 setTitleModel(new ResourceModel("auxClasses.title"));
66 setSummaryModel(new StringResourceModel("auxClasses.summary", this, new Model<>(resourceProvision)));
67 add(new ProvisionAuxClassesPanel("auxClasses", resourceProvision.getProvisionTO()));
68 }
69
70 @Override
71 public boolean evaluate() {
72 return provision.getProvisionTO() != null;
73 }
74 }
75
76
77
78
79 protected static final class Mapping extends WizardStep {
80
81 private static final long serialVersionUID = 3454904947720856253L;
82
83 Mapping() {
84 setTitleModel(Model.of("Mapping"));
85 setSummaryModel(Model.of(StringUtils.EMPTY));
86 }
87 }
88
89
90
91
92 protected static final class ConnObjectLink extends WizardStep {
93
94 private static final long serialVersionUID = 2359955465172450478L;
95
96 ConnObjectLink(final ResourceProvision resourceProvision) {
97 super(new ResourceModel("link.title", StringUtils.EMPTY),
98 new ResourceModel("link.summary", StringUtils.EMPTY));
99
100 WebMarkupContainer connObjectLinkContainer = new WebMarkupContainer("connObjectLinkContainer");
101 connObjectLinkContainer.setOutputMarkupId(true);
102 add(connObjectLinkContainer);
103
104 boolean connObjectLinkEnabled = false;
105 if (StringUtils.isNotBlank(resourceProvision.getConnObjectLink())) {
106 connObjectLinkEnabled = true;
107 }
108
109 final AjaxCheckBoxPanel connObjectLinkCheckbox = new AjaxCheckBoxPanel(
110 "connObjectLinkCheckbox",
111 new ResourceModel("connObjectLinkCheckbox", "connObjectLinkCheckbox").getObject(),
112 new Model<>(connObjectLinkEnabled),
113 false);
114 connObjectLinkCheckbox.setEnabled(true);
115
116 connObjectLinkContainer.add(connObjectLinkCheckbox);
117
118 final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel(
119 "connObjectLink",
120 new ResourceModel("connObjectLink", "connObjectLink").getObject(),
121 new PropertyModel<>(resourceProvision, "connObjectLink"),
122 false);
123 connObjectLink.enableJexlHelp();
124 connObjectLink.setEnabled(connObjectLinkEnabled);
125 connObjectLinkContainer.add(connObjectLink);
126
127 connObjectLinkCheckbox.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
128
129 private static final long serialVersionUID = -1107858522700306810L;
130
131 @Override
132 protected void onUpdate(final AjaxRequestTarget target) {
133 connObjectLink.setEnabled(connObjectLinkCheckbox.getModelObject());
134 connObjectLink.setModelObject("");
135
136 target.add(connObjectLink);
137 }
138 });
139 }
140 }
141
142
143
144
145 protected final class ObjectType extends WizardStep {
146
147 private static final long serialVersionUID = -1657800545799468278L;
148
149 ObjectType(final ResourceProvision resourceProvision) {
150 super(new ResourceModel("clazz.title", StringUtils.EMPTY),
151 new ResourceModel("clazz.summary", StringUtils.EMPTY), new Model<>(resourceProvision));
152
153 WebMarkupContainer container = new WebMarkupContainer("container");
154 container.setOutputMarkupId(true);
155 add(container);
156
157 clazz = new AjaxTextFieldPanel(
158 "clazz", "clazz", new PropertyModel<>(resourceProvision, "objectClass"));
159 clazz.setRequired(true);
160 clazz.setChoices(connectorRestClient.getObjectClasses(resourceTO.getConnector()));
161 container.add(clazz);
162
163 AjaxCheckBoxPanel ignoreCaseMatch = new AjaxCheckBoxPanel(
164 "ignoreCaseMatch", "ignoreCaseMatch", new PropertyModel<>(resourceProvision, "ignoreCaseMatch"));
165 container.add(ignoreCaseMatch);
166 }
167 }
168
169 protected final ResourceTO resourceTO;
170
171 protected final String adminRealm;
172
173 protected AjaxTextFieldPanel clazz;
174
175 protected final ConnectorRestClient connectorRestClient;
176
177 public ProvisionWizardBuilder(
178 final ResourceTO resourceTO,
179 final String adminRealm,
180 final ConnectorRestClient connectorRestClient,
181 final PageReference pageRef) {
182
183 super(new ResourceProvision(), pageRef);
184
185 this.resourceTO = resourceTO;
186 this.adminRealm = adminRealm;
187 this.connectorRestClient = connectorRestClient;
188 }
189
190 protected void setObjectClassModelObject(final String type) {
191 if (clazz != null) {
192 if (AnyTypeKind.USER.name().equals(type)) {
193 clazz.setModelObject(ConnIdSpecialName.ACCOUNT);
194 } else if (AnyTypeKind.GROUP.name().equals(type)) {
195 clazz.setModelObject(ConnIdSpecialName.GROUP);
196 } else {
197 clazz.setModelObject("");
198 }
199 }
200 }
201
202 @Override
203 protected WizardModel buildModelSteps(final ResourceProvision resourceProvision, final WizardModel wizardModel) {
204 wizardModel.add(new ObjectType(resourceProvision));
205 wizardModel.add(new AuxClasses(resourceProvision));
206
207 Mapping mapping = new Mapping();
208 mapping.setOutputMarkupId(true);
209
210 ItemTransformersTogglePanel itemTransformers = new ItemTransformersTogglePanel(mapping, pageRef);
211 addOuterObject(itemTransformers);
212 JEXLTransformersTogglePanel jexlTransformers = new JEXLTransformersTogglePanel(mapping, pageRef);
213 addOuterObject(jexlTransformers);
214 if (resourceProvision.getProvisionTO() != null && resourceProvision.getProvisionTO().getMapping() == null) {
215 resourceProvision.getProvisionTO().setMapping(new org.apache.syncope.common.lib.to.Mapping());
216 }
217 mapping.add(new ResourceMappingPanel(
218 "mapping", resourceTO, adminRealm, resourceProvision, itemTransformers, jexlTransformers));
219
220 wizardModel.add(mapping);
221
222 wizardModel.add(new ConnObjectLink(resourceProvision));
223 return wizardModel;
224 }
225
226 @Override
227 protected Serializable onApplyInternal(final ResourceProvision resourceProvision) {
228 if (resourceProvision.getOrgUnitTO() != null) {
229 this.resourceTO.setOrgUnit(resourceProvision.getOrgUnitTO());
230
231 this.resourceTO.getOrgUnit().getItems().clear();
232 this.resourceTO.getOrgUnit().getItems().addAll(resourceProvision.getItems());
233 } else if (resourceProvision.getProvisionTO() != null) {
234 final List<Provision> provisions;
235 if (resourceProvision.getKey() == null) {
236 provisions = this.resourceTO.getProvisions().stream().
237 filter(object -> !resourceProvision.getAnyType().equals(object.getAnyType())).
238 collect(Collectors.toList());
239 } else {
240 provisions = this.resourceTO.getProvisions().stream().
241 filter(object -> !resourceProvision.getKey().equals(object.getObjectClass())).
242 collect(Collectors.toList());
243 }
244
245 Provision provisionTO = resourceProvision.getProvisionTO();
246 provisionTO.getMapping().getItems().clear();
247 provisionTO.getMapping().getItems().addAll(resourceProvision.getItems());
248 provisions.add(provisionTO);
249
250 this.resourceTO.getProvisions().clear();
251 this.resourceTO.getProvisions().addAll(provisions);
252 }
253
254 return resourceProvision;
255 }
256 }