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.lang.reflect.Field;
22 import java.lang.reflect.Modifier;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28 import org.apache.commons.lang3.StringUtils;
29 import org.apache.syncope.client.console.SyncopeConsoleSession;
30 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
31 import org.apache.syncope.client.console.commons.IdRepoConstants;
32 import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
33 import org.apache.syncope.client.console.pages.BasePage;
34 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
35 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.BooleanPropertyColumn;
36 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
37 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
38 import org.apache.syncope.client.ui.commons.Constants;
39 import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
40 import org.apache.syncope.client.ui.commons.wizards.AbstractModalPanelBuilder;
41 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
42 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
43 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
44 import org.apache.wicket.PageReference;
45 import org.apache.wicket.ajax.AjaxRequestTarget;
46 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
47 import org.apache.wicket.event.Broadcast;
48 import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
49 import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
50 import org.apache.wicket.model.CompoundPropertyModel;
51 import org.apache.wicket.model.IModel;
52 import org.apache.wicket.model.ResourceModel;
53
54 public class AnyTypeClassesPanel extends TypesDirectoryPanel<
55 AnyTypeClassTO, AnyTypeClassesPanel.AnyTypeClassProvider, AnyTypeClassRestClient> {
56
57 private static final long serialVersionUID = -2356760296223908382L;
58
59 public AnyTypeClassesPanel(final String id, final AnyTypeClassRestClient restClient, final PageReference pageRef) {
60 super(id, restClient, false, pageRef);
61 disableCheckBoxes();
62
63 this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<AnyTypeClassTO>(new AnyTypeClassTO(), pageRef) {
64
65 private static final long serialVersionUID = -6388405037134399367L;
66
67 @Override
68 public WizardModalPanel<AnyTypeClassTO> build(
69 final String id, final int index, final AjaxWizard.Mode mode) {
70 final AnyTypeClassTO modelObject = newModelObject();
71 return new AnyTypeClassModalPanel(modal, modelObject, pageRef) {
72
73 private static final long serialVersionUID = -6227956682141146095L;
74
75 @Override
76 public void onSubmit(final AjaxRequestTarget target) {
77 try {
78 if (getOriginalItem() == null || StringUtils.isBlank(getOriginalItem().getKey())) {
79 restClient.create(modelObject);
80 } else {
81 restClient.update(modelObject);
82 }
83
84 SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
85 AnyTypeClassesPanel.this.updateResultTable(target);
86 modal.close(target);
87 } catch (Exception e) {
88 LOG.error("While creating or updating AnyTypeClassTO", e);
89 SyncopeConsoleSession.get().onException(e);
90 }
91 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
92 }
93 };
94 }
95
96 }, true);
97
98 initResultTable();
99 MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, IdRepoEntitlement.ANYTYPE_CREATE);
100 }
101
102 @Override
103 protected AnyTypeClassesPanel.AnyTypeClassProvider dataProvider() {
104 return new AnyTypeClassProvider(rows);
105 }
106
107 @Override
108 protected String paginatorRowsKey() {
109 return IdRepoConstants.PREF_ANYTYPE_PAGINATOR_ROWS;
110 }
111
112 @Override
113 protected Collection<ActionLink.ActionType> getBatches() {
114 return List.of();
115 }
116
117 @Override
118 protected List<IColumn<AnyTypeClassTO, String>> getColumns() {
119 final List<IColumn<AnyTypeClassTO, String>> columns = new ArrayList<>();
120
121 for (Field field : AnyTypeClassTO.class.getDeclaredFields()) {
122 if (!field.isSynthetic() && !Modifier.isStatic(field.getModifiers())) {
123 final String fieldName = field.getName();
124 if (field.getType().isArray()
125 || Collection.class.isAssignableFrom(field.getType())
126 || Map.class.isAssignableFrom(field.getType())) {
127
128 columns.add(new PropertyColumn<>(
129 new ResourceModel(field.getName()), field.getName()));
130 } else if (field.getType().equals(boolean.class) || field.getType().equals(Boolean.class)) {
131 columns.add(new BooleanPropertyColumn<>(
132 new ResourceModel(field.getName()), field.getName(), field.getName()));
133 } else {
134 columns.add(new PropertyColumn<>(
135 new ResourceModel(field.getName()), field.getName(), field.getName()) {
136
137 private static final long serialVersionUID = -6902459669035442212L;
138
139 @Override
140 public String getCssClass() {
141 String css = super.getCssClass();
142 if (Constants.KEY_FIELD_NAME.equals(fieldName)) {
143 css = StringUtils.isBlank(css)
144 ? "col-xs-1"
145 : css + " col-xs-1";
146 }
147 return css;
148 }
149 });
150 }
151 }
152 }
153
154 return columns;
155 }
156
157 @Override
158 public ActionsPanel<AnyTypeClassTO> getActions(final IModel<AnyTypeClassTO> model) {
159 final ActionsPanel<AnyTypeClassTO> panel = super.getActions(model);
160
161 panel.add(new ActionLink<>() {
162
163 private static final long serialVersionUID = -3722207913631435501L;
164
165 @Override
166 public void onClick(final AjaxRequestTarget target, final AnyTypeClassTO ignore) {
167 send(AnyTypeClassesPanel.this, Broadcast.EXACT,
168 new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
169 }
170 }, ActionLink.ActionType.EDIT, IdRepoEntitlement.ANYTYPECLASS_UPDATE);
171
172 panel.add(new ActionLink<>() {
173
174 private static final long serialVersionUID = -3722207913631435501L;
175
176 @Override
177 public void onClick(final AjaxRequestTarget target, final AnyTypeClassTO ignore) {
178 try {
179 restClient.delete(model.getObject().getKey());
180
181 SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
182 target.add(container);
183 } catch (Exception e) {
184 LOG.error("While deleting {}", model.getObject(), e);
185 SyncopeConsoleSession.get().onException(e);
186 }
187 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
188 }
189 }, ActionLink.ActionType.DELETE, IdRepoEntitlement.ANYTYPECLASS_DELETE, true);
190
191 return panel;
192 }
193
194 protected final class AnyTypeClassProvider extends DirectoryDataProvider<AnyTypeClassTO> {
195
196 private static final long serialVersionUID = -185944053385660794L;
197
198 protected final SortableDataProviderComparator<AnyTypeClassTO> comparator;
199
200 protected AnyTypeClassProvider(final int paginatorRows) {
201 super(paginatorRows);
202 comparator = new SortableDataProviderComparator<>(this);
203 }
204
205 @Override
206 public Iterator<AnyTypeClassTO> iterator(final long first, final long count) {
207 List<AnyTypeClassTO> list = restClient.list();
208 list.sort(comparator);
209 return list.subList((int) first, (int) first + (int) count).iterator();
210 }
211
212 @Override
213 public long size() {
214 return restClient.list().size();
215 }
216
217 @Override
218 public IModel<AnyTypeClassTO> model(final AnyTypeClassTO object) {
219 return new CompoundPropertyModel<>(object);
220 }
221 }
222 }