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 org.apache.syncope.client.console.SyncopeConsoleSession;
27  import org.apache.syncope.client.console.commons.DirectoryDataProvider;
28  import org.apache.syncope.client.console.commons.IdRepoConstants;
29  import org.apache.syncope.client.console.commons.SortableDataProviderComparator;
30  import org.apache.syncope.client.console.panels.DomainDirectoryPanel.DomainProvider;
31  import org.apache.syncope.client.console.rest.SyncopeRestClient;
32  import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
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.ui.commons.Constants;
36  import org.apache.syncope.client.ui.commons.pages.BaseWebPage;
37  import org.apache.syncope.common.keymaster.client.api.DomainOps;
38  import org.apache.syncope.common.keymaster.client.api.KeymasterException;
39  import org.apache.syncope.common.keymaster.client.api.model.Domain;
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.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
44  import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
45  import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
46  import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
47  import org.apache.wicket.model.IModel;
48  import org.apache.wicket.model.ResourceModel;
49  import org.apache.wicket.model.StringResourceModel;
50  import org.apache.wicket.spring.injection.annot.SpringBean;
51  
52  public class DomainDirectoryPanel extends DirectoryPanel<Domain, Domain, DomainProvider, SyncopeRestClient> {
53  
54      private static final long serialVersionUID = -1039907608594680220L;
55  
56      @SpringBean
57      private DomainOps domainOps;
58  
59      private final BaseModal<Domain> utilityModal = new BaseModal<>(Constants.OUTER);
60  
61      public DomainDirectoryPanel(final String id, final PageReference pageRef) {
62          super(id, null, pageRef);
63          disableCheckBoxes();
64  
65          modal.size(Modal.Size.Large);
66  
67          modal.setWindowClosedCallback(target -> {
68              updateResultTable(target);
69              modal.show(false);
70          });
71  
72          addOuterObject(utilityModal);
73          utilityModal.setWindowClosedCallback(target -> {
74              updateResultTable(target);
75              modal.show(false);
76          });
77          utilityModal.size(Modal.Size.Small);
78          utilityModal.addSubmitButton();
79  
80          addNewItemPanelBuilder(new DomainWizardBuilder(domainOps, new Domain(), pageRef), true);
81  
82          initResultTable();
83  
84          MetaDataRoleAuthorizationStrategy.authorize(addAjaxLink, RENDER, IdRepoEntitlement.KEYMASTER);
85      }
86  
87      @Override
88      protected List<IColumn<Domain, String>> getColumns() {
89          List<IColumn<Domain, String>> columns = new ArrayList<>();
90          columns.add(new PropertyColumn<>(new StringResourceModel("key", this), "key", "key"));
91          columns.add(new PropertyColumn<>(
92                  new StringResourceModel("jdbcURL", this), "jdbcURL", "jdbcURL"));
93          columns.add(new PropertyColumn<>(
94                  new StringResourceModel("poolMaxActive", this), "poolMaxActive", "poolMaxActive"));
95          columns.add(new PropertyColumn<>(
96                  new StringResourceModel("poolMinIdle", this), "poolMinIdle", "poolMinIdle"));
97          return columns;
98      }
99  
100     @Override
101     protected ActionsPanel<Domain> getActions(final IModel<Domain> model) {
102         ActionsPanel<Domain> panel = super.getActions(model);
103 
104         panel.add(new ActionLink<>() {
105 
106             private static final long serialVersionUID = 7610801302168867641L;
107 
108             @Override
109             public void onClick(final AjaxRequestTarget target, final Domain ignore) {
110                 utilityModal.header(new ResourceModel("adjust.pool.size"));
111                 utilityModal.setContent(new DomainPoolModalPanel(model.getObject(), utilityModal, pageRef));
112                 utilityModal.show(true);
113                 target.add(utilityModal);
114             }
115         }, ActionLink.ActionType.EDIT, IdRepoEntitlement.KEYMASTER);
116 
117         panel.add(new ActionLink<>() {
118 
119             private static final long serialVersionUID = 7610801302168867641L;
120 
121             @Override
122             public void onClick(final AjaxRequestTarget target, final Domain ignore) {
123                 utilityModal.header(new ResourceModel("set.admin.credentials"));
124                 utilityModal.setContent(new DomainAdminCredentialsPanel(model.getObject(), utilityModal, pageRef));
125                 utilityModal.show(true);
126                 target.add(utilityModal);
127             }
128         }, ActionLink.ActionType.PASSWORD_MANAGEMENT, IdRepoEntitlement.KEYMASTER);
129 
130         panel.add(new ActionLink<>() {
131 
132             private static final long serialVersionUID = -3722207913631435501L;
133 
134             @Override
135             public void onClick(final AjaxRequestTarget target, final Domain ignore) {
136                 final Domain domain = model.getObject();
137                 try {
138                     domainOps.delete(domain.getKey());
139                     SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED));
140                     target.add(container);
141                 } catch (KeymasterException e) {
142                     LOG.error("While deleting {}", domain.getKey(), e);
143                     SyncopeConsoleSession.get().onException(e);
144                 }
145                 ((BaseWebPage) pageRef.getPage()).getNotificationPanel().refresh(target);
146             }
147         }, ActionLink.ActionType.DELETE, IdRepoEntitlement.KEYMASTER, true);
148 
149         return panel;
150     }
151 
152     @Override
153     protected DomainProvider dataProvider() {
154         return new DomainProvider(rows);
155     }
156 
157     @Override
158     protected String paginatorRowsKey() {
159         return IdRepoConstants.PREF_DOMAIN_PAGINATOR_ROWS;
160     }
161 
162     @Override
163     protected Collection<ActionLink.ActionType> getBatches() {
164         return List.of();
165 
166     }
167 
168     protected final class DomainProvider extends DirectoryDataProvider<Domain> {
169 
170         private static final long serialVersionUID = 8668261951640646188L;
171 
172         private final SortableDataProviderComparator<Domain> comparator;
173 
174         public DomainProvider(final int paginatorRows) {
175             super(paginatorRows);
176             setSort("key", SortOrder.ASCENDING);
177             comparator = new SortableDataProviderComparator<>(this);
178         }
179 
180         @Override
181         public Iterator<? extends Domain> iterator(final long first, final long count) {
182             List<Domain> list = domainOps.list();
183             list.sort(comparator);
184             return list.subList((int) first, (int) first + (int) count).iterator();
185         }
186 
187         @Override
188         public long size() {
189             return domainOps.list().size();
190         }
191 
192         @Override
193         public IModel<Domain> model(final Domain object) {
194             return new IModel<>() {
195 
196                 private static final long serialVersionUID = 8093553921710742624L;
197 
198                 @Override
199                 public Domain getObject() {
200                     return object;
201                 }
202             };
203         }
204     }
205 }