Merge remote branch 'origin/gwt' into gwt

This commit is contained in:
unknown committed 2011-12-21 15:27:29 +01:00
commit b1ced08cbb
17 files changed
+335 -126

No files matched your search

@@ -20,6 +20,13 @@ import java.util.List;
import java.util.Map;
import java.util.NavigableSet;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
@@ -66,6 +73,7 @@ import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.NoWindError;
import com.sap.sailing.domain.tracking.NoWindException;
import com.sap.sailing.domain.tracking.RacesHandle;
import com.sap.sailing.domain.tracking.TrackedLeg.LegType;
@@ -82,8 +90,8 @@ import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
import com.sap.sailing.gwt.ui.client.SailingService;
import com.sap.sailing.gwt.ui.shared.BoatClassDAO;
import com.sap.sailing.gwt.ui.shared.CompetitorDAO;
import com.sap.sailing.gwt.ui.shared.CompetitorsAndTimePointsDAO;
import com.sap.sailing.gwt.ui.shared.CompetitorInRaceDAO;
import com.sap.sailing.gwt.ui.shared.CompetitorsAndTimePointsDAO;
import com.sap.sailing.gwt.ui.shared.EventDAO;
import com.sap.sailing.gwt.ui.shared.GPSFixDAO;
import com.sap.sailing.gwt.ui.shared.LeaderboardDAO;
@@ -142,6 +150,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
private final com.sap.sailing.domain.tractracadapter.persistence.DomainObjectFactory tractracDomainObjectFactory;
private final com.sap.sailing.util.CountryCodeFactory countryCodeFactory;
private final Executor executor;
public SailingServiceImpl() {
BundleContext context = Activator.getDefault();
@@ -153,6 +163,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
tractracMongoObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory.INSTANCE;
swissTimingFactory = SwissTimingFactory.INSTANCE;
countryCodeFactory = com.sap.sailing.util.CountryCodeFactory.INSTANCE;
executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
}
protected ServiceTracker<RacingEventService, RacingEventService> createAndOpenRacingEventServiceTracker(
@@ -165,14 +176,14 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
@Override
public LeaderboardDAO getLeaderboardByName(String leaderboardName, Date date,
Collection<String> namesOfRacesForWhichToLoadLegDetails)
final Collection<String> namesOfRacesForWhichToLoadLegDetails)
throws NoWindException {
long startOfRequestHandling = System.currentTimeMillis();
LeaderboardDAO result = null;
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard != null) {
result = new LeaderboardDAO();
TimePoint timePoint = new MillisecondsTimePoint(date);
final TimePoint timePoint = new MillisecondsTimePoint(date);
result.competitors = new ArrayList<CompetitorDAO>();
result.name = leaderboard.getName();
result.competitorDisplayNames = new HashMap<CompetitorDAO, String>();
@@ -182,21 +193,41 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
result.rows = new HashMap<CompetitorDAO, LeaderboardRowDAO>();
result.hasCarriedPoints = leaderboard.hasCarriedPoints();
result.discardThresholds = leaderboard.getResultDiscardingRule().getDiscardIndexResultsStartingWithHowManyRaces();
for (Competitor competitor : leaderboard.getCompetitors()) {
for (final Competitor competitor : leaderboard.getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
LeaderboardRowDAO row = new LeaderboardRowDAO();
row.competitor = competitorDAO;
row.fieldsByRaceName = new HashMap<String, LeaderboardEntryDAO>();
row.carriedPoints = leaderboard.hasCarriedPoints(competitor) ? leaderboard.getCarriedPoints(competitor) : null;
result.competitors.add(competitorDAO);
for (RaceInLeaderboard raceColumn : leaderboard.getRaceColumns()) {
Entry entry = leaderboard.getEntry(competitor, raceColumn, timePoint);
LeaderboardEntryDAO entryDAO = getLeaderboardEntryDAO(entry, raceColumn.getTrackedRace(),
competitor, timePoint, namesOfRacesForWhichToLoadLegDetails != null
&& namesOfRacesForWhichToLoadLegDetails.contains(raceColumn.getName()));
row.fieldsByRaceName.put(raceColumn.getName(), entryDAO);
result.rows.put(competitorDAO, row);
Map<String, Future<LeaderboardEntryDAO>> futuresForColumnName = new HashMap<String, Future<LeaderboardEntryDAO>>();
for (final RaceInLeaderboard raceColumn : leaderboard.getRaceColumns()) {
final Entry entry = leaderboard.getEntry(competitor, raceColumn, timePoint);
RunnableFuture<LeaderboardEntryDAO> future = new FutureTask<LeaderboardEntryDAO>(new Callable<LeaderboardEntryDAO>() {
@Override
public LeaderboardEntryDAO call() {
try {
return getLeaderboardEntryDAO(entry, raceColumn.getTrackedRace(), competitor, timePoint,
namesOfRacesForWhichToLoadLegDetails != null
&& namesOfRacesForWhichToLoadLegDetails.contains(raceColumn.getName()));
} catch (NoWindException e) {
throw new NoWindError(e);
}
}
});
executor.execute(future);
futuresForColumnName.put(raceColumn.getName(), future);
}
for (Map.Entry<String, Future<LeaderboardEntryDAO>> raceColumnNameAndFuture : futuresForColumnName.entrySet()) {
try {
row.fieldsByRaceName.put(raceColumnNameAndFuture.getKey(), raceColumnNameAndFuture.getValue().get());
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
result.rows.put(competitorDAO, row);
String displayName = leaderboard.getDisplayName(competitor);
if (displayName != null) {
result.competitorDisplayNames.put(competitorDAO, displayName);
@@ -448,9 +479,9 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
@Override
public void removeAndUntrackedRace(EventAndRaceIdentifier eventAndRaceidentifier) throws Exception{
Event event = getEvent(eventAndRaceidentifier);
if(event!= null){
if(event!= null) {
RaceDefinition race = getRace(eventAndRaceidentifier);
if(race != null){
if(race != null) {
getService().removeRace(event, race);
}
}
@@ -1185,8 +1216,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
@Override
public String[] getCountryCodes() {
List<String> countryCodes = new ArrayList<String>();
for (CountryCode cc : countryCodeFactory.getAll()){
if (cc.getThreeLetterIOCCode() != null && !cc.getThreeLetterIOCCode().equals("")){
for (CountryCode cc : countryCodeFactory.getAll()) {
if (cc.getThreeLetterIOCCode() != null && !cc.getThreeLetterIOCCode().equals("")) {
countryCodes.add(cc.getThreeLetterIOCCode());
}
}
@@ -1201,22 +1232,22 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
TrackedRace trackedRace = getTrackedRace(race);
Iterable<Competitor> competitors = trackedRace.getRace().getCompetitors();
List<Competitor> selectedCompetitor = new ArrayList<Competitor>();
for (CompetitorDAO cDAO : competitorAndTimePointsDAO.getCompetitor()){
for (Competitor c : competitors){
if (c.getId().toString().equals(cDAO.id)){
for (CompetitorDAO cDAO : competitorAndTimePointsDAO.getCompetitor()) {
for (Competitor c : competitors) {
if (c.getId().toString().equals(cDAO.id)) {
selectedCompetitor.add(c);
}
}
}
switch (dataType){
switch (dataType) {
case CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
for (int c = 0; c < selectedCompetitor.size(); c++){
for (int c = 0; c < selectedCompetitor.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDAO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
}
@@ -1224,10 +1255,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
CompetitorDAO competitor = competitorAndTimePointsDAO.getCompetitor()[c];
competitorData.setRaceData(competitor, entries);
entries = new Double[competitorAndTimePointsDAO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
SpeedWithBearing speedOverGround = trackedLeg.getSpeedOverGround(time);
entries[i] = (speedOverGround == null) ? null : speedOverGround.getKnots();
}
@@ -1236,12 +1267,12 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
break;
case VELOCITY_MADE_GOOD_IN_KNOTS:
for (int c = 0; c < selectedCompetitor.size(); c++){
for (int c = 0; c < selectedCompetitor.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDAO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
}
@@ -1249,10 +1280,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
competitorData.setRaceData(competitorAndTimePointsDAO.getCompetitor()[c], entries);
CompetitorDAO competitor = competitorAndTimePointsDAO.getCompetitor()[c];
entries = new Double[competitorAndTimePointsDAO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Speed velocityMadeGood = trackedLeg.getVelocityMadeGood(time);
entries[i] = (velocityMadeGood == null) ? null : velocityMadeGood.getKnots();
}
@@ -1261,18 +1292,18 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
break;
case DISTANCE_TRAVELED:
for (int c = 0; c < selectedCompetitor.size(); c++){
for (int c = 0; c < selectedCompetitor.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDAO.getTimePoints().length];
double distanceOfPreviousLegs = 0;
double lastTraveledDistance = 0;
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
if (distanceTraveled != null){
if (distanceTraveled != null) {
double d = distanceTraveled.getMeters();
if (d < lastTraveledDistance){
if (d < lastTraveledDistance) {
distanceOfPreviousLegs += lastTraveledDistance;
}
lastTraveledDistance = d;
@@ -1283,14 +1314,14 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
competitorData.setRaceData(competitorAndTimePointsDAO.getCompetitor()[c], entries);
CompetitorDAO competitor = competitorAndTimePointsDAO.getCompetitor()[c];
entries = new Double[competitorAndTimePointsDAO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Distance distanceTraveled = trackedLeg.getDistanceTraveled(time);
if (distanceTraveled != null){
if (distanceTraveled != null) {
double d = distanceTraveled.getMeters();
if (d < lastTraveledDistance){
if (d < lastTraveledDistance) {
distanceOfPreviousLegs += lastTraveledDistance;
}
lastTraveledDistance = d;
@@ -1302,22 +1333,22 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
break;
case GAP_TO_LEADER_IN_SECONDS:
for (int c = 0; c < selectedCompetitor.size(); c++){
for (int c = 0; c < selectedCompetitor.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDAO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
}
}
competitorData.setRaceData(competitorAndTimePointsDAO.getCompetitor()[c], entries);
CompetitorDAO competitor = competitorAndTimePointsDAO.getCompetitor()[c];
entries = new Double[competitorAndTimePointsDAO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
entries[i] = trackedLeg.getGapToLeaderInSeconds(time);
}
}
@@ -1325,12 +1356,12 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
}
break;
case WINDWARD_DISTANCE_TO_OVERALL_LEADER:
for (int c = 0; c < selectedCompetitor.size(); c++){
for (int c = 0; c < selectedCompetitor.size(); c++) {
Double[] entries = new Double[competitorAndTimePointsDAO.getTimePoints().length];
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getTimePoints().length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getTimePoints()[i]);
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(time);
entries[i] = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
}
@@ -1338,10 +1369,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
competitorData.setRaceData(competitorAndTimePointsDAO.getCompetitor()[c], entries);
CompetitorDAO competitor = competitorAndTimePointsDAO.getCompetitor()[c];
entries = new Double[competitorAndTimePointsDAO.getMarkPassings(competitor).length];
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++){
for (int i = 0; i < competitorAndTimePointsDAO.getMarkPassings(competitor).length; i++) {
MillisecondsTimePoint time = new MillisecondsTimePoint(competitorAndTimePointsDAO.getMarkPassings(competitor)[i].getB());
TrackedLegOfCompetitor trackedLeg = trackedRace.getTrackedLeg(selectedCompetitor.get(c), time);
if (trackedLeg != null){
if (trackedLeg != null) {
Distance distanceToLeader = trackedLeg.getWindwardDistanceToOverallLeader(time);
entries[i] = (distanceToLeader == null) ? null : distanceToLeader.getMeters();
}
@@ -1401,15 +1432,36 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
public Map<CompetitorDAO, List<ManeuverDAO>> getManeuvers(RaceIdentifier raceIdentifier,
Map<CompetitorDAO, Date> from, Map<CompetitorDAO, Date> to) throws NoWindException {
Map<CompetitorDAO, List<ManeuverDAO>> result = new HashMap<CompetitorDAO, List<ManeuverDAO>>();
TrackedRace trackedRace = getTrackedRace(raceIdentifier);
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
final TrackedRace trackedRace = getTrackedRace(raceIdentifier);
Map<CompetitorDAO, Future<List<ManeuverDAO>>> futures = new HashMap<CompetitorDAO, Future<List<ManeuverDAO>>>();
for (final Competitor competitor : trackedRace.getRace().getCompetitors()) {
CompetitorDAO competitorDAO = getCompetitorDAO(competitor);
if (from.containsKey(competitorDAO)) {
TimePoint timePointFrom = new MillisecondsTimePoint(from.get(competitorDAO));
TimePoint timePointTo = new MillisecondsTimePoint(to.get(competitorDAO));
List<Maneuver> maneuversForCompetitor = trackedRace.getManeuvers(competitor, timePointFrom, timePointTo);
List<ManeuverDAO> maneuverDAOs = createManeuverDAOsForCompetitor(maneuversForCompetitor, trackedRace, competitor);
result.put(competitorDAO, maneuverDAOs);
final TimePoint timePointFrom = new MillisecondsTimePoint(from.get(competitorDAO));
final TimePoint timePointTo = new MillisecondsTimePoint(to.get(competitorDAO));
RunnableFuture<List<ManeuverDAO>> future = new FutureTask<List<ManeuverDAO>>(new Callable<List<ManeuverDAO>>() {
@Override
public List<ManeuverDAO> call() {
List<Maneuver> maneuversForCompetitor;
try {
maneuversForCompetitor = trackedRace.getManeuvers(competitor, timePointFrom, timePointTo);
} catch (NoWindException e) {
throw new NoWindError(e);
}
return createManeuverDAOsForCompetitor(maneuversForCompetitor, trackedRace, competitor);
}
});
executor.execute(future);
futures.put(competitorDAO, future);
}
}
for (Map.Entry<CompetitorDAO, Future<List<ManeuverDAO>>> competitorAndFuture : futures.entrySet()) {
try {
result.put(competitorAndFuture.getKey(), competitorAndFuture.getValue().get());
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
return result;
@@ -1516,7 +1568,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
NavigableSet<MarkPassing> markPassings = trackedRace.getMarkPassings(competitor);
List<Pair<String, Long>> markPassingTimes = new ArrayList<Pair<String,Long>>();
for (MarkPassing markPassing : markPassings){
for (MarkPassing markPassing : markPassings) {
markPassingTimes.add(new Pair<String, Long>(markPassing.getWaypoint().getName(), markPassing.getTimePoint().asMillis()));
}
competitors.add(getCompetitorDAO(competitor));