mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-09 13:50:57 +00:00
MasterDataImport leaderboard names are now fetched using the server
resolved by the importing server rather than the web client fixes 1706
This commit is contained in:
1 parent
2274238ce5
commit
2e1ec8fde7
8 files changed
+104
-86
No files matched your search
+2
@@ -341,6 +341,8 @@ public interface SailingService extends RemoteService {
|
||||
|
||||
RaceLogDTO getRaceLog(String leaderboardName, RaceColumnDTO raceColumnDTO, FleetDTO fleet);
|
||||
|
||||
List<String> getLeaderboardGroupNamesFromRemoteServer(String host);
|
||||
|
||||
MasterDataImportObjectCreationCount importMasterData(String host, String[] groupNames, boolean override, boolean compress);
|
||||
|
||||
<ResultType extends Number> QueryResult<ResultType> runQuery(QueryDefinition queryDefinition) throws Exception;
|
||||
|
||||
+2
@@ -464,6 +464,8 @@ public interface SailingServiceAsync {
|
||||
void importMasterData(String host, String[] names, boolean override, boolean compress,
|
||||
AsyncCallback<MasterDataImportObjectCreationCount> asyncCallback);
|
||||
|
||||
void getLeaderboardGroupNamesFromRemoteServer(String host, AsyncCallback<List<String>> leaderboardGroupNames);
|
||||
|
||||
<ResultType extends Number> void runQuery(QueryDefinition queryDefinition, AsyncCallback<QueryResult<ResultType>> asyncCallback);
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -766,7 +766,7 @@ public interface StringMessages extends Messages {
|
||||
String importRemoteHost();
|
||||
String importFetchRemoteLgs();
|
||||
String importUrlInvalid(String url);
|
||||
String importGetLeaderboardsFailed(int statusCode, String url);
|
||||
String importGetLeaderboardsFailed(String host, String errorMessage);
|
||||
String importNoDataReturned();
|
||||
String importServerError();
|
||||
String importLeaderboardGroups();
|
||||
|
||||
+1
-1
@@ -766,7 +766,7 @@ rawFixes=All fixes (including outliers)
|
||||
importRemoteHost=Remote host:
|
||||
importFetchRemoteLgs=Fetch Leaderboard Group List
|
||||
importUrlInvalid=Not a valid URL for fetching leaderboardgroups: {0}
|
||||
importGetLeaderboardsFailed=GET leaderboardgroups request failed with error code: {0}; For url: {1}
|
||||
importGetLeaderboardsFailed=GET leaderboardgroups request failed for host {0} with error {1}
|
||||
importNoDataReturned=No data was returned by the server
|
||||
importServerError=GET leaderboardgroups request failed with Server error. Please see server logs for more information.
|
||||
importLeaderboardGroups=Leaderboard Groups:
|
||||
|
||||
+1
-1
@@ -762,7 +762,7 @@ rawFixes=Alle Fixes (inklusive Ausreißer)
|
||||
importRemoteHost=Entfernter Host:
|
||||
importFetchRemoteLgs=Liste der Leaderboard Groups abrufen
|
||||
importUrlInvalid=Keine gültige URL um Leaderboard Groups abzurufen: {0}
|
||||
importGetLeaderboardsFailed=GET leaderboardgroups Request scheiterte mit Error Code: {0}; Für die Url: {1}
|
||||
importGetLeaderboardsFailed=GET leaderboardgroups Request scheiterte für den Host {0} mit dem Fehler: {1}
|
||||
importNoDataReturned=Es kamen keine Daten vom Server zurück
|
||||
importServerError=Der GET leaderboardgroups Request scheiterte an einem Server Error. Bitte schauen Sie in die Server logs für mehr Informationen.
|
||||
importLeaderboardGroups=Leaderboard Groups:
|
||||
|
||||
+13
-75
@@ -13,14 +13,6 @@ import com.google.gwt.event.dom.client.KeyDownEvent;
|
||||
import com.google.gwt.event.dom.client.KeyDownHandler;
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||
import com.google.gwt.http.client.Request;
|
||||
import com.google.gwt.http.client.RequestBuilder;
|
||||
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.JSONParser;
|
||||
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;
|
||||
@@ -47,9 +39,6 @@ public class MasterDataImportPanel extends VerticalPanel {
|
||||
|
||||
private List<String> allLeaderboardGroupNames;
|
||||
|
||||
private RegExp urlValidator;
|
||||
private RegExp urlPlusTldValidator;
|
||||
|
||||
private final StringMessages stringMessages;
|
||||
private String currentHost;
|
||||
private SailingServiceAsync sailingService;
|
||||
@@ -219,38 +208,24 @@ public class MasterDataImportPanel extends VerticalPanel {
|
||||
}
|
||||
}
|
||||
|
||||
private void fireLgIdRequestAndFillList(String host) {
|
||||
private void fireLgIdRequestAndFillList(final String host) {
|
||||
currentHost = host;
|
||||
final String getLgsUrl = createGetLgsUrl(host);
|
||||
if (!isValidUrl(getLgsUrl, false)) {
|
||||
showErrorAlert(stringMessages.importUrlInvalid(getLgsUrl));
|
||||
return;
|
||||
}
|
||||
disableAllButtons();
|
||||
RequestBuilder getLgsRequestBuilder = new RequestBuilder(RequestBuilder.GET, getLgsUrl);
|
||||
getLgsRequestBuilder.setCallback(new RequestCallback() {
|
||||
sailingService.getLeaderboardGroupNamesFromRemoteServer(host, new AsyncCallback<List<String>>() {
|
||||
|
||||
@Override
|
||||
public void onResponseReceived(Request request, Response response) {
|
||||
if (response.getStatusCode() != 200) {
|
||||
showErrorAlert(stringMessages.importGetLeaderboardsFailed(response.getStatusCode(), getLgsUrl));
|
||||
}
|
||||
public void onFailure(Throwable caught) {
|
||||
showErrorAlert(stringMessages.importGetLeaderboardsFailed(host, caught.getMessage()));
|
||||
changeButtonStateAccordingToApplicationState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<String> result) {
|
||||
clearListBox();
|
||||
String body = response.getText();
|
||||
if (body == null || body.isEmpty()) {
|
||||
showErrorAlert(stringMessages.importNoDataReturned());
|
||||
changeButtonStateAccordingToApplicationState();
|
||||
return;
|
||||
}
|
||||
JSONArray leaderboardGroups = JSONParser.parseStrict(body).isArray();
|
||||
List<String> toSort = new ArrayList<String>();
|
||||
for (int i = 0; i < leaderboardGroups.size(); i++) {
|
||||
toSort.add(leaderboardGroups.get(i).isString().stringValue());
|
||||
}
|
||||
Collections.sort(toSort);
|
||||
allLeaderboardGroupNames = toSort;
|
||||
leaderboardgroupListBox.setVisibleItemCount(leaderboardGroups.size());
|
||||
for (String lgName : toSort) {
|
||||
Collections.sort(result);
|
||||
allLeaderboardGroupNames = result;
|
||||
leaderboardgroupListBox.setVisibleItemCount(result.size());
|
||||
for (String lgName : result) {
|
||||
leaderboardgroupListBox.addItem(lgName);
|
||||
}
|
||||
changeButtonStateAccordingToApplicationState();
|
||||
@@ -259,50 +234,13 @@ public class MasterDataImportPanel extends VerticalPanel {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Request request, Throwable exception) {
|
||||
showErrorAlert(stringMessages.importServerError());
|
||||
changeButtonStateAccordingToApplicationState();
|
||||
}
|
||||
});
|
||||
try {
|
||||
getLgsRequestBuilder.send();
|
||||
} catch (RequestException e) {
|
||||
showErrorAlert(stringMessages.importServerError());
|
||||
changeButtonStateAccordingToApplicationState();
|
||||
}
|
||||
}
|
||||
|
||||
private String createGetLgsUrl(String host) {
|
||||
StringBuffer urlBuffer = new StringBuffer(host);
|
||||
appendHttpAndSlashIfNeeded(host, urlBuffer);
|
||||
urlBuffer.append("sailingserver/api/v1/leaderboardgroups");
|
||||
return urlBuffer.toString();
|
||||
}
|
||||
|
||||
private void appendHttpAndSlashIfNeeded(String host, StringBuffer urlBuffer) {
|
||||
if (!host.endsWith("/")) {
|
||||
urlBuffer.append("/");
|
||||
}
|
||||
if (!host.startsWith("http://")) {
|
||||
urlBuffer.insert(0, "http://");
|
||||
}
|
||||
}
|
||||
|
||||
private void showErrorAlert(String string) {
|
||||
Window.alert(string);
|
||||
}
|
||||
|
||||
public boolean isValidUrl(String url, boolean topLevelDomainRequired) {
|
||||
if (urlValidator == null || urlPlusTldValidator == null) {
|
||||
urlValidator = RegExp
|
||||
.compile("^((ftp|http|https)://[\\w@.\\-\\_]+(:\\d{1,5})?(/[\\w#!:.?+=&%@!\\_\\-/]+)*){1}$");
|
||||
urlPlusTldValidator = RegExp
|
||||
.compile("^((ftp|http|https)://[\\w@.\\-\\_]+\\.[a-zA-Z]{2,}(:\\d{1,5})?(/[\\w#!:.?+=&%@!\\_\\-/]+)*){1}$");
|
||||
}
|
||||
return (topLevelDomainRequired ? urlPlusTldValidator : urlValidator).exec(url) != null;
|
||||
}
|
||||
|
||||
private void addContentToLeftPanel(VerticalPanel contentPanel) {
|
||||
contentPanel.add(new Label(stringMessages.importLeaderboardGroups()));
|
||||
|
||||
|
||||
+80
-7
@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.server;
|
||||
import java.io.FilterInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.Serializable;
|
||||
@@ -3356,14 +3357,67 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
}
|
||||
|
||||
@Override
|
||||
public MasterDataImportObjectCreationCount importMasterData(String urlAsString, String[] groupNames, boolean override, boolean compress) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
public List<String> getLeaderboardGroupNamesFromRemoteServer(String url) {
|
||||
Pair<String, Integer> hostnameAndPort = parseHostAndPort(url);
|
||||
String hostname = hostnameAndPort.getA();
|
||||
int port = hostnameAndPort.getB();
|
||||
final String path = "/sailingserver/api/v1/leaderboardgroups";
|
||||
final String query = null;
|
||||
|
||||
HttpURLConnection connection = null;
|
||||
|
||||
URL serverAddress = null;
|
||||
InputStream inputStream = null;
|
||||
try {
|
||||
serverAddress = createUrl(hostname, port, path, query);
|
||||
// set up out communications stuff
|
||||
connection = null;
|
||||
// Set up the initial connection
|
||||
connection = (HttpURLConnection) serverAddress.openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setDoOutput(true);
|
||||
// Initial timeout needs to be big enough to allow the first parts of the response to reach this server
|
||||
connection.setReadTimeout(10000);
|
||||
connection.connect();
|
||||
|
||||
inputStream = connection.getInputStream();
|
||||
|
||||
InputStreamReader in = new InputStreamReader(inputStream, "UTF-8");
|
||||
|
||||
org.json.simple.parser.JSONParser parser = new org.json.simple.parser.JSONParser();
|
||||
org.json.simple.JSONArray array = (org.json.simple.JSONArray) parser.parse(in);
|
||||
List<String> names = new ArrayList<String>();
|
||||
for (Object obj : array) {
|
||||
names.add((String) obj);
|
||||
}
|
||||
return names;
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
// close the connection
|
||||
if (connection != null) {
|
||||
connection.disconnect();
|
||||
}
|
||||
try {
|
||||
if (inputStream != null) {
|
||||
inputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private Pair<String, Integer> parseHostAndPort(String urlAsString) {
|
||||
String hostname;
|
||||
Integer port = 80;
|
||||
try {
|
||||
URL url = new URL(urlAsString);
|
||||
hostname = url.getHost();
|
||||
port = url.getPort();
|
||||
int portFromUrl = url.getPort();
|
||||
if (portFromUrl > 0) {
|
||||
port = portFromUrl;
|
||||
}
|
||||
} catch (MalformedURLException e1) {
|
||||
hostname = urlAsString;
|
||||
if (urlAsString.contains("://")) {
|
||||
@@ -3375,9 +3429,21 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
if (hostname.contains(":")) {
|
||||
String[] split = hostname.split(":");
|
||||
hostname = split[0];
|
||||
port = Integer.parseInt(split[1]);
|
||||
if (port > 0) {
|
||||
port = Integer.parseInt(split[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new Pair<String, Integer>(hostname, port);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MasterDataImportObjectCreationCount importMasterData(String urlAsString, String[] groupNames,
|
||||
boolean override, boolean compress) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
Pair<String, Integer> hostnameAndPort = parseHostAndPort(urlAsString);
|
||||
String hostname = hostnameAndPort.getA();
|
||||
int port = hostnameAndPort.getB();
|
||||
String query;
|
||||
try {
|
||||
query = createLeaderboardQuery(groupNames, compress);
|
||||
@@ -3390,7 +3456,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
InputStream inputStream = null;
|
||||
ObjectInputStream objectInputStream = null;
|
||||
try {
|
||||
serverAddress = createUrl(hostname, port, query);
|
||||
String path = "/sailingserver/spi/v1/masterdata/leaderboardgroups";
|
||||
serverAddress = createUrl(hostname, port, path, query);
|
||||
//set up out communications stuff
|
||||
connection = null;
|
||||
//Set up the initial connection
|
||||
@@ -3434,8 +3501,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
}
|
||||
}
|
||||
|
||||
private URL createUrl(String host, Integer port, String query) throws Exception {
|
||||
return new URL("http://" + host + ":" + port + "/sailingserver/spi/v1/masterdata/leaderboardgroups?" + query);
|
||||
private URL createUrl(String host, Integer port, String path, String query) throws Exception {
|
||||
URL url;
|
||||
if (query != null) {
|
||||
url = new URL("http://" + host + ":" + port + path + "?" + query);
|
||||
} else {
|
||||
url = new URL("http://" + host + ":" + port + path);
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
protected MasterDataImportObjectCreationCount importFromHttpResponse(TopLevelMasterData topLevelMasterData,
|
||||
|
||||
+4
-1
@@ -188,7 +188,8 @@ public class MasterDataImportTest {
|
||||
|
||||
List<Series> series = new ArrayList<Series>();
|
||||
List<Fleet> fleets = new ArrayList<Fleet>();
|
||||
FleetImpl testFleet1 = new FleetImpl("testFleet1");
|
||||
String testFleet1Name = "testFleet1";
|
||||
FleetImpl testFleet1 = new FleetImpl(testFleet1Name);
|
||||
fleets.add(testFleet1);
|
||||
fleets.add(new FleetImpl("testFleet2"));
|
||||
series.add(new SeriesImpl("testSeries", false, fleets, emptyRaceColumnNamesList, sourceService));
|
||||
@@ -322,6 +323,8 @@ public class MasterDataImportTest {
|
||||
|
||||
RaceColumn raceColumnOnTarget = leaderboardOnTarget.getRaceColumnByName(raceColumnName);
|
||||
Assert.assertNotNull(raceColumnOnTarget);
|
||||
Assert.assertNull(raceColumnOnTarget.getTrackedRace(raceColumnOnTarget.getFleetByName(testFleet1Name)));
|
||||
|
||||
raceColumnOnTarget.setTrackedRace(raceColumnOnTarget.getFleets().iterator().next(), new DummyTrackedRace(
|
||||
competitors, regattaOnTarget, null));
|
||||
|
||||
|
||||
Reference in new issue
Block a user