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.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 }