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 de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
22  import java.util.ArrayList;
23  import java.util.Collection;
24  import java.util.Iterator;
25  import java.util.List;
26  import java.util.stream.Collectors;
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.commons.SortableDataProviderComparator;
31  import org.apache.syncope.client.console.panels.ParametersDirectoryPanel.ParametersProvider;
32  import org.apache.syncope.client.console.rest.SyncopeRestClient;
33  import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
34  import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
35  import org.apache.syncope.client.console.wizards.WizardMgtPanel;
36  import org.apache.syncope.client.ui.commons.Constants;
37  import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
38  import org.apache.syncope.client.ui.commons.panels.WizardModalPanel;
39  import org.apache.syncope.client.ui.commons.wizards.AbstractModalPanelBuilder;
40  import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
41  import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
42  import org.apache.wicket.AttributeModifier;
43  import org.apache.wicket.PageReference;
44  import org.apache.wicket.ajax.AjaxRequestTarget;
45  import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
46  import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
47  import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
48  import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
49  import org.apache.wicket.markup.html.basic.Label;
50  import org.apache.wicket.markup.repeater.Item;
51  import org.apache.wicket.model.CompoundPropertyModel;
52  import org.apache.wicket.model.IModel;
53  import org.apache.wicket.model.ResourceModel;
54  import org.apache.wicket.model.StringResourceModel;
55  import org.apache.wicket.spring.injection.annot.SpringBean;
56  
57  public class ParametersDirectoryPanel
58          extends DirectoryPanel<ConfParam, ConfParam, ParametersProvider, SyncopeRestClient> {
59  
60      private static final long serialVersionUID = 2765863608539154422L;
61  
62      @SpringBean
63      protected ConfParamOps confParamOps;
64  
65      public ParametersDirectoryPanel(final String id, final SyncopeRestClient restClient, final PageReference pageRef) {
66          super(id, new Builder<>(restClient, pageRef) {
67  
68              private static final long serialVersionUID = 8769126634538601689L;
69  
70              @Override
71              protected WizardMgtPanel<ConfParam> newInstance(final String id, final boolean wizardInModal) {
72                  throw new UnsupportedOperationException();
73              }
74          });
75  
76          itemKeyFieldName = "schema";
77          disableCheckBoxes();
78  
79          this.addNewItemPanelBuilder(new AbstractModalPanelBuilder<ConfParam>(new ConfParam(), pageRef) {
80  
81              private static final long serialVersionUID = 1995192603527154740L;
82  
83              @Override
84              public WizardModalPanel<ConfParam> build(final String id, final int index, final AjaxWizard.Mode mode) {
85                  return new ParametersModalPanel(modal, newModelObject(), confParamOps, mode, pageRef);
86              }
87          }, true);
88          modal.size(Modal.Size.Default);
89          initResultTable();
90      }
91  
92      public ParametersDirectoryPanel(final String id, final Builder<ConfParam, ConfParam, SyncopeRestClient> builder) {
93          super(id, builder);
94      }
95  
96      @Override
97      protected ParametersProvider dataProvider() {
98          return new ParametersProvider(rows);
99      }
100 
101     @Override
102     protected String paginatorRowsKey() {
103         return IdRepoConstants.PREF_PARAMETERS_PAGINATOR_ROWS;
104     }
105 
106     @Override
107     protected Collection<ActionLink.ActionType> getBatches() {
108         return List.of();
109     }
110 
111     @Override
112     protected List<IColumn<ConfParam, String>> getColumns() {
113         final List<IColumn<ConfParam, String>> columns = new ArrayList<>();
114         columns.add(new PropertyColumn<>(new ResourceModel("schema"), "schema"));
115         columns.add(new PropertyColumn<>(new ResourceModel("values"), "values") {
116 
117             private static final long serialVersionUID = -1822504503325964706L;
118 
119             @Override
120             public void populateItem(
121                     final Item<ICellPopulator<ConfParam>> item,
122                     final String componentId,
123                     final IModel<ConfParam> rowModel) {
124 
125                 if (rowModel.getObject().getValues().toString().length() > 96) {
126                     item.add(new Label(componentId, getString("tooLong")).
127                             add(new AttributeModifier("style", "font-style:italic")));
128                 } else {
129                     super.populateItem(item, componentId, rowModel);
130                 }
131             }
132         });
133         return columns;
134     }
135 
136     @Override
137     public ActionsPanel<ConfParam> getActions(final IModel<ConfParam> model) {
138         final ActionsPanel<ConfParam> panel = super.getActions(model);
139 
140         panel.add(new ActionLink<>() {
141 
142             private static final long serialVersionUID = -3722207913631435501L;
143 
144             @Override
145             public void onClick(final AjaxRequestTarget target, final ConfParam ignore) {
146                 target.add(modal);
147                 modal.header(new StringResourceModel("any.edit"));
148                 modal.setContent(new ParametersModalPanel(
149                         modal, model.getObject(), confParamOps, AjaxWizard.Mode.EDIT, pageRef));
150                 modal.show(true);
151             }
152         }, ActionLink.ActionType.EDIT, null);
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 ConfParam ignore) {
160                 try {
161                     confParamOps.remove(SyncopeConsoleSession.get().getDomain(), model.getObject().getSchema());
162 
163                     SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
164                     target.add(container);
165                 } catch (Exception e) {
166                     LOG.error("While deleting {}", model.getObject(), e);
167                     SyncopeConsoleSession.get().onException(e);
168                 }
169                 ((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target);
170             }
171         }, ActionLink.ActionType.DELETE, null, true);
172 
173         return panel;
174     }
175 
176     protected final class ParametersProvider extends DirectoryDataProvider<ConfParam> {
177 
178         private static final long serialVersionUID = -185944053385660794L;
179 
180         private final SortableDataProviderComparator<ConfParam> comparator;
181 
182         private ParametersProvider(final int paginatorRows) {
183             super(paginatorRows);
184             setSort("schema", SortOrder.ASCENDING);
185             comparator = new SortableDataProviderComparator<>(this);
186         }
187 
188         @Override
189         public Iterator<ConfParam> iterator(final long first, final long count) {
190             List<ConfParam> list = confParamOps.list(SyncopeConsoleSession.get().getDomain()).entrySet().stream().
191                     skip(first).limit(count).
192                     map(entry -> {
193                         ConfParam param = new ConfParam();
194                         param.setSchema(entry.getKey());
195                         param.setValues(entry.getValue());
196                         return param;
197                     }).collect(Collectors.toList());
198 
199             list.sort(comparator);
200             return list.iterator();
201         }
202 
203         @Override
204         public long size() {
205             return confParamOps.list(SyncopeConsoleSession.get().getDomain()).size();
206         }
207 
208         @Override
209         public IModel<ConfParam> model(final ConfParam object) {
210             return new CompoundPropertyModel<>(object);
211         }
212     }
213 }