/* * 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.usergrid.chop.webapp.view.runner; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import com.vaadin.ui.Accordion; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Table; import org.apache.commons.lang.StringUtils; import org.apache.usergrid.chop.api.Module; import org.apache.usergrid.chop.api.Runner; import org.apache.usergrid.chop.api.State; import org.apache.usergrid.chop.api.StatsSnapshot; import org.apache.usergrid.chop.webapp.dao.ModuleDao; import org.apache.usergrid.chop.webapp.dao.RunnerDao; import org.apache.usergrid.chop.webapp.dao.model.RunnerGroup; import org.apache.usergrid.chop.webapp.service.InjectorFactory; import org.apache.usergrid.chop.webapp.service.runner.RunnerService; import org.apache.usergrid.chop.webapp.service.runner.RunnerServiceImpl; public class RunnersLayout extends VerticalLayout { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss"); private final RunnerDao runnerDao = InjectorFactory.getInstance( RunnerDao.class ); private final ModuleDao moduleDao = InjectorFactory.getInstance( ModuleDao.class ); // Use RunnerServiceMock for testing private final RunnerService runnerService = InjectorFactory.getInstance( RunnerServiceImpl.class ); private final Accordion accordion = new Accordion(); public RunnersLayout() { addItems(); loadData(); } private void addItems() { addAccordion(); addRefreshButton(); } private void addRefreshButton() { Button button = new Button( "Refresh" ); button.setWidth( "100px" ); button.addClickListener( new Button.ClickListener() { public void buttonClick( Button.ClickEvent event ) { loadData(); } }); addComponent( button ); this.setComponentAlignment( button, Alignment.BOTTOM_CENTER ); } private void addAccordion() { accordion.setWidth( "800px" ); accordion.setHeight( "530px" ); addComponent( accordion ); this.setComponentAlignment( accordion, Alignment.MIDDLE_CENTER ); } private void loadData() { accordion.removeAllComponents(); Map<RunnerGroup, List<Runner>> runnerGroups = runnerDao.getRunnersGrouped(); for ( RunnerGroup group : runnerGroups.keySet() ) { Table table = getRunnersTable( runnerGroups.get( group ) ); addGroup( group, table ); } } private Table getRunnersTable( List<Runner> runners ) { Table table = getTable(); for ( Runner runner : runners ) { addRunnerToTable( table, runner ); } return table; } private void addRunnerToTable( Table table, Runner runner ) { State state = runnerService.getState(runner); StatsSnapshot stats = state == State.RUNNING ? runnerService.getStats(runner) : null; String percentageComplete = stats != null ? stats.getPercentageComplete() + "%" : ""; String startTime = stats != null ? DATE_FORMAT.format( new Date( stats.getStartTime() ) ) : ""; Object[] cells = new Object[] { runner.getUrl(), state.toString(), percentageComplete, startTime }; table.addItem( cells, runner.getUrl() ); } private void addGroup( RunnerGroup group, Table runnersTable ) { Module module = moduleDao.get( group.getModuleId() ); if (module == null) { return; } String caption = String.format( "%s / %s / %s: commit[%s], user[%s]", module.getGroupId(), module.getArtifactId(), module.getVersion(), StringUtils.abbreviate( group.getCommitId(), 10 ), group.getUser() ); accordion.addTab( runnersTable, caption ); } private static Table getTable() { Table table = new Table(); table.setSizeFull(); table.addContainerProperty( "URL", String.class, null ); table.addContainerProperty( "State", String.class, null ); table.addContainerProperty( "Complete %", String.class, null ); table.addContainerProperty( "Start Time", String.class, null ); return table; } }