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.panels;
20
21 import java.io.Serializable;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26 import org.apache.commons.lang3.StringUtils;
27 import org.apache.syncope.client.console.SyncopeConsoleSession;
28 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
29 import org.apache.syncope.client.console.commons.IdRepoConstants;
30 import org.apache.syncope.client.console.pages.BasePage;
31 import org.apache.syncope.client.console.panels.TypeExtensionDirectoryPanel.TypeExtensionDataProvider;
32 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
33 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
34 import org.apache.syncope.client.console.rest.BaseRestClient;
35 import org.apache.syncope.client.console.rest.GroupRestClient;
36 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
37 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
38 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
39 import org.apache.syncope.client.console.wizards.any.TypeExtensionWizardBuilder;
40 import org.apache.syncope.client.ui.commons.Constants;
41 import org.apache.syncope.client.ui.commons.panels.SubmitableModalPanel;
42 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
43 import org.apache.syncope.common.lib.request.GroupUR;
44 import org.apache.syncope.common.lib.to.GroupTO;
45 import org.apache.syncope.common.lib.to.TypeExtensionTO;
46 import org.apache.wicket.PageReference;
47 import org.apache.wicket.ajax.AjaxRequestTarget;
48 import org.apache.wicket.event.Broadcast;
49 import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
50 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
51 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
52 import org.apache.wicket.model.CompoundPropertyModel;
53 import org.apache.wicket.model.IModel;
54 import org.apache.wicket.model.Model;
55 import org.apache.wicket.model.StringResourceModel;
56 import org.apache.wicket.spring.injection.annot.SpringBean;
57
58 public class TypeExtensionDirectoryPanel
59 extends DirectoryPanel<TypeExtensionTO, TypeExtensionTO, TypeExtensionDataProvider, BaseRestClient>
60 implements SubmitableModalPanel {
61
62 private static final long serialVersionUID = -4117015319209624858L;
63
64 @SpringBean
65 protected GroupRestClient groupRestClient;
66
67 @SpringBean
68 protected AnyTypeRestClient anyTypeRestClient;
69
70 @SpringBean
71 protected AnyTypeClassRestClient anyTypeClassRestClient;
72
73 protected final BaseModal<Serializable> baseModal;
74
75 protected final GroupTO groupTO;
76
77 protected TypeExtensionDirectoryPanel(
78 final BaseModal<Serializable> baseModal,
79 final GroupTO groupTO,
80 final PageReference pageRef) {
81
82 super(BaseModal.CONTENT_ID, null, pageRef, false);
83
84 this.baseModal = baseModal;
85 this.groupTO = groupTO;
86
87 TypeExtensionWizardBuilder builder = new TypeExtensionWizardBuilder(
88 groupTO,
89 new TypeExtensionTO(),
90 new StringResourceModel("anyType", this).getObject(),
91 new StringResourceModel("auxClasses", this).getObject(),
92 anyTypeRestClient,
93 anyTypeClassRestClient,
94 pageRef);
95 this.addNewItemPanelBuilder(builder, true);
96
97 setShowResultPanel(false);
98 initResultTable();
99 }
100
101 @Override
102 public void onSubmit(final AjaxRequestTarget target) {
103 GroupUR req = new GroupUR();
104 req.setKey(groupTO.getKey());
105 req.getTypeExtensions().addAll(groupTO.getTypeExtensions());
106
107 try {
108 groupRestClient.update(groupTO.getETagValue(), req);
109
110 this.baseModal.show(false);
111 this.baseModal.close(target);
112
113 SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
114 } catch (Exception e) {
115 LOG.error("Group update failure", e);
116 SyncopeConsoleSession.get().onException(e);
117 }
118 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
119 }
120
121 @Override
122 public void onError(final AjaxRequestTarget target) {
123 SyncopeConsoleSession.get().error(getString(Constants.OPERATION_ERROR));
124 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
125 }
126
127 @Override
128 protected TypeExtensionDataProvider dataProvider() {
129 return new TypeExtensionDataProvider(rows);
130 }
131
132 @Override
133 protected String paginatorRowsKey() {
134 return IdRepoConstants.PREF_TYPE_EXTENSIONS_PAGINATOR_ROWS;
135 }
136
137 @Override
138 protected List<IColumn<TypeExtensionTO, String>> getColumns() {
139 List<IColumn<TypeExtensionTO, String>> columns = new ArrayList<>();
140
141 columns.add(new PropertyColumn<>(
142 Model.of("Any Type"), "anyType", "anyType"));
143 columns.add(new PropertyColumn<>(
144 new StringResourceModel("auxClasses", this), "auxClasses", "auxClasses"));
145
146 return columns;
147 }
148
149 @Override
150 public ActionsPanel<TypeExtensionTO> getActions(final IModel<TypeExtensionTO> model) {
151 final ActionsPanel<TypeExtensionTO> panel = super.getActions(model);
152 final TypeExtensionTO typeExtension = model.getObject();
153
154 panel.add(new ActionLink<>() {
155
156 private static final long serialVersionUID = -3722207913631435501L;
157
158 @Override
159 public void onClick(final AjaxRequestTarget target, final TypeExtensionTO ignore) {
160 send(TypeExtensionDirectoryPanel.this, Broadcast.EXACT,
161 new AjaxWizard.EditItemActionEvent<>(typeExtension, target));
162 }
163 }, ActionLink.ActionType.EDIT, StringUtils.EMPTY);
164 panel.add(new ActionLink<>() {
165
166 private static final long serialVersionUID = -3722207913631435501L;
167
168 @Override
169 public void onClick(final AjaxRequestTarget target, final TypeExtensionTO ignore) {
170 groupTO.getTypeExtension(typeExtension.getAnyType()).ifPresent(typeExt -> {
171 groupTO.getTypeExtensions().remove(typeExt);
172 target.add(container);
173 });
174 }
175 }, ActionLink.ActionType.DELETE, StringUtils.EMPTY, true);
176 return panel;
177 }
178
179 @Override
180 protected Collection<ActionLink.ActionType> getBatches() {
181 return List.of();
182 }
183
184 protected class TypeExtensionDataProvider extends DirectoryDataProvider<TypeExtensionTO> {
185
186 private static final long serialVersionUID = 4533123471004692755L;
187
188 public TypeExtensionDataProvider(final int paginatorRows) {
189 super(paginatorRows);
190
191 setSort("anyType", SortOrder.ASCENDING);
192 }
193
194 @Override
195 public Iterator<? extends TypeExtensionTO> iterator(final long first, final long count) {
196 return groupTO.getTypeExtensions().subList((int) first, (int) (first + count)).iterator();
197 }
198
199 @Override
200 public long size() {
201 return groupTO.getTypeExtensions().size();
202 }
203
204 @Override
205 public IModel<TypeExtensionTO> model(final TypeExtensionTO object) {
206 return new CompoundPropertyModel<>(object);
207 }
208
209 }
210
211 @Override
212 protected void customActionCallback(final AjaxRequestTarget target) {
213
214 send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
215 }
216
217 @Override
218 protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
219
220 send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
221 }
222
223 @Override
224 protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
225
226 send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
227 }
228 }