mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 06:18:12 +00:00
Merge branch 'master' into mak-buttonStyles
This commit is contained in:
commit
33fe56904f
6 files changed
+94
-12
No files matched your search
+5
-2
@@ -89,14 +89,17 @@ public class MarkPositionReceiver extends AbstractReceiverWithQueue<ControlPoint
|
||||
public Iterable<TypeController> getTypeControllersAndStart() {
|
||||
List<TypeController> result = new ArrayList<TypeController>();
|
||||
TimePoint now = MillisecondsTimePoint.now();
|
||||
long fromTime = startOfTracking == null ? 0l : startOfTracking.compareTo(now) > 0 ? now.asMillis() : startOfTracking.asMillis();
|
||||
long toTime = endOfTracking == null ? Long.MAX_VALUE : endOfTracking.asMillis();
|
||||
logger.fine("subscribing to ControlPointPositionData for time range "+new MillisecondsTimePoint(fromTime)+"/"+
|
||||
new MillisecondsTimePoint(toTime));
|
||||
TypeController controlPointListener = ControlPointPositionData.subscribe(getTracTracEvent(),
|
||||
new ICallbackData<ControlPoint, ControlPointPositionData>() {
|
||||
@Override
|
||||
public void gotData(ControlPoint controlPoint, ControlPointPositionData record, boolean isLiveData) {
|
||||
enqueue(new Triple<ControlPoint, ControlPointPositionData, Boolean>(controlPoint, record, isLiveData));
|
||||
}
|
||||
}, /* fromTime */ startOfTracking == null ? 0l : startOfTracking.compareTo(now) > 0 ? now.asMillis() : startOfTracking.asMillis(),
|
||||
/* toTime */ endOfTracking == null ? Long.MAX_VALUE : endOfTracking.asMillis());
|
||||
}, fromTime, toTime);
|
||||
result.add(controlPointListener);
|
||||
setAndStartThread(new Thread(this, getClass().getName()));
|
||||
return result;
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<html><head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<title>PRE- WORLD 2012 - COUPE INTERNATIONALE DE FRANCE 505</title>
|
||||
<!-- base href="http://sapcoe-app01.pironet-ndh.com/p2/results505/pre_world_505_s.htm" -->
|
||||
<meta name="DESCRIPTION" content="Classement general PRE- WORLD 2012 - COUPE INTERNATIONALE DE FRANCE 505">
|
||||
<meta name="KEYWORDS" content="freg,freg2011,freg2007,freg2009,regate,voile,voilier,resultats,470,420,laser,optimist,catamaran,planche a voile,49er,quillard">
|
||||
|
||||
<script language="JavaScript">
|
||||
var message="Non autoris� (Vous devez respecter le Copyright)"
|
||||
function click(e) {if (document.all) { if (event.button == 2) {alert(message); return false;}}
|
||||
if (document.layers) { if (e.which == 3) {alert(message);return false;}}}
|
||||
if (document.layers) {document.captureEvents(Event.MOUSEDOWN);} document.onmousedown=click;
|
||||
</script>
|
||||
<script language="JavaScript">
|
||||
var nbSearch=0;function findInPage(str) { var txt, i, found; if (str=="") return false; if ((document.layers)||(window.sidebar)) { if (!window.find(str)) { alert("Fin de page atteinte."); while(window.find(str, false, true)) {nbSearch++;}} else nbSearch++; if (nbSearch == 0) alert('"'+str+'" est introuvable'); } if (document.all) { txt = window.document.body.createTextRange(); for (i = 0; i <= nbSearch && (found = txt.findText(str)) != false; i++) { txt.moveStart("character", 1); txt.moveEnd("textedit"); } if (found) { txt.moveStart("character", -1); txt.findText(str); txt.select(); txt.scrollIntoView(); nbSearch++; } else { if (nbSearch > 0) { alert("Fin de page atteinte."); nbSearch = 0; findInPage(str); } else { alert('"'+str+'" est introuvable'); } } } return false;}</script><style type="text/css">td { font-family: Verdana; font-size: 10pt; vertical-align: Top; text-align: Center }th { Font-family: Vernada; font-size: 12pt; color: white; vertical-align: Top; text-align: Center }p { text-align: Left; margin-top: 0; margin-bottom: 0 }.link { font-size: 10pt; font-weight: Bold; font-style: Italic }a:visited {color:#800088;}a:hover {color:#FF0000;}a:focus {color:#FF0000;}a:active {color:#0000FF;}</style></head>
|
||||
<body bgcolor="#FFFFFF"><p><a name="BR_MENU"></a></p><table bordercolordark="#0F8B8B" bordercolorlight="#6FCCCC" align="center" bgcolor="white" border="5" width="70%"><tbody><tr><td align="center" valign="middle"><font color="#0000FF" size="4"><b>PRE- WORLD 2012 - COUPE INTERNATIONALE DE FRANCE 505</b><br><b>Soci�t� des R�gates Rochelaises</b><br><b>-_-</b><br><b>BEFORE JURY DECISIONS</b><br><b></b><br><b>17/07/2012 au 19/07/2012</b><br></font></td></tr></tbody></table><br><font size="2"> Time 18.48, Tuesday , July 17 2012</font><br><table align="center" cellpadding="0" cellspacing="0"></table><hr size="3"><center><font color="#0000FF" size="4"><b><a name="GRP_1"></a>Results after 2 races ( Discards : 0 ) (INVALIDE tous n'ont pas le m�me nombre de courses)</b></font><font size="4"> (117 entries)</font>
|
||||
<form name="search" onsubmit="return findInPage(this.motcle.value);">
|
||||
<font color="navy" face="Arial" size="-1">
|
||||
<font size="3"><input name="motcle" size="30" onfocus="nbSearch=0; if (this.value=='Mot-cl�') {this.value=''}" type="text"></font><input value="Chercher/Search" type="submit"></font></form>
|
||||
<br><span style="font-size:8pt;">(Click on the underlined names to access the individual skipper's file)</span><p><font size="1"><table bordercolordark="white" bordercolorlight="black" align="CENTER" border="1" cellpadding="2" cellspacing="0"><tbody><tr bgcolor="#0F8B8B"><th><font color="#FFFFFF">Pos</font></th><th><font color="#FFFFFF">Sail</font></th><th><font color="#FFFFFF">Competitors</font></th><th><font color="#FFFFFF">P Net</font></th><th><font color="#FFFFFF">P tot</font></th><th><font color="#FFFFFF">r.1 </font></th><th><font color="#FFFFFF">r.2 </font></th><th><font color="#FFFFFF">Club/Country</font></th></tr><tr bgcolor="#91E4E4"><td><b> 1</b></td><td><p><img src="pre_world_505_s_files/USA.GIF" align="left" border="1" height="11" width="19">USA 8808</p></td><td><p><span style="font-size:9pt;">DIAZ Augie</span><br> <span style="font-size:9pt;">LAWRENCE Luke</span> </p></td><td><b> 4.00</b></td><td> 4.00</td><td>3<br><i>3.00</i></td><td><span style="background-color: #FFFF00">1<br><i>1.00</i></span></td><td><p>CORAL REEF YACHT CLUB<br>-</p></td></tr><tr bgcolor="#6FCCCC"><td><b> 2</b></td><td><p><img src="pre_world_505_s_files/GBR.GIF" align="left" border="1" height="11" width="19">GBR 9057</p></td><td><p><span style="font-size:9pt;">LEWIS Chris</span><br> <span style="font-size:9pt;">PARSONS Dan</span> </p></td><td><b> 4.00</b></td><td> 4.00</td><td><span style="background-color: #FFFF00">1<br><i>1.00</i></span></td><td>3<br><i>3.00</i></td><td><p>WHITSTABLE YACHT CLUB<br>-</p></td></tr><tr bgcolor="#91E4E4"><td><b> 3</b></td><td><p><img src="pre_world_505_s_files/DEN.GIF" align="left" border="1" height="11" width="19">DEN 8964</p></td><td><p><span style="font-size:9pt;">SAUGMANN Jan</span><br> <span style="font-size:9pt;">GORGE Martin</span> </p></td><td><b> 15.00</b></td><td> 15.00</td><td>10<br><i>10.00</i></td><td>5<br><i>5.00</i></td><td><p>HELLERUP<br>-</p></td></tr><tr bgcolor="#6FCCCC"><td><b> 4</b></td><td><p><img src="pre_world_505_s_files/USA.GIF" align="left" border="1" height="11" width="19">USA 9080</p></td><td><p><span style="font-size:9pt;">HAMLIN Howard</span><br> <span style="font-size:9pt;">ZINN Andy</span> </p></td><td><b> 16.00</b></td><td> 16.00</td><td>14<br><i>14.00</i></td><td><span style="background-color: #FFFFFF">2<br><i>2.00</i></span></td><td><p>NHYC<br>-</p></td></tr><tr bgcolor="#91E4E4"><td><b> 5</b></td><td><p><img src="pre_world_505_s_files/FRA.GIF" align="left" border="1" height="11" width="19">FRA 9075</p></td><td><p><a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0002567Z&AnneeSportive=" target="_blank"><span style="font-size:9pt;">BOITE Philippe</span></a><br> <a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0730716N&AnneeSportive=" target="_blank"><span style="font-size:9pt;">GALLO Pierre jean</span></a> </p></td><td><b> 16.00</b></td><td> 16.00</td><td><span style="background-color: #FFFFFF">2<br><i>2.00</i></span></td><td>14<br><i>14.00</i></td><td><p>C V ST QUENTIN<br>S R HAVRE</p></td></tr><tr bgcolor="#6FCCCC"><td><b> 6</b></td><td><p><img src="pre_world_505_s_files/USA.GIF" align="left" border="1" height="11" width="19">USA 9007</p></td><td><p><span style="font-size:9pt;">MOORE Tyler</span><br> <span style="font-size:9pt;">EWENSON Geoff</span> </p></td><td><b> 17.00</b></td><td> 17.00</td><td>9<br><i>9.00</i></td><td>8<br><i>8.00</i></td><td><p>HYC/WYC<br>-</p></td></tr><tr bgcolor="#91E4E4"><td><b> 7</b></td><td><p><img src="pre_world_505_s_files/USA.GIF" align="left" border="1" height="11" width="19">USA 8715</p></td><td><p><span style="font-size:9pt;">BIXBY Ethan</span><br> <span style="font-size:9pt;">BRADY Christopher</span> </p></td><td><b> 21.00</b></td><td> 21.00</td><td>4<br><i>4.00</i></td><td>17<br><i>17.00</i></td><td><p>ST PETERSBURG YC<br>-</p></td></tr><tr bgcolor="#6FCCCC"><td><b> 8</b></td><td><p><img src="pre_world_505_s_files/USA.GIF" align="left" border="1" height="11" width="19">USA 8083</p></td><td><p><span style="font-size:9pt;">BARRY Matthew</span><br> <span style="font-size:9pt;">BARROWS Thomas</span> </p></td><td><b> 22.00</b></td><td> 22.00</td><td>16<br><i>16.00</i></td><td>6<br><i>6.00</i></td><td><p>YALE CORINTHIAN YACHT CLUB<br>-</p></td></tr><tr bgcolor="#91E4E4"><td><b> 9</b></td><td><p><img src="pre_world_505_s_files/FRA.GIF" align="left" border="1" height="11" width="19">FRA 8904</p></td><td><p><a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0429428W&AnneeSportive=" target="_blank"><span style="font-size:9pt;">MARTIN Nicolas</span></a><br> <a href="http://www.ffvoile.fr/ffv/sportif/cif/cLine truncated
|
||||
<center><hr size="5" width="100%"><p><font face="Arial" size="2"></font></p><div align="center"><table border="0" cellspacing="12" width="70%"><tbody><tr><td width="300"><p align="left"><font size="2"><b><a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0695575H&AnneeSportive=" target="_blank">LEMAIRE Pierre</a></b><br><b>Pr�sident du Comit� de Course</b></font></p></td><td width="300"><p align="right"><font size="2"><b>EDWARDS Jack</b><br><b>Pr�sident du Jury</b></font></p></td></tr></tbody></table></div><hr size="5" width="100%"><center><font face="Arial" size="2"><font face="Verdana, Arial, Helvetica" size="1">Produit le 17/07/2012 par <a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0538540E&AnneeSportive=" target="_blank">GAUTIER Annick</a> et logiciel <a href="http://freg.ffvoile.org/" target="_blank">FReg2011</a> (vers. 12/07/2012) FFVoile © 2001/2011<br></font></font></center></center><font face="Arial" size="2"> </font></body></html>
|
||||
+34
@@ -29,6 +29,40 @@ public class SimpleHtmlParsingTest {
|
||||
br.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptyAndDashedScores() throws IOException {
|
||||
final InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("pre_world_505_s.htm");
|
||||
FregHtmlParser parser = new FregHtmlParser();
|
||||
List<CompetitorRow> result = parser.getRegattaResults(resourceAsStream).getCompetitorResults();
|
||||
assertFalse(result.isEmpty());
|
||||
assertEquals(117, result.size());
|
||||
for (CompetitorRow row : result) {
|
||||
if (Util.contains(row.getNames(), "NIEMINEN Jukka")) {
|
||||
assertEquals("FIN 8768", row.getSailID());
|
||||
assertEquals(118, row.getScoreAfterDiscarding(), 0.000000001);
|
||||
assertEquals(118.00, row.getTotalPointsBeforeDiscarding(), 0.000000001);
|
||||
assertNull(Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).getRank());
|
||||
assertNull(Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).getScore());
|
||||
assertEquals(false, Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).isDiscarded());
|
||||
assertNull(Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).getRank());
|
||||
assertEquals((double) 118.00, (double) Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).getScore(), 0.000000001);
|
||||
assertEquals(false, Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).isDiscarded());
|
||||
} else if (Util.contains(row.getNames(), "HAGAN Douglas")) {
|
||||
assertEquals("AUS 8817", row.getSailID());
|
||||
assertEquals(235.00, row.getScoreAfterDiscarding(), 0.000000001);
|
||||
assertEquals(235.00, row.getTotalPointsBeforeDiscarding(), 0.000000001);
|
||||
assertNull(Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).getRank());
|
||||
assertEquals("DNF", Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).getMaxPointsReason());
|
||||
assertEquals((double) 117.00, (double) Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).getScore(), 0.000000001);
|
||||
assertEquals(false, Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 0).isDiscarded());
|
||||
assertNull(Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).getRank());
|
||||
assertEquals("DNF", Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).getMaxPointsReason());
|
||||
assertEquals((double) 118.00, (double) Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).getScore(), 0.000000001);
|
||||
assertEquals(false, Util.get(row.getRankAndMaxPointsReasonAndPointsAndDiscarded(), 1).isDiscarded());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void matchAngleBracketTest() {
|
||||
Pattern tr = Pattern.compile("<(tr|TR)( [^>]*)?>");
|
||||
|
||||
+20
-9
@@ -125,18 +125,24 @@ public class FregHtmlParser {
|
||||
}
|
||||
|
||||
private CompetitorRow createCompetitorRow(List<String> tdContent) {
|
||||
Integer totalRank = getInt(tdContent.get(0));
|
||||
String sailID = getSailID(tdContent.get(1)).replace(" ", " ").trim();
|
||||
List<String> names = getNames(tdContent.get(2));
|
||||
Double scoreAfterDiscarding = getScore(tdContent.get(3));
|
||||
Double totalPointsBeforeDiscarding = getScore(tdContent.get(4));
|
||||
List<String> bold = getTagContents(tdContent.get(0), "b");
|
||||
Integer totalRank;
|
||||
if (bold != null && !bold.isEmpty()) {
|
||||
totalRank = getInt(bold.get(0).trim());
|
||||
} else {
|
||||
totalRank = getInt(tdContent.get(0).trim());
|
||||
}
|
||||
String sailID = getSailID(tdContent.get(1).trim()).replace(" ", " ").trim();
|
||||
List<String> names = getNames(tdContent.get(2).trim());
|
||||
Double scoreAfterDiscarding = getScore(tdContent.get(3).trim());
|
||||
Double totalPointsBeforeDiscarding = getScore(tdContent.get(4).trim());
|
||||
List<CompetitorEntry> rankAndMaxPointsReasonAndPointsAndDiscarded = new ArrayList<CompetitorEntry>();
|
||||
for (int i=5; i<tdContent.size()-1; i++) {
|
||||
CompetitorEntry rankAndMaxPointsReasonAndPointsAndDiscardedForOnceRace =
|
||||
getRankAndMaxPointsReasonAndPointsAndDiscardedForOnceRace(tdContent.get(i));
|
||||
getRankAndMaxPointsReasonAndPointsAndDiscardedForOnceRace(tdContent.get(i).trim());
|
||||
rankAndMaxPointsReasonAndPointsAndDiscarded.add(rankAndMaxPointsReasonAndPointsAndDiscardedForOnceRace);
|
||||
}
|
||||
String[] clubNameAndCountry = getTagContents(tdContent.get(tdContent.size()-1), "p").get(0).split("<(br|BR)>");
|
||||
String[] clubNameAndCountry = getTagContents(tdContent.get(tdContent.size()-1).trim(), "p").get(0).trim().split("<(br|BR)>");
|
||||
String clubName = clubNameAndCountry[0].replace(" ", " ").trim();
|
||||
return new CompetitorRowImpl(totalRank, sailID, names, scoreAfterDiscarding, totalPointsBeforeDiscarding,
|
||||
rankAndMaxPointsReasonAndPointsAndDiscarded, clubName);
|
||||
@@ -147,6 +153,7 @@ public class FregHtmlParser {
|
||||
boolean isDiscarded;
|
||||
String maxPointsReason;
|
||||
String results;
|
||||
cell = cell.replace(" ", "");
|
||||
List<String> discarded = getTagContents(cell, "strike");
|
||||
if (discarded.isEmpty()) {
|
||||
List<String> colorized = getTagContents(cell, "span"); // could be a background-color-styled span for 1st and 2nd rank
|
||||
@@ -168,9 +175,13 @@ public class FregHtmlParser {
|
||||
} catch (NumberFormatException nfe) {
|
||||
// must have been a disqualification / max-points-reason
|
||||
rank = null;
|
||||
maxPointsReason = lines[0];
|
||||
if (lines.length==0 || lines[0].trim().length() == 0 || lines[0].trim().contains("--")) {
|
||||
maxPointsReason = "DNC";
|
||||
} else {
|
||||
maxPointsReason = lines[0];
|
||||
}
|
||||
}
|
||||
Double points = Double.valueOf(getTagContents(lines[1], "i").get(0));
|
||||
Double points = lines.length < 2 ? null : Double.valueOf(getTagContents(lines[1], "i").get(0));
|
||||
return new CompetitorEntryImpl(rank, maxPointsReason, points, isDiscarded);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ public class ScoreCorrectionForCompetitorInRaceImpl implements ScoreCorrectionFo
|
||||
discarded = false;
|
||||
} else {
|
||||
this.discarded = competitorEntry.isDiscarded();
|
||||
points = (int) (double) competitorEntry.getScore();
|
||||
points = (int) (competitorEntry.getScore() == null ? 0 : (double) competitorEntry.getScore());
|
||||
MaxPointsReason mpe = null;
|
||||
if (competitorEntry.getMaxPointsReason() != null && competitorEntry.getMaxPointsReason().length() > 0) {
|
||||
// no int; try parsing a MaxPointsReason
|
||||
|
||||
+13
@@ -27,6 +27,7 @@ import com.google.gwt.maps.client.control.ControlPosition;
|
||||
import com.google.gwt.maps.client.control.LargeMapControl3D;
|
||||
import com.google.gwt.maps.client.control.MenuMapTypeControl;
|
||||
import com.google.gwt.maps.client.control.ScaleControl;
|
||||
import com.google.gwt.maps.client.event.MapClickHandler;
|
||||
import com.google.gwt.maps.client.event.MapDragEndHandler;
|
||||
import com.google.gwt.maps.client.event.MapMouseMoveHandler;
|
||||
import com.google.gwt.maps.client.event.MapZoomEndHandler;
|
||||
@@ -269,6 +270,18 @@ public class RaceMap extends AbsolutePanel implements TimeListener, CompetitorSe
|
||||
RaceMap.this.add(combinedWindPanel, 10, 10);
|
||||
RaceMap.this.raceMapImageManager.loadMapIcons(map);
|
||||
map.setSize("100%", "100%");
|
||||
map.addMapClickHandler(new MapClickHandler() {
|
||||
@Override
|
||||
public void onClick(MapClickEvent event) {
|
||||
if (event.getOverlay() == null) { // nothing hit; consider click on map the play/pause action
|
||||
if (timer.getPlayState() == PlayStates.Playing) {
|
||||
timer.pause();
|
||||
} else if (timer.getPlayState() == PlayStates.Paused || timer.getPlayState() == PlayStates.Stopped) {
|
||||
timer.play();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
map.addMapZoomEndHandler(new MapZoomEndHandler() {
|
||||
@Override
|
||||
public void onZoomEnd(MapZoomEndEvent event) {
|
||||
|
||||
Reference in new issue
Block a user