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.role;
20  
21  import java.io.Serializable;
22  import java.util.ArrayList;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.stream.Collectors;
26  import org.apache.commons.lang3.StringUtils;
27  import org.apache.syncope.client.console.SyncopeWebApplication;
28  import org.apache.syncope.client.console.commons.RealmsUtils;
29  import org.apache.syncope.client.console.panels.search.UserSearchPanel;
30  import org.apache.syncope.client.console.rest.ApplicationRestClient;
31  import org.apache.syncope.client.console.rest.DynRealmRestClient;
32  import org.apache.syncope.client.console.rest.RealmRestClient;
33  import org.apache.syncope.client.console.rest.RoleRestClient;
34  import org.apache.syncope.client.console.wicket.markup.html.form.AjaxSearchFieldPanel;
35  import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
36  import org.apache.syncope.client.console.wizards.BaseAjaxWizardBuilder;
37  import org.apache.syncope.client.ui.commons.Constants;
38  import org.apache.syncope.client.ui.commons.markup.html.form.AbstractFieldPanel;
39  import org.apache.syncope.client.ui.commons.markup.html.form.AjaxPalettePanel;
40  import org.apache.syncope.client.ui.commons.markup.html.form.AjaxTextFieldPanel;
41  import org.apache.syncope.client.ui.commons.markup.html.form.FieldPanel;
42  import org.apache.syncope.client.ui.commons.wicket.markup.html.bootstrap.tabs.Accordion;
43  import org.apache.syncope.client.ui.commons.wizards.AjaxWizardBuilder;
44  import org.apache.syncope.common.lib.to.DynRealmTO;
45  import org.apache.syncope.common.lib.to.PrivilegeTO;
46  import org.apache.syncope.common.lib.to.RealmTO;
47  import org.apache.syncope.common.lib.to.RoleTO;
48  import org.apache.wicket.PageReference;
49  import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
50  import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
51  import org.apache.wicket.extensions.wizard.WizardModel;
52  import org.apache.wicket.extensions.wizard.WizardStep;
53  import org.apache.wicket.markup.html.panel.Panel;
54  import org.apache.wicket.model.Model;
55  import org.apache.wicket.model.PropertyModel;
56  import org.apache.wicket.model.ResourceModel;
57  import org.apache.wicket.model.util.ListModel;
58  
59  public class RoleWizardBuilder extends BaseAjaxWizardBuilder<RoleWrapper> {
60  
61      private static final long serialVersionUID = 5945391813567245081L;
62  
63      protected final RoleRestClient roleRestClient;
64  
65      protected final RealmRestClient realmRestClient;
66  
67      protected final DynRealmRestClient dynRealmRestClient;
68  
69      protected final ApplicationRestClient applicationRestClient;
70  
71      public RoleWizardBuilder(
72              final RoleTO roleTO,
73              final RoleRestClient roleRestClient,
74              final RealmRestClient realmRestClient,
75              final DynRealmRestClient dynRealmRestClient,
76              final ApplicationRestClient applicationRestClient,
77              final PageReference pageRef) {
78  
79          super(new RoleWrapper(roleTO), pageRef);
80  
81          this.roleRestClient = roleRestClient;
82          this.realmRestClient = realmRestClient;
83          this.dynRealmRestClient = dynRealmRestClient;
84          this.applicationRestClient = applicationRestClient;
85      }
86  
87      /**
88       * This method has been overridden to manage asynchronous translation of FIQL string to search classes list and
89       * viceversa.
90       *
91       * @param item wizard backend item.
92       * @return the current builder.
93       */
94      @Override
95      public AjaxWizardBuilder<RoleWrapper> setItem(final RoleWrapper item) {
96          return (AjaxWizardBuilder<RoleWrapper>) (item != null
97                  ? super.setItem(new RoleWrapper(item.getInnerObject()))
98                  : super.setItem(null));
99      }
100 
101     @Override
102     protected Serializable onApplyInternal(final RoleWrapper modelObject) {
103         modelObject.fillDynamicConditions();
104         if (getOriginalItem() == null || getOriginalItem().getInnerObject() == null
105                 || StringUtils.isBlank(getOriginalItem().getInnerObject().getKey())) {
106             roleRestClient.create(modelObject.getInnerObject());
107         } else {
108             roleRestClient.update(modelObject.getInnerObject());
109         }
110         return null;
111     }
112 
113     @Override
114     protected WizardModel buildModelSteps(final RoleWrapper modelObject, final WizardModel wizardModel) {
115         wizardModel.add(new Details(modelObject));
116         wizardModel.add(new Entitlements(modelObject.getInnerObject()));
117         wizardModel.add(new Realms(modelObject.getInnerObject()));
118         wizardModel.add(new DynRealms(modelObject.getInnerObject()));
119         wizardModel.add(new Privileges(modelObject.getInnerObject()));
120         return wizardModel;
121     }
122 
123     protected class Details extends WizardStep {
124 
125         private static final long serialVersionUID = 5514523040031722255L;
126 
127         public Details(final RoleWrapper modelObject) {
128             add(new AjaxTextFieldPanel(
129                     Constants.KEY_FIELD_NAME,
130                     Constants.KEY_FIELD_NAME,
131                     new PropertyModel<>(modelObject.getInnerObject(), Constants.KEY_FIELD_NAME), false).
132                     setEnabled(StringUtils.isEmpty(modelObject.getInnerObject().getKey())));
133 
134             // ------------------------
135             // dynMembershipCond
136             // ------------------------
137             add(new Accordion("dynMembershipCond", List.of(
138                     new AbstractTab(new ResourceModel("dynMembershipCond", "Dynamic USER Membership Conditions")) {
139 
140                 private static final long serialVersionUID = 1037272333056449378L;
141 
142                 @Override
143                 public Panel getPanel(final String panelId) {
144                     return new UserSearchPanel.Builder(
145                             new PropertyModel<>(modelObject, "dynClauses"), pageRef).
146                             required(true).build(panelId);
147                 }
148             }), Model.of(StringUtils.isBlank(modelObject.getDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
149             // ------------------------
150         }
151     }
152 
153     protected class Entitlements extends WizardStep {
154 
155         private static final long serialVersionUID = 5514523040031722256L;
156 
157         public Entitlements(final RoleTO modelObject) {
158             setTitleModel(new ResourceModel("entitlements"));
159             add(new AjaxPalettePanel.Builder<String>().build("entitlements",
160                     new PropertyModel<>(modelObject, "entitlements") {
161 
162                 private static final long serialVersionUID = -7809699384012595307L;
163 
164                 @Override
165                 public List<String> getObject() {
166                     return new ArrayList<>(modelObject.getEntitlements());
167                 }
168 
169                 @Override
170                 public void setObject(final List<String> object) {
171                     modelObject.getEntitlements().clear();
172                     modelObject.getEntitlements().addAll(object);
173                 }
174             }, new ListModel<>(roleRestClient.getAllAvailableEntitlements())).
175                     hideLabel().setOutputMarkupId(true));
176         }
177     }
178 
179     protected class Realms extends WizardStep {
180 
181         private static final long serialVersionUID = 5514523040031722257L;
182 
183         @SuppressWarnings("unchecked")
184         public Realms(final RoleTO modelObject) {
185             setTitleModel(new ResourceModel("realms"));
186 
187             boolean fullRealmsTree = SyncopeWebApplication.get().fullRealmsTree(realmRestClient);
188             AutoCompleteSettings settings = new AutoCompleteSettings();
189             settings.setShowCompleteListOnFocusGain(fullRealmsTree);
190             settings.setShowListOnEmptyInput(fullRealmsTree);
191             AbstractFieldPanel<?> realm = new AjaxSearchFieldPanel(
192                     "panel", "realm", new Model<>(), settings) {
193 
194                 private static final long serialVersionUID = -6390474600233486704L;
195 
196                 @Override
197                 protected Iterator<String> getChoices(final String input) {
198                     return realmRestClient.search(fullRealmsTree
199                             ? RealmsUtils.buildRootQuery()
200                             : RealmsUtils.buildKeywordQuery(input)).getResult().stream().
201                             map(RealmTO::getFullPath).collect(Collectors.toList()).iterator();
202                 }
203             };
204             add(new MultiFieldPanel.Builder<>(
205                     new PropertyModel<>(modelObject, "realms")).build(
206                     "realms",
207                     "realms",
208                     (FieldPanel) realm).hideLabel());
209         }
210     }
211 
212     protected class DynRealms extends WizardStep {
213 
214         private static final long serialVersionUID = 6846234574424462255L;
215 
216         public DynRealms(final RoleTO modelObject) {
217             setTitleModel(new ResourceModel("dynRealms"));
218             add(new AjaxPalettePanel.Builder<>().build("dynRealms",
219                     new PropertyModel<>(modelObject, "dynRealms"),
220                     new ListModel<>(dynRealmRestClient.list().stream().
221                             map(DynRealmTO::getKey).collect(Collectors.toList()))).
222                     hideLabel().setOutputMarkupId(true));
223         }
224     }
225 
226     protected class Privileges extends WizardStep {
227 
228         private static final long serialVersionUID = 6896014330702958579L;
229 
230         public Privileges(final RoleTO modelObject) {
231             setTitleModel(new ResourceModel("privileges"));
232             add(new AjaxPalettePanel.Builder<>().build("privileges",
233                     new PropertyModel<>(modelObject, "privileges"),
234                     new ListModel<>(applicationRestClient.list().stream().
235                             flatMap(application -> application.getPrivileges().stream()).
236                             map(PrivilegeTO::getKey).collect(Collectors.toList()))).
237                     hideLabel().setOutputMarkupId(true));
238         }
239     }
240 }