package org.openbakery.racecontrol.plugin.tracker.web; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import org.openbakery.jinsim.Car; import org.openbakery.jinsim.Track; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.util.string.StringValueConversionException; import org.openbakery.racecontrol.data.Lap; import org.openbakery.racecontrol.persistence.PersistenceException; import org.openbakery.racecontrol.persistence.bean.Profile; import org.openbakery.racecontrol.plugin.tracker.TrackerService; import org.openbakery.racecontrol.plugin.tracker.data.TrackerSettings; import org.openbakery.racecontrol.service.ServiceLocateException; import org.openbakery.racecontrol.service.ServiceLocator; import org.openbakery.racecontrol.web.RaceControlPage; import org.openbakery.racecontrol.web.bean.Visibility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TrackerPage extends RaceControlPage { private static Logger log = LoggerFactory.getLogger(TrackerPage.class); private Track track = null; private List<Car> cars = null; private int numberLaps; public TrackerPage(PageParameters parameters) throws PersistenceException { super(parameters); TrackerSettings settings = getSession().getServiceLocator().getSettingsService().getTrackerSettings(); log.debug("trackerSettings {}", settings); Set<String> keys = parameters.getNamedKeys(); if (keys.contains("track") && keys.contains("car") && keys.contains("numberLaps")) { try { track = Track.getTrackByShortName(parameters.get("track").toString()); String carString = parameters.get("car").toString(); cars = new ArrayList<Car>(); for (String carName : carString.split(",")) { cars.add(Car.getCarByName(carName)); } try { numberLaps = parameters.get("numberLaps").toInt(); } catch (StringValueConversionException ex) { error("given numberLaps is not a number"); } } catch (IllegalArgumentException ex) { // error handling is below } } else { track = settings.getTrack(); cars = settings.getCars(); numberLaps = settings.getNumberLaps(); } String description; List<Lap> lapList = null; if (track != null && cars != null) { lapList = getTrackerService().getFastestLap(track, cars, numberLaps); StringBuilder carString = new StringBuilder(); boolean first = true; for (Car car : cars) { if (!first) { carString.append(", "); } else { first = false; } carString.append(car.getLongname()); } description = MessageFormat.format(getString("times_for"), track.getName(), carString); } else { lapList = Collections.emptyList(); description = ""; } add(new Label("description", description)); List<Profile> profiles = getTrackerService().getSignedUpDrivers(); log.debug("display laps for: {}", profiles); add(new LapListView("laps", lapList, profiles, track)); } @Override public String getPageTitle() { return "Tracker"; } public TrackerService getTrackerService() { ServiceLocator serviceLocator = getSession().getServiceLocator(); try { return (TrackerService) serviceLocator.getService(TrackerService.class); } catch (ServiceLocateException e) { error("Internal error!"); log.error(e.getMessage(), e); } return null; } @Override public Visibility getVisibility() { return Visibility.ALWAYS; } }