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.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         // change modal footer visibility
214         send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
215     }
216 
217     @Override
218     protected void customActionOnCancelCallback(final AjaxRequestTarget target) {
219         // change modal footer visibility
220         send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
221     }
222 
223     @Override
224     protected void customActionOnFinishCallback(final AjaxRequestTarget target) {
225         // change modal foter visibility
226         send(TypeExtensionDirectoryPanel.this, Broadcast.BUBBLE, new BaseModal.ChangeFooterVisibilityEvent(target));
227     }
228 }