Merge branch 'master' into mak-buttonStyles

This commit is contained in:
Marcus Kammer committed 2012-07-18 09:23:11 +02:00
commit 33fe56904f
6 files changed
+94 -12

No files matched your search

@@ -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&nbsp;Net</font></th><th><font color="#FFFFFF">P&nbsp;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&nbsp;8808</p></td><td><p><span style="font-size:9pt;">DIAZ&nbsp;Augie</span><br>&nbsp;<span style="font-size:9pt;">LAWRENCE&nbsp;Luke</span>&nbsp;</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&nbsp;REEF&nbsp;YACHT&nbsp;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&nbsp;9057</p></td><td><p><span style="font-size:9pt;">LEWIS&nbsp;Chris</span><br>&nbsp;<span style="font-size:9pt;">PARSONS&nbsp;Dan</span>&nbsp;</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&nbsp;YACHT&nbsp;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&nbsp;8964</p></td><td><p><span style="font-size:9pt;">SAUGMANN&nbsp;Jan</span><br>&nbsp;<span style="font-size:9pt;">GORGE&nbsp;Martin</span>&nbsp;</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&nbsp;9080</p></td><td><p><span style="font-size:9pt;">HAMLIN&nbsp;Howard</span><br>&nbsp;<span style="font-size:9pt;">ZINN&nbsp;Andy</span>&nbsp;</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&nbsp;9075</p></td><td><p><a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0002567Z&amp;AnneeSportive=" target="_blank"><span style="font-size:9pt;">BOITE&nbsp;Philippe</span></a><br>&nbsp;<a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0730716N&amp;AnneeSportive=" target="_blank"><span style="font-size:9pt;">GALLO&nbsp;Pierre&nbsp;jean</span></a>&nbsp;</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&nbsp;V&nbsp;ST&nbsp;QUENTIN<br>S&nbsp;R&nbsp;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&nbsp;9007</p></td><td><p><span style="font-size:9pt;">MOORE&nbsp;Tyler</span><br>&nbsp;<span style="font-size:9pt;">EWENSON&nbsp;Geoff</span>&nbsp;</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&nbsp;8715</p></td><td><p><span style="font-size:9pt;">BIXBY&nbsp;Ethan</span><br>&nbsp;<span style="font-size:9pt;">BRADY&nbsp;Christopher</span>&nbsp;</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&nbsp;PETERSBURG&nbsp;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&nbsp;8083</p></td><td><p><span style="font-size:9pt;">BARRY&nbsp;Matthew</span><br>&nbsp;<span style="font-size:9pt;">BARROWS&nbsp;Thomas</span>&nbsp;</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&nbsp;CORINTHIAN&nbsp;YACHT&nbsp;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&nbsp;8904</p></td><td><p><a href="http://www.ffvoile.fr/ffv/sportif/cif/cif_detail.aspx?NoLicence=0429428W&amp;AnneeSportive=" target="_blank"><span style="font-size:9pt;">MARTIN&nbsp;Nicolas</span></a><br>&nbsp;<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&amp;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&amp;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>
@@ -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)( [^>]*)?>");
@@ -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("&nbsp;", " ").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("&nbsp;", " ").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("&nbsp;", " ").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("&nbsp;", "");
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);
}
@@ -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
@@ -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) {