mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 22:43:57 +00:00
Merge branch 'master' into permission-vertical
Change-Id: Ie55e40f6b736664fdcc385a1cc1fc7f32e849a99
This commit is contained in:
commit
516d5aacb0
6 files changed
+173
-4
No files matched your search
+4
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
+29
-4
@@ -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);
|
||||
|
||||
+51
@@ -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;
|
||||
}
|
||||
}
|
||||
+1
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user