mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-13 14:12:11 +00:00
Merge branch 'master' into bug5174
This commit is contained in:
commit
0abaa93e44
194 files changed
+1390
-451
No files matched your search
@@ -100,6 +100,9 @@ public enum DetailType implements Serializable {
|
||||
OVERALL_TOTAL_DURATION_FOILED_IN_SECONDS(0, DESCENDING, "TOTAL_DURATION_FOILED_IN_SECONDS"),
|
||||
OVERALL_TOTAL_DISTANCE_FOILED_IN_METERS(0, DESCENDING, "TOTAL_DISTANCE_FOILED_IN_METERS"),
|
||||
RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS(2, DESCENDING),
|
||||
RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES(1, ASCENDING),
|
||||
RACE_CURRENT_POSITION_LAT_DEG(10, ASCENDING),
|
||||
RACE_CURRENT_POSITION_LNG_DEG(10, ASCENDING),
|
||||
BRAVO_RACE_CURRENT_RIDE_HEIGHT_IN_METERS(2, DESCENDING),
|
||||
RACE_CURRENT_DISTANCE_FOILED_IN_METERS(0, DESCENDING),
|
||||
RACE_CURRENT_DURATION_FOILED_IN_SECONDS(0, DESCENDING),
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ public class FixFactory {
|
||||
int i=1;
|
||||
JSONArray values;
|
||||
while ((values=(JSONArray) fixesJson.get(""+i)) != null) {
|
||||
valuesPerSubindex.put(i, (Number) values.get(fixIndex));
|
||||
valuesPerSubindex.put(i, values.get(fixIndex));
|
||||
i++;
|
||||
}
|
||||
Sensor sensor = new SensorImpl(deviceSerialNumber,
|
||||
|
||||
+5
@@ -1159,6 +1159,11 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
|
||||
UUID id = (UUID) eventDBObject.get(FieldNames.EVENT_ID.name());
|
||||
TimePoint startDate = loadTimePoint(eventDBObject, FieldNames.EVENT_START_DATE);
|
||||
TimePoint endDate = loadTimePoint(eventDBObject, FieldNames.EVENT_END_DATE);
|
||||
if (endDate.before(startDate)) {
|
||||
logger.warning("End date "+endDate+" of event "+name+" with ID "+id+" is before its start date "+
|
||||
startDate+"; adjusting such that end date equals start date.");
|
||||
endDate = startDate;
|
||||
}
|
||||
boolean isPublic = eventDBObject.get(FieldNames.EVENT_IS_PUBLIC.name()) != null
|
||||
? (Boolean) eventDBObject.get(FieldNames.EVENT_IS_PUBLIC.name()) : false;
|
||||
Venue venue = loadVenue((Document) eventDBObject.get(FieldNames.VENUE.name()));
|
||||
|
||||
+40
-31
@@ -15,6 +15,10 @@ import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
@@ -70,7 +74,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
private Course course;
|
||||
private Regatta domainRegatta;
|
||||
private DynamicTrackedRegatta trackedRegatta;
|
||||
private final IControlRoute[] routeData = new IControlRoute[1];
|
||||
private CompletableFuture<IControlRoute> routeDataFuture;
|
||||
private DomainFactory domainFactory;
|
||||
|
||||
public CourseUpdateTest() throws URISyntaxException, MalformedURLException {
|
||||
@@ -80,6 +84,7 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
routeDataFuture = new CompletableFuture<>();
|
||||
domainFactory = new DomainFactoryImpl(new com.sap.sailing.domain.base.impl.DomainFactoryImpl(com.sap.sailing.domain.base.DomainFactory.TEST_RACE_LOG_RESOLVER));
|
||||
domainRegatta = domainFactory.getOrCreateDefaultRegatta(EmptyRaceLogStore.INSTANCE, EmptyRegattaLogStore.INSTANCE,
|
||||
getTracTracRace(), /* trackedRegattaRegistry */ null);
|
||||
@@ -99,9 +104,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
@Override
|
||||
protected void handleEvent(Triple<IControlRoute, Long, Void> event) {
|
||||
super.handleEvent(event);
|
||||
synchronized (routeData) {
|
||||
routeData[0] = event.getA();
|
||||
routeData.notifyAll();
|
||||
if (!event.getA().getControls().isEmpty()) {
|
||||
routeDataFuture.complete(event.getA());
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -132,20 +136,25 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
|
||||
private void testLegStructure(int minimalNumberOfLegsExpected) throws InterruptedException {
|
||||
waitForRouteData();
|
||||
assertTrue(course.getLegs().size() >= minimalNumberOfLegsExpected);
|
||||
TrackedRace trackedRace = trackedRegatta.getTrackedRace(race);
|
||||
assertEquals(course.getLegs().size(), Util.size(trackedRace.getTrackedLegs()));
|
||||
Iterator<Leg> legIter = course.getLegs().iterator();
|
||||
for (TrackedLeg trackedLeg : trackedRace.getTrackedLegs()) {
|
||||
assertTrue(legIter.hasNext());
|
||||
Leg leg = legIter.next();
|
||||
assertSame(leg, trackedLeg.getLeg());
|
||||
for (Competitor competitor : race.getCompetitors()) {
|
||||
TrackedLegOfCompetitor tloc = trackedLeg.getTrackedLeg(competitor);
|
||||
assertNotNull(tloc);
|
||||
assertSame(competitor, tloc.getCompetitor());
|
||||
assertSame(leg, tloc.getLeg());
|
||||
course.lockForRead();
|
||||
try {
|
||||
assertTrue(course.getLegs().size() >= minimalNumberOfLegsExpected);
|
||||
TrackedRace trackedRace = trackedRegatta.getTrackedRace(race);
|
||||
assertEquals(course.getLegs().size(), Util.size(trackedRace.getTrackedLegs()));
|
||||
Iterator<Leg> legIter = course.getLegs().iterator();
|
||||
for (TrackedLeg trackedLeg : trackedRace.getTrackedLegs()) {
|
||||
assertTrue(legIter.hasNext());
|
||||
Leg leg = legIter.next();
|
||||
assertSame(leg, trackedLeg.getLeg());
|
||||
for (Competitor competitor : race.getCompetitors()) {
|
||||
TrackedLegOfCompetitor tloc = trackedLeg.getTrackedLeg(competitor);
|
||||
assertNotNull(tloc);
|
||||
assertSame(competitor, tloc.getCompetitor());
|
||||
assertSame(leg, tloc.getLeg());
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
course.unlockAfterRead();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,8 +217,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
@Test
|
||||
public void testLastWaypointRemoved() throws PatchFailedException, InterruptedException {
|
||||
final boolean[] result = new boolean[1];
|
||||
waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
|
||||
final IControlRoute routeData = waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
|
||||
final IControl removedControlPoint = controlPoints.remove(controlPoints.size()-1);
|
||||
course.addCourseListener(new CourseListener() {
|
||||
@Override
|
||||
@@ -232,8 +241,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
@Test
|
||||
public void testLastButOneWaypointRemoved() throws PatchFailedException, InterruptedException {
|
||||
final boolean[] result = new boolean[1];
|
||||
waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
|
||||
final IControlRoute routeData = waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
|
||||
final IControl removedControlPoint = controlPoints.remove(1);
|
||||
course.addCourseListener(new CourseListener() {
|
||||
@Override
|
||||
@@ -253,11 +262,11 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
testLegStructure(1);
|
||||
}
|
||||
|
||||
private void waitForRouteData() throws InterruptedException {
|
||||
synchronized (routeData) {
|
||||
while (routeData[0] == null) {
|
||||
routeData.wait();
|
||||
}
|
||||
private IControlRoute waitForRouteData() {
|
||||
try {
|
||||
return routeDataFuture.get(1, TimeUnit.MINUTES);
|
||||
} catch (ExecutionException | TimeoutException | InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,8 +274,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
public void testWaypointAddedAtEnd() throws PatchFailedException, InterruptedException {
|
||||
final boolean[] result = new boolean[1];
|
||||
final IControl cp1 = createMockedControlPoint("CP1", 1, UUID.randomUUID());
|
||||
waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
|
||||
final IControlRoute routeData = waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
|
||||
controlPoints.add(cp1);
|
||||
course.addCourseListener(new CourseListener() {
|
||||
@Override
|
||||
@@ -303,8 +312,8 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
public void testTrackedRacesTrackedLegsUpdatedProperly() throws InterruptedException, PatchFailedException {
|
||||
final boolean[] result = new boolean[1];
|
||||
final IControl cp1 = createMockedControlPoint("CP1", 1, UUID.randomUUID());
|
||||
waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData[0].getControls());
|
||||
final IControlRoute routeData = waitForRouteData();
|
||||
final List<IControl> controlPoints = new ArrayList<>(routeData.getControls());
|
||||
controlPoints.add(cp1);
|
||||
course.addCourseListener(new CourseListener() {
|
||||
@Override
|
||||
@@ -327,6 +336,6 @@ public class CourseUpdateTest extends AbstractTracTracLiveTest {
|
||||
@After
|
||||
public void tearDown() throws MalformedURLException, IOException, InterruptedException {
|
||||
super.tearDown();
|
||||
routeData[0] = null;
|
||||
routeDataFuture = null;
|
||||
}
|
||||
}
|
||||
+15
-1
@@ -7,6 +7,7 @@ import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
@@ -330,7 +331,7 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat
|
||||
builder = child.getTextContent();
|
||||
break;
|
||||
case "dxtDate":
|
||||
issueDate = new MillisecondsTimePoint(isoTimestampFormat.parse(child.getTextContent().replaceAll("Z", "+0000"))); // assume UTC
|
||||
issueDate = new MillisecondsTimePoint(parseDate(child.getTextContent())); // assume UTC
|
||||
break;
|
||||
case "CertType":
|
||||
certType = Integer.valueOf(child.getTextContent().trim());
|
||||
@@ -350,6 +351,19 @@ public class ORCPublicCertificateDatabaseImpl implements ORCPublicCertificateDat
|
||||
sailNumber, boatClassName, designer, builder, yearBuilt, issueDate, certType, isOneDesign, isProvisional);
|
||||
}
|
||||
|
||||
private Date parseDate(String dateString) throws ParseException {
|
||||
StringBuilder stringBuilder = new StringBuilder(dateString);
|
||||
char timeZoneCharacter = stringBuilder.charAt(stringBuilder.length()-1);
|
||||
if(timeZoneCharacter== 'z' || timeZoneCharacter == 'Z'|| timeZoneCharacter == 'X') {
|
||||
stringBuilder.deleteCharAt(stringBuilder.length()-1);
|
||||
}
|
||||
if(false == stringBuilder.toString().contains("+")) {
|
||||
stringBuilder.append("+0000");
|
||||
}
|
||||
|
||||
return isoTimestampFormat.parse(stringBuilder.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ORCCertificate getCertificate(String referenceNumber) throws Exception {
|
||||
final HttpClient client = new SystemDefaultHttpClient();
|
||||
|
||||
+15
@@ -40,6 +40,12 @@ public class DetailTypeFormatter {
|
||||
return stringMessages.currentOrAverageSpeedOverGroundInKnots();
|
||||
case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
|
||||
return stringMessages.currentSpeedOverGroundInKnots();
|
||||
case RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES:
|
||||
return stringMessages.courseOverGroundTrueDegrees();
|
||||
case RACE_CURRENT_POSITION_LAT_DEG:
|
||||
return stringMessages.latitude();
|
||||
case RACE_CURRENT_POSITION_LNG_DEG:
|
||||
return stringMessages.longitude();
|
||||
case BRAVO_LEG_CURRENT_RIDE_HEIGHT_IN_METERS:
|
||||
return stringMessages.currentOrAverageRideHeightInMeters();
|
||||
case BRAVOEXTENDED_LEG_CURRENT_DISTANCE_FOILED_IN_METERS:
|
||||
@@ -433,6 +439,9 @@ public class DetailTypeFormatter {
|
||||
return stringMessages.millimetersUnit();
|
||||
|
||||
case CHART_COURSE_OVER_GROUND_TRUE_DEGREES:
|
||||
case RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES:
|
||||
case RACE_CURRENT_POSITION_LAT_DEG:
|
||||
case RACE_CURRENT_POSITION_LNG_DEG:
|
||||
case BRAVO_LEG_CURRENT_HEEL_IN_DEGREES:
|
||||
case BRAVO_LEG_CURRENT_PITCH_IN_DEGREES:
|
||||
case BRAVOEXTENDED_RACE_CURRENT_MAST_ROTATION_IN_DEGREES:
|
||||
@@ -657,6 +666,12 @@ public class DetailTypeFormatter {
|
||||
return stringMessages.currentOrAverageSpeedOverGroundInKnotsTooltip();
|
||||
case RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS:
|
||||
return stringMessages.currentSpeedOverGroundInKnotsTooltip();
|
||||
case RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES:
|
||||
return stringMessages.courseOverGroundTrueDegreesTooltip();
|
||||
case RACE_CURRENT_POSITION_LAT_DEG:
|
||||
return stringMessages.currentPositionLatitudeTooltip();
|
||||
case RACE_CURRENT_POSITION_LNG_DEG:
|
||||
return stringMessages.currentPositionLongitudeTooltip();
|
||||
case BRAVO_LEG_CURRENT_RIDE_HEIGHT_IN_METERS:
|
||||
return stringMessages.currentOrAverageRideHeightInMetersTooltip();
|
||||
case BRAVOEXTENDED_LEG_CURRENT_DISTANCE_FOILED_IN_METERS:
|
||||
|
||||
+2
@@ -2328,4 +2328,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String errorWhileLoadingUserSettings(String errorMessage);
|
||||
String certificates();
|
||||
String dataBy();
|
||||
String currentPositionLatitudeTooltip();
|
||||
String currentPositionLongitudeTooltip();
|
||||
}
|
||||
+3
-1
@@ -2329,4 +2329,6 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Windward/Leeward (up and do
|
||||
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Windward/Leeward (up and down) is a conventional course around windward and leeward marks where the race course consists of 50% upwind and 50% downwind legs.\nDuring the race, upwind and downwind legs will automatically be modeled as respective "constructed course" legs for better predictions, whereas after the race the averaged values will apply for all legs.
|
||||
errorWhileLoadingUserSettings=Error while loading user settings: {0}
|
||||
certificates=Certificates
|
||||
dataBy=Data by
|
||||
dataBy=Data by
|
||||
currentPositionLatitudeTooltip=Latitude of position in degrees (positive values denote northern hemisphere, negative values denote southern hemisphere)
|
||||
currentPositionLongitudeTooltip=Longitude of position in degrees (positive values denote east, negative values denote west)
|
||||
+2
@@ -2346,3 +2346,5 @@ orcPerformanceCurveLegs=ORC Performance Curve Bahnschenkel
|
||||
errorAssigningCertificates=Beim Zuweisen von Messbriefen zu Booten ist ein Fehler aufgetreten: {0}
|
||||
certificates=Messbriefe
|
||||
dataBy=Daten von
|
||||
currentPositionLatitudeTooltip=Geographische Breite der Position in Grad (positive Werte bezeichnen nördliche Breite, negative Werte südliche Breite)
|
||||
currentPositionLongitudeTooltip=Geographische Länge der Position in Grad (positive Werte bezeichnen östliche Länge, negative Werte westliche Länge)
|
||||
+1
-1
@@ -2011,7 +2011,7 @@ enterTagsForTheVideo=Entrez des balises pour la vidéo.
|
||||
enterIdOfWindFinderReviewedSpotCollection=Entrez l''ID d''un ensemble d''endroits WindFinder révisé, par exemple, "Schilksee".
|
||||
windFinderSpotCollectionsList=Ensemble d''endroits WindFinder
|
||||
enterTagsForTheImage=Entrez des balises pour l''image.
|
||||
unableToResolveWindFinderSpotId=Impossible de traiter l''endroit WindFinder ayant l''ID {0} : {1}
|
||||
unableToResolveWindFinderSpotId=Impossible de traiter l''endroit WindFinder avec l''ID {0} : {1}
|
||||
windFinderWeatherData=Données météo
|
||||
positionEditOnNonTrackingRace=Cette course n''est pas suivie actuellement. Les mises à jour d''erreurs ne sont plus reçues par la course suivie. Pour voir les modifications, vous devez recharger la course.
|
||||
errorCreatingLeaderboardGroup=Erreur lors de la tentative de création du nouveau groupe de palmarès {0}
|
||||
|
||||
+7
-2
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
|
||||
import com.sap.sailing.gwt.ui.client.FlagImageRenderer;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel.LeaderBoardStyle;
|
||||
import com.sap.sse.common.CountryCode;
|
||||
import com.sap.sse.gwt.client.celltable.FlushableSortedCellTableWithStylableHeaders;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentResources;
|
||||
|
||||
@@ -31,8 +32,12 @@ public class ClassicLeaderboardStyle implements LeaderBoardStyle {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderNationalityFlag(ImageResource nationalityFlagImageResource, SafeHtmlBuilder sb) {
|
||||
sb.append(FlagImageRenderer.image(nationalityFlagImageResource.getSafeUri().asString()));
|
||||
public void renderNationalityFlag(ImageResource nationalityFlagImageResource, CountryCode countryCode, SafeHtmlBuilder sb) {
|
||||
if (countryCode == null) {
|
||||
sb.append(FlagImageRenderer.image(nationalityFlagImageResource.getSafeUri().asString()));
|
||||
} else {
|
||||
sb.append(FlagImageRenderer.imageWithTitle(nationalityFlagImageResource.getSafeUri().asString(), countryCode.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-2
@@ -93,6 +93,8 @@ import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.DetailTypeColumn.DataExtractor;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.CountryCode;
|
||||
import com.sap.sse.common.CountryCodeFactory;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.InvertibleComparator;
|
||||
@@ -188,7 +190,7 @@ public abstract class LeaderboardPanel<LS extends LeaderboardSettings> extends A
|
||||
}
|
||||
|
||||
public interface LeaderBoardStyle {
|
||||
void renderNationalityFlag(ImageResource nationalityFlagImageResource, SafeHtmlBuilder sb);
|
||||
void renderNationalityFlag(ImageResource nationalityFlagImageResource, CountryCode countryCode, SafeHtmlBuilder sb);
|
||||
|
||||
void renderFlagImage(String flagImageURL, SafeHtmlBuilder sb, CompetitorDTO competitor);
|
||||
|
||||
@@ -3583,6 +3585,7 @@ public abstract class LeaderboardPanel<LS extends LeaderboardSettings> extends A
|
||||
final String flagImageURL = competitor.getFlagImageURL();
|
||||
if (isShowCompetitorNationality || flagImageURL == null || flagImageURL.isEmpty()) {
|
||||
final String twoLetterIsoCountryCode = competitor.getTwoLetterIsoCountryCode();
|
||||
final CountryCode countryCode = CountryCodeFactory.INSTANCE.getFromTwoLetterISOName(twoLetterIsoCountryCode);
|
||||
final ImageResource nationalityFlagImageResource;
|
||||
if (twoLetterIsoCountryCode == null || twoLetterIsoCountryCode.isEmpty()) {
|
||||
nationalityFlagImageResource = flagImageResolver.getEmptyFlagImageResource();
|
||||
@@ -3590,7 +3593,7 @@ public abstract class LeaderboardPanel<LS extends LeaderboardSettings> extends A
|
||||
nationalityFlagImageResource = flagImageResolver.getFlagImageResource(twoLetterIsoCountryCode);
|
||||
}
|
||||
if (nationalityFlagImageResource != null) {
|
||||
style.renderNationalityFlag(nationalityFlagImageResource, sb);
|
||||
style.renderNationalityFlag(nationalityFlagImageResource, countryCode, sb);
|
||||
sb.appendHtmlConstant(" ");
|
||||
}
|
||||
}
|
||||
|
||||
+4
-2
@@ -17,6 +17,7 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
|
||||
import com.sap.sailing.gwt.autoplay.client.resources.LeaderboardTableResourcesSixty;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel.LeaderBoardStyle;
|
||||
import com.sap.sse.common.CountryCode;
|
||||
import com.sap.sse.gwt.client.celltable.FlushableSortedCellTableWithStylableHeaders;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentResources;
|
||||
|
||||
@@ -40,8 +41,9 @@ public class SixtyInchLeaderboardStyle implements LeaderBoardStyle {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderNationalityFlag(ImageResource nationalityFlagImageResource, SafeHtmlBuilder sb) {
|
||||
sb.append(FLAG_RENDERER.imageWithTitle(nationalityFlagImageResource.getSafeUri().asString(), 60, 40, ""));
|
||||
public void renderNationalityFlag(ImageResource nationalityFlagImageResource, CountryCode countryCode, SafeHtmlBuilder sb) {
|
||||
sb.append(FLAG_RENDERER.imageWithTitle(nationalityFlagImageResource.getSafeUri().asString(), 60, 40,
|
||||
countryCode==null?"":countryCode.getName()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+17
-3
@@ -38,6 +38,7 @@ import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.DockLayoutPanel;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.ProvidesResize;
|
||||
import com.google.gwt.user.client.ui.RequiresResize;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.google.gwt.user.client.ui.WidgetCollection;
|
||||
@@ -201,7 +202,7 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
*
|
||||
* @author Simon Marcel Pamies, Axel Uhl
|
||||
*/
|
||||
abstract class Splitter extends AbsolutePanel {
|
||||
abstract class Splitter extends AbsolutePanel implements RequiresResize, ProvidesResize {
|
||||
protected final Widget target;
|
||||
|
||||
private int offset;
|
||||
@@ -375,6 +376,11 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResize() {
|
||||
setAssociatedWidgetSize(getTargetSize(), /* defer */ false);
|
||||
}
|
||||
|
||||
protected abstract int getAbsolutePosition();
|
||||
protected abstract double getCenterSize();
|
||||
protected abstract int getEventPosition(Event event);
|
||||
@@ -409,7 +415,11 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
|
||||
@Override
|
||||
protected double getCenterSize() {
|
||||
return getCenterWidth();
|
||||
int offsetWidth = 0;
|
||||
if (getToggleButton() != null) {
|
||||
offsetWidth = getToggleButton().getOffsetHeight(); // Buttons are rotated by 90 degrees
|
||||
}
|
||||
return getCenterWidth() - offsetWidth;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -462,7 +472,11 @@ public class TouchSplitLayoutPanel extends DockLayoutPanel {
|
||||
|
||||
@Override
|
||||
protected double getCenterSize() {
|
||||
return getCenterHeight();
|
||||
int offsetHeight = 0;
|
||||
if (getToggleButton() != null) {
|
||||
offsetHeight = getToggleButton().getOffsetHeight();
|
||||
}
|
||||
return getCenterHeight() - offsetHeight;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+15
@@ -3497,6 +3497,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
|
||||
result = (speedOverGround == null) ? null : speedOverGround.getKnots();
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES:
|
||||
case CHART_COURSE_OVER_GROUND_TRUE_DEGREES:
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> cogTrack = trackedRace.getTrack(competitor);
|
||||
if (cogTrack != null) {
|
||||
@@ -3504,6 +3505,20 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
|
||||
result = (speedOverGround == null) ? null : speedOverGround.getBearing().getDegrees();
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_POSITION_LAT_DEG:
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> latTrack = trackedRace.getTrack(competitor);
|
||||
if (latTrack != null) {
|
||||
Position position = latTrack.getEstimatedPosition(timePoint, /* extrapolate */ true);
|
||||
result = (position == null) ? null : position.getLatDeg();
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_POSITION_LNG_DEG:
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> lngTrack = trackedRace.getTrack(competitor);
|
||||
if (lngTrack != null) {
|
||||
Position position = lngTrack.getEstimatedPosition(timePoint, /* extrapolate */ true);
|
||||
result = (position == null) ? null : position.getLngDeg();
|
||||
}
|
||||
break;
|
||||
case LEG_VELOCITY_MADE_GOOD_IN_KNOTS:
|
||||
final Speed velocityMadeGood;
|
||||
if (trackedLeg != null) {
|
||||
|
||||
+114
-4
@@ -26,21 +26,60 @@ public class LeaderboardApi {
|
||||
private static final String SET_TRACKING_TIMES_URL = LEADERBOARDS_V1_RESOURCE_URL
|
||||
+ "/{leaderboardname}/settrackingtimes";
|
||||
private static final String START_TRACKING_URL = LEADERBOARDS_V1_RESOURCE_URL + "/{leaderboardname}/starttracking";
|
||||
private static final String UPDATE_LEADERBOARD_URL = LEADERBOARDS_V1_RESOURCE_URL + "/{leaderboardname}/update";
|
||||
|
||||
private static final String PARAM_RESULT_DISCARDING_THRESHOLDS = "resultDiscardingThresholds";
|
||||
private static final String PARAM_LEADERBOARD_DISPLAY_NAME = "leaderboardDisplayName";
|
||||
|
||||
public JSONArray getLeaderboards(ApiContext ctx) {
|
||||
return ctx.get(LEADERBOARDS_LIST_URL);
|
||||
}
|
||||
|
||||
public JSONObject getLeaderboard(ApiContext ctx, String leaderboardName) {
|
||||
return ctx.get(toUrl(LEADERBOARD_URL, leaderboardName));
|
||||
public Leaderboard getLeaderboard(ApiContext ctx, String leaderboardName) {
|
||||
return new Leaderboard(ctx.get(toUrl(LEADERBOARD_URL, leaderboardName)));
|
||||
}
|
||||
|
||||
public DeviceMappingRequest createDeviceMappingRequest(final ApiContext ctx, final String leaderboardName) {
|
||||
return new DeviceMappingRequest(ctx, leaderboardName);
|
||||
}
|
||||
|
||||
public TrackingTimes setTrackingTimes(ApiContext ctx, String leaderboardName, String raceColumnName, String fleetName,
|
||||
Long startTime, Long endTime) {
|
||||
public void updateLeaderboard(ApiContext ctx, String leaderboardName, String leaderboardDisplayName,
|
||||
int[] resultDiscardingThresholds) {
|
||||
JSONObject requestJson = new JSONObject();
|
||||
JSONArray resultDiscardingThresholdsJsonArray = new JSONArray();
|
||||
if (resultDiscardingThresholds != null) {
|
||||
for (int i = 0; i < resultDiscardingThresholds.length; i++) {
|
||||
resultDiscardingThresholdsJsonArray.add(resultDiscardingThresholds[i]);
|
||||
}
|
||||
}
|
||||
requestJson.put(PARAM_RESULT_DISCARDING_THRESHOLDS,
|
||||
resultDiscardingThresholds != null ? resultDiscardingThresholdsJsonArray : null);
|
||||
requestJson.put(PARAM_LEADERBOARD_DISPLAY_NAME, leaderboardDisplayName);
|
||||
ctx.post(toUrl(UPDATE_LEADERBOARD_URL, leaderboardName), null, requestJson);
|
||||
}
|
||||
|
||||
public void updateLeaderboardDisplayName(ApiContext ctx, String leaderboardName, String leaderboardDisplayName) {
|
||||
JSONObject requestJson = new JSONObject();
|
||||
requestJson.put(PARAM_LEADERBOARD_DISPLAY_NAME, leaderboardDisplayName);
|
||||
ctx.post(toUrl(UPDATE_LEADERBOARD_URL, leaderboardName), null, requestJson);
|
||||
}
|
||||
|
||||
public void updateLeaderboardResultDiscardingThresholds(ApiContext ctx, String leaderboardName,
|
||||
int[] resultDiscardingThresholds) {
|
||||
JSONObject requestJson = new JSONObject();
|
||||
JSONArray resultDiscardingThresholdsJsonArray = new JSONArray();
|
||||
if (resultDiscardingThresholds != null) {
|
||||
for (int i = 0; i < resultDiscardingThresholds.length; i++) {
|
||||
resultDiscardingThresholdsJsonArray.add(resultDiscardingThresholds[i]);
|
||||
}
|
||||
}
|
||||
requestJson.put(PARAM_RESULT_DISCARDING_THRESHOLDS,
|
||||
resultDiscardingThresholds != null ? resultDiscardingThresholdsJsonArray : null);
|
||||
ctx.post(toUrl(UPDATE_LEADERBOARD_URL, leaderboardName), null, requestJson);
|
||||
}
|
||||
|
||||
public TrackingTimes setTrackingTimes(ApiContext ctx, String leaderboardName, String raceColumnName,
|
||||
String fleetName, Long startTime, Long endTime) {
|
||||
final Map<String, String> queryParams = new TreeMap<>();
|
||||
queryParams.put("race_column", raceColumnName);
|
||||
queryParams.put("fleet", fleetName);
|
||||
@@ -63,6 +102,77 @@ public class LeaderboardApi {
|
||||
return urlTemplate.replace("{leaderboardname}", leaderboardName);
|
||||
}
|
||||
|
||||
public class Leaderboard extends JsonWrapper {
|
||||
|
||||
public Leaderboard(JSONObject json) {
|
||||
super(json);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return get("name");
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return get("displayName");
|
||||
}
|
||||
|
||||
public Long getResultTimePoint() {
|
||||
return get("resultTimepoint");
|
||||
}
|
||||
|
||||
public String getResultState() {
|
||||
return get("resultState");
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return get("type");
|
||||
}
|
||||
|
||||
public String getShardingLeaderboardName() {
|
||||
return get("shardingLeaderboardName");
|
||||
}
|
||||
|
||||
public int[] getDiscardIndexResultsStartingWithHowManyRaces() {
|
||||
final JSONArray resultDiscardingThresholdsRaw = (JSONArray) get(
|
||||
"discardIndexResultsStartingWithHowManyRaces");
|
||||
final int[] resultDiscardingThresholds = new int[resultDiscardingThresholdsRaw.size()];
|
||||
for (int i = 0; i < resultDiscardingThresholdsRaw.size(); i++) {
|
||||
resultDiscardingThresholds[i] = ((Long) resultDiscardingThresholdsRaw.get(i)).intValue();
|
||||
}
|
||||
return resultDiscardingThresholds;
|
||||
}
|
||||
|
||||
public Boolean canBoatsOfCompetitorsChangePerRace() {
|
||||
return get("canBoatsOfCompetitorsChangePerRace");
|
||||
}
|
||||
|
||||
public Long getMaxCompetitorsCount() {
|
||||
return get("maxCompetitorsCount");
|
||||
}
|
||||
|
||||
public String getScoringComment() {
|
||||
return get("scoringComment");
|
||||
}
|
||||
|
||||
public Long getLastScoringUpdate() {
|
||||
return get("lastScoringUpdate");
|
||||
}
|
||||
|
||||
public String[] getColumnNames() {
|
||||
final JSONArray columnNamesRaw = (JSONArray) get("columnNames");
|
||||
final String[] columnNames = new String[columnNamesRaw.size()];
|
||||
for (int i = 0; i < columnNamesRaw.size(); i++) {
|
||||
columnNames[i] = (String) columnNamesRaw.get(i);
|
||||
}
|
||||
return columnNames;
|
||||
}
|
||||
|
||||
public JSONArray getCompetitors() {
|
||||
return get("competitors");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class DeviceMappingRequest {
|
||||
|
||||
private final JSONObject requestBody = new JSONObject();
|
||||
|
||||
+1
-1
@@ -104,7 +104,7 @@ public class RegattaApi {
|
||||
final String url = REGATTAS + "/" + regattaName + ADD_RACE_COLUMN_URL;
|
||||
final Map<String, String> queryParams = new TreeMap<>();
|
||||
queryParams.put("prefix", prefix);
|
||||
queryParams.put("numberOfRaces", numberOfRaces != null ? numberOfRaces.toString() : null);
|
||||
queryParams.put("numberofraces", numberOfRaces != null ? numberOfRaces.toString() : null);
|
||||
final JSONArray json = ctx.post(url, queryParams);
|
||||
final RaceColumn[] result = new RaceColumn[json.size()];
|
||||
for (int i = 0; i < json.size(); i++) {
|
||||
|
||||
+97
-12
@@ -5,6 +5,7 @@ import static com.sap.sailing.selenium.api.core.ApiContext.SERVER_CONTEXT;
|
||||
import static com.sap.sailing.selenium.api.core.ApiContext.createAdminApiContext;
|
||||
import static java.lang.System.currentTimeMillis;
|
||||
import static java.util.UUID.randomUUID;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
@@ -18,6 +19,7 @@ import com.sap.sailing.selenium.api.core.ApiContext;
|
||||
import com.sap.sailing.selenium.api.event.EventApi;
|
||||
import com.sap.sailing.selenium.api.event.LeaderboardApi;
|
||||
import com.sap.sailing.selenium.api.event.LeaderboardApi.DeviceMappingRequest;
|
||||
import com.sap.sailing.selenium.api.event.LeaderboardApi.Leaderboard;
|
||||
import com.sap.sailing.selenium.api.event.LeaderboardApi.TrackingTimes;
|
||||
import com.sap.sailing.selenium.api.regatta.Competitor;
|
||||
import com.sap.sailing.selenium.api.regatta.RaceColumn;
|
||||
@@ -42,19 +44,18 @@ public class LeaderboardApiTest extends AbstractSeleniumTest {
|
||||
public void testGetLeaderboardForCreatedEvent() {
|
||||
final ApiContext ctx = createAdminApiContext(getContextRoot(), SERVER_CONTEXT);
|
||||
eventApi.createEvent(ctx, LEADERBOARD_NAME, BOATCLASSNAME, CLOSED, "default");
|
||||
JSONObject leaderBoard = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals("read: leaderboard.name is different", LEADERBOARD_NAME, leaderBoard.get("name"));
|
||||
assertEquals("read: leaderboard.displayName is different", LEADERBOARD_NAME, leaderBoard.get("displayName"));
|
||||
assertNotNull("read: leaderboard.resultTimepoint is missing", leaderBoard.get("resultTimepoint"));
|
||||
assertEquals("read: leaderboard.resultState is different", "Live", leaderBoard.get("resultState"));
|
||||
assertEquals("read: leaderboard.type is different", "RegattaLeaderboard", leaderBoard.get("type"));
|
||||
Leaderboard leaderBoard = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals("read: leaderboard.name is different", LEADERBOARD_NAME, leaderBoard.getName());
|
||||
assertEquals("read: leaderboard.displayName is different", LEADERBOARD_NAME, leaderBoard.getDisplayName());
|
||||
assertNotNull("read: leaderboard.resultTimepoint is missing", leaderBoard.getResultTimePoint());
|
||||
assertEquals("read: leaderboard.resultState is different", "Live", leaderBoard.getResultState());
|
||||
assertEquals("read: leaderboard.type is different", "RegattaLeaderboard", leaderBoard.getType());
|
||||
assertEquals("read: leaderboard.canBoatsOfCompetitorsChangePerRace is different", false,
|
||||
leaderBoard.get("canBoatsOfCompetitorsChangePerRace"));
|
||||
assertNull("read: leaderboard.maxCompetitorsCount should be null", leaderBoard.get("maxCompetitorsCount"));
|
||||
assertNull("read: leaderboard.scoringComment should be null", leaderBoard.get("scoringComment"));
|
||||
assertNull("read: leaderboard.lastScoringUpdate should be null", leaderBoard.get("lastScoringUpdate"));
|
||||
assertEquals("read: leaderboard.columnNames should be empty", 0,
|
||||
((JSONArray) leaderBoard.get("columnNames")).size());
|
||||
leaderBoard.canBoatsOfCompetitorsChangePerRace());
|
||||
assertNull("read: leaderboard.maxCompetitorsCount should be null", leaderBoard.getMaxCompetitorsCount());
|
||||
assertNull("read: leaderboard.scoringComment should be null", leaderBoard.getScoringComment());
|
||||
assertNull("read: leaderboard.lastScoringUpdate should be null", leaderBoard.getLastScoringUpdate());
|
||||
assertEquals("read: leaderboard.columnNames should be empty", 0, leaderBoard.getColumnNames().length);
|
||||
assertEquals("read: leaderboard.competitors should be empty", 0,
|
||||
((JSONArray) leaderBoard.get("competitors")).size());
|
||||
assertEquals("read: leaderboard.ShardingLeaderboardName is different",
|
||||
@@ -62,6 +63,90 @@ public class LeaderboardApiTest extends AbstractSeleniumTest {
|
||||
leaderBoard.get("ShardingLeaderboardName"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdatingLeaderboard() {
|
||||
final ApiContext ctx = createAdminApiContext(getContextRoot(), SERVER_CONTEXT);
|
||||
eventApi.createEvent(ctx, LEADERBOARD_NAME, BOATCLASSNAME, CLOSED, "default");
|
||||
final Leaderboard leaderboardOriginal = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
|
||||
// updating resultDiscardingThresholds
|
||||
final int[] newResultDiscardingThresholds = new int[] { 1, 2, 3, 4, 5 };
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, leaderboardOriginal.getDisplayName(),
|
||||
newResultDiscardingThresholds);
|
||||
|
||||
// reloading and check if updated
|
||||
Leaderboard leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
|
||||
// remove and check again
|
||||
final int[] newEmptyResultDiscardingThresholds = new int[] {};
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, leaderboardOriginal.getDisplayName(),
|
||||
newEmptyResultDiscardingThresholds);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertArrayEquals(newEmptyResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
|
||||
// passing null should not change anything
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, leaderboardOriginal.getDisplayName(),
|
||||
newResultDiscardingThresholds);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, leaderboardOriginal.getDisplayName(), null);
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
|
||||
// check that no other atributes have been changed
|
||||
assertEquals(leaderboardOriginal.getName(), leaderboardReloaded.getName());
|
||||
assertEquals(leaderboardOriginal.getDisplayName(), leaderboardReloaded.getDisplayName());
|
||||
|
||||
// update leaderboardDisplayName
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, "another display name", null);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals("another display name", leaderboardReloaded.getDisplayName());
|
||||
|
||||
// check that no other atributes have been changed
|
||||
assertEquals(leaderboardOriginal.getName(), leaderboardReloaded.getName());
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
|
||||
// update leaderboardDisplayName and resultDiscardingThresholds
|
||||
final int[] newResultDiscardingThresholds2 = new int[] {7, 8};
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, "another display name 2", newResultDiscardingThresholds2);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals("another display name 2", leaderboardReloaded.getDisplayName());
|
||||
assertArrayEquals(newResultDiscardingThresholds2, newResultDiscardingThresholds2);
|
||||
|
||||
// update leaderboardDisplayName to null, this result in the name of the leaderboard
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, /* leaderboardDisplayName */ null, newResultDiscardingThresholds2);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
// if display name is null, the name of the leaderboard is returned
|
||||
assertEquals(leaderboardReloaded.getName(), leaderboardReloaded.getDisplayName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdatingLeaderboardDisplayNameToNull() {
|
||||
final ApiContext ctx = createAdminApiContext(getContextRoot(), SERVER_CONTEXT);
|
||||
eventApi.createEvent(ctx, LEADERBOARD_NAME, BOATCLASSNAME, CLOSED, "default");
|
||||
|
||||
// update to not null values
|
||||
final int[] newResultDiscardingThresholds = new int[] { 1, 2, 3, 4, 5 };
|
||||
leaderboardApi.updateLeaderboard(ctx, LEADERBOARD_NAME, "newLeaderboardDisplayName",
|
||||
newResultDiscardingThresholds);
|
||||
Leaderboard leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals("newLeaderboardDisplayName", leaderboardReloaded.getDisplayName());
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
|
||||
// update to display name to null
|
||||
leaderboardApi.updateLeaderboardDisplayName(ctx, LEADERBOARD_NAME, null);
|
||||
leaderboardReloaded = leaderboardApi.getLeaderboard(ctx, LEADERBOARD_NAME);
|
||||
assertEquals(LEADERBOARD_NAME, leaderboardReloaded.getDisplayName());
|
||||
assertArrayEquals(newResultDiscardingThresholds,
|
||||
leaderboardReloaded.getDiscardIndexResultsStartingWithHowManyRaces());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeviceMappingStartAndEnd() throws Exception {
|
||||
final ApiContext ctx = createAdminApiContext(getContextRoot(), SERVER_CONTEXT);
|
||||
|
||||
+2
-2
@@ -159,8 +159,8 @@ public class RegattaApiTest extends AbstractSeleniumTest {
|
||||
RaceColumn[] result = regattaApi.addRaceColumn(ctx, EVENT_NAME, "T", 5);
|
||||
assertEquals("read: racecolumn.seriesname is different", "Default", result[0].getSeriesName());
|
||||
assertEquals("read: racecolumn.racename is different", "T1", result[0].getRaceName());
|
||||
// assertEquals("read: racecolumn.seriesname is different", "Default", result[4].getSeriesName());
|
||||
// assertEquals("read: racecolumn.racename is different", "T5", result[4].getRaceName());
|
||||
assertEquals("read: racecolumn.seriesname is different", "Default", result[4].getSeriesName());
|
||||
assertEquals("read: racecolumn.racename is different", "T5", result[4].getRaceName());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+6
-5
@@ -38,6 +38,7 @@ import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializ
|
||||
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
|
||||
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
|
||||
import com.sap.sailing.server.interfaces.RacingEventService;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateCompetitor;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.filestorage.InvalidPropertiesException;
|
||||
import com.sap.sse.filestorage.OperationFailedException;
|
||||
@@ -187,11 +188,11 @@ public class CompetitorsResource extends AbstractSailingServerResource {
|
||||
throw new WebApplicationException(Response.status(Status.INTERNAL_SERVER_ERROR)
|
||||
.entity("Could not store competitor image").type(MediaType.TEXT_PLAIN).build());
|
||||
}
|
||||
getService().getCompetitorAndBoatStore().updateCompetitor(competitorId, competitor.getName(), competitor.getShortName(),
|
||||
competitor.getColor(), competitor.getEmail(),
|
||||
competitor.getTeam().getNationality(), imageUri, competitor.getFlagImage(),
|
||||
/* timeOnTimeFactor */ competitor.getTimeOnTimeFactor(),
|
||||
/* timeOnDistanceAllowancePerNauticalMile */ competitor.getTimeOnDistanceAllowancePerNauticalMile(), competitor.getSearchTag(), /* storePersistently */ true);
|
||||
getService().apply(new UpdateCompetitor(competitorId, competitor.getName(), competitor.getShortName(),
|
||||
competitor.getColor(), competitor.getEmail(), competitor.getTeam().getNationality(), imageUri,
|
||||
competitor.getFlagImage(), /* timeOnTimeFactor */ competitor.getTimeOnTimeFactor(),
|
||||
/* timeOnDistanceAllowancePerNauticalMile */ competitor.getTimeOnDistanceAllowancePerNauticalMile(),
|
||||
competitor.getSearchTag()));
|
||||
logger.log(Level.INFO, "Set team image for competitor " + competitor.getName());
|
||||
JSONObject result = new JSONObject();
|
||||
result.put(DeviceMappingConstants.JSON_TEAM_IMAGE_URI, imageUri.toString());
|
||||
|
||||
+40
@@ -124,6 +124,7 @@ import com.sap.sailing.server.hierarchy.SailingHierarchyOwnershipUpdater;
|
||||
import com.sap.sailing.server.interfaces.RacingEventService;
|
||||
import com.sap.sailing.server.operationaltransformation.RemoveAndUntrackRace;
|
||||
import com.sap.sailing.server.operationaltransformation.StopTrackingRace;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboard;
|
||||
import com.sap.sailing.server.security.PermissionAwareRaceTrackingHandler;
|
||||
import com.sap.sse.InvalidDateException;
|
||||
import com.sap.sse.common.Bearing;
|
||||
@@ -268,6 +269,45 @@ public class LeaderboardsResource extends AbstractLeaderboardsResource {
|
||||
return jsonLeaderboard;
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{name}/update")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
public Response updateLeaderboard(@PathParam("name") String leaderboardName, String json)
|
||||
throws ParseException, JsonDeserializationException {
|
||||
final Object requestBody = JSONValue.parseWithException(json);
|
||||
final JSONObject requestObject = Helpers.toJSONObjectSafe(requestBody);
|
||||
final Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
|
||||
if (leaderboard != null) {
|
||||
SecurityUtils.getSubject().checkPermission(
|
||||
SecuredDomainType.LEADERBOARD.getStringPermissionForObject(DefaultActions.UPDATE, leaderboard));
|
||||
String newLeaderboardDisplayName = leaderboard.getDisplayName();
|
||||
if (requestObject.containsKey("leaderboardDisplayName")) {
|
||||
newLeaderboardDisplayName = (String) requestObject.get("leaderboardDisplayName");
|
||||
}
|
||||
int[] resultDiscardingThresholds = null;
|
||||
if (requestObject.containsKey("resultDiscardingThresholds")) {
|
||||
final JSONArray resultDiscardingThresholdsRaw = (JSONArray) requestObject
|
||||
.get("resultDiscardingThresholds");
|
||||
if (resultDiscardingThresholdsRaw != null) {
|
||||
resultDiscardingThresholds = new int[resultDiscardingThresholdsRaw.size()];
|
||||
for (int i = 0; i < resultDiscardingThresholdsRaw.size(); i++) {
|
||||
resultDiscardingThresholds[i] = ((Long) resultDiscardingThresholdsRaw.get(i)).intValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
getService().apply(new UpdateLeaderboard(/* leaderboardName */ leaderboard.getName(),
|
||||
/* newLeaderboardName */ leaderboard.getName(), newLeaderboardDisplayName,
|
||||
resultDiscardingThresholds,
|
||||
leaderboard.getDefaultCourseArea() != null ? leaderboard.getDefaultCourseArea().getId() : null));
|
||||
} else {
|
||||
return Response.status(Status.NOT_FOUND).entity(
|
||||
"Could not find a leaderboard with name '" + StringEscapeUtils.escapeHtml(leaderboardName) + "'.")
|
||||
.type(MediaType.TEXT_PLAIN).build();
|
||||
}
|
||||
return Response.ok().header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
|
||||
}
|
||||
|
||||
@POST
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Path("{name}/device_mappings/start")
|
||||
|
||||
+60
-2
@@ -33,6 +33,8 @@ import com.sap.sailing.domain.common.DetailType;
|
||||
import com.sap.sailing.domain.common.ManeuverType;
|
||||
import com.sap.sailing.domain.common.MaxPointsReason;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
||||
import com.sap.sailing.domain.common.dto.BoatDTO;
|
||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||
import com.sap.sailing.domain.common.dto.FleetDTO;
|
||||
@@ -41,14 +43,18 @@ import com.sap.sailing.domain.common.dto.LeaderboardEntryDTO;
|
||||
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
|
||||
import com.sap.sailing.domain.common.dto.LegEntryDTO;
|
||||
import com.sap.sailing.domain.common.sharding.ShardingType;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.leaderboard.Leaderboard;
|
||||
import com.sap.sailing.domain.sharding.ShardingContext;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.InvalidDateException;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
import com.sap.sse.security.shared.impl.SecuredSecurityTypes;
|
||||
|
||||
@@ -243,7 +249,12 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
|
||||
JSONObject jsonRaceDetails = new JSONObject();
|
||||
jsonEntry.put("data", jsonRaceDetails);
|
||||
for (DetailType type : raceDetailsToShow) {
|
||||
Pair<String, Object> valueForRaceDetailType = getValueForRaceDetailType(type, leaderboardRowDTO, leaderboardEntry, currentLegEntry);
|
||||
final RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
|
||||
final Competitor c = getService().getCompetitorAndBoatStore().getExistingCompetitorByIdAsString(competitor.getIdAsString());
|
||||
final TrackedRace trackedRace = c == null || raceColumn == null ? null : raceColumn.getTrackedRace(c);
|
||||
Pair<String, Object> valueForRaceDetailType = getValueForRaceDetailType(type,
|
||||
leaderboardRowDTO, leaderboardEntry, currentLegEntry, trackedRace, raceColumn,
|
||||
c, new MillisecondsTimePoint(leaderboardDTO.getTimePoint()));
|
||||
if (valueForRaceDetailType != null && valueForRaceDetailType.getA() != null && valueForRaceDetailType.getB() != null) {
|
||||
jsonRaceDetails.put(valueForRaceDetailType.getA(), valueForRaceDetailType.getB());
|
||||
}
|
||||
@@ -295,6 +306,9 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
|
||||
DetailType.RACE_DISTANCE_TRAVELED,
|
||||
DetailType.RACE_TIME_TRAVELED,
|
||||
DetailType.RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS,
|
||||
DetailType.RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES,
|
||||
DetailType.RACE_CURRENT_POSITION_LAT_DEG,
|
||||
DetailType.RACE_CURRENT_POSITION_LNG_DEG,
|
||||
DetailType.RACE_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD_IN_METERS,
|
||||
DetailType.NUMBER_OF_MANEUVERS,
|
||||
DetailType.RACE_CURRENT_LEG,
|
||||
@@ -305,7 +319,9 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
|
||||
return new DetailType[] { DetailType.OVERALL_MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS };
|
||||
}
|
||||
|
||||
private Pair<String, Object> getValueForRaceDetailType(DetailType type, LeaderboardRowDTO leaderboardRowDTO, LeaderboardEntryDTO entry, LegEntryDTO currentLegEntry) {
|
||||
private Pair<String, Object> getValueForRaceDetailType(DetailType type, LeaderboardRowDTO leaderboardRowDTO,
|
||||
LeaderboardEntryDTO entry, LegEntryDTO currentLegEntry, TrackedRace trackedRace, RaceColumn raceColumn,
|
||||
Competitor competitor, TimePoint timePoint) {
|
||||
String name;
|
||||
Object value = null;
|
||||
Pair<String, Object> result = null;
|
||||
@@ -350,6 +366,42 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
|
||||
value = roundDouble(currentLegEntry.currentSpeedOverGroundInKnots, 2);
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES:
|
||||
name = "currentCourseOverGround-deg";
|
||||
if (trackedRace != null) {
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
if (track != null) {
|
||||
final SpeedWithBearing speed = track.getEstimatedSpeed(timePoint);
|
||||
if (speed != null) {
|
||||
value = roundDouble(speed.getBearing().getDegrees(), 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_POSITION_LAT_DEG:
|
||||
name = "currentPositionLatitude-deg";
|
||||
if (trackedRace != null) {
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
if (track != null) {
|
||||
final Position position = track.getEstimatedPosition(timePoint, /* extrapolated */ true);
|
||||
if (position != null) {
|
||||
value = roundDouble(position.getLatDeg(), 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RACE_CURRENT_POSITION_LNG_DEG:
|
||||
name = "currentPositionLongitude-deg";
|
||||
if (trackedRace != null) {
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
if (track != null) {
|
||||
final Position position = track.getEstimatedPosition(timePoint, /* extrapolated */ true);
|
||||
if (position != null) {
|
||||
value = roundDouble(position.getLngDeg(), 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NUMBER_OF_MANEUVERS:
|
||||
name = "numberOfManeuvers";
|
||||
Integer numberOfManeuvers = null;
|
||||
@@ -376,6 +428,12 @@ public class LeaderboardsResourceV2 extends AbstractLeaderboardsResource {
|
||||
name = "maxSpeedOverGroundInKnots";
|
||||
value = leaderboardRowDTO.maximumSpeedOverGroundInKnots==null?null:roundDouble(leaderboardRowDTO.maximumSpeedOverGroundInKnots, 2);
|
||||
break;
|
||||
case LEG_WINDWARD_DISTANCE_TO_GO_IN_METERS:
|
||||
name = "legWindwardDistanceToGoInMeters";
|
||||
if (currentLegEntry != null && currentLegEntry.windwardDistanceToGoInMeters != null) {
|
||||
value = currentLegEntry.windwardDistanceToGoInMeters;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
name = null;
|
||||
break;
|
||||
|
||||
@@ -189,6 +189,10 @@ name to make sure you get to the event you're interested in.
|
||||
<td><a href="leaderboardGetDoc.html">/api/v1/leaderboards/{name}</a></td>
|
||||
<td>Gets the details of a leaderboard</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="leaderboardUpdateDoc.html">/api/v1/leaderboards/{name}/update</a></td>
|
||||
<td>Modifies attributes of a leaderboard</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="leaderboardCheckinPostDoc.html">/api/v1/leaderboards/{name}/device_mappings/start</a></td>
|
||||
<td>Tracking App Device Checkin on leaderboard</td>
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<link href='../../../../sailing-fontface-1.0.cache.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
|
||||
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
|
||||
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
|
||||
<title>SAP Sailing Analytics Webservices API Version 1.0</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>SAP Sailing Analytics Webservices API Version 1.0</h1>
|
||||
<h2>URL: /api/v1/leaderboard/{name}/update</h2>
|
||||
|
||||
<b>Description:</b>
|
||||
<p>The service can modify some of the details of a leaderboard. Currently this allows to update the discarding thresholds of a leaderboard and the leaderboard display name.</p>
|
||||
<br/>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Webservice Type:</td>
|
||||
<td>REST</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Output format:</td>
|
||||
<td>Json</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mandatory parameters:</td>
|
||||
<td>None</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Optional parameters:</td>
|
||||
<td>None</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Request method:</td>
|
||||
<td>POST</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Payload:</td>
|
||||
|
||||
<td>format: json<br /> *(optional) resultDiscardingThresholds: if
|
||||
parameter is absent or value is null, the discarding thresholds will
|
||||
not change. If passing an empty array the discarding thresholds
|
||||
will be cleared.<br/>
|
||||
*(optional) leaderboardDisplayName: if parameter is absent
|
||||
the displayName will not change.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example:</td>
|
||||
<td><a
|
||||
href="http://www.sapsailing.com/sailingserver/api/v1/leaderboards/505 Worlds 2013/update">http://www.sapsailing.com/sailingserver/api/v1/leaderboards/505
|
||||
Worlds 2013/update</a><br/>
|
||||
Request:
|
||||
<pre>
|
||||
{
|
||||
"resultDiscardingThresholds":[1,2],
|
||||
"leaderboardDisplayName":"505 Worlds 2014"
|
||||
}
|
||||
</pre>
|
||||
Response: Status 200
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
<div style="height: 1em;"></div>
|
||||
<a href="index.html">Back to Web Service Overview</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -21,9 +21,13 @@ The supported race detail constants right now are:<br/>
|
||||
- RACE_DISTANCE_TRAVELED<br/>
|
||||
- RACE_TIME_TRAVELED<br/>
|
||||
- RACE_CURRENT_SPEED_OVER_GROUND_IN_KNOTS<br/>
|
||||
- RACE_CURRENT_COURSE_OVER_GROUND_IN_TRUE_DEGREES<br/>
|
||||
- RACE_CURRENT_POSITION_LAT_DEG<br/>
|
||||
- RACE_CURRENT_POSITION_LNG_DEG<br/>
|
||||
- RACE_DISTANCE_TO_COMPETITOR_FARTHEST_AHEAD_IN_METERS<br/>
|
||||
- NUMBER_OF_MANEUVERS<br/>
|
||||
- CURRENT_LEG
|
||||
- LEG_WINDWARD_DISTANCE_TO_GO_IN_METERS<br/>
|
||||
- OVERALL_MAXIMUM_SPEED_OVER_GROUND_IN_KNOTS<br/>
|
||||
There is also the 'ALL' shortcut constant which can be used to get all available race details without the need to enumerate them.<br/>
|
||||
<br/>
|
||||
|
||||
+3
@@ -35,6 +35,7 @@ public interface AccessControlStore extends Named {
|
||||
void removeAclDenial(QualifiedObjectIdentifier idOfAccessControlledObject, UserGroup userGroup, String action);
|
||||
|
||||
void denyAclPermission(QualifiedObjectIdentifier idOfAccessControlledObject, UserGroup userGroup, String action);
|
||||
|
||||
void removeAccessControlList(QualifiedObjectIdentifier idOfAccessControlledObject);
|
||||
|
||||
Iterable<OwnershipAnnotation> getOwnerships();
|
||||
@@ -50,9 +51,11 @@ public interface AccessControlStore extends Named {
|
||||
|
||||
OwnershipAnnotation setOwnership(QualifiedObjectIdentifier idOfOwnedObject, User userOwner, UserGroup tenantOwner,
|
||||
String displayNameOfOwnedObject);
|
||||
|
||||
void removeOwnership(QualifiedObjectIdentifier idOfOwnedObject);
|
||||
|
||||
void clear();
|
||||
|
||||
void replaceContentsFrom(AccessControlStore newAccessControlStore);
|
||||
|
||||
/**
|
||||
|
||||
@@ -76,3 +76,4 @@ bearerToken = com.sap.sse.security.BearerTokenOrBasicOrFormAuthenticationFilter
|
||||
/api/restsecurity/usergroup = bearerToken
|
||||
/api/restsecurity/role = bearerToken
|
||||
/api/restsecurity/role/** = bearerToken
|
||||
/api/restsecurity/ownership/** = bearerToken
|
||||
@@ -93,6 +93,9 @@ public interface SecurityService extends ReplicableWithObjectInputStream<Replica
|
||||
AccessControlList overrideAccessControlList(QualifiedObjectIdentifier idOfAccessControlledObject,
|
||||
Map<UserGroup, Set<String>> permissionMap);
|
||||
|
||||
AccessControlList overrideAccessControlList(QualifiedObjectIdentifier idOfAccessControlledObject,
|
||||
Map<UserGroup, Set<String>> permissionMap, String displayNameOfAccessControlledObject);
|
||||
|
||||
/**
|
||||
* @param name The name of the user group to add
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.sap.sse.security.exceptions;
|
||||
|
||||
import javax.ws.rs.core.Response.Status;
|
||||
import com.sap.sse.security.jaxrs.api.OwnershipResource;
|
||||
|
||||
/***
|
||||
* OwnershipException is used for {@link OwnershipResource} class to handle any exception in ownership Api's.
|
||||
*
|
||||
* @author Usman Ali
|
||||
*
|
||||
*/
|
||||
public class OwnershipException extends Exception {
|
||||
private static final long serialVersionUID = -7464597099374135405L;
|
||||
private Status status;
|
||||
|
||||
public OwnershipException(String message, Status status) {
|
||||
super(message);
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.sap.sse.security.exceptions.handler;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.ext.ExceptionMapper;
|
||||
import javax.ws.rs.ext.Provider;
|
||||
|
||||
import com.sap.sse.security.exceptions.OwnershipException;
|
||||
import com.sap.sse.security.jaxrs.ShiroAuthorizationExceptionTo401ResponseMapper;
|
||||
import com.sap.sse.security.model.GeneralResponse;
|
||||
|
||||
|
||||
/***
|
||||
* This class is used to handle {@link OwnershipException} thrown from any API of project.
|
||||
* @author Usman Ali
|
||||
*
|
||||
*/
|
||||
@Provider
|
||||
public class OwnershipExceptionHandler implements ExceptionMapper<OwnershipException> {
|
||||
private static final Logger logger = Logger.getLogger(ShiroAuthorizationExceptionTo401ResponseMapper.class.getName());
|
||||
@Override
|
||||
public Response toResponse(OwnershipException exception) {
|
||||
logger.log(Level.WARNING, "OwnershipException occurred in REST call: " + exception.getMessage());
|
||||
return Response.status(exception.getStatus()).entity(new GeneralResponse(false, exception.getMessage()).toString()).build();
|
||||
}
|
||||
}
|
||||
@@ -523,6 +523,14 @@ public class SecurityServiceImpl implements ReplicableSecurityService, ClearStat
|
||||
return updateAccessControlList(idOfAccessControlledObject, permissionMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccessControlList overrideAccessControlList(QualifiedObjectIdentifier idOfAccessControlledObject,
|
||||
Map<UserGroup, Set<String>> permissionMap, String displayNameOfAccessControlledObject) {
|
||||
accessControlStore.removeAccessControlList(idOfAccessControlledObject);
|
||||
accessControlStore.setEmptyAccessControlList(idOfAccessControlledObject, displayNameOfAccessControlledObject);
|
||||
return updateAccessControlList(idOfAccessControlledObject, permissionMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccessControlList updateAccessControlList(QualifiedObjectIdentifier idOfAccessControlledObject,
|
||||
Map<UserGroup, Set<String>> permissionMap) {
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
package com.sap.sse.security.jaxrs.api;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.PUT;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
import javax.ws.rs.core.Response.Status;
|
||||
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.JSONValue;
|
||||
|
||||
import com.sap.sse.security.exceptions.OwnershipException;
|
||||
import com.sap.sse.security.jaxrs.AbstractSecurityResource;
|
||||
import com.sap.sse.security.model.GeneralResponse;
|
||||
import com.sap.sse.security.shared.AccessControlListAnnotation;
|
||||
import com.sap.sse.security.shared.HasPermissions.DefaultActions;
|
||||
import com.sap.sse.security.shared.OwnershipAnnotation;
|
||||
import com.sap.sse.security.shared.QualifiedObjectIdentifier;
|
||||
import com.sap.sse.security.shared.TypeRelativeObjectIdentifier;
|
||||
import com.sap.sse.security.shared.impl.QualifiedObjectIdentifierImpl;
|
||||
import com.sap.sse.security.shared.impl.User;
|
||||
import com.sap.sse.security.shared.impl.UserGroup;
|
||||
|
||||
@Path("/restsecurity/ownership")
|
||||
public class OwnershipResource extends AbstractSecurityResource {
|
||||
private static final String KEY_OBJECT_ID = "objectId";
|
||||
private static final String KEY_OBJECT_TYPE = "objectType";
|
||||
private static final String KEY_USERNAME = "username";
|
||||
private static final String KEY_GROUP_ID = "groupId";
|
||||
private static final String KEY_ACL = "acl";
|
||||
private static final String KEY_ACTIONS = "actions";
|
||||
private static final String KEY_DISPLAY_NAME = "displayName";
|
||||
|
||||
@Path("{objectType}/{typeRelativeObjectId}")
|
||||
@PUT
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
public Response setOwnership(@PathParam("objectType") String objectType,
|
||||
@PathParam("typeRelativeObjectId") String typeRelativeObjectId, String jsonBody) throws OwnershipException {
|
||||
final JSONObject json = (JSONObject) JSONValue.parse(jsonBody);
|
||||
QualifiedObjectIdentifier identifier = new QualifiedObjectIdentifierImpl((String) json.get(KEY_OBJECT_TYPE),
|
||||
new TypeRelativeObjectIdentifier((String) json.get(KEY_OBJECT_ID)));
|
||||
try {
|
||||
SecurityUtils.getSubject().checkPermission(identifier.getStringPermission(DefaultActions.CHANGE_OWNERSHIP));
|
||||
} catch (Exception ex) {
|
||||
throw new OwnershipException("Not permitted to change ownership.", Status.FORBIDDEN);
|
||||
}
|
||||
final OwnershipAnnotation existingOwnership = getService().getOwnership(identifier);
|
||||
final User user;
|
||||
if (json.containsKey(KEY_USERNAME)) {
|
||||
final String username = (String) json.get(KEY_USERNAME);
|
||||
if (username == null) {
|
||||
user = null;
|
||||
} else {
|
||||
user = getService().getUserByName(username);
|
||||
if (user == null) {
|
||||
// username provided but cannot be resolved
|
||||
throw new OwnershipException("User Not found", Status.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
user = existingOwnership == null ? null : existingOwnership.getAnnotation().getUserOwner();
|
||||
}
|
||||
final UserGroup userGroup;
|
||||
if (json.containsKey(KEY_GROUP_ID)) {
|
||||
final String userGroupIdAsString = (String) json.get(KEY_GROUP_ID);
|
||||
if (userGroupIdAsString == null) {
|
||||
userGroup = null;
|
||||
} else {
|
||||
userGroup = getService().getUserGroup(UUID.fromString(userGroupIdAsString));
|
||||
if (userGroup == null) {
|
||||
throw new OwnershipException("UserGroup Not found", Status.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
userGroup = existingOwnership == null ? null : existingOwnership.getAnnotation().getTenantOwner();
|
||||
}
|
||||
if (json.containsKey(KEY_DISPLAY_NAME)) {
|
||||
getService().setOwnership(identifier, user, userGroup, (String) json.get(KEY_DISPLAY_NAME));
|
||||
} else {
|
||||
getService().setOwnership(identifier, user, userGroup);
|
||||
}
|
||||
return Response.ok(new GeneralResponse(true, "Ownership changed successfully").toString()).build();
|
||||
}
|
||||
|
||||
@Path("{objectType}/{typeRelativeObjectId}")
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
public Response getOwnership(@PathParam("objectType") String objectType,
|
||||
@PathParam("typeRelativeObjectId") String typeRelativeObjectId) throws OwnershipException {
|
||||
QualifiedObjectIdentifier identifier = new QualifiedObjectIdentifierImpl(objectType,
|
||||
new TypeRelativeObjectIdentifier(typeRelativeObjectId));
|
||||
final OwnershipAnnotation existingOwnership = getService().getOwnership(identifier);
|
||||
final JSONObject result = new JSONObject();
|
||||
result.put(KEY_OBJECT_TYPE, objectType);
|
||||
result.put(KEY_OBJECT_ID, typeRelativeObjectId);
|
||||
result.put(KEY_GROUP_ID, existingOwnership == null || existingOwnership.getAnnotation().getTenantOwner() == null ? null : existingOwnership.getAnnotation().getTenantOwner().getId().toString());
|
||||
result.put(KEY_USERNAME, existingOwnership == null || existingOwnership.getAnnotation().getUserOwner() == null ? null : existingOwnership.getAnnotation().getUserOwner().getName());
|
||||
result.put(KEY_DISPLAY_NAME, existingOwnership == null || existingOwnership.getDisplayNameOfAnnotatedObject() == null ? null : existingOwnership.getDisplayNameOfAnnotatedObject());
|
||||
return Response.ok(result.toJSONString()).build();
|
||||
}
|
||||
|
||||
@Path("{objectType}/{typeRelativeObjectId}/acl")
|
||||
@GET
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
public Response getAccessControlLists(@PathParam("objectType") String objectType,
|
||||
@PathParam("typeRelativeObjectId") String typeRelativeObjectId) throws OwnershipException {
|
||||
QualifiedObjectIdentifier identifier = new QualifiedObjectIdentifierImpl(objectType,
|
||||
new TypeRelativeObjectIdentifier(typeRelativeObjectId));
|
||||
final AccessControlListAnnotation acl = getService().getAccessControlList(identifier);
|
||||
final JSONObject result = new JSONObject();
|
||||
result.put(KEY_OBJECT_TYPE, objectType);
|
||||
result.put(KEY_OBJECT_ID, typeRelativeObjectId);
|
||||
result.put(KEY_DISPLAY_NAME, acl == null || acl.getDisplayNameOfAnnotatedObject() == null ? null : acl.getDisplayNameOfAnnotatedObject());
|
||||
final JSONArray actionsByUserGroup = new JSONArray();
|
||||
result.put(KEY_ACL, actionsByUserGroup);
|
||||
if (acl != null && acl.getAnnotation() != null) {
|
||||
for (final Entry<UserGroup, Set<String>> e : acl.getAnnotation().getActionsByUserGroup().entrySet()) {
|
||||
final JSONObject actionsForGroup = new JSONObject();
|
||||
actionsByUserGroup.add(actionsForGroup);
|
||||
actionsForGroup.put(KEY_GROUP_ID, e.getKey() == null ? null : e.getKey().getId().toString());
|
||||
final JSONArray actions = new JSONArray();
|
||||
actions.addAll(e.getValue());
|
||||
actionsForGroup.put(KEY_ACTIONS, actions);
|
||||
}
|
||||
}
|
||||
return Response.ok(result.toJSONString()).build();
|
||||
}
|
||||
|
||||
@Path("{objectType}/{typeRelativeObjectId}/acl")
|
||||
@PUT
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Produces("application/json;charset=UTF-8")
|
||||
public Response getAccessControlLists(@PathParam("objectType") String objectType,
|
||||
@PathParam("typeRelativeObjectId") String typeRelativeObjectId, String jsonBody) throws OwnershipException {
|
||||
final JSONObject json = (JSONObject) JSONValue.parse(jsonBody);
|
||||
final JSONArray actionsByUserGroupJson = (JSONArray) json.get(KEY_ACL);
|
||||
QualifiedObjectIdentifier identifier = new QualifiedObjectIdentifierImpl(objectType,
|
||||
new TypeRelativeObjectIdentifier(typeRelativeObjectId));
|
||||
try {
|
||||
SecurityUtils.getSubject().checkPermission(identifier.getStringPermission(DefaultActions.CHANGE_ACL));
|
||||
} catch (Exception ex) {
|
||||
throw new OwnershipException("Not permitted to change ownership.", Status.FORBIDDEN);
|
||||
}
|
||||
final Map<UserGroup, Set<String>> actionsByUserGroup = new HashMap<>();
|
||||
for (final Object o : actionsByUserGroupJson) {
|
||||
final JSONObject permissionsForGroup = (JSONObject) o;
|
||||
final String groupIdAsString = (String) permissionsForGroup.get(KEY_GROUP_ID);
|
||||
final UserGroup group;
|
||||
if (groupIdAsString == null) {
|
||||
group = null;
|
||||
} else {
|
||||
group = getService().getUserGroup(UUID.fromString(groupIdAsString));
|
||||
if (group == null) {
|
||||
throw new OwnershipException(String.format("UserGroup with ID %s Not found", groupIdAsString), Status.BAD_REQUEST);
|
||||
}
|
||||
}
|
||||
final JSONArray actions = (JSONArray) permissionsForGroup.get(KEY_ACTIONS);
|
||||
final Set<String> actionsForGroup = new HashSet<>();
|
||||
for (final Object action : actions) {
|
||||
actionsForGroup.add(action.toString());
|
||||
}
|
||||
actionsByUserGroup.put(group, actionsForGroup);
|
||||
}
|
||||
if (json.containsKey(KEY_DISPLAY_NAME)) {
|
||||
final String displayName = (String) json.get(KEY_DISPLAY_NAME);
|
||||
getService().overrideAccessControlList(identifier, actionsByUserGroup, displayName);
|
||||
} else {
|
||||
getService().overrideAccessControlList(identifier, actionsByUserGroup);
|
||||
}
|
||||
return Response.ok(new GeneralResponse(true, "ACL changed successfully").toString()).build();
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -5,6 +5,7 @@ import java.util.Set;
|
||||
|
||||
import javax.ws.rs.core.Application;
|
||||
|
||||
import com.sap.sse.security.exceptions.handler.OwnershipExceptionHandler;
|
||||
import com.sap.sse.security.jaxrs.ShiroAuthorizationExceptionTo401ResponseMapper;
|
||||
|
||||
public class RestApiApplication extends Application {
|
||||
@@ -13,9 +14,10 @@ public class RestApiApplication extends Application {
|
||||
classes.add(SecurityResource.class);
|
||||
classes.add(UserGroupResource.class);
|
||||
classes.add(RoleResource.class);
|
||||
|
||||
classes.add(OwnershipResource.class);
|
||||
// exception mapper
|
||||
classes.add(ShiroAuthorizationExceptionTo401ResponseMapper.class);
|
||||
classes.add(OwnershipExceptionHandler.class);
|
||||
return classes;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.sap.sse.security.model;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/***
|
||||
* This Class will be used to send general response in JSON format.
|
||||
* @author Usman Ali
|
||||
*
|
||||
*/
|
||||
public class GeneralResponse implements Serializable{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private boolean responseStatus;
|
||||
private String responseMessage;
|
||||
|
||||
public GeneralResponse(boolean responseStatus, String responseMessage) {
|
||||
super();
|
||||
this.responseStatus = responseStatus;
|
||||
this.responseMessage = responseMessage;
|
||||
}
|
||||
|
||||
public boolean isResponseStatus() {
|
||||
return responseStatus;
|
||||
}
|
||||
public void setResponseStatus(boolean responseStatus) {
|
||||
this.responseStatus = responseStatus;
|
||||
}
|
||||
public String getResponseMessage() {
|
||||
return responseMessage;
|
||||
}
|
||||
public void setResponseMessage(String responseMessage) {
|
||||
this.responseMessage = responseMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return " {\"responseStatus\":\"" + responseStatus + "\", \"responseMessage\":\"" + responseMessage + "\"}";
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -62,6 +62,10 @@ be <code>http://sapsailing.com/security/api/restsecurity/login</code>.
|
||||
<td><a href="remove_access_token.html">/api/restsecurity/remove_access_token</a></td>
|
||||
<td>Remove an existing access token, rendering it invalid for authenticating to the server</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="ownership.html">/api/restsecurity/ownership</a></td>
|
||||
<td>Change Object ownership</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
|
||||
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
|
||||
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
|
||||
<title>SAP Sponsorships Engine Security Webservices API</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>SAP Sponsorships Engine Security Webservices API</h1>
|
||||
<h2>URL: /api/restsecurity/onwership</h2>
|
||||
|
||||
<b>Description:</b>
|
||||
<p>The service obtains or changes the ownership of object, or obtains or changes access control list (ACL) properties of an object.</p>
|
||||
<br/>
|
||||
|
||||
<b>Change Ownership</b>
|
||||
<table>
|
||||
<tr>
|
||||
<td>Request Method:</td>
|
||||
<td>PUT /{objectType}/{typeRelativeObjectId}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Output format:</td>
|
||||
<td>a JSON document of the following format<br>
|
||||
<pre>{ "responseStatus": "true", "responseMessage": "Ownership changed successfully"}</pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Parameter (path and body):</td>
|
||||
<td>
|
||||
<div>typeRelativeObjectId</div> Unique Object id.
|
||||
<div>objectType</div> Object type represents the type of object to change the ownership.
|
||||
<div>groupId</div> GroupId to assign given group to ownership of object object. If the property is missing in the body,
|
||||
the group ownership is not touched. If it is null, the group ownership is reset to null.
|
||||
<div>username</div> Username to search the user in order to attach it with given Object ownership. If the property is missing in the body,
|
||||
the user ownership is not touched. If it is null, the user ownership is reset to null.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example:</td>
|
||||
<td><code>curl -X POST -d '{
|
||||
"groupId":"admin-tenant",
|
||||
"username":"admin"
|
||||
}' -H 'Content-type: application/json' "http://admin:admin@127.0.0.1:8888/security/api/restsecurity/ownership/USER_GROUP/427ebd42-ac69-4f74-a171-376d9bea9457"</code><br>
|
||||
Will provide a JSON document as explained above.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Request Method:</td>
|
||||
<td>GET /{objectType}/{typeRelativeObjectId}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Output format:</td>
|
||||
<td>a JSON document of the following format<br>
|
||||
<pre>{"objectType":"USER_GROUP","objectId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","groupId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","username":"admin"}</pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Parameter (path)</td>
|
||||
<td>
|
||||
<div>objectType</div> Object type represents the type of object to change the ownership.
|
||||
<div>objectId</div> Unique Object id.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example:</td>
|
||||
<td><code>curl "http://127.0.0.1:8888/security/api/restsecurity/ownership/USER_GROUP/82832851-07ac-47ee-9ddf-6f4f9eaa7823"</code><br>
|
||||
Will provide a JSON document as explained above.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Request Method:</td>
|
||||
<td>GET /{objectType}/{typeRelativeObjectId}/acl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Output format:</td>
|
||||
<td>a JSON document of the following format<br>
|
||||
<pre>{"objectType":"USER_GROUP","objectId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","displayName": null,"acl":[{"groupId":null,"actions":["READ","!DELETE"]},{"groupId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","actions":["READ","!UPDATE"]}]}
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Parameter (path)</td>
|
||||
<td>
|
||||
<div>objectType</div> Object type represents the type of object to request the ACL information for
|
||||
<div>objectId</div> Unique Object id.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example:</td>
|
||||
<td><code>curl -i -X GET "http://admin:admin@127.0.0.1:8888/security/api/restsecurity/ownership/USER_GROUP/82832851-07ac-47ee-9ddf-6f4f9eaa7823/acl"</code><br>
|
||||
Will provide a JSON document as explained above.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Request Method:</td>
|
||||
<td>PUT /{objectType}/{typeRelativeObjectId}/acl</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Output format:</td>
|
||||
<td>a JSON document of the following format<br>
|
||||
<pre>{ "responseStatus": "true", "responseMessage": "Ownership changed successfully"}</pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Parameter (path, body)</td>
|
||||
<td>
|
||||
<div>objectType</div> Object type represents the type of object to request the ACL information for
|
||||
<div>objectId</div> Unique Object id.
|
||||
<div>The body must contain a document as the one returned by the GET method, only that the objectType and objectId fields are not required in
|
||||
the body and will be ignored as these parameters are expected to be provided in the path.</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Example:</td>
|
||||
<td><code>curl -i -X PUT -H 'Content-Type: application/json' -d '{"objectType":"USER_GROUP","objectId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","displayName":"The Admin Tenant ACL","acl":[{"groupId":null,"actions":["READ","!UPDATE"]},{"groupId":"82832851-07ac-47ee-9ddf-6f4f9eaa7823","actions":["READ","!DELETE"]}]}' "http://admin:admin@127.0.0.1:8888/security/api/restsecurity/ownership/USER_GROUP/82832851-07ac-47ee-9ddf-6f4f9eaa7823/acl"</code><br>
|
||||
Will provide a JSON document as explained above.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: TracTrac Client module
|
||||
Bundle-SymbolicName: com.tractrac.clientmodule
|
||||
Bundle-Version: 3.12.5
|
||||
Bundle-Version: 3.13.0
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-ClassPath: .,
|
||||
lib/TracAPI.jar
|
||||
|
||||
@@ -16,15 +16,27 @@ It contains also some files:
|
||||
- test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example.
|
||||
- Manifest.txt -> manifest used to create the test.jar file
|
||||
|
||||
********************************************
|
||||
************* TracAPI 3.13.0 ***************
|
||||
********************************************
|
||||
This is a final version. It changes the enumerate RaceStatusType, breaking the backward compatibility:
|
||||
|
||||
- RaceStatusType.FINAL is renamed to RaceStatusType.OFFICIAL
|
||||
- RaceStatusType.FINISHED is renamed to RaceStatusType.UNOFFICIAL
|
||||
|
||||
Release date: 15/01/2019
|
||||
Build number: 41b9774f520978e2bc4596d82da891c5c77d8da8
|
||||
|
||||
********************************************
|
||||
************* TracAPI 3.12.5 ***************
|
||||
********************************************
|
||||
|
||||
1) Features
|
||||
This is a final version. It adds a some features. It keeps the backward compatibility.
|
||||
|
||||
Release date: 21/11/2019
|
||||
Build number: 27eb535e
|
||||
|
||||
1) Features
|
||||
|
||||
- If the sport is Orienteering/Route sport the API wont't retrieve the control positions from the server (Requested
|
||||
by Jorge Piera, 29/07/2019)
|
||||
- If the start time type is Individual and the competitor has start time, the API discards the positions two minutes
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>All Classes</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>All Classes</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IIdentifiable</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>INamed</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>ModelLocator</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>AbstractAttachable</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IAttachable</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IAttachmentKey</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IAttachmentManager</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.attachment</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.attachment</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.attachment Class Hierarchy</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IControlPassing</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IControlPassings</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IMessageData</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPosition</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPositionFactory</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPositionOffset</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPositionSnapped</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IStartStopData</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>ITimeData</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.data</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.data</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.data Class Hierarchy</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>CreateModelException</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>DataSource</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>EventType</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>ICompetitor</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>ICompetitorClass</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IEvent</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IEventFactory</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+18
-28
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IRace</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
@@ -256,19 +256,14 @@ extends <a href="../../../../../../com/tractrac/model/lib/api/INamed.html" title
|
||||
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/IRace.html#getStatus--">getStatus</a></span>()</code>
|
||||
<div class="block">Gets the status of the race that can be:
|
||||
|
||||
NO_INFOS: No information available for this race yet
|
||||
ESTIMATED: Race start time is estimated
|
||||
SCHEDULED: Race scheduled to start at the given race start time
|
||||
START_PHASE: Race start likely at the given race start time.
|
||||
RUNNING: Post 10 minute gun (Start time therefore confirmed)
|
||||
FINISHING: racing
|
||||
FINISHED: race completed
|
||||
POSTPONED: race postponed, restart unknown
|
||||
CAN_RESTART: Race abandoned, a restart is possible.
|
||||
ABANDONED: Race abandoned, no restart today.
|
||||
NO_RACE: No racing today
|
||||
CANCELLED: No racing today.
|
||||
NO_DATA: Due to technical problems, no data available for this race.
|
||||
NONE: No information available for this race yet
|
||||
START: It is typically 5 minutes before the race start time
|
||||
RACING: After the race start time
|
||||
UNOFFICIAL: The race is over but the results have not been confirmed
|
||||
ABANDONED: race abandoned
|
||||
OFFICIAL: The race is over and the results have been
|
||||
GENERAL_RECALL: Race abandoned, a restart is possible.
|
||||
POSTPONED: Race postponed, restart unknown
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -622,19 +617,14 @@ extends <a href="../../../../../../com/tractrac/model/lib/api/INamed.html" title
|
||||
<pre><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> getStatus()</pre>
|
||||
<div class="block">Gets the status of the race that can be:
|
||||
<ul>
|
||||
<li>NO_INFOS: No information available for this race yet</li>
|
||||
<li>ESTIMATED: Race start time is estimated</li>
|
||||
<li>SCHEDULED: Race scheduled to start at the given race start time</li>
|
||||
<li>START_PHASE: Race start likely at the given race start time.</li>
|
||||
<li>RUNNING: Post 10 minute gun (Start time therefore confirmed)</li>
|
||||
<li>FINISHING: racing</li>
|
||||
<li>FINISHED: race completed</li>
|
||||
<li>POSTPONED: race postponed, restart unknown</li>
|
||||
<li>CAN_RESTART: Race abandoned, a restart is possible.</li>
|
||||
<li>ABANDONED: Race abandoned, no restart today.</li>
|
||||
<li>NO_RACE: No racing today</li>
|
||||
<li>CANCELLED: No racing today.</li>
|
||||
<li>NO_DATA: Due to technical problems, no data available for this race.</li>
|
||||
<li>NONE: No information available for this race yet</li>
|
||||
<li>START: It is typically 5 minutes before the race start time</li>
|
||||
<li>RACING: After the race start time</li>
|
||||
<li>UNOFFICIAL: The race is over but the results have not been confirmed</li>
|
||||
<li>ABANDONED: race abandoned</li>
|
||||
<li>OFFICIAL: The race is over and the results have been</li>
|
||||
<li>GENERAL_RECALL: Race abandoned, a restart is possible.</li>
|
||||
<li>POSTPONED: Race postponed, restart unknown</li>
|
||||
</ul></div>
|
||||
<dl>
|
||||
<dt><span class="returnLabel">Returns:</span></dt>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IRaceCompetitor</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IRaceSerie</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>ITeam</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>RaceCompetitorStatusType</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>RaceLoadingException</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+28
-17
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>RaceStatusType</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
@@ -119,7 +119,18 @@ var activeTableTab = "activeTableTab";
|
||||
<br>
|
||||
<pre>public enum <span class="typeNameLabel">RaceStatusType</span>
|
||||
extends java.lang.Enum<<a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a>></pre>
|
||||
<div class="block">Values for race status.</div>
|
||||
<div class="block">Values for race status. The possible values are
|
||||
|
||||
<ul>
|
||||
<li>NONE: No information available for this race yet</li>
|
||||
<li>START: It is typically 5 minutes before the race start time</li>
|
||||
<li>RACING: After the race start time</li>
|
||||
<li>UNOFFICIAL: The race is over but the results have not been confirmed</li>
|
||||
<li>ABANDONED: race abandoned</li>
|
||||
<li>OFFICIAL: The race is over and the results have been</li>
|
||||
<li>GENERAL_RECALL: Race abandoned, a restart is possible.</li>
|
||||
<li>POSTPONED: Race postponed, restart unknown</li>
|
||||
</ul></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -141,26 +152,26 @@ extends java.lang.Enum<<a href="../../../../../../com/tractrac/model/lib/api/
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#ABANDONED">ABANDONED</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#FINAL">FINAL</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#FINISHED">FINISHED</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#GENERAL_RECALL">GENERAL_RECALL</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#NONE">NONE</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#POSTPONED">POSTPONED</a></span></code> </td>
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#OFFICIAL">OFFICIAL</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#RACING">RACING</a></span></code> </td>
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#POSTPONED">POSTPONED</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#RACING">RACING</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="altColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#START">START</a></span></code> </td>
|
||||
</tr>
|
||||
<tr class="rowColor">
|
||||
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html#UNOFFICIAL">UNOFFICIAL</a></span></code> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -257,13 +268,13 @@ the order they are declared.</div>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> RACING</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="FINISHED">
|
||||
<a name="UNOFFICIAL">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>FINISHED</h4>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> FINISHED</pre>
|
||||
<h4>UNOFFICIAL</h4>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> UNOFFICIAL</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="ABANDONED">
|
||||
@@ -275,13 +286,13 @@ the order they are declared.</div>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> ABANDONED</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="FINAL">
|
||||
<a name="OFFICIAL">
|
||||
<!-- -->
|
||||
</a>
|
||||
<ul class="blockList">
|
||||
<li class="blockList">
|
||||
<h4>FINAL</h4>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> FINAL</pre>
|
||||
<h4>OFFICIAL</h4>
|
||||
<pre>public static final <a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event">RaceStatusType</a> OFFICIAL</pre>
|
||||
</li>
|
||||
</ul>
|
||||
<a name="GENERAL_RECALL">
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>RaceVisibilityType</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>StartTimeType</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.event</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.event</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+5
-5
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.event Class Hierarchy</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
@@ -150,12 +150,12 @@
|
||||
<ul>
|
||||
<li type="circle">java.lang.Enum<E> (implements java.lang.Comparable<T>, java.io.Serializable)
|
||||
<ul>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/EventType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">EventType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/StartTimeType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">StartTimeType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">RaceStatusType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/RaceCompetitorStatusType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">RaceCompetitorStatusType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/RaceVisibilityType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">RaceVisibilityType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/StartTimeType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">StartTimeType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/DataSource.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">DataSource</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/EventType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">EventType</span></a></li>
|
||||
<li type="circle">com.tractrac.model.lib.api.event.<a href="../../../../../../com/tractrac/model/lib/api/event/RaceStatusType.html" title="enum in com.tractrac.model.lib.api.event"><span class="typeNameLink">RaceStatusType</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IMetadata</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IMetadataContainer</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:35 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IMetadataFactory</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:08 UTC 2020 -->
|
||||
<title>IPropertiesContainer</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.metadata</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.metadata</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.metadata Class Hierarchy</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api Class Hierarchy</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IControl</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IControlPoint</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IControlRoute</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPathRoute</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPathRouteFactory</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IPathSegment</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>IRoute</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>ISegment</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@
|
||||
<!-- NewPage -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Generated by javadoc (1.8.0_161) on Thu Nov 21 09:55:36 UTC 2019 -->
|
||||
<!-- Generated by javadoc (1.8.0_161) on Wed Jan 15 13:37:09 UTC 2020 -->
|
||||
<title>com.tractrac.model.lib.api.route</title>
|
||||
<meta name="date" content="2019-11-21">
|
||||
<meta name="date" content="2020-01-15">
|
||||
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
|
||||
<script type="text/javascript" src="../../../../../../script.js"></script>
|
||||
</head>
|
||||
|
||||
Loaded 100 of 194 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user