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:
Frederik Petersen committed 2014-02-18 11:40:00 +01:00
1 parent 2274238ce5
commit 2e1ec8fde7
8 files changed
+104 -86

No files matched your search

@@ -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;
@@ -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);
/**
@@ -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();
@@ -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:
@@ -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,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()));
@@ -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,
@@ -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));