Merge branch 'racecommittee_app' into racecommittee_wind

Conflicts:
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
	java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
This commit is contained in:
Armin Zamani committed 2013-07-04 21:07:35 +02:00
commit 8af60a38ce
10 files changed
+296 -73

No files matched your search

@@ -1,5 +1,8 @@
package com.sap.sailing.domain.common.impl; package com.sap.sailing.domain.common.impl;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount; import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
@@ -7,6 +10,9 @@ import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
* Keeps track of how many instances of domain classes are created in the process of * Keeps track of how many instances of domain classes are created in the process of
* the master data import. * the master data import.
* *
* Also keeps track of names and ids of the created objects to ignore one that are
* listed multiple times.
*
* @author Frederik Petersen (D054528) * @author Frederik Petersen (D054528)
* *
*/ */
@@ -18,22 +24,31 @@ public class MasterDataImportObjectCreationCountImpl implements MasterDataImport
private int eventCount = 0; private int eventCount = 0;
private int regattaCount = 0; private int regattaCount = 0;
private Set<String> createdLeaderboards = new HashSet<String>();
private Set<String> createdLeaderboardGroups = new HashSet<String>();
private Set<String> createdEvents = new HashSet<String>();
private Set<String> createdRegattas = new HashSet<String>();
//For GWT serialization //For GWT serialization
public MasterDataImportObjectCreationCountImpl() {}; public MasterDataImportObjectCreationCountImpl() {};
public void addOneLeaderboard() { public void addOneLeaderboard(String name) {
createdLeaderboards.add(name);
leaderboardCount++; leaderboardCount++;
} }
public void addOneLeaderboardGroup() { public void addOneLeaderboardGroup(String name) {
createdLeaderboardGroups.add(name);
leaderboardGroupCount++; leaderboardGroupCount++;
} }
public void addOneEvent() { public void addOneEvent(String id) {
createdEvents.add(id);
eventCount++; eventCount++;
} }
public void addOneRegatta() { public void addOneRegatta(String id) {
createdRegattas.add(id);
regattaCount++; regattaCount++;
} }
@@ -43,6 +58,26 @@ public class MasterDataImportObjectCreationCountImpl implements MasterDataImport
leaderboardGroupCount = leaderboardGroupCount + toAdd.leaderboardGroupCount; leaderboardGroupCount = leaderboardGroupCount + toAdd.leaderboardGroupCount;
eventCount = eventCount + toAdd.eventCount; eventCount = eventCount + toAdd.eventCount;
regattaCount = regattaCount + toAdd.regattaCount; regattaCount = regattaCount + toAdd.regattaCount;
createdEvents.addAll(toAdd.createdEvents);
createdLeaderboardGroups.addAll(toAdd.createdLeaderboardGroups);
createdLeaderboards.addAll(toAdd.createdLeaderboards);
createdRegattas.addAll(toAdd.createdRegattas);
}
public boolean alreadyAddedLeaderboardWithName(String name) {
return createdLeaderboards.contains(name);
}
public boolean alreadyAddedLeaderboardGroupWithName(String name) {
return createdLeaderboardGroups.contains(name);
}
public boolean alreadyAddedEventWithId(String id) {
return createdEvents.contains(id);
}
public boolean alreadyAddedRegattaWithId(String id) {
return createdRegattas.contains(id);
} }
@Override @Override
@@ -27,7 +27,10 @@ public class ReverseGeocoderTest {
//Simple Test in Kiel center to check the connection and the parsing from JSONObject to Placemark //Simple Test in Kiel center to check the connection and the parsing from JSONObject to Placemark
try { try {
Placemark kielReversed = geocoder.getPlacemarkNearest(KIEL_POSITION); Placemark kielReversed = geocoder.getPlacemarkNearest(KIEL_POSITION);
Assert.assertEquals(KIEL, kielReversed); Assert.assertEquals(KIEL.getName(), kielReversed.getName());
Assert.assertEquals(KIEL.getCountryCode(), kielReversed.getCountryCode());
Assert.assertEquals(KIEL.getPosition().getLatDeg(), kielReversed.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(KIEL.getPosition().getLngDeg(), kielReversed.getPosition().getLngDeg(), 0.0001);
} catch (IOException e) { } catch (IOException e) {
Assert.fail(e.getMessage()); Assert.fail(e.getMessage());
} catch (ParseException e) { } catch (ParseException e) {
@@ -55,13 +58,22 @@ public class ReverseGeocoderTest {
try { try {
Placemark p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulation()); Placemark p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulation());
Assert.assertEquals(KIEL, p); Assert.assertEquals(KIEL.getName(), p.getName());
Assert.assertEquals(KIEL.getCountryCode(), p.getCountryCode());
Assert.assertEquals(KIEL.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(KIEL.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.0001);
p = geocoder.getPlacemarkFirst(abroad, 20, new Placemark.ByDistance(abroad)); p = geocoder.getPlacemarkFirst(abroad, 20, new Placemark.ByDistance(abroad));
Assert.assertEquals(firstByDistance, p); Assert.assertEquals(firstByDistance.getName(), p.getName());
Assert.assertEquals(firstByDistance.getCountryCode(), p.getCountryCode());
Assert.assertEquals(firstByDistance.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(firstByDistance.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.0001);
p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulationDistanceRatio(abroad)); p = geocoder.getPlacemarkLast(abroad, 20, new Placemark.ByPopulationDistanceRatio(abroad));
Assert.assertEquals(KIEL, p); Assert.assertEquals(KIEL.getName(), p.getName());
Assert.assertEquals(KIEL.getCountryCode(), p.getCountryCode());
Assert.assertEquals(KIEL.getPosition().getLatDeg(), p.getPosition().getLatDeg(), 0.0001);
Assert.assertEquals(KIEL.getPosition().getLngDeg(), p.getPosition().getLngDeg(), 0.0001);
} catch (IOException e) { } catch (IOException e) {
Assert.fail(e.getMessage()); Assert.fail(e.getMessage());
} catch (ParseException e) { } catch (ParseException e) {
@@ -159,16 +159,18 @@ public class ReverseGeocoderImpl implements ReverseGeocoder {
// and are interpreted as Long // and are interpreted as Long
// Casting a Long to a Double raises a ClassCastException // Casting a Long to a Double raises a ClassCastException
Double latDeg = null; Double latDeg = null;
try { Object jsonLat = json.get("lat");
latDeg = (Double) json.get("lat"); if (jsonLat instanceof String) {
} catch (ClassCastException e) { latDeg = Double.valueOf((String) jsonLat);
latDeg = ((Long) json.get("lat")).doubleValue(); } else if (jsonLat instanceof Number) {
latDeg = ((Number) jsonLat).doubleValue();
} }
Double lngDeg = null; Double lngDeg = null;
try { Object jsonLng = json.get("lng");
lngDeg = (Double) json.get("lng"); if (jsonLng instanceof String) {
} catch (ClassCastException e) { lngDeg = Double.valueOf((String) jsonLng);
lngDeg = ((Long) json.get("lng")).doubleValue(); } else if (jsonLng instanceof Number) {
lngDeg = ((Number) jsonLng).doubleValue();
} }
SerializablePosition position = new SerializablePositionImpl(latDeg, lngDeg); SerializablePosition position = new SerializablePositionImpl(latDeg, lngDeg);
@@ -731,4 +731,14 @@ public interface StringMessages extends Messages {
String export(); String export();
String dataBeforeAfter(); String dataBeforeAfter();
String rawFixes(); String rawFixes();
String importRemoteHost();
String importFetchRemoteLgs();
String importUrlInvalid(String url);
String importGetLeaderboardsFailed(int statusCode, String url);
String importNoDataReturned();
String importServerError();
String importLeaderboardGroups();
String importOverrideSwitchLabel();
String importSelectedLeaderboardGroups();
String importSelectAtLeastOne();
} }
@@ -723,4 +723,14 @@ essThreeDisplayed=Three minutes till start
essTwoDisplayed=Two minutes till start essTwoDisplayed=Two minutes till start
essOneDisplayed=One minute till start essOneDisplayed=One minute till start
essOneRemoved=Race starting signaldataBeforeAfter=Data from before/after race essOneRemoved=Race starting signaldataBeforeAfter=Data from before/after race
rawFixes=All fixes (including outliers) 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}
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:
importOverrideSwitchLabel=Override existing data if names and ids match
importSelectedLeaderboardGroups=Import selected leaderboard groups
importSelectAtLeastOne=You have to select at least one leaderboard group to import
@@ -719,4 +719,14 @@ essThreeDisplayed=Drei Minuten bis zum Start
essTwoDisplayed=Zwei Minuten bis zum Start essTwoDisplayed=Zwei Minuten bis zum Start
essOneDisplayed=Eine Minute bis zum Start essOneDisplayed=Eine Minute bis zum Start
essOneRemoved=RennstartsignaldataBeforeAfter=Daten von vor/nach dem Rennen essOneRemoved=RennstartsignaldataBeforeAfter=Daten von vor/nach dem Rennen
rawFixes=Alle Fixes (inklusive Ausreißer) 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}
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:
importOverrideSwitchLabel=Bei übereinstimmenden IDs und Namen die Daten überschreiben
importSelectedLeaderboardGroups=Ausgewählte Leaderboard Groups selektieren
importSelectAtLeastOne=Es muss mindestens eine Leaderboard Group ausgewählt werden
@@ -44,9 +44,6 @@ public class MasterDataImportPanel extends VerticalPanel {
private RegExp urlValidator; private RegExp urlValidator;
private RegExp urlPlusTldValidator; private RegExp urlPlusTldValidator;
/*
* TODO: use string messages
*/
private final StringMessages stringMessages; private final StringMessages stringMessages;
private String currentHost; private String currentHost;
private SailingServiceAsync sailingService; private SailingServiceAsync sailingService;
@@ -65,12 +62,12 @@ public class MasterDataImportPanel extends VerticalPanel {
this.leaderboardGroupRefresher = leaderboardGroupRefresher; this.leaderboardGroupRefresher = leaderboardGroupRefresher;
HorizontalPanel serverAddressPanel = new HorizontalPanel(); HorizontalPanel serverAddressPanel = new HorizontalPanel();
serverAddressPanel.add(new Label("Remote host:")); serverAddressPanel.add(new Label(stringMessages.importRemoteHost()));
hostBox = new TextBox(); hostBox = new TextBox();
hostBox.setText("http://prod2.sapsailing.com/"); hostBox.setText("http://live2.sapsailing.com/");
hostBox.setWidth("300px"); hostBox.setWidth("300px");
serverAddressPanel.add(hostBox); serverAddressPanel.add(hostBox);
fetchIdsButton = new Button("Fetch Leaderboard Group List"); fetchIdsButton = new Button(stringMessages.importFetchRemoteLgs());
serverAddressPanel.add(fetchIdsButton); serverAddressPanel.add(fetchIdsButton);
this.add(serverAddressPanel); this.add(serverAddressPanel);
@@ -115,36 +112,50 @@ public class MasterDataImportPanel extends VerticalPanel {
protected void importLeaderboardGroups() { protected void importLeaderboardGroups() {
String[] groupNames = createLeaderBoardGroupNamesFromListBox(); String[] groupNames = createLeaderBoardGroupNamesFromListBox();
boolean override = overrideSwitch.getValue(); if (groupNames.length >= 1) {
sailingService.importMasterData(currentHost, groupNames, override, changeAllButtonState(false);
new AsyncCallback<MasterDataImportObjectCreationCount>() { boolean override = overrideSwitch.getValue();
sailingService.importMasterData(currentHost, groupNames, override,
new AsyncCallback<MasterDataImportObjectCreationCount>() {
@Override @Override
public void onSuccess(MasterDataImportObjectCreationCount result) { public void onSuccess(MasterDataImportObjectCreationCount result) {
int leaderboardsCreated = result.getLeaderboardCount(); int leaderboardsCreated = result.getLeaderboardCount();
int leaderboardGroupsCreated = result.getLeaderboardGroupCount(); int leaderboardGroupsCreated = result.getLeaderboardGroupCount();
int eventsCreated = result.getEventCount(); int eventsCreated = result.getEventCount();
int regattasCreated = result.getRegattaCount(); int regattasCreated = result.getRegattaCount();
if (regattasCreated > 0) { if (regattasCreated > 0) {
regattaRefresher.fillRegattas(); regattaRefresher.fillRegattas();
}
if (eventsCreated > 0) {
eventRefresher.fillEvents();
}
if (leaderboardGroupsCreated > 0) {
leaderboardGroupRefresher.fillLeaderboardGroups();
}
showSuccessAlert(leaderboardsCreated, leaderboardGroupsCreated, eventsCreated,
regattasCreated);
changeAllButtonState(true);
} }
if (eventsCreated > 0) {
eventRefresher.fillEvents();
}
if (leaderboardGroupsCreated > 0) {
leaderboardGroupRefresher.fillLeaderboardGroups();
}
showSuccessAlert(leaderboardsCreated, leaderboardGroupsCreated, eventsCreated, regattasCreated);
}
@Override @Override
public void onFailure(Throwable caught) { public void onFailure(Throwable caught) {
showErrorAlert(caught.getLocalizedMessage()); showErrorAlert(caught.getLocalizedMessage());
} changeAllButtonState(true);
}); }
});
} else {
showErrorAlert(stringMessages.importSelectAtLeastOne());
}
} }
private void changeAllButtonState(boolean enabled) {
importLeaderboardGroupsButton.setEnabled(enabled);
overrideSwitch.setEnabled(enabled);
fetchIdsButton.setEnabled(enabled);
}
protected void showSuccessAlert(int leaderboardsCreated, int leaderboardGroupsCreated, int eventsCreated, protected void showSuccessAlert(int leaderboardsCreated, int leaderboardGroupsCreated, int eventsCreated,
int regattasCreated) { int regattasCreated) {
Window.alert(stringMessages.importSuccess(leaderboardGroupsCreated, leaderboardsCreated, eventsCreated, Window.alert(stringMessages.importSuccess(leaderboardGroupsCreated, leaderboardsCreated, eventsCreated,
@@ -173,17 +184,17 @@ public class MasterDataImportPanel extends VerticalPanel {
currentHost = host; currentHost = host;
final String getLgsUrl = createGetLgsUrl(host); final String getLgsUrl = createGetLgsUrl(host);
if (!isValidUrl(getLgsUrl, false)) { if (!isValidUrl(getLgsUrl, false)) {
showErrorAlert("Not a valid URL for fetching leaderboardgroups: " + getLgsUrl); showErrorAlert(stringMessages.importUrlInvalid(getLgsUrl));
return; return;
} }
changeAllButtonState(false);
RequestBuilder getLgsRequestBuilder = new RequestBuilder(RequestBuilder.GET, getLgsUrl); RequestBuilder getLgsRequestBuilder = new RequestBuilder(RequestBuilder.GET, getLgsUrl);
getLgsRequestBuilder.setCallback(new RequestCallback() { getLgsRequestBuilder.setCallback(new RequestCallback() {
@Override @Override
public void onResponseReceived(Request request, Response response) { public void onResponseReceived(Request request, Response response) {
if (response.getStatusCode() != 200) { if (response.getStatusCode() != 200) {
showErrorAlert("GET leaderboardgroups request failed with error code: " + response.getStatusCode() showErrorAlert(stringMessages.importGetLeaderboardsFailed(response.getStatusCode(), getLgsUrl));
+ " For url: " + getLgsUrl);
} }
int itemCount = leaderboardgroupListBox.getItemCount(); int itemCount = leaderboardgroupListBox.getItemCount();
for (int i = itemCount - 1; i >= 0; i--) { for (int i = itemCount - 1; i >= 0; i--) {
@@ -191,7 +202,8 @@ public class MasterDataImportPanel extends VerticalPanel {
} }
String body = response.getText(); String body = response.getText();
if (body == null || body.isEmpty()) { if (body == null || body.isEmpty()) {
showErrorAlert("No data was returned by remote server."); showErrorAlert(stringMessages.importNoDataReturned());
changeAllButtonState(true);
return; return;
} }
JSONArray leaderboardGroups = JSONParser.parseStrict(body).isArray(); JSONArray leaderboardGroups = JSONParser.parseStrict(body).isArray();
@@ -200,18 +212,25 @@ public class MasterDataImportPanel extends VerticalPanel {
JSONString leaderboardGroupName = leaderboardGroups.get(i).isString(); JSONString leaderboardGroupName = leaderboardGroups.get(i).isString();
leaderboardgroupListBox.addItem(leaderboardGroupName.stringValue()); leaderboardgroupListBox.addItem(leaderboardGroupName.stringValue());
} }
if (leaderboardGroups.size() > 1) {
importLeaderboardGroupsButton.setEnabled(true);
} else {
importLeaderboardGroupsButton.setEnabled(false);
}
changeAllButtonState(true);
} }
@Override @Override
public void onError(Request request, Throwable exception) { public void onError(Request request, Throwable exception) {
showErrorAlert("GET leaderboardgroups request failed with Server error: " showErrorAlert(stringMessages.importServerError());
+ exception.getLocalizedMessage()); changeAllButtonState(true);
} }
}); });
try { try {
getLgsRequestBuilder.send(); getLgsRequestBuilder.send();
} catch (RequestException e) { } catch (RequestException e) {
showErrorAlert("GET leaderboardgroups request failed: " + e.getLocalizedMessage()); showErrorAlert(stringMessages.importServerError());
changeAllButtonState(true);
} }
} }
@@ -246,16 +265,17 @@ public class MasterDataImportPanel extends VerticalPanel {
} }
private void addContentToLeftPanel(VerticalPanel contentPanel) { private void addContentToLeftPanel(VerticalPanel contentPanel) {
contentPanel.add(new Label("Leaderboard Groups:")); contentPanel.add(new Label(stringMessages.importLeaderboardGroups()));
leaderboardgroupListBox = new ListBox(true); leaderboardgroupListBox = new ListBox(true);
contentPanel.add(leaderboardgroupListBox); contentPanel.add(leaderboardgroupListBox);
overrideSwitch = new CheckBox("Override existing data if names and ids match"); overrideSwitch = new CheckBox(stringMessages.importOverrideSwitchLabel());
overrideSwitch.setValue(false); overrideSwitch.setValue(false);
contentPanel.add(overrideSwitch); contentPanel.add(overrideSwitch);
importLeaderboardGroupsButton = new Button("Import selected Leaderboard Groups"); importLeaderboardGroupsButton = new Button(stringMessages.importSelectedLeaderboardGroups());
importLeaderboardGroupsButton.setEnabled(false);
contentPanel.add(importLeaderboardGroupsButton); contentPanel.add(importLeaderboardGroupsButton);
} }
@@ -66,6 +66,7 @@ public class MasterDataImportTest {
private static final String TEST_GROUP_NAME = "testGroup"; private static final String TEST_GROUP_NAME = "testGroup";
private static final String TEST_EVENT_NAME = "testEvent"; private static final String TEST_EVENT_NAME = "testEvent";
private static final String TEST_LEADERBOARD_NAME = "testRegatta (29er)"; private static final String TEST_LEADERBOARD_NAME = "testRegatta (29er)";
private static final String TEST_GROUP_NAME2 = "testGroup2";
private final UUID eventUUID = UUID.randomUUID(); private final UUID eventUUID = UUID.randomUUID();
@@ -87,6 +88,10 @@ public class MasterDataImportTest {
if (group != null) { if (group != null) {
service.removeLeaderboardGroup(TEST_GROUP_NAME); service.removeLeaderboardGroup(TEST_GROUP_NAME);
} }
LeaderboardGroup group2 = service.getLeaderboardGroupByName(TEST_GROUP_NAME2);
if (group2 != null) {
service.removeLeaderboardGroup(TEST_GROUP_NAME2);
}
Leaderboard leaderboard = service.getLeaderboardByName(TEST_LEADERBOARD_NAME); Leaderboard leaderboard = service.getLeaderboardByName(TEST_LEADERBOARD_NAME);
if (leaderboard != null) { if (leaderboard != null) {
service.removeLeaderboard(TEST_LEADERBOARD_NAME); service.removeLeaderboard(TEST_LEADERBOARD_NAME);
@@ -416,8 +421,13 @@ public class MasterDataImportTest {
//---Asserts--- //---Asserts---
//Test correct number of creations
Assert.assertNotNull(creationCount); Assert.assertNotNull(creationCount);
Assert.assertEquals(0,creationCount.getEventCount());
Assert.assertEquals(0,creationCount.getRegattaCount());
Assert.assertEquals(0,creationCount.getLeaderboardCount());
Assert.assertEquals(0,creationCount.getLeaderboardGroupCount());
Event eventOnTarget = destService.getEvent(eventUUID); Event eventOnTarget = destService.getEvent(eventUUID);
Assert.assertNotNull(eventOnTarget); Assert.assertNotNull(eventOnTarget);
@@ -579,8 +589,14 @@ public class MasterDataImportTest {
//---Asserts--- //---Asserts---
//Test correct number of creations
Assert.assertNotNull(creationCount); Assert.assertNotNull(creationCount);
Assert.assertEquals(1,creationCount.getEventCount());
Assert.assertEquals(1,creationCount.getRegattaCount());
Assert.assertEquals(1,creationCount.getLeaderboardCount());
Assert.assertEquals(1,creationCount.getLeaderboardGroupCount());
Event eventOnTarget = destService.getEvent(eventUUID); Event eventOnTarget = destService.getEvent(eventUUID);
Assert.assertNotNull(eventOnTarget); Assert.assertNotNull(eventOnTarget);
@@ -890,4 +906,105 @@ public class MasterDataImportTest {
Assert.assertEquals(trackOnSource.url, trackOnTarget.url); Assert.assertEquals(trackOnSource.url, trackOnTarget.url);
} }
@Test
public void testMasterDataImportWithTwoLgsWithSameLeaderboard() throws MalformedURLException, IOException, InterruptedException {
// Setup source service
RacingEventService sourceService = new RacingEventServiceImpl();
Event event = sourceService.addEvent(TEST_EVENT_NAME, "testVenue", "", false, eventUUID,
new ArrayList<String>());
UUID courseAreaUUID = UUID.randomUUID();
CourseArea courseArea = new CourseAreaImpl("testArea", courseAreaUUID);
event.getVenue().addCourseArea(courseArea);
List<String> raceColumnNames = new ArrayList<String>();
String raceColumnName = "T1";
raceColumnNames.add(raceColumnName);
raceColumnNames.add("T2");
List<Series> series = new ArrayList<Series>();
List<Fleet> fleets = new ArrayList<Fleet>();
FleetImpl testFleet1 = new FleetImpl("testFleet1");
fleets.add(testFleet1);
fleets.add(new FleetImpl("testFleet2"));
series.add(new SeriesImpl("testSeries", false, fleets, raceColumnNames, sourceService));
UUID regattaUUID = UUID.randomUUID();
Regatta regatta = sourceService.createRegatta("testRegatta", "29er", regattaUUID, series, true, new LowPoint(),
courseAreaUUID);
event.addRegatta(regatta);
int[] discardRule = { 1, 2, 3, 4 };
Leaderboard leaderboard = sourceService.addRegattaLeaderboard(regatta.getRegattaIdentifier(),
"testDisplayName", discardRule);
List<String> leaderboardNames = new ArrayList<String>();
leaderboardNames.add(leaderboard.getName());
sourceService.addLeaderboardGroup(TEST_GROUP_NAME, "testGroupDesc", false, leaderboardNames, null, null);
sourceService.addLeaderboardGroup(TEST_GROUP_NAME2, "testGroupDesc2", false, leaderboardNames, null, null);
// Set tracked Race with competitors
Set<Competitor> competitors = new HashSet<Competitor>();
UUID competitorUUID = UUID.randomUUID();
Set<Person> sailors = new HashSet<Person>();
sailors.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(645487200000L),
"Oberhoschy"));
Person coach = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(645487200000L),
"Der Lennart halt");
Team team = new TeamImpl("Pros", sailors, coach);
BoatClass boatClass = new BoatClassImpl("H16", true);
Boat boat = new BoatImpl("Wingy", boatClass, "GER70133");
CompetitorImpl competitor = new CompetitorImpl(competitorUUID, "Froderik", team, boat);
competitors.add(competitor);
UUID competitorToSuppressUUID = UUID.randomUUID();
Set<Person> sailors2 = new HashSet<Person>();
sailors2.add(new PersonImpl("Angela Merkel", new NationalityImpl("GER"), new Date(645487200000L),
"segelt auch mit"));
Person coach2 = new PersonImpl("Peer Steinbrueck", new NationalityImpl("GER"), new Date(645487200000L),
"Bester Coach");
Team team2 = new TeamImpl("Noobs", sailors2, coach2);
Boat boat2 = new BoatImpl("LahmeEnte", boatClass, "GER1337");
CompetitorImpl competitorToSuppress = new CompetitorImpl(competitorToSuppressUUID, "Merkel", team2, boat2);
competitors.add(competitorToSuppress);
TrackedRace trackedRace = new DummyTrackedRace(competitors, regatta);
RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName);
raceColumn.setTrackedRace(testFleet1, trackedRace);
// Serialize
TopLevelMasterDataSerializer serializer = new TopLevelMasterDataSerializer(
sourceService.getLeaderboardGroups(), sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Set<String> names = new HashSet<String>();
names.add(TEST_GROUP_NAME);
names.add(TEST_GROUP_NAME2);
JSONObject masterDataOverallObject = serializer.serialize(names);
Assert.assertNotNull(masterDataOverallObject);
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Deserialization copied from doPost in MasterDataByLeaderboardGroupJsonPostServlet
RacingEventService destService = new RacingEventServiceImplMock();
DomainFactory domainFactory = DomainFactory.INSTANCE;
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
//Test in override model, to find out if data that was created during import is overriden later on
// in the same import process. Number of creations is checked below.
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(
masterDataOverallObject.toString(), true);
//Test correct number of creations
Assert.assertNotNull(creationCount);
Assert.assertEquals(1,creationCount.getEventCount());
Assert.assertEquals(1,creationCount.getRegattaCount());
Assert.assertEquals(1,creationCount.getLeaderboardCount());
Assert.assertEquals(2,creationCount.getLeaderboardGroupCount());
Event eventOnTarget = destService.getEvent(eventUUID);
Assert.assertNotNull(eventOnTarget);
LeaderboardGroup leaderboardGroupOnTarget = destService.getLeaderboardGroupByName(TEST_GROUP_NAME);
Assert.assertNotNull(leaderboardGroupOnTarget);
Assert.assertTrue(leaderboardGroupOnTarget.getLeaderboards().iterator().hasNext());
LeaderboardGroup leaderboardGroup2OnTarget = destService.getLeaderboardGroupByName(TEST_GROUP_NAME2);
Assert.assertNotNull(leaderboardGroup2OnTarget);
Assert.assertTrue(leaderboardGroup2OnTarget.getLeaderboards().iterator().hasNext());
}
} }
@@ -48,8 +48,8 @@ public class MasterDataImporter {
JSONObject leaderBoardGroupMasterDataJson = (JSONObject) leaderBoardGroupMasterData; JSONObject leaderBoardGroupMasterDataJson = (JSONObject) leaderBoardGroupMasterData;
LeaderboardGroupMasterData masterData = leaderboardGroupMasterDataDeserializer LeaderboardGroupMasterData masterData = leaderboardGroupMasterDataDeserializer
.deserialize(leaderBoardGroupMasterDataJson); .deserialize(leaderBoardGroupMasterDataJson);
ImportMasterDataOperation op = new ImportMasterDataOperation(masterData, override); ImportMasterDataOperation op = new ImportMasterDataOperation(masterData, override, creationCount);
creationCount.add(racingEventService.apply(op)); creationCount = racingEventService.apply(op);
} }
JsonDeserializer<MediaTrack> mediaTrackDeserializer = new MediaTrackJsonDeserializer(); JsonDeserializer<MediaTrack> mediaTrackDeserializer = new MediaTrackJsonDeserializer();
JSONArray mediaTracks = (JSONArray) masterDataOverall.get(TopLevelMasterDataSerializer.FIELD_MEDIA); JSONArray mediaTracks = (JSONArray) masterDataOverall.get(TopLevelMasterDataSerializer.FIELD_MEDIA);
@@ -67,7 +67,7 @@ public class MasterDataImporter {
for (MediaTrack oneNewTrack : tracks) { for (MediaTrack oneNewTrack : tracks) {
if (existingMap.containsKey(oneNewTrack.dbId)) { if (existingMap.containsKey(oneNewTrack.dbId)) {
if (override) { if (override) {
racingEventService.mediaTrackDeleted(existingMap.get(oneNewTrack)); racingEventService.mediaTrackDeleted(existingMap.get(oneNewTrack.dbId));
} else { } else {
continue; continue;
} }
@@ -63,7 +63,8 @@ public class ImportMasterDataOperation extends
private final boolean override; private final boolean override;
public ImportMasterDataOperation(LeaderboardGroupMasterData masterData, boolean override) { public ImportMasterDataOperation(LeaderboardGroupMasterData masterData, boolean override, MasterDataImportObjectCreationCountImpl existingCreationCount) {
this.creationCount.add(existingCreationCount);
this.masterData = masterData; this.masterData = masterData;
this.override = override; this.override = override;
} }
@@ -81,8 +82,12 @@ public class ImportMasterDataOperation extends
createRegattas(masterData, toState); createRegattas(masterData, toState);
Map<String, Leaderboard> existingLeaderboards = toState.getLeaderboards(); Map<String, Leaderboard> existingLeaderboards = toState.getLeaderboards();
for (LeaderboardMasterData board : masterData.getLeaderboards()) { for (LeaderboardMasterData board : masterData.getLeaderboards()) {
leaderboardNames.add(board.getName());
if (existingLeaderboards.containsKey(board.getName())) { if (existingLeaderboards.containsKey(board.getName())) {
if (override) { if (creationCount.alreadyAddedLeaderboardWithName(board.getName())) {
//Has already been added by this operation
continue;
} else if (override) {
toState.removeLeaderboard(board.getName()); toState.removeLeaderboard(board.getName());
logger.info(String.format("Leaderboard with name %1$s already existed and has been overridden.", logger.info(String.format("Leaderboard with name %1$s already existed and has been overridden.",
board.getName())); board.getName()));
@@ -98,8 +103,7 @@ public class ImportMasterDataOperation extends
if (leaderboard != null) { if (leaderboard != null) {
leaderboard.setDisplayName(board.getDisplayName()); leaderboard.setDisplayName(board.getDisplayName());
toState.addLeaderboard(leaderboard); toState.addLeaderboard(leaderboard);
leaderboardNames.add(board.getName()); creationCount.addOneLeaderboard(leaderboard.getName());
creationCount.addOneLeaderboard();
Leaderboard newLeaderboard = toState.getLeaderboardByName(board.getName()); Leaderboard newLeaderboard = toState.getLeaderboardByName(board.getName());
addRaceColumnsIfNecessary(board, newLeaderboard, toState); addRaceColumnsIfNecessary(board, newLeaderboard, toState);
// Set dummy tracked race, so that the leaderboard caches the competitors and // Set dummy tracked race, so that the leaderboard caches the competitors and
@@ -138,7 +142,7 @@ public class ImportMasterDataOperation extends
toState.addLeaderboardGroup(masterData.getName(), masterData.getDescription(), toState.addLeaderboardGroup(masterData.getName(), masterData.getDescription(),
masterData.isDisplayGroupsRevese(), leaderboardNames, overallLeaderboardDiscardThresholds, masterData.isDisplayGroupsRevese(), leaderboardNames, overallLeaderboardDiscardThresholds,
overallLeaderboardScoringSchemeType); overallLeaderboardScoringSchemeType);
creationCount.addOneLeaderboardGroup(); creationCount.addOneLeaderboardGroup(masterData.getName());
} else { } else {
logger.info(String.format("Leaderboard Group with name %1$s already exists and hasn't been overridden.", logger.info(String.format("Leaderboard Group with name %1$s already exists and hasn't been overridden.",
masterData.getName())); masterData.getName()));
@@ -267,13 +271,16 @@ public class ImportMasterDataOperation extends
for (RegattaMasterData singleRegattaData : regattaData) { for (RegattaMasterData singleRegattaData : regattaData) {
Regatta existingRegatta = toState.getRegatta(new RegattaName(singleRegattaData.getRegattaName())); Regatta existingRegatta = toState.getRegatta(new RegattaName(singleRegattaData.getRegattaName()));
if (existingRegatta != null) { if (existingRegatta != null) {
if (override) { if (creationCount.alreadyAddedRegattaWithId(existingRegatta.getId().toString())) {
//Already added earlier in this import process
continue;
} else if (override) {
logger.info(String.format("Regatta with name %1$s already existed and has been overridden.", logger.info(String.format("Regatta with name %1$s already existed and has been overridden.",
singleRegattaData.getRegattaName())); singleRegattaData.getRegattaName()));
try { try {
toState.removeRegatta(existingRegatta); toState.removeRegatta(existingRegatta);
} catch (IOException | InterruptedException e) { } catch (IOException | InterruptedException e) {
logger.info(String.format("Regatta with name %1$s could not be deleted due to an error.", logger.warning(String.format("Regatta with name %1$s could not be deleted due to an error.",
singleRegattaData.getRegattaName())); singleRegattaData.getRegattaName()));
e.printStackTrace(); e.printStackTrace();
continue; continue;
@@ -297,7 +304,7 @@ public class ImportMasterDataOperation extends
domainFactory.createScoringScheme(ScoringSchemeType.valueOf(scoringSchemeType)), domainFactory.createScoringScheme(ScoringSchemeType.valueOf(scoringSchemeType)),
courseAreaUUID).getA(); courseAreaUUID).getA();
toState.setPersistentRegattaForRaceIDs(createdRegatta, singleRegattaData.getRaceIds(), override); toState.setPersistentRegattaForRaceIDs(createdRegatta, singleRegattaData.getRaceIds(), override);
creationCount.addOneRegatta(); creationCount.addOneRegatta(createdRegatta.getId().toString());
} }
} }
@@ -338,7 +345,7 @@ public class ImportMasterDataOperation extends
for (EventMasterData event : events) { for (EventMasterData event : events) {
String id = event.getId(); String id = event.getId();
Event existingEvent = toState.getEvent(UUID.fromString(id)); Event existingEvent = toState.getEvent(UUID.fromString(id));
if (existingEvent != null && override) { if (existingEvent != null && override && !creationCount.alreadyAddedEventWithId(id)) {
logger.info(String.format("Event with name %1$s already existed and will be overridden.", logger.info(String.format("Event with name %1$s already existed and will be overridden.",
event.getName())); event.getName()));
toState.removeEvent(existingEvent.getId()); toState.removeEvent(existingEvent.getId());
@@ -351,7 +358,7 @@ public class ImportMasterDataOperation extends
boolean isPublic = event.isPublic(); boolean isPublic = event.isPublic();
Event newEvent = new EventImpl(name, venueName, pubString, isPublic, UUID.fromString(id)); Event newEvent = new EventImpl(name, venueName, pubString, isPublic, UUID.fromString(id));
toState.createEventWithoutReplication(newEvent); toState.createEventWithoutReplication(newEvent);
creationCount.addOneEvent(); creationCount.addOneEvent(newEvent.getId().toString());
} else { } else {
logger.info(String.format("Event with name %1$s already exists and hasn't been overridden.", logger.info(String.format("Event with name %1$s already exists and hasn't been overridden.",
event.getName())); event.getName()));