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.io.Serializable;
23  import java.util.ArrayList;
24  import java.util.Collection;
25  import java.util.Iterator;
26  import java.util.List;
27  import org.apache.commons.lang3.StringUtils;
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.KeywordSearchEvent;
31  import org.apache.syncope.client.console.panels.CommandDirectoryPanel.CommandDataProvider;
32  import org.apache.syncope.client.console.rest.CommandRestClient;
33  import org.apache.syncope.client.console.tasks.ExecMessage;
34  import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
35  import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
36  import org.apache.syncope.client.console.wizards.CommandWizardBuilder;
37  import org.apache.syncope.client.ui.commons.Constants;
38  import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
39  import org.apache.syncope.common.lib.command.CommandTO;
40  import org.apache.syncope.common.lib.types.IdRepoEntitlement;
41  import org.apache.wicket.PageReference;
42  import org.apache.wicket.ajax.AjaxRequestTarget;
43  import org.apache.wicket.event.Broadcast;
44  import org.apache.wicket.event.IEvent;
45  import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
46  import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
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.html.panel.Panel;
51  import org.apache.wicket.markup.repeater.Item;
52  import org.apache.wicket.model.CompoundPropertyModel;
53  import org.apache.wicket.model.IModel;
54  import org.apache.wicket.model.ResourceModel;
55  
56  public class CommandDirectoryPanel
57          extends DirectoryPanel<CommandTO, CommandTO, CommandDataProvider, CommandRestClient> {
58  
59      private static final long serialVersionUID = -8723262033772725592L;
60  
61      private String keyword;
62  
63      public CommandDirectoryPanel(final String id, final CommandRestClient restClient, final PageReference pageRef) {
64          super(id, restClient, pageRef);
65          disableCheckBoxes();
66  
67          modal.size(Modal.Size.Large);
68  
69          modal.setWindowClosedCallback(target -> {
70              updateResultTable(target);
71              modal.show(false);
72          });
73  
74          addNewItemPanelBuilder(new CommandWizardBuilder(new CommandTO(), restClient, pageRef), false);
75  
76          setShowResultPanel(true);
77  
78          initResultTable();
79      }
80  
81      @Override
82      protected CommandDataProvider dataProvider() {
83          return new CommandDataProvider(rows);
84      }
85  
86      @Override
87      protected String paginatorRowsKey() {
88          return IdRepoConstants.PREF_COMMAND_PAGINATOR_ROWS;
89      }
90  
91      @Override
92      protected List<IColumn<CommandTO, String>> getColumns() {
93          List<IColumn<CommandTO, String>> columns = new ArrayList<>();
94  
95          columns.add(new PropertyColumn<>(
96                  new ResourceModel(Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME, Constants.KEY_FIELD_NAME));
97  
98          columns.add(new AbstractColumn<>(new ResourceModel("arguments"), "arguments") {
99  
100             private static final long serialVersionUID = -4008579357070833846L;
101 
102             @Override
103             public void populateItem(
104                     final Item<ICellPopulator<CommandTO>> cellItem,
105                     final String componentId,
106                     final IModel<CommandTO> rowModel) {
107 
108                 cellItem.add(new Label(componentId, rowModel.getObject().getArgs().getClass().getName()));
109             }
110         });
111 
112         return columns;
113     }
114 
115     @Override
116     protected ActionsPanel<CommandTO> getActions(final IModel<CommandTO> model) {
117         ActionsPanel<CommandTO> panel = super.getActions(model);
118 
119         panel.add(new ActionLink<>() {
120 
121             private static final long serialVersionUID = -3722207913631435501L;
122 
123             @Override
124             public void onClick(final AjaxRequestTarget target, final CommandTO ignore) {
125                 send(CommandDirectoryPanel.this, Broadcast.EXACT,
126                         new AjaxWizard.EditItemActionEvent<>(model.getObject(), target));
127             }
128         }, ActionLink.ActionType.EXECUTE, IdRepoEntitlement.COMMAND_RUN);
129 
130         return panel;
131     }
132 
133     @Override
134     protected Collection<ActionLink.ActionType> getBatches() {
135         return List.of();
136     }
137 
138     @Override
139     protected Panel customResultBody(final String panelId, final CommandTO item, final Serializable result) {
140         return new ExecMessage(panelId, (String) result);
141     }
142 
143     @Override
144     public void onEvent(final IEvent<?> event) {
145         if (event.getPayload() instanceof KeywordSearchEvent) {
146             KeywordSearchEvent payload = KeywordSearchEvent.class.cast(event.getPayload());
147 
148             keyword = payload.getKeyword();
149             if (StringUtils.isNotBlank(keyword)) {
150                 if (!StringUtils.startsWith(keyword, "*")) {
151                     keyword = "*" + keyword;
152                 }
153                 if (!StringUtils.endsWith(keyword, "*")) {
154                     keyword += "*";
155                 }
156             }
157 
158             updateResultTable(payload.getTarget());
159         } else {
160             super.onEvent(event);
161         }
162     }
163 
164     protected final class CommandDataProvider extends DirectoryDataProvider<CommandTO> {
165 
166         private static final long serialVersionUID = 6267494272884913376L;
167 
168         public CommandDataProvider(final int paginatorRows) {
169             super(paginatorRows);
170         }
171 
172         @Override
173         public Iterator<CommandTO> iterator(final long first, final long count) {
174             int page = ((int) first / paginatorRows);
175             return restClient.search((page < 0 ? 0 : page) + 1, paginatorRows, keyword).iterator();
176         }
177 
178         @Override
179         public long size() {
180             return restClient.count(keyword);
181         }
182 
183         @Override
184         public IModel<CommandTO> model(final CommandTO object) {
185             return new CompoundPropertyModel<>(object);
186         }
187     }
188 }