From 570dfef4be7bd174fa2a15fd5ac3cd01e08becf2 Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Tue, 2 Jul 2013 13:08:15 +0200 Subject: [PATCH] Removed master data import post servlet replaced with sailingservice implementation --- .../MasterDataImportObjectCreationCount.java | 15 ++ ...sterDataImportObjectCreationCountImpl.java | 68 +++++++++ .../META-INF/MANIFEST.MF | 3 +- .../adminconsole/AdminConsoleEntryPoint.java | 2 +- .../sailing/gwt/ui/client/SailingService.java | 3 + .../gwt/ui/client/SailingServiceAsync.java | 3 + .../MasterDataImportPanel.java | 110 +++------------ .../gwt/ui/server/SailingServiceImpl.java | 133 ++++++++++++++++++ .../sap/sailing/gwt/ui/AdminConsole.gwt.xml | 1 + .../WEB-INF/web.xml | 9 -- ...DataByLeaderboardGroupJsonPostServlet.java | 55 -------- .../server/test/MasterDataImportTest.java | 45 +++--- .../CreationCount.java | 46 ------ .../ImportMasterDataOperation.java | 7 +- 14 files changed, 271 insertions(+), 229 deletions(-) create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MasterDataImportObjectCreationCount.java create mode 100644 java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/MasterDataImportObjectCreationCountImpl.java delete mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/MasterDataByLeaderboardGroupJsonPostServlet.java delete mode 100644 java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreationCount.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MasterDataImportObjectCreationCount.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MasterDataImportObjectCreationCount.java new file mode 100644 index 00000000000..78a98940233 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/MasterDataImportObjectCreationCount.java @@ -0,0 +1,15 @@ +package com.sap.sailing.domain.common; + +import java.io.Serializable; + +public interface MasterDataImportObjectCreationCount extends Serializable{ + + public abstract int getLeaderboardCount(); + + public abstract int getLeaderboardGroupCount(); + + public abstract int getEventCount(); + + public abstract int getRegattaCount(); + +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/MasterDataImportObjectCreationCountImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/MasterDataImportObjectCreationCountImpl.java new file mode 100644 index 00000000000..3f1bb3b6f04 --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/MasterDataImportObjectCreationCountImpl.java @@ -0,0 +1,68 @@ +package com.sap.sailing.domain.common.impl; + +import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; + + +/** + * Keeps track of how many instances of domain classes are created in the process of + * the master data import. + * + * @author Frederik Petersen (D054528) + * + */ +public class MasterDataImportObjectCreationCountImpl implements MasterDataImportObjectCreationCount { + + private static final long serialVersionUID = -3677005970701170818L; + private int leaderboardCount = 0; + private int leaderboardGroupCount = 0; + private int eventCount = 0; + private int regattaCount = 0; + + //For GWT serialization + public MasterDataImportObjectCreationCountImpl() {}; + + public void addOneLeaderboard() { + leaderboardCount++; + } + + public void addOneLeaderboardGroup() { + leaderboardGroupCount++; + } + + public void addOneEvent() { + eventCount++; + } + + public void addOneRegatta() { + regattaCount++; + + } + + public void add(MasterDataImportObjectCreationCountImpl toAdd) { + leaderboardCount = leaderboardCount + toAdd.leaderboardCount; + leaderboardGroupCount = leaderboardGroupCount + toAdd.leaderboardGroupCount; + eventCount = eventCount + toAdd.eventCount; + regattaCount = regattaCount + toAdd.regattaCount; + } + + @Override + public int getLeaderboardCount() { + return leaderboardCount; + } + + @Override + public int getLeaderboardGroupCount() { + return leaderboardGroupCount; + } + + @Override + public int getEventCount() { + return eventCount; + } + + @Override + public int getRegattaCount() { + return regattaCount; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index 55dc5938542..f85217624e3 100755 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -25,7 +25,8 @@ Require-Bundle: com.sap.sailing.domain, com.googlecode.java-diff-utils;bundle-version="1.3.0", com.sap.sailing.freg.resultimport, com.sap.sailing.domain.swisstimingreplayadapter, - com.sap.sailing.simulator;bundle-version="1.0.0" + com.sap.sailing.simulator;bundle-version="1.0.0", + com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0" Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator Bundle-ActivationPolicy: lazy Import-Package: javax.jms;version="1.1.0", diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java index 3028e02367e..cbca3e20132 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AdminConsoleEntryPoint.java @@ -120,7 +120,7 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements Regatt final MediaPanel mediaPanel = new MediaPanel(mediaService, this, stringMessages); tabPanel.add(mediaPanel, stringMessages.mediaPanel(), /* asHTML */ false); - final MasterDataImportPanel masterDataImportPanel = new MasterDataImportPanel(stringMessages); + final MasterDataImportPanel masterDataImportPanel = new MasterDataImportPanel(stringMessages, sailingService); tabPanel.add(masterDataImportPanel, stringMessages.masterDataImportPanel(), /* asHTML */ false); tabPanel.selectTab(0); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java index 4a6c452f8c4..f56d612c4b0 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java @@ -10,6 +10,7 @@ import java.util.Set; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import com.sap.sailing.domain.common.DetailType; +import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.NoWindException; @@ -319,4 +320,6 @@ public interface SailingService extends RemoteService { void stopSingleReplicaInstance(String identifier); void reloadRaceLog(String selectedLeaderboardName, RaceColumnDTO raceColumnDTO, FleetDTO fleet); + + MasterDataImportObjectCreationCount importMasterData(String host, String[] groupNames); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java index fee3898b0bf..b193b1c89a9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java @@ -9,6 +9,7 @@ import java.util.Set; import com.google.gwt.user.client.rpc.AsyncCallback; import com.sap.sailing.domain.common.DetailType; +import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.PolarSheetGenerationTriggerResponse; @@ -441,5 +442,7 @@ public interface SailingServiceAsync { void reloadRaceLog(String selectedLeaderboardName, RaceColumnDTO raceColumnDTO, FleetDTO fleet, AsyncCallback asyncCallback); + void importMasterData(String host, String[] names, AsyncCallback asyncCallback); + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java index f3a049b0b7d..91698a6c023 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/masterdataimport/MasterDataImportPanel.java @@ -14,14 +14,11 @@ import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.json.client.JSONArray; -import com.google.gwt.json.client.JSONException; -import com.google.gwt.json.client.JSONNumber; -import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; -import com.google.gwt.json.client.JSONValue; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; @@ -29,8 +26,9 @@ import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; +import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.client.URLEncoder; public class MasterDataImportPanel extends VerticalPanel { @@ -47,8 +45,10 @@ public class MasterDataImportPanel extends VerticalPanel { */ private final StringMessages stringMessages; private String currentHost; + private SailingServiceAsync sailingService; - public MasterDataImportPanel(StringMessages stringMessages) { + public MasterDataImportPanel(StringMessages stringMessages, SailingServiceAsync sailingService) { + this.sailingService = sailingService; this.stringMessages = stringMessages; HorizontalPanel serverAddressPanel = new HorizontalPanel(); @@ -101,90 +101,25 @@ public class MasterDataImportPanel extends VerticalPanel { } protected void importLeaderboardGroups() { - String getMasterDataUrl = createGetMasterDataForLgsUrl(currentHost); - if (!isValidUrl(getMasterDataUrl, false)) { - showErrorAlert("Not a valid URL for fetching leaderboardgroups masterdata: " + getMasterDataUrl); - return; - } String[] groupNames = createLeaderBoardGroupNamesFromListBox(); - String query = createLeaderboardQuery(groupNames); - RequestBuilder getLgsMasterDataRequestBuilder = new RequestBuilder(RequestBuilder.GET, getMasterDataUrl - + URLEncoder.encode(query)); - - getLgsMasterDataRequestBuilder.setCallback(new RequestCallback() { - + sailingService.importMasterData(currentHost, groupNames, new AsyncCallback() { + @Override - public void onResponseReceived(Request request, Response response) { - if (response.getStatusCode() != 200) { - showErrorAlert("GET leaderboardgroups master data request failed with error code: " - + response.getStatusCode()); - return; - } - fireLgsImportRequest(response); + public void onSuccess(MasterDataImportObjectCreationCount result) { + int leaderboardsCreated = result.getLeaderboardCount(); + int leaderboardGroupsCreated = result.getLeaderboardGroupCount(); + int eventsCreated = result.getEventCount(); + int regattasCreated = result.getRegattaCount(); + showSuccessAlert(leaderboardsCreated, leaderboardGroupsCreated, eventsCreated, regattasCreated); } - + @Override - public void onError(Request request, Throwable exception) { - showErrorAlert("GET leaderboardgroups master data request failed with Server error: " - + exception.getLocalizedMessage()); + public void onFailure(Throwable caught) { + showErrorAlert(caught.getLocalizedMessage()); } }); - try { - getLgsMasterDataRequestBuilder.send(); - } catch (RequestException e) { - showErrorAlert("GET leaderboardgroups request failed: " + e.getLocalizedMessage()); - } } - private String createLeaderboardQuery(String[] groupNames) { - StringBuffer queryStringBuffer = new StringBuffer("?"); - for (int i = 0; i < groupNames.length; i++) { - queryStringBuffer.append("names[]=" + groupNames[i] + "&"); - } - if (queryStringBuffer.length() == 1) { - return ""; - } else { - // Delete last "&" - queryStringBuffer.deleteCharAt(queryStringBuffer.length() - 1); - } - return queryStringBuffer.toString(); - } - - protected void fireLgsImportRequest(Response response) { - RequestBuilder postLgsMasterDataRequestBuilder = new RequestBuilder(RequestBuilder.POST, - createPostLgsMasterDataUrl()); - postLgsMasterDataRequestBuilder.setRequestData(response.getText()); - postLgsMasterDataRequestBuilder.setCallback(new RequestCallback() { - - @Override - public void onResponseReceived(Request request, Response response) { - try { - JSONValue creationCount = JSONParser.parseStrict(response.getText()); - JSONObject creationCountObj = (JSONObject) creationCount; - int leaderboardsCreated = (int) ((JSONNumber) creationCountObj.get("leaderboards")).doubleValue(); - int leaderboardGroupsCreated = (int) ((JSONNumber) creationCountObj.get("leaderboardGroups")) - .doubleValue(); - int eventsCreated = (int) ((JSONNumber) creationCountObj.get("events")).doubleValue(); - int regattasCreated = (int) ((JSONNumber) creationCountObj.get("regattas")).doubleValue(); - showSuccessAlert(leaderboardsCreated, leaderboardGroupsCreated, eventsCreated, regattasCreated); - } catch (JSONException e) { - showErrorAlert("Server did not provide success Message: " + response.getText()); - } - } - - @Override - public void onError(Request request, Throwable exception) { - showErrorAlert("POST leaderboardgroups master data request failed with Server error: " - + exception.getLocalizedMessage()); - } - }); - try { - postLgsMasterDataRequestBuilder.send(); - } catch (RequestException e) { - showErrorAlert("POST leaderboardgroups master data request failed with Server error: " - + e.getLocalizedMessage()); - } - } protected void showSuccessAlert(int leaderboardsCreated, int leaderboardGroupsCreated, int eventsCreated, int regattasCreated) { @@ -193,10 +128,6 @@ public class MasterDataImportPanel extends VerticalPanel { } - private String createPostLgsMasterDataUrl() { - return "http://" + Window.Location.getHost() + "/sailingserver/masterdata/import/leaderboardgroups"; - } - private String[] createLeaderBoardGroupNamesFromListBox() { List names = new ArrayList(); for (int i = 0; i < leaderboardgroupListBox.getItemCount(); i++) { @@ -207,13 +138,6 @@ public class MasterDataImportPanel extends VerticalPanel { return names.toArray(new String[names.size()]); } - private String createGetMasterDataForLgsUrl(String host) { - StringBuffer urlBuffer = new StringBuffer(host); - appendHttpAndSlashIfNeeded(host, urlBuffer); - urlBuffer.append("sailingserver/masterdata/leaderboardgroups"); - return urlBuffer.toString(); - } - protected void fireIdRequestsAndFillLists() { String host = hostBox.getText(); if (host != null && !host.isEmpty()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 3af990d045e..e09d6389b1d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1,8 +1,11 @@ package com.sap.sailing.gwt.ui.server; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.io.Serializable; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; @@ -42,9 +45,13 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; +import com.google.gwt.regexp.shared.RegExp; import com.sap.sailing.domain.base.BoatClass; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.ControlPoint; @@ -75,6 +82,7 @@ import com.sap.sailing.domain.common.Distance; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.LegType; import com.sap.sailing.domain.common.ManeuverType; +import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.NauticalSide; import com.sap.sailing.domain.common.NoWindError; @@ -115,6 +123,7 @@ import com.sap.sailing.domain.common.dto.TrackedRaceDTO; import com.sap.sailing.domain.common.impl.DegreeBearingImpl; import com.sap.sailing.domain.common.impl.DegreePosition; import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl; +import com.sap.sailing.domain.common.impl.MasterDataImportObjectCreationCountImpl; import com.sap.sailing.domain.common.impl.MeterDistance; import com.sap.sailing.domain.common.impl.PolarSheetGenerationTriggerResponseImpl; import com.sap.sailing.domain.common.impl.PolarSheetsHistogramDataImpl; @@ -132,6 +141,7 @@ import com.sap.sailing.domain.leaderboard.MetaLeaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule; import com.sap.sailing.domain.leaderboard.caching.LiveLeaderboardUpdater; +import com.sap.sailing.domain.masterdataimport.LeaderboardGroupMasterData; import com.sap.sailing.domain.persistence.DomainObjectFactory; import com.sap.sailing.domain.persistence.MongoFactory; import com.sap.sailing.domain.persistence.MongoObjectFactory; @@ -236,6 +246,9 @@ import com.sap.sailing.resultimport.ResultUrlProvider; import com.sap.sailing.resultimport.ResultUrlRegistry; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.deserialization.masterdata.impl.LeaderboardGroupMasterDataJsonDeserializer; import com.sap.sailing.server.operationaltransformation.AddColumnToLeaderboard; import com.sap.sailing.server.operationaltransformation.AddColumnToSeries; import com.sap.sailing.server.operationaltransformation.AddCourseArea; @@ -246,6 +259,7 @@ import com.sap.sailing.server.operationaltransformation.CreateFlexibleLeaderboar import com.sap.sailing.server.operationaltransformation.CreateLeaderboardGroup; import com.sap.sailing.server.operationaltransformation.CreateRegattaLeaderboard; import com.sap.sailing.server.operationaltransformation.DisconnectLeaderboardColumnFromTrackedRace; +import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation; import com.sap.sailing.server.operationaltransformation.MoveColumnInSeriesDown; import com.sap.sailing.server.operationaltransformation.MoveColumnInSeriesUp; import com.sap.sailing.server.operationaltransformation.MoveLeaderboardColumnDown; @@ -3145,4 +3159,123 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S public void reloadRaceLog(String selectedLeaderboardName, RaceColumnDTO raceColumnDTO, FleetDTO fleet) { getService().reloadRaceLog(selectedLeaderboardName, raceColumnDTO, fleet); } + + @Override + public MasterDataImportObjectCreationCount importMasterData(String host, String[] groupNames) { + String getMasterDataUrl = createGetMasterDataForLgsUrl(host); + if (!isValidUrl(getMasterDataUrl, false)) { + throw new RuntimeException("Not a valid URL for fetching leaderboardgroups masterdata: " + getMasterDataUrl); + } + String query = createLeaderboardQuery(groupNames); + HttpURLConnection connection = null; + BufferedReader rd = null; + StringBuilder sb = null; + String line = null; + + URL serverAddress = null; + + try { + serverAddress = parseUrl(getMasterDataUrl + query); + //set up out communications stuff + connection = null; + + //Set up the initial connection + connection = (HttpURLConnection)serverAddress.openConnection(); + connection.setRequestMethod("GET"); + connection.setDoOutput(true); + connection.setReadTimeout(10000); + + connection.connect(); + + //read the result from the server + rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); + sb = new StringBuilder(); + + while ((line = rd.readLine()) != null) { + sb.append(line); + } + + return importFromHttpResponse(sb.toString()); + + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + // close the connection, set all objects to null + connection.disconnect(); + rd = null; + sb = null; + connection = null; + } + } + + private URL parseUrl(String s) throws Exception { + URL u = new URL(s); + return new URI( + u.getProtocol(), + u.getAuthority(), + u.getPath(), + u.getQuery(), + u.getRef()). + toURL(); + } + + protected MasterDataImportObjectCreationCountImpl importFromHttpResponse(String response) { + MasterDataImportObjectCreationCountImpl creationCount = new MasterDataImportObjectCreationCountImpl(); + JsonDeserializer leaderboardGroupMasterDataDeserializer = LeaderboardGroupMasterDataJsonDeserializer + .create(baseDomainFactory); + JSONParser parser = new JSONParser(); + try { + JSONArray leaderboardGroupsMasterDataJsonArray = (JSONArray) parser.parse(response); + for (Object leaderBoardGroupMasterData : leaderboardGroupsMasterDataJsonArray) { + JSONObject leaderBoardGroupMasterDataJson = (JSONObject) leaderBoardGroupMasterData; + LeaderboardGroupMasterData masterData = leaderboardGroupMasterDataDeserializer + .deserialize(leaderBoardGroupMasterDataJson); + ImportMasterDataOperation op = new ImportMasterDataOperation(masterData); + creationCount.add(getService().apply(op)); + } + } catch (org.json.simple.parser.ParseException e) { + throw new RuntimeException(e); + } catch (JsonDeserializationException e) { + throw new RuntimeException(e); + } + + return creationCount; + } + + private String createLeaderboardQuery(String[] groupNames) { + StringBuffer queryStringBuffer = new StringBuffer("?"); + for (int i = 0; i < groupNames.length; i++) { + queryStringBuffer.append("names[]=" + groupNames[i] + "&"); + } + if (queryStringBuffer.length() == 1) { + return ""; + } else { + // Delete last "&" + queryStringBuffer.deleteCharAt(queryStringBuffer.length() - 1); + } + return queryStringBuffer.toString(); + } + + private boolean isValidUrl(String url, boolean topLevelDomainRequired) { + RegExp urlValidator = RegExp + .compile("^((ftp|http|https)://[\\w@.\\-\\_]+(:\\d{1,5})?(/[\\w#!:.?+=&%@!\\_\\-/]+)*){1}$"); + return urlValidator.exec(url) != null; + } + + private String createGetMasterDataForLgsUrl(String host) { + StringBuffer urlBuffer = new StringBuffer(host); + appendHttpAndSlashIfNeeded(host, urlBuffer); + urlBuffer.append("sailingserver/masterdata/leaderboardgroups"); + return urlBuffer.toString(); + } + + private void appendHttpAndSlashIfNeeded(String host, StringBuffer urlBuffer) { + if (!host.endsWith("/")) { + urlBuffer.append("/"); + } + if (!host.startsWith("http://")) { + urlBuffer.insert(0, "http://"); + } + } + } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml index bac214a0786..eaa517d44dd 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml @@ -53,4 +53,5 @@ + diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml index 801fd4f38a8..bbf9dd8d886 100644 --- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml +++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml @@ -194,15 +194,6 @@ MasterDataByLeaderboardGroupJsonGetServlet /masterdata/leaderboardgroups - - - MasterDataByLeaderboardGroupJsonPostServlet - com.sap.sailing.server.gateway.impl.MasterDataByLeaderboardGroupJsonPostServlet - - - MasterDataByLeaderboardGroupJsonPostServlet - /masterdata/import/leaderboardgroups - jspServet diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/MasterDataByLeaderboardGroupJsonPostServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/MasterDataByLeaderboardGroupJsonPostServlet.java deleted file mode 100644 index a5a1fee8987..00000000000 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/MasterDataByLeaderboardGroupJsonPostServlet.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sap.sailing.server.gateway.impl; - -import java.io.IOException; -import java.io.InputStreamReader; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -import com.sap.sailing.domain.base.DomainFactory; -import com.sap.sailing.domain.masterdataimport.LeaderboardGroupMasterData; -import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; -import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; -import com.sap.sailing.server.gateway.deserialization.masterdata.impl.LeaderboardGroupMasterDataJsonDeserializer; -import com.sap.sailing.server.operationaltransformation.CreationCount; -import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation; - -public class MasterDataByLeaderboardGroupJsonPostServlet extends AbstractJsonHttpServlet { - - private static final long serialVersionUID = 998103495657252850L; - private DomainFactory domainFactory; - - private CreationCount creationCount; - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - domainFactory = DomainFactory.INSTANCE; - creationCount = new CreationCount(); - JsonDeserializer leaderboardGroupMasterDataDeserializer = LeaderboardGroupMasterDataJsonDeserializer - .create(domainFactory); - JSONParser parser = new JSONParser(); - try { - JSONArray leaderboardGroupsMasterDataJsonArray = (JSONArray) parser.parse(new InputStreamReader(req - .getInputStream())); - for (Object leaderBoardGroupMasterData : leaderboardGroupsMasterDataJsonArray) { - JSONObject leaderBoardGroupMasterDataJson = (JSONObject) leaderBoardGroupMasterData; - LeaderboardGroupMasterData masterData = leaderboardGroupMasterDataDeserializer - .deserialize(leaderBoardGroupMasterDataJson); - ImportMasterDataOperation op = new ImportMasterDataOperation(masterData); - creationCount.add(getService().apply(op)); - } - } catch (ParseException e) { - resp.sendError(400); - e.printStackTrace(); - } - resp.getWriter().write(creationCount.toJson().toJSONString()); - } - - -} diff --git a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java index fdee813502c..c0d1591cdca 100644 --- a/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java +++ b/java/com.sap.sailing.server.test/src/com/sap/sailing/server/test/MasterDataImportTest.java @@ -18,7 +18,6 @@ import org.json.simple.JSONObject; import org.junit.After; import org.junit.Test; -import com.mongodb.BasicDBObject; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.sap.sailing.domain.base.Boat; @@ -44,6 +43,8 @@ import com.sap.sailing.domain.base.impl.PersonImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.MaxPointsReason; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.common.impl.MasterDataImportObjectCreationCountImpl; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.LeaderboardGroup; import com.sap.sailing.domain.leaderboard.impl.LowPoint; @@ -58,7 +59,6 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.masterdata.impl.LeaderboardGroupMasterDataJsonDeserializer; import com.sap.sailing.server.gateway.serialization.masterdata.impl.TopLevelMasterDataSerializer; import com.sap.sailing.server.impl.RacingEventServiceImpl; -import com.sap.sailing.server.operationaltransformation.CreationCount; import com.sap.sailing.server.operationaltransformation.DummyTrackedRace; import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation; @@ -82,18 +82,6 @@ public class MasterDataImportTest { } private void deleteCreatedDataFromDatabase() throws MalformedURLException, IOException, InterruptedException { - // Didnt use CollectionNames stuff since it was not visible in this package. Sucks as soon as these names - // change, I know.. - DBCollection raceLogCollection = MongoDBService.INSTANCE.getDB().getCollection("RACE_LOGS"); - raceLogCollection.ensureIndex(new BasicDBObject("RACE_LOG_EVENT_ID", null)); - for (Serializable id : storedLogUUIDs) { - BasicDBObject query = new BasicDBObject(); - query.put("RACE_LOG_EVENT.RACE_LOG_EVENT_ID", id); - DBCursor result = raceLogCollection.find(query); - while (result.hasNext()) { - raceLogCollection.remove(result.next()); - } - } storedLogUUIDs.clear(); RacingEventService service = new RacingEventServiceImpl(); LeaderboardGroup group = service.getLeaderboardGroupByName(TEST_GROUP_NAME); @@ -112,9 +100,23 @@ public class MasterDataImportTest { if (regatta != null) { service.removeRegatta(regatta); } - // DBCursor cursor = raceLogCollection.find(); - // while (cursor.hasNext()) { - // raceLogCollection.remove(cursor.next()); + DBCollection raceLogCollection = MongoDBService.INSTANCE.getDB().getCollection("RACE_LOGS"); + //Removes all race log events + DBCursor cursor = raceLogCollection.find(); + while (cursor.hasNext()) { + raceLogCollection.remove(cursor.next()); + } + // This should only delete those logs created during this test. Sadly it doesn't seem to work. + // Didnt use CollectionNames stuff since it was not visible in this package. Sucks as soon as these names + // change, I know.. + // raceLogCollection.ensureIndex(new BasicDBObject("RACE_LOG_EVENT_ID", null)); + // for (Serializable id : storedLogUUIDs) { + // BasicDBObject query = new BasicDBObject(); + // query.put("RACE_LOG_EVENT.RACE_LOG_EVENT_ID", id); + // DBCursor result = raceLogCollection.find(query); + // while (result.hasNext()) { + // raceLogCollection.remove(result.next()); + // } // } } @@ -180,8 +182,9 @@ public class MasterDataImportTest { // Set log event RaceLogEventFactory factory = new RaceLogEventFactoryImpl(); - RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(new MillisecondsTimePoint(1372421236312L), 1, - new MillisecondsTimePoint(1372489200000L)); + TimePoint logTimePoint = new MillisecondsTimePoint(1372489200000L); + RaceLogStartTimeEvent logEvent = factory.createStartTimeEvent(logTimePoint, 1, + logTimePoint); raceColumn.getRaceLog(testFleet1).add(logEvent); storedLogUUIDs.add(logEvent.getId()); @@ -216,7 +219,7 @@ public class MasterDataImportTest { // Deserialization copied from doPost in MasterDataByLeaderboardGroupJsonPostServlet RacingEventService destService = new RacingEventServiceImplMock(); DomainFactory domainFactory = DomainFactory.INSTANCE; - CreationCount creationCount = new CreationCount(); + MasterDataImportObjectCreationCountImpl creationCount = new MasterDataImportObjectCreationCountImpl(); JsonDeserializer leaderboardGroupMasterDataDeserializer = LeaderboardGroupMasterDataJsonDeserializer .create(domainFactory); JSONArray leaderboardGroupsMasterDataJsonArray = masterDataOverallArray; @@ -280,6 +283,6 @@ public class MasterDataImportTest { // Check for race log event Assert.assertNotNull(raceColumnOnTarget.getRaceLog(fleet1OnTarget).getFirstRawFix()); - Assert.assertEquals(logEvent.getId(), raceColumnOnTarget.getRaceLog(fleet1OnTarget).getFirstRawFix().getId()); + Assert.assertEquals(logEvent.getId(), raceColumnOnTarget.getRaceLog(fleet1OnTarget).getFirstRawFixAtOrAfter(logTimePoint).getId()); } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreationCount.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreationCount.java deleted file mode 100644 index 22e012cbf79..00000000000 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/CreationCount.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.sap.sailing.server.operationaltransformation; - -import org.json.simple.JSONObject; - -public class CreationCount { - - private int leaderboardCount = 0; - private int leaderboardGroupCount = 0; - private int eventCount = 0; - private int regattaCount = 0; - - public void addOneLeaderboard() { - leaderboardCount++; - } - - public void addOneLeaderboardGroup() { - leaderboardGroupCount++; - } - - public void addOneEvent() { - eventCount++; - } - - public void addOneRegatta() { - regattaCount++; - - } - public JSONObject toJson() { - JSONObject countJson = new JSONObject(); - countJson.put("leaderboards", leaderboardCount); - countJson.put("leaderboardGroups", leaderboardGroupCount); - countJson.put("events", eventCount); - countJson.put("regattas", regattaCount); - return countJson; - } - - public void add(CreationCount toAdd) { - leaderboardCount = leaderboardCount + toAdd.leaderboardCount; - leaderboardGroupCount = leaderboardGroupCount + toAdd.leaderboardGroupCount; - eventCount = eventCount + toAdd.eventCount; - regattaCount = regattaCount + toAdd.regattaCount; - } - - - -} diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java index aff90c4be29..0cd9f6816c2 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/operationaltransformation/ImportMasterDataOperation.java @@ -22,6 +22,7 @@ import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.RegattaName; import com.sap.sailing.domain.common.ScoringSchemeType; +import com.sap.sailing.domain.common.impl.MasterDataImportObjectCreationCountImpl; import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.domain.leaderboard.Leaderboard; import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; @@ -40,13 +41,13 @@ import com.sap.sailing.domain.racelog.RaceLogEvent; import com.sap.sailing.server.RacingEventService; import com.sap.sailing.server.RacingEventServiceOperation; -public class ImportMasterDataOperation extends AbstractRacingEventServiceOperation { +public class ImportMasterDataOperation extends AbstractRacingEventServiceOperation { private static final long serialVersionUID = 3131715325307370303L; private LeaderboardGroupMasterData masterData; - private CreationCount creationCount = new CreationCount(); + private MasterDataImportObjectCreationCountImpl creationCount = new MasterDataImportObjectCreationCountImpl(); private DomainFactory domainFactory = DomainFactory.INSTANCE; @@ -55,7 +56,7 @@ public class ImportMasterDataOperation extends AbstractRacingEventServiceOperati } @Override - public CreationCount internalApplyTo(RacingEventService toState) throws Exception { + public MasterDataImportObjectCreationCountImpl internalApplyTo(RacingEventService toState) throws Exception { createLeaderboardGroupWithAllRelatedObjects(masterData, toState); return creationCount; }