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.util.ArrayList;
22  import java.util.Collection;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Map;
26  import org.apache.syncope.client.console.SyncopeConsoleSession;
27  import org.apache.syncope.client.console.batch.BatchModal;
28  import org.apache.syncope.client.console.commons.DirectoryDataProvider;
29  import org.apache.syncope.client.console.pages.BasePage;
30  import org.apache.syncope.client.console.panels.UserRequestDirectoryPanel.UserRequestProvider;
31  import org.apache.syncope.client.console.panels.UserRequestsPanel.UserRequestSearchEvent;
32  import org.apache.syncope.client.console.rest.UserRequestRestClient;
33  import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.DatePropertyColumn;
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.wicket.markup.html.form.ConfirmBehavior;
37  import org.apache.syncope.client.lib.batch.BatchRequest;
38  import org.apache.syncope.client.ui.commons.Constants;
39  import org.apache.syncope.common.lib.SyncopeClientException;
40  import org.apache.syncope.common.lib.to.UserRequest;
41  import org.apache.syncope.common.lib.types.FlowableEntitlement;
42  import org.apache.syncope.common.rest.api.service.UserRequestService;
43  import org.apache.wicket.PageReference;
44  import org.apache.wicket.ajax.AjaxRequestTarget;
45  import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
46  import org.apache.wicket.event.IEvent;
47  import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
48  import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
49  import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
50  import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
51  import org.apache.wicket.markup.html.WebMarkupContainer;
52  import org.apache.wicket.model.IModel;
53  import org.apache.wicket.model.Model;
54  import org.apache.wicket.model.ResourceModel;
55  
56  public class UserRequestDirectoryPanel
57          extends DirectoryPanel<UserRequest, UserRequest, UserRequestProvider, UserRequestRestClient> {
58  
59      private static final long serialVersionUID = -5346161040211617763L;
60  
61      private static final String PREF_USER_REQUEST_PAGINATOR_ROWS = "userrequest.paginator.rows";
62  
63      private String keyword;
64  
65      public UserRequestDirectoryPanel(
66              final String id,
67              final UserRequestRestClient restClient,
68              final PageReference pageRef) {
69  
70          super(id, restClient, pageRef, true);
71          setFooterVisibility(false);
72  
73          initResultTable();
74  
75          IndicatingAjaxButton batchLink = new IndicatingAjaxButton("batchLink", resultTable.group.getForm()) {
76  
77              private static final long serialVersionUID = 382302811235019988L;
78  
79              @Override
80              public void onSubmit(final AjaxRequestTarget target) {
81                  Collection<UserRequest> items = resultTable.group.getModelObject();
82                  if (!items.isEmpty()) {
83                      BatchRequest batch = SyncopeConsoleSession.get().batch();
84                      UserRequestService service = batch.getService(UserRequestService.class);
85                      items.forEach(item -> service.cancelRequest(item.getExecutionId(), null));
86  
87                      Map<String, String> results = restClient.batch(batch);
88  
89                      resultTable.batchModal.header(new ResourceModel("batch"));
90                      resultTable.batchModal.changeCloseButtonLabel(getString("cancel", null, "Cancel"), target);
91  
92                      target.add(resultTable.batchModal.setContent(new BatchModal<>(
93                              resultTable.batchModal,
94                              pageRef,
95                              new ArrayList<>(items),
96                              getColumns(),
97                              results,
98                              "executionId",
99                              target)));
100 
101                     resultTable.batchModal.show(true);
102                 }
103             }
104         };
105         batchLink.add(new ConfirmBehavior(batchLink, "confirmDelete"));
106         ((WebMarkupContainer) resultTable.get("tablePanel")).addOrReplace(batchLink);
107 
108         MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, FlowableEntitlement.USER_REQUEST_LIST);
109     }
110 
111     @Override
112     protected List<IColumn<UserRequest, String>> getColumns() {
113         List<IColumn<UserRequest, String>> columns = new ArrayList<>();
114 
115         columns.add(new PropertyColumn<>(
116                 new ResourceModel("bpmnProcess"), "bpmnProcess", "bpmnProcess"));
117         columns.add(new DatePropertyColumn<>(
118                 new ResourceModel("startTime"), "startTime", "startTime"));
119         columns.add(new PropertyColumn<>(
120                 new ResourceModel("username"), "username"));
121         columns.add(new PropertyColumn<>(
122                 new ResourceModel("activityId"), "activityId"));
123 
124         return columns;
125     }
126 
127     @Override
128     public ActionsPanel<UserRequest> getActions(final IModel<UserRequest> model) {
129         ActionsPanel<UserRequest> panel = super.getActions(model);
130 
131         panel.add(new ActionLink<>() {
132 
133             private static final long serialVersionUID = -3722207913631435501L;
134 
135             @Override
136             public void onClick(final AjaxRequestTarget target, final UserRequest ignore) {
137                 try {
138                     restClient.cancelRequest(model.getObject().getExecutionId(), null);
139                     SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
140                     target.add(container);
141                     UserRequestDirectoryPanel.this.getTogglePanel().close(target);
142                 } catch (SyncopeClientException e) {
143                     LOG.error("While canceling execution {}", model.getObject().getExecutionId(), e);
144                     SyncopeConsoleSession.get().onException(e);
145                 }
146                 ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target);
147             }
148         }, ActionLink.ActionType.DELETE, FlowableEntitlement.USER_REQUEST_CANCEL, true);
149 
150         return panel;
151     }
152 
153     @Override
154     protected UserRequestProvider dataProvider() {
155         return new UserRequestProvider(rows);
156     }
157 
158     @Override
159     protected String paginatorRowsKey() {
160         return PREF_USER_REQUEST_PAGINATOR_ROWS;
161     }
162 
163     @Override
164     protected Collection<ActionLink.ActionType> getBatches() {
165         return List.of();
166     }
167 
168     @Override
169     public void onEvent(final IEvent<?> event) {
170         if (event.getPayload() instanceof UserRequestSearchEvent) {
171             UserRequestSearchEvent payload = UserRequestSearchEvent.class.cast(event.getPayload());
172             keyword = payload.getKeyword();
173 
174             updateResultTable(payload.getTarget());
175         } else {
176             super.onEvent(event);
177         }
178     }
179 
180     protected final class UserRequestProvider extends DirectoryDataProvider<UserRequest> {
181 
182         private static final long serialVersionUID = -1392420250782313734L;
183 
184         public UserRequestProvider(final int paginatorRows) {
185             super(paginatorRows);
186 
187             setSort("startTime", SortOrder.ASCENDING);
188         }
189 
190         @Override
191         public Iterator<UserRequest> iterator(final long first, final long count) {
192             int page = ((int) first / paginatorRows);
193             return restClient.listRequests(
194                     keyword, (page < 0 ? 0 : page) + 1, paginatorRows, getSort()).iterator();
195         }
196 
197         @Override
198         public long size() {
199             return restClient.countRequests(keyword);
200         }
201 
202         @Override
203         public IModel<UserRequest> model(final UserRequest request) {
204             return Model.of(request);
205         }
206     }
207 }