diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java index b92711dddbe..126fa5b4e23 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/AbstractChartPanel.java @@ -72,7 +72,7 @@ import com.sap.sailing.gwt.ui.shared.components.Component; public abstract class AbstractChartPanel extends RaceChart implements CompetitorSelectionChangeListener, RequiresResize { private static final int LINE_WIDTH = 1; - private CompetitorsRaceDataDTO chartData; + private static final int MAX_SERIES_POINTS = 10000; private boolean compactChart; private final Label noCompetitorsSelectedLabel; private final Map dataSeriesByCompetitor; @@ -95,7 +95,6 @@ public abstract class AbstractChartPanel ext this.allowTimeAdjust = allowTimeAdjust; dataSeriesByCompetitor = new HashMap(); markPassingSeriesByCompetitor = new HashMap(); - chartData = null; setSize("100%", "100%"); noCompetitorsSelectedLabel = new Label(stringMessages.selectAtLeastOneCompetitor() + "."); @@ -196,53 +195,27 @@ public abstract class AbstractChartPanel ext } } - private void loadData(final Date from, final Date to, List competitors, boolean append) { - if(chartData != null && chartData.getDetailType() != selectedDetailType) { - chartData = null; - } - + private void loadData(final Date from, final Date to, final List competitors, final boolean append) { + showLoading(stringMessages.loadingCompetitorData()); ArrayList competitorsToLoad = new ArrayList(); for (CompetitorDTO competitorDTO : competitors) { competitorsToLoad.add(competitorDTO); } - -// Date chartDataDateOfNewestData = chartData.getDateOfNewestData(); -// Date competitorDateOfNewestData = chartData.contains(competitor) ? chartData.getCompetitorData(competitor) -// .getDateOfNewestData() : null; -// if (!chartData.contains(competitor)) { -// competitorsToLoad.add(new Pair(new Date(0), competitor)); -// } else if (competitorDateOfNewestData.before(chartDataDateOfNewestData) -// || competitorDateOfNewestData.before(timeRangeWithZoomProvider.getToTime())) { -// competitorsToLoad.add(new Pair(new Date(competitorDateOfNewestData.getTime() -// + getStepSize()), competitor)); -// } - showLoading(stringMessages.loadingCompetitorData()); GetCompetitorsRaceDataAction getCompetitorsRaceDataAction = new GetCompetitorsRaceDataAction(sailingService, selectedRaceIdentifier, competitorsToLoad, from, to, getStepSize(), getSelectedDetailType(), new AsyncCallback() { @Override - public void onSuccess(CompetitorsRaceDataDTO result) { - if (result != null) { - timeOfEarliestRequestInMillis = result.getRequestedFromTime().getTime(); - timeOfLatestRequestInMillis = result.getRequestedToTime().getTime(); - - if(chartData == null) { - chartData = result; - } else { - for (CompetitorRaceDataDTO competitorData : result.getAllRaceData()) { - if (chartData.contains(competitorData.getCompetitor())) { - chartData.addCompetitorRaceData(competitorData); - chartData.setCompetitorMarkPassingsData(competitorData); - } else { - chartData.setCompetitorData(competitorData.getCompetitor(), competitorData); - } - } - } - } + public void onSuccess(final CompetitorsRaceDataDTO result) { hideLoading(); - drawChartData(); + if (result != null) { + updateChartSeries(result, append); + } else { + if (!append) { + clearChart(); + } + } } @Override @@ -291,63 +264,72 @@ public abstract class AbstractChartPanel ext /** * Creates the series for all selected competitors if these aren't created yet.
* Fills the series for the selected competitors with the data in {@link AbstractChartPanel#chartData}.
- * Removes series of competitors, which aren't selected and adds series for competitors, which are newly selected.
- * Also {@link #forceTimeLineUpdate() updates} the {@link #timeLineSeries} if {@link #timeLineNeedsUpdate} is - * true.
- *
- * - * The data for all {@link #getSelectedCompetitors() visible competitors} needs to be filled before calling this - * method. */ - private synchronized void drawChartData() { + private synchronized void updateChartSeries(CompetitorsRaceDataDTO chartData, boolean append) { // Make sure the busy indicator is removed at this point, or plotting the data results in an exception setWidget(chart); - if (chartData != null) { - List chartSeries = Arrays.asList(chart.getSeries()); - for (CompetitorDTO competitor : getSelectedCompetitors()) { - Series competitorDataSeries = getOrCreateCompetitorDataSeries(competitor); - Series markPassingSeries = getOrCreateCompetitorMarkPassingSeries(competitor); - CompetitorRaceDataDTO competitorData = chartData.getCompetitorData(competitor); - if (competitorData != null) { - Date toDate = new Date(System.currentTimeMillis() - timer.getLivePlayDelayInMillis()); - - List> markPassingsData = competitorData.getMarkPassingsData(); - List markPassingPoints = new ArrayList(); - for (Triple markPassingData : markPassingsData) { - if (markPassingData.getB() != null && markPassingData.getC() != null) { - if (markPassingData.getB().before(toDate)) { - Point markPassingPoint = new Point(markPassingData.getB().getTime(), - markPassingData.getC()); - markPassingPoint.setName(markPassingData.getA()); - markPassingPoints.add(markPassingPoint); - } + List chartSeries = Arrays.asList(chart.getSeries()); + for (CompetitorDTO competitor : chartData.getCompetitors()) { + Series competitorDataSeries = getOrCreateCompetitorDataSeries(competitor); + Series markPassingSeries = getOrCreateCompetitorMarkPassingSeries(competitor); + CompetitorRaceDataDTO competitorData = chartData.getCompetitorData(competitor); + if (competitorData != null) { + Date toDate = new Date(System.currentTimeMillis() - timer.getLivePlayDelayInMillis()); + + List> markPassingsData = competitorData.getMarkPassingsData(); + List markPassingPoints = new ArrayList(); + for (Triple markPassingData : markPassingsData) { + if (markPassingData.getB() != null && markPassingData.getC() != null) { + if (markPassingData.getB().before(toDate)) { + Point markPassingPoint = new Point(markPassingData.getB().getTime(), + markPassingData.getC()); + markPassingPoint.setName(markPassingData.getA()); + markPassingPoints.add(markPassingPoint); } } - markPassingSeries.setPoints(markPassingPoints.toArray(new Point[0])); + } + markPassingSeries.setPoints(markPassingPoints.toArray(new Point[0]), false); - Point[] compSeriesPoints = competitorDataSeries.getPoints(); - Date dateOfNewestSeriesPoint = compSeriesPoints.length == 0 ? null : new Date( - compSeriesPoints[compSeriesPoints.length - 1].getX().longValue()); - List> raceData = dateOfNewestSeriesPoint == null ? competitorData.getRaceData() - : competitorData.getRaceDataAfterDate(dateOfNewestSeriesPoint); - for (Pair data : raceData) { - if (data.getA() != null && data.getB() != null) { - if (data.getA().before(toDate)) { - Point competitorPoint = new Point(data.getA().getTime(), data.getB()); - competitorDataSeries.addPoint(competitorPoint); - } + Point[] oldRaceDataPoints = competitorDataSeries.getPoints(); + List> raceData = competitorData.getRaceData(); + + Point[] raceDataPointsToAdd = new Point[raceData.size()]; + int currentPointIndex = 0; + for (Pair raceDataPoint : raceData) { + Double dataPointValue = raceDataPoint.getB(); + if(dataPointValue != null) { + long dataPointTimeAsMillis = raceDataPoint.getA().getTime(); + if(append == false || (timeOfEarliestRequestInMillis == null || dataPointTimeAsMillis < timeOfEarliestRequestInMillis) || + timeOfLatestRequestInMillis == null || dataPointTimeAsMillis > timeOfLatestRequestInMillis) { + raceDataPointsToAdd[currentPointIndex++] = new Point(dataPointTimeAsMillis, dataPointValue); } } + } - // Adding the series if chart doesn't contain it - if (!chartSeries.contains(competitorDataSeries)) { - chart.addSeries(competitorDataSeries); - chart.addSeries(markPassingSeries); - } + Point[] newRaceDataPoints; + if (append) { + newRaceDataPoints = new Point[oldRaceDataPoints.length + currentPointIndex]; + System.arraycopy(oldRaceDataPoints, 0, newRaceDataPoints, 0, oldRaceDataPoints.length); + System.arraycopy(raceDataPointsToAdd, 0, newRaceDataPoints, oldRaceDataPoints.length, currentPointIndex); + } else { + newRaceDataPoints = new Point[currentPointIndex]; + System.arraycopy(raceDataPointsToAdd, 0, newRaceDataPoints, 0, currentPointIndex); + } + + competitorDataSeries.setPoints(newRaceDataPoints, false); + + // Adding the series if chart doesn't contain it + if (!chartSeries.contains(competitorDataSeries)) { + chart.addSeries(competitorDataSeries); + chart.addSeries(markPassingSeries); } } } + + timeOfEarliestRequestInMillis = chartData.getRequestedFromTime().getTime(); + timeOfLatestRequestInMillis = chartData.getRequestedToTime().getTime(); + // if (!isZoomed) { // chart.getXAxis().setMin(timeRangeWithZoomProvider.getFromTime().getTime()); // chart.getXAxis().setMax(timeRangeWithZoomProvider.getToTime().getTime()); @@ -377,6 +359,7 @@ public abstract class AbstractChartPanel ext .setMarker(new Marker().setEnabled(false).setHoverState(new Marker().setEnabled(true).setRadius(4))) .setShadow(false).setHoverStateLineWidth(LINE_WIDTH) .setColor(competitorSelectionProvider.getColor(competitor)).setSelected(true)); + result.setOption("turboThreshold", MAX_SERIES_POINTS); dataSeriesByCompetitor.put(competitor, result); } return result; @@ -435,7 +418,6 @@ public abstract class AbstractChartPanel ext * Clears the whole chart and empties cached data. */ protected void clearChart() { - setChartData(null); timeOfEarliestRequestInMillis = null; timeOfLatestRequestInMillis = null; dataSeriesByCompetitor.clear(); @@ -540,14 +522,6 @@ public abstract class AbstractChartPanel ext return hasDetailTypeChanged; } - protected CompetitorsRaceDataDTO getChartData() { - return chartData; - } - - protected void setChartData(CompetitorsRaceDataDTO chartData) { - this.chartData = chartData; - } - @Override public void onRaceSelectionChange(List selectedRaces) { if (selectedRaces != null && !selectedRaces.isEmpty()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java index 22ce7814f58..d5456d474f2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/ChartPanel.java @@ -45,9 +45,11 @@ public class ChartPanel extends AbstractChartPanel implements Com @Override public void updateSettings(ChartSettings newSettings) { - updateSettingsOnly(newSettings); - clearChart(); - timeChanged(timer.getTime()); + boolean settingsChanged = updateSettingsOnly(newSettings); + if(settingsChanged) { + clearChart(); + timeChanged(timer.getTime()); + } } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java index de4c263b12a..fed952f5d94 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/MultiChartPanel.java @@ -43,6 +43,7 @@ public class MultiChartPanel extends AbstractChartPanel impl boolean settingsChanged = updateSettingsOnly(newSettings); boolean selectedDetailTypeChanged = setSelectedDetailType(newSettings.getDetailType()); if (selectedDetailTypeChanged || settingsChanged) { + clearChart(); timeChanged(timer.getTime()); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java index 49ef1a96f9b..d1dc00c1289 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/charts/WindChart.java @@ -60,6 +60,8 @@ import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; public class WindChart extends RaceChart implements Component, RequiresResize { private static final int LINE_WIDTH = 1; + private static final int MAX_SERIES_POINTS = 10000; + private final WindChartSettings settings; /** @@ -283,6 +285,7 @@ public class WindChart extends RaceChart implements Component .setType(Series.Type.LINE) .setName(stringMessages.fromDeg()+" "+WindSourceTypeFormatter.format(windSource, stringMessages)) .setYAxis(0) + .setOption("turboThreshold", MAX_SERIES_POINTS) .setPlotOptions(new LinePlotOptions().setColor(colorMap.getColorByID(windSource)).setSelected(true)); return newSeries; } @@ -297,6 +300,7 @@ public class WindChart extends RaceChart implements Component .setType(Series.Type.LINE) .setName(stringMessages.windSpeed()+" "+WindSourceTypeFormatter.format(windSource, stringMessages)) .setYAxis(1) // use the second Y-axis + .setOption("turboThreshold", MAX_SERIES_POINTS) .setPlotOptions(new LinePlotOptions().setDashStyle(PlotLine.DashStyle.SHORT_DOT) .setLineWidth(3).setHoverStateLineWidth(3) .setColor(colorMap.getColorByID(windSource)).setSelected(true)); // show only the markers, not the connecting lines @@ -307,7 +311,7 @@ public class WindChart extends RaceChart implements Component * Updates the wind charts with the wind data from result. If append is true, previously * existing points in the chart are left unchanged. Otherwise, the existing wind series are replaced. */ - public void updateStripChartSeries(WindInfoForRaceDTO result, boolean append) { + public void updateChartSeries(WindInfoForRaceDTO result, boolean append) { final NumberFormat numberFormat = NumberFormat.getFormat("0"); Long newMinTimepoint = timeOfEarliestRequestInMillis; Long newMaxTimepoint = timeOfLatestRequestInMillis; @@ -428,7 +432,7 @@ public class WindChart extends RaceChart implements Component /** * Sets the visibilities of the wind source series based on the new settings. Note that this does not - * re-load any wind data. This has to happen by calling {@link #updateStripChartSeries(WindInfoForRaceDTO, boolean)}. + * re-load any wind data. This has to happen by calling {@link #updateChartSeries(WindInfoForRaceDTO, boolean)}. */ @Override public void updateSettings(WindChartSettings newSettings) { @@ -473,7 +477,7 @@ public class WindChart extends RaceChart implements Component @Override public void onSuccess(WindInfoForRaceDTO result) { if (result != null) { - updateStripChartSeries(result, append); + updateChartSeries(result, append); updateVisibleSeries(); } else { if (!append) { diff --git a/java/com.sap.sailing.monitoring/src/com/sap/sailing/monitoring/AbstractPortMonitor.java b/java/com.sap.sailing.monitoring/src/com/sap/sailing/monitoring/AbstractPortMonitor.java index 03fdbe2e325..d84bae006b1 100644 --- a/java/com.sap.sailing.monitoring/src/com/sap/sailing/monitoring/AbstractPortMonitor.java +++ b/java/com.sap.sailing.monitoring/src/com/sap/sailing/monitoring/AbstractPortMonitor.java @@ -2,10 +2,13 @@ package com.sap.sailing.monitoring; import java.io.IOException; import java.net.ConnectException; +import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.MalformedURLException; import java.net.Socket; import java.net.SocketTimeoutException; +import java.net.URL; import java.util.Properties; import java.util.logging.Logger; @@ -41,13 +44,24 @@ public abstract class AbstractPortMonitor extends Thread { this.endpoints = new Endpoint[prop_endpoints.length]; for (int i=0; i bundles = new HashMap(); - public OSGiRestartingPortMonitor(Properties properties) { super(properties); - /* store bundles so that we can reference them later without iterating every time */ - for (Bundle bundle : Activator.getContext().getBundles()) { - bundles.put(bundle.getSymbolicName(), bundle); - } - - String[] prop_services = properties.getProperty("monitor.services").split(","); + String[] prop_services = properties.getProperty("monitor.bundles").split(","); for (int i=0; i
- Sailer + Sailer

Extreme Sailing Series 2012

@@ -43,11 +43,11 @@

6th - 9th December

diff --git a/java/com.sap.sailing.www.events/ess40/mobile.html b/java/com.sap.sailing.www.events/ess40/mobile.html index 0a058fe5990..323a57f4001 100644 --- a/java/com.sap.sailing.www.events/ess40/mobile.html +++ b/java/com.sap.sailing.www.events/ess40/mobile.html @@ -26,10 +26,10 @@

diff --git a/java/com.sap.sailing.www.events/images/ess40-bg-image.jpg b/java/com.sap.sailing.www.events/images/ess40-bg-image.jpg new file mode 100644 index 00000000000..b87ae743e3e Binary files /dev/null and b/java/com.sap.sailing.www.events/images/ess40-bg-image.jpg differ diff --git a/java/com.sap.sailing.www.events/images/ess40-key-visual.jpg b/java/com.sap.sailing.www.events/images/ess40-key-visual.jpg new file mode 100644 index 00000000000..ac6aa1ef51a Binary files /dev/null and b/java/com.sap.sailing.www.events/images/ess40-key-visual.jpg differ diff --git a/java/com.sap.sailing.www.events/site.css b/java/com.sap.sailing.www.events/site.css index 5346a044f4f..46ff0e72d4c 100644 --- a/java/com.sap.sailing.www.events/site.css +++ b/java/com.sap.sailing.www.events/site.css @@ -67,7 +67,7 @@ body { font-size: 12px; font-family: OpenSansRegular, Arial, Verdana, sans-serif; font-weight: normal; - background-image: url(images/bg-image.jpg); + background-image: url(images/ess40-bg-image.jpg); background-attachment: fixed; background-color: #222222; background-position: 50% 0%; diff --git a/java/target/configuration/monitoring.properties b/java/target/configuration/monitoring.properties index 9d676d61202..c984fe0d379 100644 --- a/java/target/configuration/monitoring.properties +++ b/java/target/configuration/monitoring.properties @@ -17,11 +17,19 @@ monitor.timeout = 2000 # provided in milliseconds monitor.wait_after_failure = 60000 -# endpoints that should be checked, separate by comma, each in the format host:port, e.g., test.something.com:80 -monitor.endpoints = 127.0.0.1:8888, 127.0.0.1:8889 +# endpoints that should be checked, separate by comma +# two formats are valid, each yielding a different check +# - address:port +# This format leads to a simple port check. Use this if +# you want to check if a server is still running (e.g. jetty) +# +# - http://domain_or_address/path/to/check +# This format leads to a check that only succeeds if a status +# code of 200 is returned. +monitor.endpoints = http://127.0.0.1:8889/gwt/RaceBoard.html, http://127.0.0.1:8889/ -# service name associated to endpoints -monitor.services = com.sap.sailing.server, com.sap.sailing.server +# bundle associated to endpoints +monitor.bundles = com.sap.sailing.gwt.ui, com.sap.sailing.www # mail configuration mail.from = info@sapsailing.com