View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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       * AuxClasses definition step.
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       * Mapping definition step.
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       * AccountLink specification step.
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      * The object type specification step.
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 }