package nl.topicus.onderwijs.dashboard.web.components.statustable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import nl.topicus.onderwijs.dashboard.datasources.ApplicationVersion; import nl.topicus.onderwijs.dashboard.datasources.AverageRequestTime; import nl.topicus.onderwijs.dashboard.datasources.HudsonBuildNumber; import nl.topicus.onderwijs.dashboard.datasources.HudsonBuildStatus; import nl.topicus.onderwijs.dashboard.datasources.NumberOfServers; import nl.topicus.onderwijs.dashboard.datasources.NumberOfServersOffline; import nl.topicus.onderwijs.dashboard.datasources.NumberOfUnitTests; import nl.topicus.onderwijs.dashboard.datasources.NumberOfUsers; import nl.topicus.onderwijs.dashboard.datasources.NumberOfUsersPerServer; import nl.topicus.onderwijs.dashboard.datasources.ProjectAlerts; import nl.topicus.onderwijs.dashboard.datasources.RequestsPerMinute; import nl.topicus.onderwijs.dashboard.datasources.ServerStatus; import nl.topicus.onderwijs.dashboard.datasources.Uptime; import nl.topicus.onderwijs.dashboard.datatypes.Alert; import nl.topicus.onderwijs.dashboard.datatypes.DotColor; import nl.topicus.onderwijs.dashboard.keys.Project; import nl.topicus.onderwijs.dashboard.modules.DataSource; import nl.topicus.onderwijs.dashboard.web.WicketApplication; import nl.topicus.onderwijs.dashboard.web.components.JsonResourceBehavior; import org.apache.wicket.markup.html.IHeaderResponse; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.util.ListModel; import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.odlabs.wiquery.core.IWiQueryPlugin; import org.odlabs.wiquery.core.javascript.JsQuery; import org.odlabs.wiquery.core.javascript.JsStatement; import org.odlabs.wiquery.core.options.Options; import org.odlabs.wiquery.ui.commons.WiQueryUIPlugin; import org.odlabs.wiquery.ui.widget.WidgetJavaScriptResourceReference; @WiQueryUIPlugin public class StatusTablePanel extends Panel implements IWiQueryPlugin { private static final long serialVersionUID = 1L; private WebMarkupContainer projects; private JsonResourceBehavior<Map<String, DotColor>> dataResource; public StatusTablePanel(String id) { super(id); this.dataResource = new JsonResourceBehavior<Map<String, DotColor>>( new AbstractReadOnlyModel<Map<String, DotColor>>() { private static final long serialVersionUID = 1L; @Override public Map<String, DotColor> getObject() { Map<String, DotColor> ret = new HashMap<String, DotColor>(); retrieveDataFromApplication(ret); return ret; } }); add(dataResource); projects = new WebMarkupContainer("projects"); add(projects); final Map<String, List<Class<? extends DataSource<?>>>> columns = new TreeMap<String, List<Class<? extends DataSource<?>>>>(); List<Class<? extends DataSource<?>>> sources1 = new ArrayList<Class<? extends DataSource<?>>>(); sources1.add(NumberOfUsers.class); sources1.add(NumberOfUsersPerServer.class); sources1.add(RequestsPerMinute.class); sources1.add(AverageRequestTime.class); List<Class<? extends DataSource<?>>> sources2 = new ArrayList<Class<? extends DataSource<?>>>(); sources2.add(ApplicationVersion.class); sources2.add(Uptime.class); List<Class<? extends DataSource<?>>> sources3 = new ArrayList<Class<? extends DataSource<?>>>(); sources3.add(HudsonBuildStatus.class); sources3.add(NumberOfUnitTests.class); sources3.add(HudsonBuildNumber.class); List<Class<? extends DataSource<?>>> sources4 = new ArrayList<Class<? extends DataSource<?>>>(); sources4.add(NumberOfServers.class); sources4.add(ServerStatus.class); sources4.add(NumberOfServersOffline.class); columns.put("color-1", sources1); columns.put("color-2", sources2); columns.put("color-3", sources3); columns.put("color-4", sources4); ListView<String> columnsView = new ListView<String>("columns", new ArrayList<String>(columns.keySet())) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<String> item) { item.add(new StatusTableColumnPanel("column", item.getModel(), new ListModel<Class<? extends DataSource<?>>>(columns .get(item.getModelObject())))); } }; add(columnsView); } private void retrieveDataFromApplication(Map<String, DotColor> ret) { for (Project curProject : WicketApplication.get().getProjects()) { ProjectAlerts alerts = WicketApplication.get().getRepository() .getData(ProjectAlerts.class).get(curProject); DotColor max = null; for (Alert curAlert : alerts.getValue()) { if (DotColor.RED.equals(curAlert.getColor())) { max = DotColor.RED; break; } else if (DotColor.YELLOW.equals(curAlert.getColor())) max = DotColor.YELLOW; } if (max != null) { ret.put(curProject.getCode(), max); } } } @Override public void renderHead(IHeaderResponse response) { response.renderJavaScriptReference(WidgetJavaScriptResourceReference .get()); response.renderJavaScriptReference(new JavaScriptResourceReference( StatusTablePanel.class, "jquery.ui.dashboardstatustablemaster.js")); } @Override public JsStatement statement() { Options projectList = new Options(); for (Project project : WicketApplication.get().getProjects()) { projectList.putLiteral(project.getCode(), project.getName()); } Options options = new Options(); options.putLiteral("dataUrl", dataResource.getCallbackUrl().toString()); options.put("projects", projectList.getJavaScriptOptions().toString()); options.put("secondsBetweenScroll", WicketApplication.get() .isDevelopment() ? 15 : 30); options.put("secondsBetweenRotate", WicketApplication.get() .isDevelopment() ? 5 : 10); JsQuery jsq = new JsQuery(projects); return jsq.$().chain("dashboardStatusTableMaster", options.getJavaScriptOptions()); } }