blob: e503bcdccf129dcf0dde80118dd54e2d7a8e447e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.syncope.client.console.panels;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.syncope.client.console.rest.SyncopeRestClient;
import org.apache.syncope.client.console.wicket.ajax.IndicatorAjaxTimerBehavior;
import org.apache.syncope.client.console.widgets.AnyByRealmWidget;
import org.apache.syncope.client.console.widgets.CompletenessWidget;
import org.apache.syncope.client.console.widgets.LoadWidget;
import org.apache.syncope.client.console.widgets.NumberWidget;
import org.apache.syncope.client.console.widgets.UsersByStatusWidget;
import org.apache.syncope.common.lib.info.NumbersInfo;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.ResourceModel;
public class DashboardOverviewPanel extends Panel {
private static final long serialVersionUID = 5989039374050260225L;
private final NumberWidget totalUsers;
private final NumberWidget totalGroups;
private final NumberWidget totalAny1OrRoles;
private final NumberWidget totalAny2OrResources;
private final UsersByStatusWidget usersByStatus;
private final CompletenessWidget completeness;
private final AnyByRealmWidget anyByRealm;
private final LoadWidget load;
public DashboardOverviewPanel(final String id) {
super(id);
NumbersInfo numbers = SyncopeRestClient.numbers();
WebMarkupContainer container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
add(container);
totalUsers = new NumberWidget("totalUsers", "bg-yellow", numbers.getTotalUsers(),
new ResourceModel("users").getObject(), "ion ion-person");
container.add(totalUsers);
totalGroups = new NumberWidget(
"totalGroups", "bg-red", numbers.getTotalGroups(),
new ResourceModel("groups").getObject(), "ion ion-person-stalker");
container.add(totalGroups);
Triple<Integer, String, String> built = buildTotalAny1OrRoles(numbers);
totalAny1OrRoles = new NumberWidget(
"totalAny1OrRoles", "bg-green", built.getLeft(), built.getMiddle(), built.getRight());
container.add(totalAny1OrRoles);
built = buildTotalAny2OrResources(numbers);
totalAny2OrResources = new NumberWidget(
"totalAny2OrResources", "bg-info", built.getLeft(), built.getMiddle(), built.getRight());
container.add(totalAny2OrResources);
usersByStatus = new UsersByStatusWidget("usersByStatus", numbers.getUsersByStatus());
container.add(usersByStatus);
completeness = new CompletenessWidget("completeness", numbers.getConfCompleteness());
container.add(completeness);
anyByRealm = new AnyByRealmWidget(
"anyByRealm",
numbers.getUsersByRealm(),
numbers.getGroupsByRealm(),
numbers.getAnyType1(),
numbers.getAny1ByRealm(),
numbers.getAnyType2(),
numbers.getAny2ByRealm());
container.add(anyByRealm);
load = new LoadWidget("load", SyncopeRestClient.system());
container.add(load);
container.add(new IndicatorAjaxTimerBehavior(Duration.of(60, ChronoUnit.SECONDS)) {
private static final long serialVersionUID = -4426283634345968585L;
@Override
protected void onTimer(final AjaxRequestTarget target) {
NumbersInfo numbers = SyncopeRestClient.numbers();
if (totalUsers.refresh(numbers.getTotalUsers())) {
target.add(totalUsers);
}
if (totalGroups.refresh(numbers.getTotalGroups())) {
target.add(totalGroups);
}
Triple<Integer, String, String> updatedBuild = buildTotalAny1OrRoles(numbers);
if (totalAny1OrRoles.refresh(updatedBuild.getLeft())) {
target.add(totalAny1OrRoles);
}
updatedBuild = buildTotalAny2OrResources(numbers);
if (totalAny2OrResources.refresh(updatedBuild.getLeft())) {
target.add(totalAny2OrResources);
}
if (usersByStatus.refresh(numbers.getUsersByStatus())) {
target.add(usersByStatus);
}
if (completeness.refresh(numbers.getConfCompleteness())) {
target.add(completeness);
}
if (anyByRealm.refresh(
numbers.getUsersByRealm(),
numbers.getGroupsByRealm(),
numbers.getAnyType1(),
numbers.getAny1ByRealm(),
numbers.getAnyType2(),
numbers.getAny2ByRealm())) {
target.add(anyByRealm);
}
load.refresh(SyncopeRestClient.system());
target.add(load);
}
});
}
private static Triple<Integer, String, String> buildTotalAny1OrRoles(final NumbersInfo numbers) {
int number;
String label;
String icon;
if (numbers.getAnyType1() == null) {
number = numbers.getTotalRoles();
label = new ResourceModel("roles").getObject();
icon = "fas fa-users";
} else {
number = numbers.getTotalAny1();
label = numbers.getAnyType1();
icon = "ion ion-gear-a";
}
return Triple.of(number, label, icon);
}
private static Triple<Integer, String, String> buildTotalAny2OrResources(final NumbersInfo numbers) {
int number;
String label;
String icon;
if (numbers.getAnyType2() == null) {
number = numbers.getTotalResources();
label = new ResourceModel("resources").getObject();
icon = "fa fa-database";
} else {
number = numbers.getTotalAny2();
label = numbers.getAnyType2();
icon = "ion ion-gear-a";
}
return Triple.of(number, label, icon);
}
}