started to move update handler classes to com.sap.sailing.domain bundle

Change-Id: I821f633ee1e5f1db970017788473b4edcce8cbd8
This commit is contained in:
Axel Uhl committed 2018-07-27 17:11:50 +02:00
1 parent 7938babf4f
commit 2a7221c2c6
13 files changed
+147 -111

No files matched your search

@@ -73,6 +73,9 @@ import com.sap.sailing.domain.tracking.TrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tracking.impl.FinishTimeUpdateHandler;
import com.sap.sailing.domain.tracking.impl.RaceAbortedHandler;
import com.sap.sailing.domain.tracking.impl.StartTimeUpdateHandler;
import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.JSONService;
import com.sap.sailing.domain.tractracadapter.MetadataParser;
@@ -678,15 +681,15 @@ public class DomainFactoryImpl implements DomainFactory {
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
raceDefinition.getId(), tractracRace, this);
trackedRace.addCourseDesignChangedListener(courseDesignHandler);
TracTracStartTimeUpdateHandler startTimeHandler = new TracTracStartTimeUpdateHandler(
StartTimeUpdateHandler startTimeHandler = new StartTimeUpdateHandler(
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
raceDefinition.getId(), trackedRace.getTrackedRegatta().getRegatta());
trackedRace.addStartTimeChangedListener(startTimeHandler);
TracTracRaceAbortedHandler raceAbortedHandler = new TracTracRaceAbortedHandler(
RaceAbortedHandler raceAbortedHandler = new RaceAbortedHandler(
tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
raceDefinition.getId());
trackedRace.addRaceAbortedListener(raceAbortedHandler);
trackedRace.addListener(new TracTracFinishTimeUpdateHandler(tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
trackedRace.addListener(new FinishTimeUpdateHandler(tracTracUpdateURI, tracTracUsername, tracTracPassword, tracTracEventUuid,
raceDefinition.getId(), trackedRace.getTrackedRegatta().getRegatta()).getListener());
}
@@ -1,86 +1,32 @@
package com.sap.sailing.domain.tractracadapter.impl;
import java.io.IOException;
import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.Iterator;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
import com.sap.sailing.domain.tracking.impl.CourseDesignUpdateHandler;
import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
import com.sap.sse.common.Util;
import com.tractrac.model.lib.api.event.IRace;
import com.tractrac.model.lib.api.route.IControl;
public class TracTracCourseDesignUpdateHandler extends UpdateHandler implements CourseDesignChangedListener {
private final static String ACTION = "update_course";
private final static Logger logger = Logger.getLogger(TracTracCourseDesignUpdateHandler.class.getName());
private final JsonSerializer<CourseBase> courseSerializer;
public class TracTracCourseDesignUpdateHandler extends CourseDesignUpdateHandler {
private final IRace tractracRace;
private final DomainFactory domainFactory;
public TracTracCourseDesignUpdateHandler(URI updateURI, String tracTracUsername, String tracTracPassword, Serializable tracTracEventId, Serializable raceId, IRace tractracRace, DomainFactory domainFactory) {
super(updateURI, ACTION, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
super(updateURI, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
this.domainFactory = domainFactory;
this.tractracRace = tractracRace;
this.courseSerializer = new CourseJsonSerializer(
new CourseBaseJsonSerializer(
new WaypointJsonSerializer(
new ControlPointJsonSerializer(
new MarkJsonSerializer(),
new GateJsonSerializer(new MarkJsonSerializer())))));
}
@Override
public void courseDesignChanged(final CourseBase newCourseDesign) throws MalformedURLException, IOException {
if (!isActive()) {
logger.info("Not sending course update to TracTrac because no URL has been provided.");
return;
}
final CourseBase newCourseDesignWithExistingControlPoints = replaceControlPointsByMatchingExistingControlPoints(newCourseDesign);
JSONObject serializedCourseDesign = courseSerializer.serialize(newCourseDesignWithExistingControlPoints);
String payload = serializedCourseDesign.toJSONString();
URL currentCourseDesignURL = buildUpdateURL();
logger.info("Using " + currentCourseDesignURL.toString() + " for the course update!");
logger.info("Payload is " + payload);
HttpURLConnection connection = (HttpURLConnection) currentCourseDesignURL.openConnection();
try {
setConnectionPropertiesAndSendWithPayload(connection, payload);
try {
checkAndLogUpdateResponse(connection);
} catch (ParseException e) {
e.printStackTrace();
}
} finally {
if (connection != null) {
connection.disconnect();
} else {
logger.severe("Connection to TracTrac Course Update URL " + currentCourseDesignURL.toString() + " could not be established");
}
}
}
private CourseBase replaceControlPointsByMatchingExistingControlPoints(CourseBase courseDesign) {
protected CourseBase replaceControlPointsByMatchingExistingControlPoints(CourseBase courseDesign) {
final Iterable<IControl> candidates = domainFactory.getControlsForCourseArea(tractracRace.getEvent(), tractracRace.getCourseArea());
final CourseBase result = new CourseDataImpl(courseDesign.getName());
int zeroBasedPosition = 0;
@@ -47,5 +47,12 @@ Require-Bundle: com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sse.shared.android,
org.apache.commons.math,
com.sap.sailing.declination,
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sse.datamining.annotations
Import-Package: org.apache.http,
org.apache.http.client;version="[4.2.5,4.3.0)",
org.apache.http.client.entity;version="[4.2.5,4.3.0)",
org.apache.http.client.methods;version="[4.2.5,4.3.0)",
org.apache.http.impl.client;version="[4.2.5,4.3.0)",
org.apache.http.message;version="[4.2.5,4.3.0)"
Automatic-Module-Name: com.sap.sailing.domain
@@ -205,7 +205,7 @@ public class DomainFactoryImpl extends SharedDomainFactoryImpl implements Domain
raceDTO.status.status = trackedRace.getStatus() == null ? null : trackedRace.getStatus().getStatus();
raceDTO.status.loadingProgress = trackedRace.getStatus() == null ? 0.0 : trackedRace.getStatus().getLoadingProgress();
}
@Override
public TrackedRaceDTO createTrackedRaceDTO(TrackedRace trackedRace) {
TrackedRaceDTO trackedRaceDTO = new TrackedRaceDTO();
@@ -0,0 +1,78 @@
package com.sap.sailing.domain.tracking.impl;
import java.io.IOException;
import java.io.Serializable;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.logging.Logger;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.tracking.CourseDesignChangedListener;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
public class CourseDesignUpdateHandler extends UpdateHandler implements CourseDesignChangedListener {
private final static String ACTION = "update_course";
private final static Logger logger = Logger.getLogger(CourseDesignUpdateHandler.class.getName());
private final JsonSerializer<CourseBase> courseSerializer;
public CourseDesignUpdateHandler(URI updateURI, String username, String password, Serializable eventId, Serializable raceId) {
super(updateURI, ACTION, username, password, eventId, raceId);
this.courseSerializer = new CourseJsonSerializer(
new CourseBaseJsonSerializer(
new WaypointJsonSerializer(
new ControlPointJsonSerializer(
new MarkJsonSerializer(),
new GateJsonSerializer(new MarkJsonSerializer())))));
}
@Override
public void courseDesignChanged(final CourseBase newCourseDesign) throws MalformedURLException, IOException {
if (!isActive()) {
logger.info("Not sending course update to TracTrac because no URL has been provided.");
return;
}
final CourseBase newCourseDesignWithExistingControlPoints = replaceControlPointsByMatchingExistingControlPoints(newCourseDesign);
JSONObject serializedCourseDesign = courseSerializer.serialize(newCourseDesignWithExistingControlPoints);
String payload = serializedCourseDesign.toJSONString();
URL currentCourseDesignURL = buildUpdateURL();
logger.info("Using " + currentCourseDesignURL.toString() + " for the course update!");
logger.info("Payload is " + payload);
HttpURLConnection connection = (HttpURLConnection) currentCourseDesignURL.openConnection();
try {
setConnectionPropertiesAndSendWithPayload(connection, payload);
try {
checkAndLogUpdateResponse(connection);
} catch (ParseException e) {
e.printStackTrace();
}
} finally {
if (connection != null) {
connection.disconnect();
} else {
logger.severe("Connection to TracTrac Course Update URL " + currentCourseDesignURL.toString() + " could not be established");
}
}
}
/**
* This default implementation returns the {@code courseDesign} unchanged. Subclasses have the possibility to
* override this method in order to replace individual course marks provided in a detailed course design,
* based on the actual course marks available.
*/
protected CourseBase replaceControlPointsByMatchingExistingControlPoints(CourseBase courseDesign) {
return courseDesign;
}
}
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import java.io.BufferedReader;
import java.io.IOException;
@@ -20,12 +20,11 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.impl.AbstractRaceChangeListener;
import com.sap.sse.common.TimePoint;
import com.sap.sse.util.LaxRedirectStrategyForAllRedirectResponseCodes;
public class TracTracFinishTimeUpdateHandler extends UpdateHandler {
private final static Logger logger = Logger.getLogger(TracTracFinishTimeUpdateHandler.class.getName());
public class FinishTimeUpdateHandler extends UpdateHandler {
private final static Logger logger = Logger.getLogger(FinishTimeUpdateHandler.class.getName());
private final static String ACTION_STOP_TRACKING = "end_tracking";
private final static String FIELD_TRACKING_END_TIME = "tracking_end_time";
@@ -36,9 +35,9 @@ public class TracTracFinishTimeUpdateHandler extends UpdateHandler {
*/
private final Regatta regatta;
public TracTracFinishTimeUpdateHandler(URI updateURI, String tracTracUsername, String tracTracPassword,
Serializable tracTracEventId, Serializable raceId, Regatta regatta) {
super(updateURI, ACTION_STOP_TRACKING, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
public FinishTimeUpdateHandler(URI updateURI, String username, String password,
Serializable eventId, Serializable raceId, Regatta regatta) {
super(updateURI, ACTION_STOP_TRACKING, username, password, eventId, raceId);
this.regatta = regatta;
}
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import java.io.IOException;
import java.io.Serializable;
@@ -15,14 +15,14 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.tracking.RaceAbortedListener;
public class TracTracRaceAbortedHandler extends UpdateHandler implements RaceAbortedListener {
public class RaceAbortedHandler extends UpdateHandler implements RaceAbortedListener {
private final static String ACTION = "update_race_status";
private final static Logger logger = Logger.getLogger(TracTracRaceAbortedHandler.class.getName());
private final static Logger logger = Logger.getLogger(RaceAbortedHandler.class.getName());
public TracTracRaceAbortedHandler(URI updateURI, String tracTracUsername, String tracTracPassword, Serializable tracTracEventId, Serializable raceId) {
super(updateURI, ACTION, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
public RaceAbortedHandler(URI updateURI, String username, String password, Serializable eventId, Serializable raceId) {
super(updateURI, ACTION, username, password, eventId, raceId);
}
@Override
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import java.io.IOException;
import java.io.Serializable;
@@ -13,14 +13,14 @@ import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.tracking.StartTimeChangedListener;
import com.sap.sse.common.TimePoint;
public class TracTracStartTimeResetHandler extends UpdateHandler implements StartTimeChangedListener {
public class StartTimeResetHandler extends UpdateHandler implements StartTimeChangedListener {
private static final String ACTION = "resetStartTime";
private final static Logger logger = Logger.getLogger(TracTracStartTimeResetHandler.class.getName());
private final static Logger logger = Logger.getLogger(StartTimeResetHandler.class.getName());
public TracTracStartTimeResetHandler(URI updateURI, String tracTracUsername, String tracTracPassword, Serializable tracTracEventId, Serializable raceId) {
super(updateURI, ACTION, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
public StartTimeResetHandler(URI updateURI, String username, String password, Serializable eventId, Serializable raceId) {
super(updateURI, ACTION, username, password, eventId, raceId);
}
@Override
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import java.io.BufferedReader;
import java.io.IOException;
@@ -28,8 +28,8 @@ import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
import com.sap.sse.util.LaxRedirectStrategyForAllRedirectResponseCodes;
public class TracTracStartTimeUpdateHandler extends UpdateHandler implements StartTimeChangedListener {
private final static Logger logger = Logger.getLogger(TracTracStartTimeUpdateHandler.class.getName());
public class StartTimeUpdateHandler extends UpdateHandler implements StartTimeChangedListener {
private final static Logger logger = Logger.getLogger(StartTimeUpdateHandler.class.getName());
private final static String ACTION = "update_race_start_time";
private final static String ACTION_START_TRACKING = "start_tracking";
@@ -42,7 +42,7 @@ public class TracTracStartTimeUpdateHandler extends UpdateHandler implements Sta
*/
private final Regatta regatta;
public TracTracStartTimeUpdateHandler(URI updateURI, String tracTracUsername, String tracTracPassword,
public StartTimeUpdateHandler(URI updateURI, String tracTracUsername, String tracTracPassword,
Serializable tracTracEventId, Serializable raceId, Regatta regatta) {
super(updateURI, ACTION, tracTracUsername, tracTracPassword, tracTracEventId, raceId);
this.regatta = regatta;
@@ -1,4 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import java.io.BufferedReader;
import java.io.DataOutputStream;
@@ -25,21 +25,28 @@ import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.json.simple.parser.ParseException;
import com.sap.sailing.domain.tractracadapter.UpdateResponse;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sse.common.Duration;
/**
* An update handler can be registered as a listener on a {@link TrackedRace} and can then propagate information to
* an external service. This can, e.g., be a tracking partner's system that is interested in receiving race status
* updates such as new start times or postponements.
*
* @author Axel Uhl (d043530)
*
*/
public class UpdateHandler {
private final static Logger logger = Logger.getLogger(UpdateHandler.class.getName());
private JsonDeserializer<UpdateResponse> updateDeserializer;
private final URI baseURI;
private final String tracTracUsername;
private final String tracTracPassword;
private final Serializable tracTracEventId;
private final String username;
private final String password;
private final Serializable eventId;
private final Serializable raceId;
private final String action;
private final boolean active;
@@ -53,16 +60,16 @@ public class UpdateHandler {
private final static String ResponseCodeForFailure = "FAILURE";
private final static String UpdateUrlTemplate = "%s%s?eventid=%s&raceid=%s&username=%s&password=%s";
public UpdateHandler(URI updateURI, String action, String tracTracUsername, String tracTracPassword, Serializable tracTracEventId, Serializable raceId) {
public UpdateHandler(URI updateURI, String action, String username, String password, Serializable eventId, Serializable raceId) {
this.baseURI = updateURI;
this.action = action;
this.tracTracUsername = tracTracUsername;
this.tracTracPassword = tracTracPassword;
this.tracTracEventId = tracTracEventId;
this.username = username;
this.password = password;
this.eventId = eventId;
this.raceId = raceId;
this.updateDeserializer = new UpdateResponseDeserializer();
if (updateURI != null && !updateURI.toString().equals("")) {
logger.info("Activating TracTrac update handler "+this+" for race with ID "+raceId);
logger.info("Activating update handler "+this+" for race with ID "+raceId);
this.active = true;
} else {
this.active = false;
@@ -87,10 +94,10 @@ public class UpdateHandler {
*/
protected List<BasicNameValuePair> getDefaultParametersAsNewList() {
final List<BasicNameValuePair> result = new ArrayList<>();
result.add(new BasicNameValuePair("eventid", tracTracEventId.toString()));
result.add(new BasicNameValuePair("eventid", eventId.toString()));
result.add(new BasicNameValuePair("raceid", this.raceId.toString()));
result.add(new BasicNameValuePair("username", tracTracUsername));
result.add(new BasicNameValuePair("password", tracTracPassword));
result.add(new BasicNameValuePair("username", username));
result.add(new BasicNameValuePair("password", password));
return result;
}
@@ -103,10 +110,10 @@ public class UpdateHandler {
String url = String.format(UpdateUrlTemplate,
serverUpdateURI.toString(),
this.action,
URLEncoder.encode(this.tracTracEventId.toString(), EncodingUtf8),
URLEncoder.encode(this.eventId.toString(), EncodingUtf8),
URLEncoder.encode(this.raceId.toString(), EncodingUtf8),
URLEncoder.encode(tracTracUsername, EncodingUtf8),
URLEncoder.encode(tracTracPassword, EncodingUtf8));
URLEncoder.encode(username, EncodingUtf8),
URLEncoder.encode(password, EncodingUtf8));
for (Entry<String, String> entry : additionalParameters.entrySet()) {
url += String.format("&%s=%s",
@@ -123,7 +130,7 @@ public class UpdateHandler {
protected void checkAndLogUpdateResponse(HttpURLConnection connection) throws IOException, ParseException {
connection.setConnectTimeout(10000/*milliseconds*/);
connection.connect();
BufferedReader reader = getResponseOnUpdateFromTracTrac(connection);
BufferedReader reader = getResponseOnUpdateFromProvider(connection);
parseAndLogResponse(reader);
}
@@ -133,13 +140,13 @@ public class UpdateHandler {
JSONObject responseObject = Helpers.toJSONObjectSafe(responseBody);
UpdateResponse updateResponse = updateDeserializer.deserialize(responseObject);
if (updateResponse.getStatus().equals(ResponseCodeForFailure)) {
logger.severe("Failed to send data to TracTrac, got following response: " + updateResponse.getMessage());
logger.severe("Failed to send data to provider, got following response: " + updateResponse.getMessage());
} else {
logger.info("Successfully sent data to TracTrac with response: " + updateResponse.getMessage());
logger.info("Successfully sent data to provider with response: " + updateResponse.getMessage());
}
}
private BufferedReader getResponseOnUpdateFromTracTrac(HttpURLConnection connection) throws IOException {
private BufferedReader getResponseOnUpdateFromProvider(HttpURLConnection connection) throws IOException {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
return reader;
@@ -1,7 +1,6 @@
package com.sap.sailing.domain.tractracadapter;
package com.sap.sailing.domain.tracking.impl;
public interface UpdateResponse {
String getStatus();
String getMessage();
@@ -1,8 +1,7 @@
package com.sap.sailing.domain.tractracadapter.impl;
package com.sap.sailing.domain.tracking.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.tractracadapter.UpdateResponse;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
@@ -1,6 +1,4 @@
package com.sap.sailing.domain.tractracadapter.impl;
import com.sap.sailing.domain.tractracadapter.UpdateResponse;
package com.sap.sailing.domain.tracking.impl;
public class UpdateResponseImpl implements UpdateResponse {