/*
* Created on Jul 8, 2004
*/
package is.idega.idegaweb.marathon.presentation;
import is.idega.idegaweb.marathon.business.ConverterUtility;
import is.idega.idegaweb.marathon.business.RunBusiness;
import is.idega.idegaweb.marathon.business.RunGroup;
import is.idega.idegaweb.marathon.business.RunGroupComparator;
import is.idega.idegaweb.marathon.business.RunGroupMap;
import is.idega.idegaweb.marathon.data.Distance;
import is.idega.idegaweb.marathon.data.Participant;
import is.idega.idegaweb.marathon.data.Run;
import is.idega.idegaweb.marathon.data.Year;
import is.idega.idegaweb.marathon.util.IWMarathonConstants;
import java.rmi.RemoteException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ejb.FinderException;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.core.location.data.Country;
import com.idega.idegaweb.IWResourceBundle;
import com.idega.presentation.Block;
import com.idega.presentation.IWContext;
import com.idega.presentation.Table;
import com.idega.presentation.text.Text;
import com.idega.presentation.ui.DropdownMenu;
import com.idega.presentation.ui.Form;
import com.idega.presentation.ui.util.SelectorUtility;
import com.idega.user.business.GroupBusiness;
import com.idega.user.business.UserBusiness;
import com.idega.user.data.Group;
import com.idega.user.data.User;
import com.idega.util.Counter;
import com.idega.util.IWTimestamp;
/**
* Show the results of a run. This block can show results for a specific run,
* year and run group
*
* @author birna
*/
public class RunResultViewer extends Block {
private static final String STYLENAME_INTERFACE = "interface";
private static final String STYLENAME_GROUP_ROW = "groupRow";
private static final String STYLENAME_HEADER_ROW = "headerRow";
private static final String STYLENAME_LIST_ROW = "listRow";
private static final String DEFAULT_INTERFACE_STYLE = "font-family:Verdana,Arial,Helvetica,sans-serif;font-size:8px;font-weight:bold;border-width:1px;border-color:#000000;border-style:solid;";
private static final String DEFAULT_GROUP_ROW_STYLE = "font-family:Arial,Helvetica,sans-serif;font-size:10px;font-weight:bold;padding:4px;background-color:#ACACAC;color:#FFFFFF";
private static final String DEFAULT_HEADER_ROW_STYLE = "font-family:Arial,Helvetica,sans-serif;font-size:12px;font-weight:bold;padding:2px;";
private static final String DEFAULT_LIST_ROW_STYLE = "font-family:Arial,Helvetica,sans-serif;font-size:10px;padding:2px;";
private static final String DARK_COLOR = "#E9E9E9";
private static final String LIGHT_COLOR = "#FFFFFF";
private int COLUMN_COUNT = 13;
private Distance distance;
private Year year;
private Collator _collator;
private IWContext _iwc;
private IWResourceBundle iwrb;
private RunBusiness _runBiz;
private GroupBusiness _groupBiz;
private UserBusiness _userBiz;
private String runPK;
private Run run;
private int sortBy = IWMarathonConstants.RYSDD_TOTAL;
private SelectorUtility util;
private HashMap countryMap = new HashMap();
public void main(IWContext iwc) throws Exception {
_iwc = iwc;
iwrb = getResourceBundle(iwc);
_collator = Collator.getInstance(iwc.getCurrentLocale());
util = new SelectorUtility();
if (runPK != null) {
run = ConverterUtility.getInstance().convertGroupToRun(new Integer(runPK));
}
if (run == null) {
add("No run set...");
return;
}
if (iwc.isParameterSet(IWMarathonConstants.PARAMETER_SORT_BY)) {
sortBy = Integer.parseInt(iwc.getParameter(IWMarathonConstants.PARAMETER_SORT_BY));
}
if (iwc.isParameterSet(IWMarathonConstants.GROUP_TYPE_RUN_YEAR)) {
try {
year = ConverterUtility.getInstance().convertGroupToYear(new Integer(iwc.getParameter(IWMarathonConstants.GROUP_TYPE_RUN_YEAR)));
}
catch (FinderException e) {
e.printStackTrace();
}
}
if (iwc.isParameterSet(IWMarathonConstants.GROUP_TYPE_RUN_DISTANCE)) {
try {
distance = ConverterUtility.getInstance().convertGroupToDistance(new Integer(iwc.getParameter(IWMarathonConstants.GROUP_TYPE_RUN_DISTANCE)));
COLUMN_COUNT += (distance.getNumberOfSplits() * 2);
}
catch (FinderException e) {
e.printStackTrace();
}
}
Form form = null;//(Form) iwc.getApplicationAttribute("run_result_cache_" + runPK + "_" + (year != null ? year.getPrimaryKey() + "_" : "") + (distance != null ? distance.getPrimaryKey() + "_" : "") + sortBy);
if (form == null) {
form = new Form();
Table table = new Table();
table.setCellpadding(0);
table.setCellspacing(0);
table.setColumns(COLUMN_COUNT);
table.setWidth(Table.HUNDRED_PERCENT);
int row = 1;
table.setCellpaddingLeft(1, row, 16);
table.mergeCells(1, row, table.getColumns(), row);
table.add(getYearsDropdown(run), 1, row);
table.add(Text.getNonBrakingSpace(), 1, row);
table.add(getDistanceDropdown(), 1, row);
table.add(Text.getNonBrakingSpace(), 1, row);
table.add(getSortDropdown(), 1, row++);
table.setHeight(row++, 12);
if (distance != null) {
row = insertHeadersIntoTable(table, row);
switch (sortBy) {
case IWMarathonConstants.RYSDD_TOTAL:
getTotalResults(table, row);
break;
case IWMarathonConstants.RYSDD_GROUPS:
getGroupResults(table, row);
break;
case IWMarathonConstants.RYSDD_GROUPS_COMP:
getGroupCompetitionResults(table, row);
break;
}
}
for (int a = 2; a < COLUMN_COUNT; a = a + 2) {
table.setWidth(a, 2);
table.setColumnColor(a, "#FFFFFF");
}
form.add(table);
//iwc.setApplicationAttribute("run_result_cache_" + runPK + "_" + (year != null ? year.getPrimaryKey() + "_" : "") + (distance != null ? distance.getPrimaryKey() + "_" : "") + sortBy, form);
}
add(form);
}
private void getTotalResults(Table table, int row) {
try {
Collection runs = getRunBiz().getRunnersByDistance(distance, null);
row = insertRunGroupIntoTable(table, row, "results.all_participants");
Iterator runIter = runs.iterator();
int num = 1;
while (runIter.hasNext()) {
Participant run = (Participant) runIter.next();
if (run.getRunTime() != -1) {
row = insertRunIntoTable(table, row, run, num, num);
num++;
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private void getGroupResults(Table table, int row) {
try {
List runGroups = new ArrayList(getGroupBiz().getChildGroups(distance));
sortRunnerGroups(runGroups);
Iterator runGroupIter = runGroups.iterator();
while (runGroupIter.hasNext()) {
Group runGroup = (Group) runGroupIter.next();
Collection runners = getRunBiz().getRunnersByDistance(distance, runGroup);
if (runners.size() > 0) {
row = insertRunGroupIntoTable(table, row, "group_" + runGroup.getName());
Iterator runIter = runners.iterator();
int num = 1;
while (runIter.hasNext()) {
Participant run = (Participant) runIter.next();
if (run.getRunTime() > 0) {
row = insertRunIntoTable(table, row, run, num, num);
num++;
}
if (!runIter.hasNext()) {
table.setHeight(row++, 2);
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private void getGroupCompetitionResults(Table table, int row) {
try {
List runs = new ArrayList(getRunBiz().getRunnersByDistance(distance, null));
Map runGroups = new HashMap();
RunGroupMap map = new RunGroupMap();
Participant runner;
RunGroup runnerGroup;
Iterator iterator = runs.iterator();
while (iterator.hasNext()) {
runner = (Participant) iterator.next();
if (runner.getRunGroupName() != null && runner.getRunGroupName().trim().length() > 0) {
runnerGroup = (RunGroup) runGroups.get(runner.getRunGroupName());
if (runnerGroup == null) {
runnerGroup = new RunGroup(runner.getRunGroupName());
runGroups.put(runner.getRunGroupName(), runnerGroup);
}
map.put(runnerGroup, runner);
}
}
List groupList = new ArrayList(map.keySet());
Collections.sort(groupList, new RunGroupComparator(map));
iterator = groupList.iterator();
Participant run;
int num = 1;
int count = 0;
Iterator runIter;
Collection runnersInRunGroup;
RunGroup runGroup;
while (iterator.hasNext()) {
runGroup = (RunGroup) iterator.next();
runnersInRunGroup = map.getCollection(runGroup);
if (runnersInRunGroup.size() >= 3) {
row = insertRunGroupIntoTable(table, row, runGroup.getGroupName() + " - " + runGroup.getCounter().toString());
runIter = runnersInRunGroup.iterator();
num = 1;
count = 0;
while (runIter.hasNext()) {
run = (Participant) runIter.next();
num = runs.indexOf(run);
row = insertRunIntoTable(table, row, run, num, count+1);
count++;
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
private DropdownMenu getYearsDropdown(Group run) throws RemoteException {
DropdownMenu years = (DropdownMenu) util.getSelectorFromIDOEntities(new DropdownMenu(IWMarathonConstants.GROUP_TYPE_RUN_YEAR), run.getChildren(), "getName", iwrb);
years.addMenuElementFirst("", "");
years.setToSubmit();
years.keepStatusOnAction();
return years;
}
private DropdownMenu getDistanceDropdown() throws RemoteException {
DropdownMenu distanceMenu = new DropdownMenu(IWMarathonConstants.GROUP_TYPE_RUN_DISTANCE);
distanceMenu.setToSubmit();
distanceMenu.keepStatusOnAction();
distanceMenu.addMenuElementFirst("", "");
Integer threeKM = new Integer(iwrb.getIWBundleParent().getProperty("3_km_id", "126"));
//Integer sevenKM = new Integer(iwrb.getIWBundleParent().getProperty("7_km_id", "113"));
if (year != null) {
List distances = getRunBiz().getDistancesMap(run, year.getName());
Iterator iter = distances.iterator();
while (iter.hasNext()) {
Group distance = (Group) iter.next();
if (!distance.getPrimaryKey().equals(threeKM)/* && !distance.getPrimaryKey().equals(sevenKM)*/) {
distanceMenu.addMenuElement(distance.getPrimaryKey().toString(), iwrb.getLocalizedString(distance.getName(), distance.getName()));
}
}
}
return distanceMenu;
}
private DropdownMenu getSortDropdown() throws RemoteException {
DropdownMenu sort = new DropdownMenu(IWMarathonConstants.PARAMETER_SORT_BY);
sort.addMenuElement(IWMarathonConstants.RYSDD_TOTAL, iwrb.getLocalizedString(IWMarathonConstants.PARAMETER_TOTAL, "Total result list"));
sort.addMenuElement(IWMarathonConstants.RYSDD_GROUPS, iwrb.getLocalizedString(IWMarathonConstants.PARAMETER_GROUPS, "Groups"));
sort.addMenuElement(IWMarathonConstants.RYSDD_GROUPS_COMP, iwrb.getLocalizedString(IWMarathonConstants.PARAMETER_GROUPS_COMPETITION, "Group competition"));
sort.setToSubmit();
sort.keepStatusOnAction();
return sort;
}
/**
* Sorts groups based on their names
*
* @param groups
* The list of groups to sort
*/
private void sortRunnerGroups(List groups) {
Collections.sort(groups, new Comparator() {
public int compare(Object arg0, Object arg1) {
Group g0 = (Group) arg0;
Group g1 = (Group) arg1;
return _collator.compare(g0.getName(), g1.getName());
}
});
}
private int insertRunIntoTable(Table table, int row, Participant run, int num, int participantRow) {
int column = 1;
table.add(getRunnerRowText(Integer.toString(num)), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
String runTime = getTimeStringFromRunTime(run.getRunTime());
table.add(getRunnerRowText(runTime), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
String chipTime = run.getChipTime() != -1 ? getTimeStringFromRunTime(run.getChipTime()) : "-";
table.add(getRunnerRowText(chipTime), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
if (distance != null && distance.getNumberOfSplits() >= 1) {
String splitTime = run.getSplitTime1() != -1 ? getTimeStringFromRunTime(run.getSplitTime1()) : "-";
table.add(getRunnerRowText(splitTime), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
if (distance.getNumberOfSplits() == 2) {
splitTime = run.getSplitTime2() != -1 ? getTimeStringFromRunTime(run.getSplitTime2()) : "-";
table.add(getRunnerRowText(splitTime), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
}
}
try {
User user = getUserBiz().getUser(run.getUserID());
table.add(getRunnerRowText(user.getName()), column, row);
table.setStyleClass(column++, row, getStyleName(STYLENAME_LIST_ROW));
column++;
IWTimestamp birthDate = new IWTimestamp(user.getDateOfBirth());
table.add(getRunnerRowText(Integer.toString(birthDate.getYear())), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
}
catch (RemoteException re) {
log(re);
}
Country country = null;
try {
String userNationality = run.getUserNationality();
if (countryMap.containsKey(userNationality)) {
country = (Country)countryMap.get(userNationality);
} else {
country = getRunBiz().getCountryByNationality(userNationality);
countryMap.put(userNationality, country);
}
}
catch (RemoteException re) {
log(re);
}
if (country != null) {
table.add(getRunnerRowText(country.getName()), column, row);
}
else {
table.add(getRunnerRowText(run.getUserNationality()), column, row);
}
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
table.add(getRunnerRowText(run.getRunGroupName() != null ? run.getRunGroupName() : ""), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_LIST_ROW));
if (participantRow % 2 == 0) {
table.setRowColor(row, LIGHT_COLOR);
}
else {
table.setRowColor(row, DARK_COLOR);
}
return ++row;
}
private int insertHeadersIntoTable(Table table, int row) {
int column = 1;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.number", "Nr.")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.run_time", "Run time")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.chip_time", "Chip time")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
if (distance != null && distance.getNumberOfSplits() >= 1) {
table.add(getRunnerRowText(iwrb.getLocalizedString("results.split_time_1", "Split time 1")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
if (distance.getNumberOfSplits() == 2) {
table.add(getRunnerRowText(iwrb.getLocalizedString("results.split_time_2", "Split time 2")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
}
}
table.add(getRunnerRowText(iwrb.getLocalizedString("results.name", "Name")), column, row);
table.setStyleClass(column++, row, getStyleName(STYLENAME_HEADER_ROW));
column++;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.birth_year", "Year")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.country", "Country")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setAlignment(column++, row, Table.HORIZONTAL_ALIGN_CENTER);
column++;
table.add(getRunnerRowText(iwrb.getLocalizedString("results.group", "Group")), column, row);
table.setStyleClass(column, row, getStyleName(STYLENAME_HEADER_ROW));
table.setHeight(++row, 2);
return ++row;
}
private String getTimeStringFromRunTime(int seconds) {
Counter counter = new Counter();
counter.addSeconds(seconds);
return counter.toString();
}
private Text getRunnerRowText(String text) {
Text t = new Text(text);
return t;
}
private int insertRunGroupIntoTable(Table table, int row, String groupName) {
table.mergeCells(1, row, COLUMN_COUNT, row);
table.setStyleClass(1, row, getStyleName(STYLENAME_GROUP_ROW));
table.add(getRunnerRowText(groupName), 1, row++);
table.setHeight(row, 2);
return ++row;
}
private RunBusiness getRunBiz() {
if (_runBiz == null) {
try {
_runBiz = (RunBusiness) IBOLookup.getServiceInstance(_iwc, RunBusiness.class);
}
catch (IBOLookupException e) {
e.printStackTrace();
}
}
return _runBiz;
}
private GroupBusiness getGroupBiz() {
if (_groupBiz == null) {
try {
_groupBiz = (GroupBusiness) IBOLookup.getServiceInstance(_iwc, GroupBusiness.class);
}
catch (IBOLookupException e) {
e.printStackTrace();
}
}
return _groupBiz;
}
private UserBusiness getUserBiz() {
if (_userBiz == null) {
try {
_userBiz = (UserBusiness) IBOLookup.getServiceInstance(_iwc, UserBusiness.class);
}
catch (IBOLookupException e) {
e.printStackTrace();
}
}
return _userBiz;
}
public String getBundleIdentifier() {
return IWMarathonConstants.IW_BUNDLE_IDENTIFIER;
}
/**
* @param run
* The run to set.
*/
public void setRun(String runPK) {
this.runPK = runPK;
}
/* (non-Javadoc)
* @see com.idega.presentation.Block#getStyleNames()
*/
public Map getStyleNames() {
Map map = new HashMap();
map.put(STYLENAME_GROUP_ROW, DEFAULT_GROUP_ROW_STYLE);
map.put(STYLENAME_HEADER_ROW, DEFAULT_HEADER_ROW_STYLE);
map.put(STYLENAME_INTERFACE, DEFAULT_INTERFACE_STYLE);
map.put(STYLENAME_LIST_ROW, DEFAULT_LIST_ROW_STYLE);
return map;
}
}