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.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
89
90
91
92
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
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 }