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.events;
20  
21  import java.util.Collections;
22  import java.util.List;
23  import java.util.Set;
24  import org.apache.syncope.client.ui.commons.Constants;
25  import org.apache.syncope.common.lib.types.AuditLoggerName;
26  import org.apache.wicket.ajax.AjaxRequestTarget;
27  import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
28  import org.apache.wicket.event.Broadcast;
29  import org.apache.wicket.event.IEvent;
30  import org.apache.wicket.markup.ComponentTag;
31  import org.apache.wicket.markup.html.WebMarkupContainer;
32  import org.apache.wicket.markup.html.form.IChoiceRenderer;
33  import org.apache.wicket.markup.html.form.ListMultipleChoice;
34  import org.apache.wicket.markup.html.panel.Panel;
35  import org.apache.wicket.model.IModel;
36  import org.apache.wicket.model.util.ListModel;
37  
38  public class SelectedEventsPanel extends Panel {
39  
40      private static final long serialVersionUID = -4832450230348213500L;
41  
42      private final WebMarkupContainer selectionContainer;
43  
44      private final IModel<List<String>> model;
45  
46      public SelectedEventsPanel(final String id, final IModel<List<String>> model) {
47          super(id);
48  
49          this.model = model;
50  
51          selectionContainer = new WebMarkupContainer("selectionContainer");
52          selectionContainer.setOutputMarkupId(true);
53          add(selectionContainer);
54  
55          ListMultipleChoice<String> selectedEvents =
56                  new ListMultipleChoice<>("selectedEvents", new ListModel<>(), model) {
57  
58              private static final long serialVersionUID = 1226677544225737338L;
59  
60              @Override
61              protected void onComponentTag(final ComponentTag tag) {
62                  super.onComponentTag(tag);
63                  tag.remove("size");
64                  tag.remove("multiple");
65                  tag.put("size", 5);
66              }
67          };
68          selectedEvents.setMaxRows(5);
69          selectedEvents.setChoiceRenderer(new IChoiceRenderer<>() {
70  
71              private static final long serialVersionUID = -4288397951948436434L;
72  
73              @Override
74              public Object getDisplayValue(final String object) {
75                  return object;
76              }
77  
78              @Override
79              public String getIdValue(final String object, final int index) {
80                  return object;
81              }
82  
83              @Override
84              public String getObject(final String id, final IModel<? extends List<? extends String>> choices) {
85                  return id;
86              }
87          });
88          selectedEvents.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
89  
90              private static final long serialVersionUID = -151291731388673682L;
91  
92              @Override
93              protected void onUpdate(final AjaxRequestTarget target) {
94                  send(SelectedEventsPanel.this.getPage(),
95                          Broadcast.BREADTH,
96                          new InspectSelectedEvent(target, selectedEvents.getModelValue()));
97              }
98          });
99          selectionContainer.add(selectedEvents);
100     }
101 
102     @Override
103     public void onEvent(final IEvent<?> event) {
104         if (event.getPayload() instanceof EventSelectionChanged) {
105             EventSelectionChanged eventSelectionChanged = (EventSelectionChanged) event.getPayload();
106 
107             eventSelectionChanged.getToBeRemoved().
108                     forEach(toBeRemoved -> model.getObject().remove(toBeRemoved.toString()));
109 
110             eventSelectionChanged.getToBeAdded().stream().
111                     filter(toBeAdded -> !model.getObject().contains(toBeAdded.toString())).
112                     forEach(toBeAdded -> model.getObject().add(toBeAdded.toString()));
113 
114             Collections.sort(model.getObject());
115             eventSelectionChanged.getTarget().add(selectionContainer);
116         }
117     }
118 
119     public static class InspectSelectedEvent {
120 
121         private final AjaxRequestTarget target;
122 
123         private final String event;
124 
125         public InspectSelectedEvent(final AjaxRequestTarget target, final String event) {
126             this.target = target;
127             this.event = event;
128         }
129 
130         public AjaxRequestTarget getTarget() {
131             return target;
132         }
133 
134         public String getEvent() {
135             return event;
136         }
137     }
138 
139     public static class EventSelectionChanged {
140 
141         private final AjaxRequestTarget target;
142 
143         private final Set<AuditLoggerName> toBeRemoved;
144 
145         private final Set<AuditLoggerName> toBeAdded;
146 
147         public EventSelectionChanged(
148                 final AjaxRequestTarget target,
149                 final Set<AuditLoggerName> toBeAdded,
150                 final Set<AuditLoggerName> toBeRemoved) {
151 
152             this.target = target;
153             this.toBeAdded = toBeAdded;
154             this.toBeRemoved = toBeRemoved;
155         }
156 
157         public AjaxRequestTarget getTarget() {
158             return target;
159         }
160 
161         public Set<AuditLoggerName> getToBeRemoved() {
162             return toBeRemoved;
163         }
164 
165         public Set<AuditLoggerName> getToBeAdded() {
166             return toBeAdded;
167         }
168     }
169 }