1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }