From 81cc0d55c25bad99c9b5e8ebef2f9d2c43110aea Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Thu, 4 Jul 2013 11:01:54 +0200 Subject: [PATCH 1/5] Fixed problem in master data import concerning leaderboardgroups leaderboardgroups where empty if the leaderboard was already added to another leaderboard group added test case for that small fix to override mode for media tracks --- .../server/test/MasterDataImportTest.java | 98 +++++++++++++++++++ .../server/masterdata/MasterDataImporter.java | 2 +- .../ImportMasterDataOperation.java | 2 +- 3 files changed, 100 insertions(+), 2 deletions(-) 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 72d09b26655..92c95ff9686 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 @@ -66,6 +66,7 @@ public class MasterDataImportTest { private static final String TEST_GROUP_NAME = "testGroup"; private static final String TEST_EVENT_NAME = "testEvent"; private static final String TEST_LEADERBOARD_NAME = "testRegatta (29er)"; + private static final String TEST_GROUP_NAME2 = "testGroup2"; private final UUID eventUUID = UUID.randomUUID(); @@ -87,6 +88,10 @@ public class MasterDataImportTest { if (group != null) { 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); if (leaderboard != null) { service.removeLeaderboard(TEST_LEADERBOARD_NAME); @@ -890,4 +895,97 @@ public class MasterDataImportTest { 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()); + UUID courseAreaUUID = UUID.randomUUID(); + CourseArea courseArea = new CourseAreaImpl("testArea", courseAreaUUID); + event.getVenue().addCourseArea(courseArea); + + List raceColumnNames = new ArrayList(); + String raceColumnName = "T1"; + raceColumnNames.add(raceColumnName); + raceColumnNames.add("T2"); + + List series = new ArrayList(); + List fleets = new ArrayList(); + 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 leaderboardNames = new ArrayList(); + 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 competitors = new HashSet(); + UUID competitorUUID = UUID.randomUUID(); + Set sailors = new HashSet(); + 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 sailors2 = new HashSet(); + 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 names = new HashSet(); + 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); + MasterDataImportObjectCreationCount creationCount = importer.importMasterData( + masterDataOverallObject.toString(), false); + + Assert.assertNotNull(creationCount); + 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()); + + } } diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java index daff0492b65..11c891f996d 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java @@ -67,7 +67,7 @@ public class MasterDataImporter { for (MediaTrack oneNewTrack : tracks) { if (existingMap.containsKey(oneNewTrack.dbId)) { if (override) { - racingEventService.mediaTrackDeleted(existingMap.get(oneNewTrack)); + racingEventService.mediaTrackDeleted(existingMap.get(oneNewTrack.dbId)); } else { continue; } 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 903836cce15..f7b8a80ac7c 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 @@ -81,6 +81,7 @@ public class ImportMasterDataOperation extends createRegattas(masterData, toState); Map existingLeaderboards = toState.getLeaderboards(); for (LeaderboardMasterData board : masterData.getLeaderboards()) { + leaderboardNames.add(board.getName()); if (existingLeaderboards.containsKey(board.getName())) { if (override) { toState.removeLeaderboard(board.getName()); @@ -98,7 +99,6 @@ public class ImportMasterDataOperation extends if (leaderboard != null) { leaderboard.setDisplayName(board.getDisplayName()); toState.addLeaderboard(leaderboard); - leaderboardNames.add(board.getName()); creationCount.addOneLeaderboard(); Leaderboard newLeaderboard = toState.getLeaderboardByName(board.getName()); addRaceColumnsIfNecessary(board, newLeaderboard, toState); From 5710e2f9c587aa5e58d9d9e21f7a117de705c261 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 4 Jul 2013 12:44:00 +0200 Subject: [PATCH 2/5] made ReverseGeocoderTest more flexible regarding changes to population; made ReverseGeocoderImpl more flexible regarding number formats --- .../geocoding/test/ReverseGeocoderTest.java | 20 +++++++++++++++---- .../geocoding/impl/ReverseGeocoderImpl.java | 18 +++++++++-------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/java/com.sap.sailing.geocoding.test/src/com/sap/sailing/geocoding/test/ReverseGeocoderTest.java b/java/com.sap.sailing.geocoding.test/src/com/sap/sailing/geocoding/test/ReverseGeocoderTest.java index 5126ce45d6e..0b6074e0238 100644 --- a/java/com.sap.sailing.geocoding.test/src/com/sap/sailing/geocoding/test/ReverseGeocoderTest.java +++ b/java/com.sap.sailing.geocoding.test/src/com/sap/sailing/geocoding/test/ReverseGeocoderTest.java @@ -27,7 +27,10 @@ public class ReverseGeocoderTest { //Simple Test in Kiel center to check the connection and the parsing from JSONObject to Placemark try { 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) { Assert.fail(e.getMessage()); } catch (ParseException e) { @@ -55,13 +58,22 @@ public class ReverseGeocoderTest { try { 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)); - 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)); - 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) { Assert.fail(e.getMessage()); } catch (ParseException e) { diff --git a/java/com.sap.sailing.geocoding/src/com/sap/sailing/geocoding/impl/ReverseGeocoderImpl.java b/java/com.sap.sailing.geocoding/src/com/sap/sailing/geocoding/impl/ReverseGeocoderImpl.java index f7055d4d095..a3a8ecec0c0 100644 --- a/java/com.sap.sailing.geocoding/src/com/sap/sailing/geocoding/impl/ReverseGeocoderImpl.java +++ b/java/com.sap.sailing.geocoding/src/com/sap/sailing/geocoding/impl/ReverseGeocoderImpl.java @@ -159,16 +159,18 @@ public class ReverseGeocoderImpl implements ReverseGeocoder { // and are interpreted as Long // Casting a Long to a Double raises a ClassCastException Double latDeg = null; - try { - latDeg = (Double) json.get("lat"); - } catch (ClassCastException e) { - latDeg = ((Long) json.get("lat")).doubleValue(); + Object jsonLat = json.get("lat"); + if (jsonLat instanceof String) { + latDeg = Double.valueOf((String) jsonLat); + } else if (jsonLat instanceof Number) { + latDeg = ((Number) jsonLat).doubleValue(); } Double lngDeg = null; - try { - lngDeg = (Double) json.get("lng"); - } catch (ClassCastException e) { - lngDeg = ((Long) json.get("lng")).doubleValue(); + Object jsonLng = json.get("lng"); + if (jsonLng instanceof String) { + lngDeg = Double.valueOf((String) jsonLng); + } else if (jsonLng instanceof Number) { + lngDeg = ((Number) jsonLng).doubleValue(); } SerializablePosition position = new SerializablePositionImpl(latDeg, lngDeg); From f1eab431724f950ebe224e1b27631a30779a7da4 Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Thu, 4 Jul 2013 13:33:43 +0200 Subject: [PATCH 3/5] Fixed issues with override mode in master data import override mode made the whole import process overwrite events and regattas again and again if they were (indirectly) contained in several leaderboard groups. This is now fixed. The creation count object holds sets with identifiers of the objects that have been created during the process. also the number of created elements are validated in the test cases --- ...sterDataImportObjectCreationCountImpl.java | 43 +++++++++++++++++-- .../server/test/MasterDataImportTest.java | 25 +++++++++-- .../server/masterdata/MasterDataImporter.java | 4 +- .../ImportMasterDataOperation.java | 25 +++++++---- 4 files changed, 79 insertions(+), 18 deletions(-) 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 index 3f1bb3b6f04..471b33cd482 100644 --- 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 @@ -1,5 +1,8 @@ package com.sap.sailing.domain.common.impl; +import java.util.HashSet; +import java.util.Set; + 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 * 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) * */ @@ -18,22 +24,31 @@ public class MasterDataImportObjectCreationCountImpl implements MasterDataImport private int eventCount = 0; private int regattaCount = 0; + private Set createdLeaderboards = new HashSet(); + private Set createdLeaderboardGroups = new HashSet(); + private Set createdEvents = new HashSet(); + private Set createdRegattas = new HashSet(); + //For GWT serialization public MasterDataImportObjectCreationCountImpl() {}; - public void addOneLeaderboard() { + public void addOneLeaderboard(String name) { + createdLeaderboards.add(name); leaderboardCount++; } - public void addOneLeaderboardGroup() { + public void addOneLeaderboardGroup(String name) { + createdLeaderboardGroups.add(name); leaderboardGroupCount++; } - public void addOneEvent() { + public void addOneEvent(String id) { + createdEvents.add(id); eventCount++; } - public void addOneRegatta() { + public void addOneRegatta(String id) { + createdRegattas.add(id); regattaCount++; } @@ -43,6 +58,26 @@ public class MasterDataImportObjectCreationCountImpl implements MasterDataImport leaderboardGroupCount = leaderboardGroupCount + toAdd.leaderboardGroupCount; eventCount = eventCount + toAdd.eventCount; 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 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 92c95ff9686..3efd0a7f84a 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 @@ -421,8 +421,13 @@ public class MasterDataImportTest { //---Asserts--- - + //Test correct number of creations 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); Assert.assertNotNull(eventOnTarget); @@ -584,8 +589,14 @@ public class MasterDataImportTest { //---Asserts--- - + //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(1,creationCount.getLeaderboardGroupCount()); + + Event eventOnTarget = destService.getEvent(eventUUID); Assert.assertNotNull(eventOnTarget); @@ -974,10 +985,18 @@ public class MasterDataImportTest { 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(), false); + 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); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java index 11c891f996d..0277b8c88c3 100644 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/masterdata/MasterDataImporter.java @@ -48,8 +48,8 @@ public class MasterDataImporter { JSONObject leaderBoardGroupMasterDataJson = (JSONObject) leaderBoardGroupMasterData; LeaderboardGroupMasterData masterData = leaderboardGroupMasterDataDeserializer .deserialize(leaderBoardGroupMasterDataJson); - ImportMasterDataOperation op = new ImportMasterDataOperation(masterData, override); - creationCount.add(racingEventService.apply(op)); + ImportMasterDataOperation op = new ImportMasterDataOperation(masterData, override, creationCount); + creationCount = racingEventService.apply(op); } JsonDeserializer mediaTrackDeserializer = new MediaTrackJsonDeserializer(); JSONArray mediaTracks = (JSONArray) masterDataOverall.get(TopLevelMasterDataSerializer.FIELD_MEDIA); 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 f7b8a80ac7c..1cc94382947 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 @@ -63,7 +63,8 @@ public class ImportMasterDataOperation extends 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.override = override; } @@ -83,7 +84,10 @@ public class ImportMasterDataOperation extends for (LeaderboardMasterData board : masterData.getLeaderboards()) { leaderboardNames.add(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()); logger.info(String.format("Leaderboard with name %1$s already existed and has been overridden.", board.getName())); @@ -99,7 +103,7 @@ public class ImportMasterDataOperation extends if (leaderboard != null) { leaderboard.setDisplayName(board.getDisplayName()); toState.addLeaderboard(leaderboard); - creationCount.addOneLeaderboard(); + creationCount.addOneLeaderboard(leaderboard.getName()); Leaderboard newLeaderboard = toState.getLeaderboardByName(board.getName()); addRaceColumnsIfNecessary(board, newLeaderboard, toState); // 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(), masterData.isDisplayGroupsRevese(), leaderboardNames, overallLeaderboardDiscardThresholds, overallLeaderboardScoringSchemeType); - creationCount.addOneLeaderboardGroup(); + creationCount.addOneLeaderboardGroup(masterData.getName()); } else { logger.info(String.format("Leaderboard Group with name %1$s already exists and hasn't been overridden.", masterData.getName())); @@ -267,13 +271,16 @@ public class ImportMasterDataOperation extends for (RegattaMasterData singleRegattaData : regattaData) { Regatta existingRegatta = toState.getRegatta(new RegattaName(singleRegattaData.getRegattaName())); 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.", singleRegattaData.getRegattaName())); try { toState.removeRegatta(existingRegatta); } 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())); e.printStackTrace(); continue; @@ -297,7 +304,7 @@ public class ImportMasterDataOperation extends domainFactory.createScoringScheme(ScoringSchemeType.valueOf(scoringSchemeType)), courseAreaUUID).getA(); 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) { String id = event.getId(); 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.", event.getName())); toState.removeEvent(existingEvent.getId()); @@ -351,7 +358,7 @@ public class ImportMasterDataOperation extends boolean isPublic = event.isPublic(); Event newEvent = new EventImpl(name, venueName, pubString, isPublic, UUID.fromString(id)); toState.createEventWithoutReplication(newEvent); - creationCount.addOneEvent(); + creationCount.addOneEvent(newEvent.getId().toString()); } else { logger.info(String.format("Event with name %1$s already exists and hasn't been overridden.", event.getName())); From 952ccbdfc8308c5ec86a407326e5328c7f9a2495 Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Thu, 4 Jul 2013 15:59:18 +0200 Subject: [PATCH 4/5] Use string messages in master data import panel also tell user to choose at least one leaderboard group before clicking button. disabling it is the next step --- .../sailing/gwt/ui/client/StringMessages.java | 10 ++++++ .../gwt/ui/client/StringMessages.properties | 12 ++++++- .../ui/client/StringMessages_de.properties | 12 ++++++- .../MasterDataImportPanel.java | 31 +++++++++---------- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index ad980bfb76c..5a63146ec8f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -703,4 +703,14 @@ public interface StringMessages extends Messages { String export(); String dataBeforeAfter(); 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(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 2a532a0d656..aa5e1e93685 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -696,4 +696,14 @@ reloadAllRaceLogs=Reload all race logs export=Export sideline=Sideline dataBeforeAfter=Data from before/after race -rawFixes=All fixes (including outliers) \ No newline at end of file +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 \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 9a1f4056b1b..ff321f18df2 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -692,4 +692,14 @@ reloadAllRaceLogs=Alle RaceLogs neu laden export=Exportieren sideline=Seitenlinie dataBeforeAfter=Daten von vor/nach dem Rennen -rawFixes=Alle Fixes (inklusive Ausreißer) \ No newline at end of file +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 \ No newline at end of file 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 add724d9811..5de083eb382 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 @@ -44,9 +44,6 @@ public class MasterDataImportPanel extends VerticalPanel { private RegExp urlValidator; private RegExp urlPlusTldValidator; - /* - * TODO: use string messages - */ private final StringMessages stringMessages; private String currentHost; private SailingServiceAsync sailingService; @@ -65,12 +62,12 @@ public class MasterDataImportPanel extends VerticalPanel { this.leaderboardGroupRefresher = leaderboardGroupRefresher; HorizontalPanel serverAddressPanel = new HorizontalPanel(); - serverAddressPanel.add(new Label("Remote host:")); + serverAddressPanel.add(new Label(stringMessages.importRemoteHost())); hostBox = new TextBox(); - hostBox.setText("http://prod2.sapsailing.com/"); + hostBox.setText("http://live2.sapsailing.com/"); hostBox.setWidth("300px"); serverAddressPanel.add(hostBox); - fetchIdsButton = new Button("Fetch Leaderboard Group List"); + fetchIdsButton = new Button(stringMessages.importFetchRemoteLgs()); serverAddressPanel.add(fetchIdsButton); this.add(serverAddressPanel); @@ -115,6 +112,7 @@ public class MasterDataImportPanel extends VerticalPanel { protected void importLeaderboardGroups() { String[] groupNames = createLeaderBoardGroupNamesFromListBox(); + if (groupNames.length >= 1) { boolean override = overrideSwitch.getValue(); sailingService.importMasterData(currentHost, groupNames, override, new AsyncCallback() { @@ -142,6 +140,9 @@ public class MasterDataImportPanel extends VerticalPanel { showErrorAlert(caught.getLocalizedMessage()); } }); + } else { + showErrorAlert(stringMessages.importSelectAtLeastOne()); + } } @@ -173,7 +174,7 @@ public class MasterDataImportPanel extends VerticalPanel { currentHost = host; final String getLgsUrl = createGetLgsUrl(host); if (!isValidUrl(getLgsUrl, false)) { - showErrorAlert("Not a valid URL for fetching leaderboardgroups: " + getLgsUrl); + showErrorAlert(stringMessages.importUrlInvalid(getLgsUrl)); return; } RequestBuilder getLgsRequestBuilder = new RequestBuilder(RequestBuilder.GET, getLgsUrl); @@ -182,8 +183,7 @@ public class MasterDataImportPanel extends VerticalPanel { @Override public void onResponseReceived(Request request, Response response) { if (response.getStatusCode() != 200) { - showErrorAlert("GET leaderboardgroups request failed with error code: " + response.getStatusCode() - + " For url: " + getLgsUrl); + showErrorAlert(stringMessages.importGetLeaderboardsFailed(response.getStatusCode(), getLgsUrl)); } int itemCount = leaderboardgroupListBox.getItemCount(); for (int i = itemCount - 1; i >= 0; i--) { @@ -191,7 +191,7 @@ public class MasterDataImportPanel extends VerticalPanel { } String body = response.getText(); if (body == null || body.isEmpty()) { - showErrorAlert("No data was returned by remote server."); + showErrorAlert(stringMessages.importNoDataReturned()); return; } JSONArray leaderboardGroups = JSONParser.parseStrict(body).isArray(); @@ -204,14 +204,13 @@ public class MasterDataImportPanel extends VerticalPanel { @Override public void onError(Request request, Throwable exception) { - showErrorAlert("GET leaderboardgroups request failed with Server error: " - + exception.getLocalizedMessage()); + showErrorAlert(stringMessages.importServerError()); } }); try { getLgsRequestBuilder.send(); } catch (RequestException e) { - showErrorAlert("GET leaderboardgroups request failed: " + e.getLocalizedMessage()); + showErrorAlert(stringMessages.importServerError()); } } @@ -246,16 +245,16 @@ public class MasterDataImportPanel extends VerticalPanel { } private void addContentToLeftPanel(VerticalPanel contentPanel) { - contentPanel.add(new Label("Leaderboard Groups:")); + contentPanel.add(new Label(stringMessages.importLeaderboardGroups())); leaderboardgroupListBox = new ListBox(true); contentPanel.add(leaderboardgroupListBox); - overrideSwitch = new CheckBox("Override existing data if names and ids match"); + overrideSwitch = new CheckBox(stringMessages.importOverrideSwitchLabel()); overrideSwitch.setValue(false); contentPanel.add(overrideSwitch); - importLeaderboardGroupsButton = new Button("Import selected Leaderboard Groups"); + importLeaderboardGroupsButton = new Button(stringMessages.importSelectedLeaderboardGroups()); contentPanel.add(importLeaderboardGroupsButton); } From 600f01f111701209f7d559a1db079d265b9db935 Mon Sep 17 00:00:00 2001 From: Frederik Petersen Date: Thu, 4 Jul 2013 16:52:05 +0200 Subject: [PATCH 5/5] Buttons will be disabled and enabled depending on the situation in master data import panel --- .../MasterDataImportPanel.java | 69 ++++++++++++------- 1 file changed, 45 insertions(+), 24 deletions(-) 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 5de083eb382..028fbb76e6a 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 @@ -113,39 +113,49 @@ public class MasterDataImportPanel extends VerticalPanel { protected void importLeaderboardGroups() { String[] groupNames = createLeaderBoardGroupNamesFromListBox(); if (groupNames.length >= 1) { - boolean override = overrideSwitch.getValue(); - sailingService.importMasterData(currentHost, groupNames, override, - new AsyncCallback() { + changeAllButtonState(false); + boolean override = overrideSwitch.getValue(); + sailingService.importMasterData(currentHost, groupNames, override, + new AsyncCallback() { - @Override - public void onSuccess(MasterDataImportObjectCreationCount result) { - int leaderboardsCreated = result.getLeaderboardCount(); - int leaderboardGroupsCreated = result.getLeaderboardGroupCount(); - int eventsCreated = result.getEventCount(); - int regattasCreated = result.getRegattaCount(); - if (regattasCreated > 0) { - regattaRefresher.fillRegattas(); + @Override + public void onSuccess(MasterDataImportObjectCreationCount result) { + int leaderboardsCreated = result.getLeaderboardCount(); + int leaderboardGroupsCreated = result.getLeaderboardGroupCount(); + int eventsCreated = result.getEventCount(); + int regattasCreated = result.getRegattaCount(); + if (regattasCreated > 0) { + 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 - public void onFailure(Throwable caught) { - showErrorAlert(caught.getLocalizedMessage()); - } - }); + @Override + public void onFailure(Throwable caught) { + 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, int regattasCreated) { Window.alert(stringMessages.importSuccess(leaderboardGroupsCreated, leaderboardsCreated, eventsCreated, @@ -177,6 +187,7 @@ public class MasterDataImportPanel extends VerticalPanel { showErrorAlert(stringMessages.importUrlInvalid(getLgsUrl)); return; } + changeAllButtonState(false); RequestBuilder getLgsRequestBuilder = new RequestBuilder(RequestBuilder.GET, getLgsUrl); getLgsRequestBuilder.setCallback(new RequestCallback() { @@ -192,6 +203,7 @@ public class MasterDataImportPanel extends VerticalPanel { String body = response.getText(); if (body == null || body.isEmpty()) { showErrorAlert(stringMessages.importNoDataReturned()); + changeAllButtonState(true); return; } JSONArray leaderboardGroups = JSONParser.parseStrict(body).isArray(); @@ -200,17 +212,25 @@ public class MasterDataImportPanel extends VerticalPanel { JSONString leaderboardGroupName = leaderboardGroups.get(i).isString(); leaderboardgroupListBox.addItem(leaderboardGroupName.stringValue()); } + if (leaderboardGroups.size() > 1) { + importLeaderboardGroupsButton.setEnabled(true); + } else { + importLeaderboardGroupsButton.setEnabled(false); + } + changeAllButtonState(true); } @Override public void onError(Request request, Throwable exception) { showErrorAlert(stringMessages.importServerError()); + changeAllButtonState(true); } }); try { getLgsRequestBuilder.send(); } catch (RequestException e) { showErrorAlert(stringMessages.importServerError()); + changeAllButtonState(true); } } @@ -255,6 +275,7 @@ public class MasterDataImportPanel extends VerticalPanel { contentPanel.add(overrideSwitch); importLeaderboardGroupsButton = new Button(stringMessages.importSelectedLeaderboardGroups()); + importLeaderboardGroupsButton.setEnabled(false); contentPanel.add(importLeaderboardGroupsButton); }