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.panels;
20
21 import java.time.Duration;
22 import java.time.temporal.ChronoUnit;
23 import org.apache.commons.lang3.tuple.Triple;
24 import org.apache.syncope.client.console.SyncopeConsoleSession;
25 import org.apache.syncope.client.console.wicket.ajax.IndicatorAjaxTimerBehavior;
26 import org.apache.syncope.client.console.widgets.AnyByRealmWidget;
27 import org.apache.syncope.client.console.widgets.CompletenessWidget;
28 import org.apache.syncope.client.console.widgets.LoadWidget;
29 import org.apache.syncope.client.console.widgets.NumberWidget;
30 import org.apache.syncope.client.console.widgets.UsersByStatusWidget;
31 import org.apache.syncope.common.lib.info.NumbersInfo;
32 import org.apache.wicket.ajax.AjaxRequestTarget;
33 import org.apache.wicket.markup.html.WebMarkupContainer;
34 import org.apache.wicket.markup.html.panel.Panel;
35 import org.apache.wicket.model.ResourceModel;
36
37 public class DashboardOverviewPanel extends Panel {
38
39 private static final long serialVersionUID = 5989039374050260225L;
40
41 private final NumberWidget totalUsers;
42
43 private final NumberWidget totalGroups;
44
45 private final NumberWidget totalAny1OrRoles;
46
47 private final NumberWidget totalAny2OrResources;
48
49 private final UsersByStatusWidget usersByStatus;
50
51 private final CompletenessWidget completeness;
52
53 private final AnyByRealmWidget anyByRealm;
54
55 private final LoadWidget load;
56
57 public DashboardOverviewPanel(final String id) {
58 super(id);
59
60 NumbersInfo numbers = SyncopeConsoleSession.get().getAnonymousClient().numbers();
61
62 WebMarkupContainer container = new WebMarkupContainer("container");
63 container.setOutputMarkupId(true);
64 add(container);
65
66 totalUsers = new NumberWidget("totalUsers", "bg-yellow", numbers.getTotalUsers(),
67 new ResourceModel("users").getObject(), "ion ion-person");
68 container.add(totalUsers);
69 totalGroups = new NumberWidget(
70 "totalGroups", "bg-red", numbers.getTotalGroups(),
71 new ResourceModel("groups").getObject(), "ion ion-person-stalker");
72 container.add(totalGroups);
73
74 Triple<Integer, String, String> built = buildTotalAny1OrRoles(numbers);
75 totalAny1OrRoles = new NumberWidget(
76 "totalAny1OrRoles", "bg-green", built.getLeft(), built.getMiddle(), built.getRight());
77 container.add(totalAny1OrRoles);
78
79 built = buildTotalAny2OrResources(numbers);
80 totalAny2OrResources = new NumberWidget(
81 "totalAny2OrResources", "bg-info", built.getLeft(), built.getMiddle(), built.getRight());
82 container.add(totalAny2OrResources);
83
84 usersByStatus = new UsersByStatusWidget("usersByStatus", numbers.getUsersByStatus());
85 container.add(usersByStatus);
86
87 completeness = new CompletenessWidget("completeness", numbers.getConfCompleteness());
88 container.add(completeness);
89
90 anyByRealm = new AnyByRealmWidget(
91 "anyByRealm",
92 numbers.getUsersByRealm(),
93 numbers.getGroupsByRealm(),
94 numbers.getAnyType1(),
95 numbers.getAny1ByRealm(),
96 numbers.getAnyType2(),
97 numbers.getAny2ByRealm());
98 container.add(anyByRealm);
99
100 load = new LoadWidget("load", SyncopeConsoleSession.get().getAnonymousClient().system());
101 container.add(load);
102
103 container.add(new IndicatorAjaxTimerBehavior(Duration.of(60, ChronoUnit.SECONDS)) {
104
105 private static final long serialVersionUID = -4426283634345968585L;
106
107 @Override
108 protected void onTimer(final AjaxRequestTarget target) {
109 NumbersInfo numbers = SyncopeConsoleSession.get().getAnonymousClient().numbers();
110
111 if (totalUsers.refresh(numbers.getTotalUsers())) {
112 target.add(totalUsers);
113 }
114 if (totalGroups.refresh(numbers.getTotalGroups())) {
115 target.add(totalGroups);
116 }
117
118 Triple<Integer, String, String> updatedBuild = buildTotalAny1OrRoles(numbers);
119 if (totalAny1OrRoles.refresh(updatedBuild.getLeft())) {
120 target.add(totalAny1OrRoles);
121 }
122 updatedBuild = buildTotalAny2OrResources(numbers);
123 if (totalAny2OrResources.refresh(updatedBuild.getLeft())) {
124 target.add(totalAny2OrResources);
125 }
126
127 if (usersByStatus.refresh(numbers.getUsersByStatus())) {
128 target.add(usersByStatus);
129 }
130
131 if (completeness.refresh(numbers.getConfCompleteness())) {
132 target.add(completeness);
133 }
134
135 if (anyByRealm.refresh(
136 numbers.getUsersByRealm(),
137 numbers.getGroupsByRealm(),
138 numbers.getAnyType1(),
139 numbers.getAny1ByRealm(),
140 numbers.getAnyType2(),
141 numbers.getAny2ByRealm())) {
142
143 target.add(anyByRealm);
144 }
145
146 load.refresh(SyncopeConsoleSession.get().getAnonymousClient().system());
147 target.add(load);
148 }
149 });
150 }
151
152 private static Triple<Integer, String, String> buildTotalAny1OrRoles(final NumbersInfo numbers) {
153 int number;
154 String label;
155 String icon;
156 if (numbers.getAnyType1() == null) {
157 number = numbers.getTotalRoles();
158 label = new ResourceModel("roles").getObject();
159 icon = "fas fa-users";
160 } else {
161 number = numbers.getTotalAny1();
162 label = numbers.getAnyType1();
163 icon = "ion ion-gear-a";
164 }
165 return Triple.of(number, label, icon);
166 }
167
168 private static Triple<Integer, String, String> buildTotalAny2OrResources(final NumbersInfo numbers) {
169 int number;
170 String label;
171 String icon;
172 if (numbers.getAnyType2() == null) {
173 number = numbers.getTotalResources();
174 label = new ResourceModel("resources").getObject();
175 icon = "fa fa-database";
176 } else {
177 number = numbers.getTotalAny2();
178 label = numbers.getAnyType2();
179 icon = "ion ion-gear-a";
180 }
181 return Triple.of(number, label, icon);
182 }
183 }