Merge branch 'master' into permission-vertical

Change-Id: Ie55e40f6b736664fdcc385a1cc1fc7f32e849a99
This commit is contained in:
Axel Uhl committed 2018-12-06 16:23:38 +01:00
commit 516d5aacb0
6 files changed
+173 -4

No files matched your search

@@ -73,6 +73,10 @@ public interface SharedDomainFactory extends CompetitorFactory, BoatFactory {
*/
Waypoint getExistingWaypointByIdOrCache(Waypoint waypoint);
BoatClass getBoatClass(String name);
Iterable<BoatClass> getBoatClasses();
BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind);
/**
@@ -292,9 +292,36 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
((WeakWaypointReference) ref).removeCacheEntry();
}
}
@Override
public BoatClass getBoatClass(String name) {
return getBoatClassOrCreateIfMasterdataExists(name);
}
@Override
public Iterable<BoatClass> getBoatClasses() {
return Collections.unmodifiableCollection(boatClassCache.values());
}
@Override
public BoatClass getOrCreateBoatClass(String name, boolean typicallyStartsUpwind) {
synchronized (boatClassCache) {
BoatClass result = getBoatClassOrCreateIfMasterdataExists(name);
if (result == null) {
final String unifiedBoatClassName = BoatClassMasterdata.unifyBoatClassNameBasedOnExistingMasterdata(name);
result = new BoatClassImpl(unifiedBoatClassName, typicallyStartsUpwind);
boatClassCache.put(unifiedBoatClassName, result);
}
return result;
}
}
/**
* @return {@code null} if no master data is found for the boat class and the cache doesn't contain a boat class
* with the {@link BoatClassMasterdata#unifyBoatClassNameBasedOnExistingMasterdata(String)} unified /
* canonicalized name.
*/
private BoatClass getBoatClassOrCreateIfMasterdataExists(String name) {
final BoatClassMasterdata boatClassMasterdata = BoatClassMasterdata.resolveBoatClass(name);
final String unifiedBoatClassName = BoatClassMasterdata.unifyBoatClassNameBasedOnExistingMasterdata(name);
BoatClass result;
@@ -303,15 +330,13 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
if (result == null) {
if (unifiedBoatClassName != null && boatClassMasterdata != null) {
result = new BoatClassImpl(boatClassMasterdata.getDisplayName(), boatClassMasterdata);
} else {
result = new BoatClassImpl(unifiedBoatClassName, typicallyStartsUpwind);
boatClassCache.put(unifiedBoatClassName, result);
}
boatClassCache.put(unifiedBoatClassName, result);
}
return result;
}
}
@Override
public BoatClass getOrCreateBoatClass(final String name) {
final String unifiedBoatClassName = BoatClassMasterdata.unifyBoatClassNameBasedOnExistingMasterdata(name);
@@ -0,0 +1,51 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import javax.ws.rs.GET;
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.commons.lang.StringEscapeUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer;
@Path("/v1/boatclasses")
public class BoatClassesResource extends AbstractSailingServerResource {
@GET
@Produces("application/json;charset=UTF-8")
public Response getBoatClasses() {
BoatClassJsonSerializer boatClassJsonSerializer = new BoatClassJsonSerializer();
final JSONArray result = new JSONArray();
for (final BoatClass boatClass : getService().getBaseDomainFactory().getBoatClasses()) {
final JSONObject jsonBoatClass = boatClassJsonSerializer.serialize(boatClass);
result.add(jsonBoatClass);
}
return Response.ok(result.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{boatClassName}")
public Response getBoat(@PathParam("boatClassName") String boatClassName) {
Response response;
BoatClass boatClass = getService().getBaseDomainFactory().getBoatClass(boatClassName);
if (boatClass == null) {
response = Response.status(Status.NOT_FOUND)
.entity("Could not find a boat with id '" + StringEscapeUtils.escapeHtml(boatClassName) + "'.")
.type(MediaType.TEXT_PLAIN).build();
} else {
BoatClassJsonSerializer boatClassJsonSerializer = new BoatClassJsonSerializer();
String jsonString = boatClassJsonSerializer.serialize(boatClass).toJSONString();
response = Response.ok(jsonString).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build();
}
return response;
}
}
@@ -16,6 +16,7 @@ public class RestApiApplication extends Application {
classes.add(EventsResource.class);
classes.add(RegattasResource.class);
classes.add(BoatsResource.class);
classes.add(BoatClassesResource.class);
classes.add(LeaderboardsResource.class);
classes.add(LeaderboardsResourceV2.class);
classes.add(PolarResource.class);
@@ -0,0 +1,84 @@
<!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/boatclasses</h2>
<b>Description:</b>
<p>Gets information about a boat class or the list of available boat classes</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>boatclassname</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example all boat classes:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/boatclasses">http://www.sapsailing.com/sailingserver/api/v1/boatclasses</a></td>
</tr>
<tr>
<td>Example answer</td>
<td><pre>
<code>
[
{
"name": "MANTRA28",
"typicallyStartsUpwind": true
},
{
"name": "30QMSCHÄRENKREUZER",
"typicallyStartsUpwind": true
},
{
"name": "75QMNATIONALEKREUZER",
"typicallyStartsUpwind": true
},
...
]
</code>
</pre>
</td>
</tr>
<tr>
<td>Example specific boat class </td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/boatclasses/MANTRA28">http://www.sapsailing.com/sailingserver/api/v1/boatclasses/MANTRA28</a></td>
</tr>
<tr>
<td>Example answer</td>
<td><pre>
<code>
{
"name": "MANTRA28",
"typicallyStartsUpwind": true
}
</code>
</pre></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -264,6 +264,10 @@ name to make sure you get to the event you're interested in.
<td><a href="raceDetailsGetDoc.html">/api/v1/trackedRaces/raceDetails</a></td>
<td>Gets more information about a specified RegattaAndRace identifier</td>
</tr>
<tr>
<td><a href="boatclasses.html">/api/v1/boatclasses</a></td>
<td>Obtains information about all or a single boat class</td>
</tr>
<tr>
<td><a href="boats.html">/api/v1/boats</a></td>
<td>Obtains information about a single boat</td>