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.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 }