Merge remote-tracking branch 'origin/dataMining' into dataMining

Conflicts:
	java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/AbstractPartitioningParallelProcessor.java
This commit is contained in:
Lennart Hensler committed 2014-03-07 09:59:50 +01:00
commit 97cf2804ad
45 files changed
+568 -359

No files matched your search

@@ -2,7 +2,7 @@ package com.sap.sailing.datamining.impl.components;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.data.GPSFixWithContext;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
@@ -13,7 +13,7 @@ import com.sap.sse.datamining.impl.components.AbstractPartitioningParallelProces
public class GPSFixRetrievalProcessor extends
AbstractPartitioningParallelProcessor<RacingEventService, LeaderboardGroup, GPSFixWithContext> {
public GPSFixRetrievalProcessor(Executor executor, Collection<Processor<GPSFixWithContext>> resultReceivers) {
public GPSFixRetrievalProcessor(ExecutorService executor, Collection<Processor<GPSFixWithContext>> resultReceivers) {
super(executor, resultReceivers);
}
@@ -15,7 +15,7 @@ import com.sap.sailing.domain.common.Color;
public abstract class AbstractLeaderboardTest {
public static CompetitorImpl createCompetitor(String competitorName) {
return new CompetitorImpl(123, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
return new CompetitorImpl(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
@@ -24,7 +24,7 @@ public abstract class AbstractLeaderboardTest {
}
public static Competitor createCompetitor(String competitorName, CompetitorFactory competitorFactory) {
return competitorFactory.getOrCreateCompetitor(123, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
@@ -879,6 +879,53 @@ public class LeaderboardScoringAndRankingTest extends AbstractLeaderboardTest {
assertEquals(28 /* one win, two second */, leaderboardGroup.getOverallLeaderboard().getTotalPoints(c[0], later), 0.000000001);
assertEquals(29 /* two wins, one second */, leaderboardGroup.getOverallLeaderboard().getTotalPoints(c[3], later), 0.000000001);
}
@Test
public void testOverallLeaderboardWithESSHighPointScoringAndTieBreakInLastRegattaOfLeaderboardGroup() throws NoWindException {
Competitor[] c = createCompetitors(12).toArray(new Competitor[0]);
// 10 9 8 7 6 5 4 3 2 1 1 1
Competitor[] regattaRace1 = new Competitor[] { c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11] };
Competitor[] regattaRace2 = new Competitor[] { c[1], c[10], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[11], c[0] };
Competitor[] regattaRace3 = new Competitor[] { c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[11], c[10], c[0] };
TimePoint now = MillisecondsTimePoint.now();
TimePoint later = new MillisecondsTimePoint(now.asMillis()+1000);
FlexibleLeaderboard leaderboard1 = new FlexibleLeaderboardImpl("Leaderboard 1", new ThresholdBasedResultDiscardingRuleImpl(/* discarding thresholds */ new int[0]),
new HighPointFirstGets10LastBreaksTie(), null);
leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(regattaRace1)), "R1", /* medalRace */ false,
leaderboard1.getFleet(null));
leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(regattaRace2)), "R2", /* medalRace */ false,
leaderboard1.getFleet(null));
leaderboard1.addRace(new MockedTrackedRaceWithStartTimeAndRanks(now, Arrays.asList(regattaRace3)), "R3", /* medalRace */ false,
leaderboard1.getFleet(null));
// [C2, C3, C4, C5, C6, C7, C1, C11, C8, C9, C10, C12]
// [29, 25, 22, 19, 16, 12, 13, 11, 10, 7, 4, 3]
List<Competitor> rankedCompetitorsInLeaderboard = leaderboard1.getCompetitorsFromBestToWorst(later);
List<Double> scoresForCompetitors = new ArrayList<Double>();
for (Competitor competitor : rankedCompetitorsInLeaderboard) {
scoresForCompetitors.add(leaderboard1.getTotalPoints(competitor, later));
}
assertEquals(12, rankedCompetitorsInLeaderboard.size());
assertEquals(c[1], rankedCompetitorsInLeaderboard.get(0));
assertEquals(29, leaderboard1.getTotalPoints(c[1], later), 0.000000001);
assertEquals(7, leaderboard1.getTotalPoints(c[8], later), 0.000000001);
assertEquals(4, leaderboard1.getTotalPoints(c[9], later), 0.000000001);
assertEquals(3, leaderboard1.getTotalPoints(c[11], later), 0.000000001);
LeaderboardGroup leaderboardGroup = new LeaderboardGroupImpl("Leaderboard Group ESS Overall", "Leaderboard Group", false, Arrays.asList(leaderboard1));
leaderboardGroup.setOverallLeaderboard(new LeaderboardGroupMetaLeaderboard(leaderboardGroup, new HighPointExtremeSailingSeriesOverall(),
new ThresholdBasedResultDiscardingRuleImpl(new int[0])));
leaderboardGroup.getOverallLeaderboard().setSuppressed(c[c.length-1], true);
// ranking must match the regatta ranks - as for 11 competitors the ranking is random
// in the faulty implementation we test with many iterations to make sure that
// we get the faulty random value
for (int i=0;i<=1000;i++) {
List<Competitor> rankedCompetitors = leaderboardGroup.getOverallLeaderboard().getCompetitorsFromBestToWorst(later);
assertFalse(rankedCompetitors.contains(c[c.length-1]));
assertEquals(11, rankedCompetitors.size());
assertEquals(c[8], rankedCompetitors.get(9));
assertEquals(c[9], rankedCompetitors.get(10));
}
}
@Test
public void testApplicationOfScoreCorrectionsInRacesWithNoTrackedRaceAfterLastTrackedRaceWithoutMarkPassings() throws NoWindException {
@@ -12,6 +12,7 @@ import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
/**
* A leaderboard has a scoring scheme that decides how race ranks map to scores, how penalties are to be scored,
@@ -95,4 +96,12 @@ public interface ScoringScheme extends Serializable {
* for the total scores.
*/
boolean isValidInTotalScore(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint at);
/**
* Some scoring schemes are applied to {@link LeaderboardGroupMetaLeaderboard} instances. These
* instances of a leaderboard are based on other leaderboards grouped in a {@link LeaderboardGroup}.
* It can happen that the {@link ScoringScheme} needs to have look at the total points of the other leaderboards
* in that group. The ordering of the list containing the total points matches the order in the group.
*/
int compareByLatestRegattaInMetaLeaderboard(List<Double> o1TotalPointsForAllOtherLeaderboardsOrdered, List<Double> o2TotalPointsForAllOtherLeaderboardsOrdered);
}
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.leaderboard.impl;
import java.util.List;
import java.util.concurrent.Callable;
import com.sap.sailing.domain.base.Competitor;
@@ -77,5 +78,11 @@ public class HighPoint extends AbstractScoringSchemeImpl {
public boolean isValidInTotalScore(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint at) {
return true;
}
@Override
public int compareByLatestRegattaInMetaLeaderboard(List<Double> o1TotalPointsForAllOtherLeaderboardsOrdered,
List<Double> o2TotalPointsForAllOtherLeaderboardsOrdered) {
return 0;
}
}
@@ -95,6 +95,32 @@ public class HighPointExtremeSailingSeriesOverall extends HighPoint {
return result;
}
/**
* If a tie still remains, it shall be broken in
* favour of the boat that had the better place at the last Regatta sailed.
*/
@Override
public int compareByLatestRegattaInMetaLeaderboard(List<Double> o1TotalPointsForAllOtherLeaderboardsOrdered,
List<Double> o2TotalPointsForAllOtherLeaderboardsOrdered) {
int result = 0;
if (o1TotalPointsForAllOtherLeaderboardsOrdered.size() == o2TotalPointsForAllOtherLeaderboardsOrdered.size()) {
for (int i=o1TotalPointsForAllOtherLeaderboardsOrdered.size()-1;i==0;i--) {
Double o1PointsForLeaderboard = o1TotalPointsForAllOtherLeaderboardsOrdered.get(i);
Double o2PointsForLeaderboard = o2TotalPointsForAllOtherLeaderboardsOrdered.get(i);
if (o1PointsForLeaderboard != null && o2PointsForLeaderboard != null) {
// we're in a scheme where points never get 0 so we can safely assume
// that the last total points that are no 0 are the ones that we want to
// look at. We also assume that the ordering matches the one in the group
if (o1PointsForLeaderboard > 0 && o2PointsForLeaderboard > 0) {
result = -o1PointsForLeaderboard.compareTo(o2PointsForLeaderboard);
break;
}
}
}
}
return result;
}
@Override
public ScoringSchemeType getType() {
return ScoringSchemeType.HIGH_POINT_ESS_OVERALL;
@@ -15,6 +15,7 @@ import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.ScoringScheme;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
/**
* Compares two competitors that occur in a {@link Leaderboard#getCompetitors()} set in the context of the
@@ -161,6 +162,21 @@ public class LeaderboardTotalRankComparator implements Comparator<Competitor> {
if (result == 0) {
// compare by last race:
result = scoringScheme.compareByLastRace(o1Scores, o2Scores, nullScoresAreBetter);
if (result == 0 && (getLeaderboard() instanceof LeaderboardGroupMetaLeaderboard)) {
// compare by last regatta if this leaderboard is a meta leaderboard
LeaderboardGroupMetaLeaderboard overallLeaderboard = (LeaderboardGroupMetaLeaderboard) getLeaderboard();
List<Double> o1PointsInLeaderboardsOfTheGroup = new ArrayList<Double>();
List<Double> o2PointsInLeaderboardsOfTheGroup = new ArrayList<Double>();
try {
for (Leaderboard leaderboardInOverall : overallLeaderboard.getLeaderboards()) {
o1PointsInLeaderboardsOfTheGroup.add(leaderboardInOverall.getTotalPoints(o1, timePoint));
o2PointsInLeaderboardsOfTheGroup.add(leaderboardInOverall.getTotalPoints(o2, timePoint));
}
result = scoringScheme.compareByLatestRegattaInMetaLeaderboard(o1PointsInLeaderboardsOfTheGroup, o2PointsInLeaderboardsOfTheGroup);
} catch (NoWindException e) {
e.printStackTrace();
}
}
}
}
}
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.leaderboard.impl;
import java.util.List;
import java.util.concurrent.Callable;
import com.sap.sailing.domain.base.Competitor;
@@ -64,4 +65,10 @@ public class LowPoint extends AbstractScoringSchemeImpl {
public boolean isValidInTotalScore(Leaderboard leaderboard, RaceColumn raceColumn, TimePoint at) {
return true;
}
@Override
public int compareByLatestRegattaInMetaLeaderboard(List<Double> o1TotalPointsForAllOtherLeaderboardsOrdered,
List<Double> o2TotalPointsForAllOtherLeaderboardsOrdered) {
return 0;
}
}
@@ -4,7 +4,6 @@ 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;
import java.io.UnsupportedEncodingException;
@@ -158,7 +157,6 @@ import com.sap.sailing.domain.leaderboard.MetaLeaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.caching.LiveLeaderboardUpdater;
import com.sap.sailing.domain.masterdataimport.TopLevelMasterData;
import com.sap.sailing.domain.persistence.DomainObjectFactory;
import com.sap.sailing.domain.persistence.MongoObjectFactory;
import com.sap.sailing.domain.persistence.MongoRaceLogStoreFactory;
@@ -3477,7 +3475,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
URL serverAddress = null;
InputStream inputStream = null;
ObjectInputStream objectInputStream = null;
try {
String path = "/sailingserver/spi/v1/masterdata/leaderboardgroups";
serverAddress = createUrl(hostname, port, path, query);
@@ -3502,17 +3499,16 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
inputStream = new TimeoutExtendingInputStream(connection.getInputStream(), connection);
}
objectInputStream = getService().getBaseDomainFactory()
.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
getService().createOrUpdateDataImportProgressWithReplication(importOperationId, 0.03,
"Reading Data", 0.5);
TopLevelMasterData topLevelMasterData = (TopLevelMasterData) objectInputStream.readObject();
getService().createOrUpdateDataImportProgressWithReplication(importOperationId, 0.3,
"Data-Transfer Complete, Initializing Import Operation", 0.5);
importFromHttpResponse(topLevelMasterData, importOperationId, override);
final MasterDataImporter importer = new MasterDataImporter(baseDomainFactory, getService());
importer.importFromStream(inputStream, importOperationId, override);
} catch (Exception e) {
getService().setDataImportFailedWithReplication(importOperationId, e.getMessage());
getService()
.setDataImportFailedWithReplication(
importOperationId,
e.getMessage()
+ "\n\nHave you checked if the"
+ " versions (commit-wise) of the importing and exporting servers are compatible with each other? "
+ "If the error still occurs, when both servers are running the same version, please report the problem.");
throw new RuntimeException(e);
} finally {
// close the connection, set all objects to null
@@ -3525,9 +3521,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
if (inputStream != null) {
inputStream.close();
}
if (objectInputStream != null) {
objectInputStream.close();
}
} catch (IOException e) {
}
}
@@ -3547,12 +3540,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
return url;
}
protected void importFromHttpResponse(final TopLevelMasterData topLevelMasterData, final UUID importOperationId,
final boolean override) {
final MasterDataImporter importer = new MasterDataImporter(baseDomainFactory, getService());
importer.importMasterData(topLevelMasterData, importOperationId, override);
}
public DataImportProgress getImportOperationProgress(UUID id) {
return getService().getDataImportLock().getProgress(id);
@@ -54,6 +54,12 @@
pages mentioned above.
-->
<driver-definition class="org.openqa.selenium.firefox.FirefoxDriver">
<capabilities>
<capability>
<name>nativeEvents</name>
<value>false</value>
</capability>
</capabilities>
</driver-definition>
<!--
<driver-definition class="org.openqa.selenium.chrome.ChromeDriver">
@@ -147,7 +147,7 @@ public class SeleniumRunner extends ParentRunner<SeleniumJUnit4ClassRunner> {
}
private String describeCapabilities() {
Map<String, String> capabilities = this.definition.getCapabilities();
Map<String, Object> capabilities = this.definition.getCapabilities();
if (capabilities.isEmpty())
return ""; //$NON-NLS-1$
@@ -156,7 +156,7 @@ public class SeleniumRunner extends ParentRunner<SeleniumJUnit4ClassRunner> {
builder.append('[');
for (Entry<String, String> capability : capabilities.entrySet()) {
for (Entry<String, Object> capability : capabilities.entrySet()) {
builder.append(capability.getKey());
builder.append('=');
builder.append(capability.getValue());
@@ -171,8 +171,7 @@ public class SeleniumRunner extends ParentRunner<SeleniumJUnit4ClassRunner> {
private TestEnvironmentImpl createTestEnvironment() throws Exception {
try {
String driverClassname = this.definition.getDriver();
Map<String, String> capabilityDefinitions = this.definition.getCapabilities();
Map<String, Object> capabilityDefinitions = this.definition.getCapabilities();
@SuppressWarnings("unchecked")
Class<WebDriver> clazz = (Class<WebDriver>) Class.forName(driverClassname);
DesiredCapabilities capabilities = new DesiredCapabilities(capabilityDefinitions);
@@ -42,7 +42,7 @@ public class TestEnvironmentConfiguration {
*/
protected static class DriverDefinition {
private String driver;
private Map<String, String> capabilities;
private Map<String, Object> capabilities;
/**
* <p>Creates a new definition of a web driver with the given class and the desired capabilities.</p>
@@ -52,7 +52,7 @@ public class TestEnvironmentConfiguration {
* @param capabilities
* The capabilities of the web driver.
*/
public DriverDefinition(String driver, Map<String, String> capabilities) {
public DriverDefinition(String driver, Map<String, Object> capabilities) {
this.driver = driver;
this.capabilities = capabilities;
}
@@ -73,7 +73,7 @@ public class TestEnvironmentConfiguration {
* @return
* The desired capabilities of the web driver.
*/
public Map<String, String> getCapabilities() {
public Map<String, Object> getCapabilities() {
return this.capabilities;
}
}
@@ -200,15 +200,21 @@ public class TestEnvironmentConfiguration {
Element capabilitiesNode = XMLHelper.getElementNS(driverDefinitionNode, DRIVER_CAPABILITIES, NAMESPACE_URI);
if (capabilitiesNode == null) {
return new DriverDefinition(driverClass, Collections.<String, String>emptyMap());
return new DriverDefinition(driverClass, Collections.<String, Object>emptyMap());
}
Map<String, String> capabilities = new HashMap<>();
Map<String, Object> capabilities = new HashMap<>();
for(Element capabilityNode : XMLHelper.getElementsNS(capabilitiesNode, DRIVER_CAPABILITY, NAMESPACE_URI)) {
String capabilityName = XMLHelper.getContentTextNS(capabilityNode, PARAMETER_NAME, NAMESPACE_URI);
String capabilityValue = XMLHelper.getContentTextNS(capabilityNode, PARAMETER_VALUE, NAMESPACE_URI);
capabilities.put(capabilityName, capabilityValue);
if(capabilityValue != null && !capabilityValue.isEmpty()) {
if(capabilityValue.equalsIgnoreCase("true") || capabilityValue.equalsIgnoreCase("false")) {
capabilities.put(capabilityName, Boolean.valueOf(capabilityValue));
} else {
capabilities.put(capabilityName, capabilityValue);
}
}
}
return new DriverDefinition(driverClass, capabilities);
@@ -5,12 +5,12 @@ Bundle-SymbolicName: com.sap.sailing.server.gateway.test.support
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Require-Bundle: javax.servlet;bundle-version="2.5.0",
org.eclipse.osgi;bundle-version="3.7.1",
Require-Bundle: javax.servlet;bundle-version="2.6.0",
com.sap.sailing.domain;bundle-version="1.0.0",
com.sap.sailing.domain.common;bundle-version="1.0.0",
com.sap.sailing.server;bundle-version="1.0.0",
com.sap.sailing.mongodb;bundle-version="1.0.0"
Bundle-ClassPath: .
Web-ContextPath: /sailingserver/test-support
Import-Package: org.osgi.framework,
org.osgi.util.tracker;version="1.5.1"
@@ -41,4 +41,6 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.igtimiadapter;bundle-version="1.0.0"
Bundle-ClassPath: .
Web-ContextPath: /sailingserver
Export-Package: com.sap.sailing.server.gateway
Export-Package: com.sap.sailing.server.gateway,
com.sap.sailing.server.gateway.jaxrs,
com.sap.sailing.server.gateway.jaxrs.spi
@@ -4,7 +4,9 @@ import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -21,6 +23,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.masterdataimport.TopLevelMasterData;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
@@ -56,6 +60,16 @@ public class MasterDataResource extends AbstractSailingServerResource {
groupsToExport.addAll(allLeaderboardGroups.values());
}
final List<Serializable> competitorIds = new ArrayList<Serializable>();
for (LeaderboardGroup lg : groupsToExport) {
for (Leaderboard leaderboard : lg.getLeaderboards()) {
for (Competitor competitor : leaderboard.getAllCompetitors()) {
competitorIds.add(competitor.getId());
}
}
}
final TopLevelMasterData masterData = new TopLevelMasterData(groupsToExport,
getService().getAllEvents(), getService().getPersistentRegattasForRaceIDs(), getService()
.getAllMediaTracks());
@@ -74,6 +88,7 @@ public class MasterDataResource extends AbstractSailingServerResource {
masterData.setMasterDataExportFlagOnRaceColumns(true);
// Actual start of streaming
objectOutputStream.writeObject(competitorIds);
objectOutputStream.writeObject(masterData);
} finally {
objectOutputStream.close();
@@ -93,11 +108,14 @@ public class MasterDataResource extends AbstractSailingServerResource {
try {
OutputStream outputStreamWithByteCounter = new ByteCountOutputStreamDecorator(output);
objectOutputStream = new ObjectOutputStream(outputStreamWithByteCounter);
masterData.setMasterDataExportFlagOnRaceColumns(true);
// Actual start of streaming
objectOutputStream.writeObject(competitorIds);
objectOutputStream.writeObject(masterData);
} finally {
objectOutputStream.close();
masterData.setMasterDataExportFlagOnRaceColumns(false);
long timeToExport = System.currentTimeMillis() - startTime;
logger.info(String.format("Took %s ms to finish masterdataexport", timeToExport));
}
@@ -19,5 +19,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.test,
org.hamcrest;bundle-version="1.1.0",
org.mockito.mockito-core;bundle-version="1.9.5"
Import-Package: org.json.simple
Import-Package: com.sap.sailing.server.gateway.jaxrs,
com.sap.sailing.server.gateway.jaxrs.spi,
org.json.simple,
javax.ws.rs.core;version="1.1.1"
Export-Package: com.sap.sailing.server.impl
@@ -2,13 +2,13 @@ package com.sap.sailing.server.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.util.ArrayList;
@@ -22,6 +22,9 @@ import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import junit.framework.Assert;
import org.junit.After;
@@ -76,7 +79,6 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
import com.sap.sailing.domain.leaderboard.impl.FlexibleLeaderboardImpl;
import com.sap.sailing.domain.leaderboard.impl.LowPoint;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
import com.sap.sailing.domain.masterdataimport.TopLevelMasterData;
import com.sap.sailing.domain.persistence.PersistenceFactory;
import com.sap.sailing.domain.persistence.media.MediaDBFactory;
import com.sap.sailing.domain.racelog.CompetitorResults;
@@ -95,6 +97,8 @@ import com.sap.sailing.domain.tracking.impl.EmptyWindStore;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.mongodb.MongoDBService;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.gateway.jaxrs.spi.MasterDataResource;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
import com.sap.sailing.server.masterdata.DummyTrackedRace;
import com.sap.sailing.server.masterdata.MasterDataImporter;
@@ -125,6 +129,13 @@ public class MasterDataImportTest {
}
private <T extends AbstractSailingServerResource> T spyResource(T resource, RacingEventService service) {
T spyResource = spy(resource);
doReturn(service).when(spyResource).getService();
return spyResource;
}
private void deleteCreatedDataFromDatabase() throws MalformedURLException, IOException, InterruptedException {
storedLogUUIDs.clear();
RacingEventService service = new RacingEventServiceImpl();
@@ -276,45 +287,40 @@ public class MasterDataImportTest {
leaderboard.setDisplayName(competitorToSuppress, nickName);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
InputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
Assert.assertNotNull(creationCount);
Event eventOnTarget = destService.getEvent(eventUUID);
@@ -469,42 +475,37 @@ public class MasterDataImportTest {
leaderboard.getScoreCorrection().setMaxPointsReason(competitor, raceColumn, maxPointsReason);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
Assert.assertNotNull(creationCount);
Event eventOnTarget = destService.getEvent(eventUUID);
@@ -608,42 +609,37 @@ public class MasterDataImportTest {
raceColumn.setTrackedRace(testFleet1, trackedRace);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
Assert.assertNotNull(creationCount);
Event eventOnTarget = destService.getEvent(eventUUID);
@@ -763,42 +759,37 @@ public class MasterDataImportTest {
storedLogUUIDs.add(finishPositioningConfirmedEvent.getId());
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
Assert.assertNotNull(creationCount);
Event eventOnTarget = destService.getEvent(eventUUID);
@@ -929,31 +920,26 @@ public class MasterDataImportTest {
leaderboard.setDisplayName(competitorToSuppress, nickName);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
RacingEventService destService;
DomainFactory domainFactory;
RacingEventServiceImplMock destService;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
String venueNameNotToOverride;
CourseAreaImpl courseAreaNotToOverride;
String raceColumnNameNotToOveride;
RegattaLeaderboard leaderboardNotToOverride;
LeaderboardGroup groupNotToOverride;
String raceColumnNameNotToOveride;
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
@@ -990,19 +976,17 @@ public class MasterDataImportTest {
leaderboardNamesNotToOverride.add(leaderboardNotToOverride.getName());
groupNotToOverride = destService.addLeaderboardGroup(TEST_GROUP_NAME,
"testGroupDescNotToOverride", false, leaderboardNamesNotToOverride, null, null);
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// ---Asserts---
// Test correct number of creations
@@ -1132,25 +1116,22 @@ public class MasterDataImportTest {
leaderboard.setDisplayName(competitorToSuppress, nickName);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
RegattaAndRaceIdentifier identifierOfRegattaTrackedRace;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
RegattaAndRaceIdentifier identifierOfRegattaTrackedRace;
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
@@ -1180,9 +1161,24 @@ public class MasterDataImportTest {
seriesToOverride.get(0).addRaceColumn(name, destService);
}
// Create competitor with same ID and other details
Set<Competitor> competitorsToOverride = new HashSet<Competitor>();
Set<DynamicPerson> sailorsToOverride = new HashSet<DynamicPerson>();
sailorsToOverride.add(new PersonImpl("Froderik Poterson", new NationalityImpl("GER"), new Date(
645487200000L), "Oberhoschy"));
Person coachToOverride = new PersonImpl("Lennart Hensler", new NationalityImpl("GER"), new Date(
645487200000L), "Der Lennart halt");
DynamicTeam teamToOverride = new TeamImpl("Pros", sailorsToOverride, coachToOverride);
BoatClass boatClassToOverride = new BoatClassImpl("H16", true);
DynamicBoat boatToOverride = new BoatImpl("Wingy", boatClassToOverride, "GER70133");
String competitorOldName = "oldName";
Competitor competitorToOverride = domainFactory.getOrCreateCompetitor(competitorUUID, competitorOldName,
Color.BLUE, teamToOverride, boatToOverride);
competitorsToOverride.add(competitorToOverride);
Leaderboard leaderboardToOverride = destService.addRegattaLeaderboard(
regattaToOverride.getRegattaIdentifier(), "testDisplayNameNotToOverride", discardRule);
TrackedRace trackedRace2 = new DummyTrackedRace(new HashSet<Competitor>(), regattaToOverride, null);
TrackedRace trackedRace2 = new DummyTrackedRace(competitorsToOverride, regattaToOverride, null);
RaceColumn columnToOverride = leaderboardToOverride.getRaceColumns().iterator().next();
columnToOverride.setTrackedRace(testFleet1ToOverride, trackedRace2);
identifierOfRegattaTrackedRace = regattaToOverride
@@ -1192,18 +1188,17 @@ public class MasterDataImportTest {
null, null);
destService.getLeaderboardGroupByName(TEST_GROUP_NAME).addLeaderboard(leaderboardToOverride);
destService.addLeaderboard(leaderboardToOverride);
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, true);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, true);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// ---Asserts---
// Test correct number of creations
@@ -1241,6 +1236,11 @@ public class MasterDataImportTest {
// Check that tracked race of regatta leaderboard has been removed
Assert.assertNull(destService.getTrackedRace(identifierOfRegattaTrackedRace));
// Assert that competitor details were overridden
Competitor competitorOnTarget = destService.getBaseDomainFactory().getExistingCompetitorById(competitorUUID);
Assert.assertEquals(competitor.getName(), competitorOnTarget.getName());
Assert.assertEquals(competitor.getColor(), competitorOnTarget.getColor());
}
@Test
@@ -1262,41 +1262,36 @@ public class MasterDataImportTest {
leaderboardNames, null, null);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importMasterData(deserializedMasterData, randomUUID, false);
destService.getDataImportLock().getProgress(randomUUID).getResult();
Regatta importedRegatta = destService.getRegattaByName(regatta.getName());
assertNotNull(importedRegatta.getRegattaConfiguration());
@@ -1390,41 +1385,37 @@ public class MasterDataImportTest {
leaderboard.setDisplayName(competitorToSuppress, nickName);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// ---Asserts---
Assert.assertNotNull(creationCount);
@@ -1447,7 +1438,8 @@ public class MasterDataImportTest {
List<String> raceColumnNames = new ArrayList<String>();
String raceColumnName = "T1";
raceColumnNames.add(raceColumnName);
raceColumnNames.add("T2");
String raceColumnName2 = "T2";
raceColumnNames.add(raceColumnName2);
final List<String> emptyRaceColumnNamesList = Collections.emptyList();
List<Series> series = new ArrayList<Series>();
@@ -1528,41 +1520,37 @@ public class MasterDataImportTest {
leaderboard.setDisplayName(competitorToSuppress, nickName);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// ---Asserts---
@@ -1596,40 +1584,36 @@ public class MasterDataImportTest {
sourceService.mediaTrackAdded(trackOnSource);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// ---Asserts---
@@ -1718,42 +1702,38 @@ public class MasterDataImportTest {
raceColumn.setTrackedRace(testFleet1, trackedRace);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(group1);
groupsToExport.add(group2);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(group1.getName());
groupNamesToExport.add(group2.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// Test correct number of creations
Assert.assertNotNull(creationCount);
@@ -1794,41 +1774,37 @@ public class MasterDataImportTest {
metaLeaderboard.getRaceColumns().iterator().next().setFactor(factor);
// Serialize
HashSet<LeaderboardGroup> groupsToExport = new HashSet<LeaderboardGroup>();
groupsToExport.add(sourceGroup);
TopLevelMasterData masterdata = new TopLevelMasterData(groupsToExport, sourceService.getAllEvents(),
sourceService.getPersistentRegattasForRaceIDs(), sourceService.getAllMediaTracks());
Assert.assertNotNull(masterdata);
List<String> groupNamesToExport = new ArrayList<String>();
groupNamesToExport.add(sourceGroup.getName());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
RacingEventService destService;
ObjectInputStream ois = null;
TopLevelMasterData deserializedMasterData;
DomainFactory domainFactory;
MasterDataResource resource = new MasterDataResource();
MasterDataResource spyResource = spyResource(resource, sourceService);
Response response = spyResource.getMasterDataByLeaderboardGroups(groupNamesToExport, false);
StreamingOutput streamingOutput = (StreamingOutput) response.getEntity();
ByteArrayOutputStream os = new ByteArrayOutputStream();
UUID randomUUID = UUID.randomUUID();
ByteArrayInputStream inputStream = null;
try {
masterdata.setMasterDataExportFlagOnRaceColumns(true);
oos.writeObject(masterdata);
outputStream.flush();
streamingOutput.write(os);
os.flush();
// Delete all data above from the database, to allow recreating all of it on target server
deleteCreatedDataFromDatabase();
// Import in new service
destService = new RacingEventServiceImplMock(new DataImportProgressImpl(randomUUID));
domainFactory = destService.getBaseDomainFactory();
InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ByteArrayInputStream(os.toByteArray());
ois = domainFactory.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
deserializedMasterData = (TopLevelMasterData) ois.readObject();
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
importer.importFromStream(inputStream, randomUUID, false);
} finally {
masterdata.setMasterDataExportFlagOnRaceColumns(false);
oos.close();
ois.close();
os.close();
inputStream.close();
}
MasterDataImporter importer = new MasterDataImporter(domainFactory, destService);
MasterDataImportObjectCreationCount creationCount = importer.importMasterData(deserializedMasterData,
randomUUID, false);
MasterDataImportObjectCreationCount creationCount = destService.getDataImportLock().getProgress(randomUUID)
.getResult();
// Test correct number of creations
Assert.assertEquals(1, creationCount.getLeaderboardGroupCount());
@@ -32,5 +32,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sse.gwt@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@5:true,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sse.gwt@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -26,6 +26,6 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sse.gwt@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.datamining.shared@default:default,com.sap.sailing.datamining@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@4:true,com.sap.sailing.domain.swisstimingreplayadapter@4:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@4:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@5:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test.support@5:true,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xrr.resultimport@default:default,com.sap.sse.gwt@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -1,8 +1,15 @@
package com.sap.sailing.server.masterdata;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import java.util.UUID;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CompetitorStore;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.ObjectInputStreamResolvingAgainstDomainFactory;
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
import com.sap.sailing.domain.common.impl.MasterDataImportObjectCreationCountImpl;
import com.sap.sailing.domain.masterdataimport.TopLevelMasterData;
@@ -19,7 +26,38 @@ public class MasterDataImporter {
this.racingEventService = racingEventService;
}
public MasterDataImportObjectCreationCount importMasterData(TopLevelMasterData topLevelMasterData,
public void importFromStream(InputStream inputStream, UUID importOperationId, boolean override) throws IOException,
ClassNotFoundException {
ObjectInputStreamResolvingAgainstDomainFactory objectInputStream = racingEventService.getBaseDomainFactory()
.createObjectInputStreamResolvingAgainstThisFactory(inputStream);
racingEventService
.createOrUpdateDataImportProgressWithReplication(importOperationId, 0.03, "Reading Data", 0.5);
@SuppressWarnings("unchecked")
final List<Serializable> competitorIds = (List<Serializable>) objectInputStream.readObject();
if (override) {
setAllowCompetitorsDataToBeReset(competitorIds);
}
TopLevelMasterData topLevelMasterData = (TopLevelMasterData) objectInputStream.readObject();
racingEventService.createOrUpdateDataImportProgressWithReplication(importOperationId, 0.3,
"Data-Transfer Complete, Initializing Import Operation", 0.5);
applyMasterDataImportOperation(topLevelMasterData, importOperationId, override);
}
private void setAllowCompetitorsDataToBeReset(List<Serializable> competitorIds) {
CompetitorStore store = baseDomainFactory.getCompetitorStore();
for (Serializable id : competitorIds) {
Competitor competitor = baseDomainFactory.getExistingCompetitorById(id);
if (competitor != null) {
store.allowCompetitorResetToDefaults(competitor);
}
}
}
private MasterDataImportObjectCreationCount applyMasterDataImportOperation(TopLevelMasterData topLevelMasterData,
UUID importOperationId, boolean override) {
MasterDataImportObjectCreationCountImpl creationCount = new MasterDataImportObjectCreationCountImpl();
ImportMasterDataOperation op = new ImportMasterDataOperation(topLevelMasterData, importOperationId, override,
@@ -54,6 +54,8 @@ public class TestAbstractParallelProcessorFinishing {
public void finish() throws InterruptedException {
receiverWasToldToFinish = true;
}
@Override
public void abort() { }
};
}
@@ -31,6 +31,9 @@ public class TestAbstractParallelProcessorWithManySimpleInstructions {
public void finish() throws InterruptedException {
receiverWasToldToFinish = true;
}
@Override
public void abort() {
}
};
Collection<Processor<Integer>> receivers = new ArrayList<>();
@@ -26,6 +26,9 @@ public class TestAbstractProcessor {
public void finish() throws InterruptedException {
receiverWasToldToFinish = true;
}
@Override
public void abort() {
}
};
receivers = new HashSet<>();
@@ -39,6 +42,9 @@ public class TestAbstractProcessor {
protected Integer processElement(Integer element) {
return null;
}
@Override
public void abort() {
}
};
processor.finish();
assertThat(receiverWasToldToFinish, is(true));
@@ -98,6 +98,9 @@ public class TestFilteringProcessors {
@Override
public void finish() throws InterruptedException {
}
@Override
public void abort() {
}
};
receivers = new HashSet<>();
@@ -46,6 +46,9 @@ public class TestParallelExtractionProcessor {
@Override
public void finish() throws InterruptedException {
}
@Override
public void abort() {
}
};
receivers = new HashSet<>();
@@ -38,6 +38,8 @@ public class TestParallelMultiDimensionalGroupingProcessor {
}
@Override
public void finish() throws InterruptedException { }
@Override
public void abort() { }
};
receivers = new ArrayList<>();
@@ -35,8 +35,8 @@ import com.sap.sse.datamining.test.util.FunctionTestsUtil;
public class TestProcessorQuery {
@SuppressWarnings("unused")
private boolean receivedElementOrFinished;
private boolean receivedAbort;
@Test
public void testStandardWorkflow() throws InterruptedException, ExecutionException {
@@ -144,6 +144,10 @@ public class TestProcessorQuery {
public void finish() throws InterruptedException {
receivedElementOrFinished = true;
}
@Override
public void abort() {
receivedAbort = true;
}
};
query.setFirstProcessor(new BlockingProcessor<Iterable<Number>, Double>(ConcurrencyTestsUtil.getExecutor(), Arrays.asList(resultReceiver), (long) 1000));
@@ -154,8 +158,9 @@ public class TestProcessorQuery {
// A timeout exception is expected
}
// ConcurrencyTestsUtil.sleepFor(1000); // Wait if a result is received
// assertThat("The processing should be aborted", receivedElementOrFinished, is(false));
ConcurrencyTestsUtil.sleepFor(1000); // Wait if a result is received
assertThat("The processing should be aborted", receivedElementOrFinished, is(false));
assertThat("The processing should be aborted", receivedAbort, is(true));
}
@Test
@@ -32,6 +32,9 @@ public class TestAbstractStoringParallelAggregationProcessor {
public void finish() throws InterruptedException {
receiverWasToldToFinish = true;
}
@Override
public void abort() {
}
};
receivers = new HashSet<>();
@@ -185,6 +185,9 @@ public class TestParallelDoubleAggregationProcessors {
@Override
public void finish() throws InterruptedException {
}
@Override
public void abort() {
}
};
receivers = new ArrayList<>();
@@ -2,7 +2,7 @@ package com.sap.sse.datamining.test.components.util;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor;
@@ -10,7 +10,7 @@ import com.sap.sse.datamining.impl.components.AbstractSimpleParallelProcessor;
public class BlockingProcessor<InputType, ResultType> extends AbstractSimpleParallelProcessor<InputType, ResultType> {
private final long timeToBlockInMillis;
public BlockingProcessor(Executor executor, Collection<Processor<ResultType>> resultReceivers, long timeToBlockInMillis) {
public BlockingProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers, long timeToBlockInMillis) {
super(executor, resultReceivers);
this.timeToBlockInMillis = timeToBlockInMillis;
}
@@ -11,11 +11,18 @@ import com.sap.sse.datamining.components.Processor;
public class ConcurrencyTestsUtil {
private static final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors(), 3);
private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
private static ThreadPoolExecutor executor = createExecutor();
public static ThreadPoolExecutor getExecutor() {
if (executor.isShutdown()) {
executor = createExecutor();
}
return executor;
}
private static ThreadPoolExecutor createExecutor() {
return new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
}
public static void sleepFor(long milliseconds) {
try {
@@ -24,6 +24,7 @@ Export-Package: com.sap.sse.datamining;uses:="com.sap.sse.datamining.functions,c
com.sap.sse.datamining.impl.criterias;uses:="com.sap.sse.datamining.data,com.sap.sse.datamining.functions,com.sap.sse.datamining.components",
com.sap.sse.datamining.impl.criterias.deprecated,
com.sap.sse.datamining.impl.data;uses:="com.sap.sse.datamining.data",
com.sap.sse.datamining.impl.deprecated,
com.sap.sse.datamining.impl.i18n;uses:="com.sap.sse.datamining.shared,com.sap.sse.datamining.i18n",
com.sap.sse.datamining.impl.workers,
com.sap.sse.datamining.impl.workers.aggregators,
@@ -14,5 +14,9 @@ public class NonFilteringProcessor<InputType> extends AbstractProcessor<InputTyp
protected InputType processElement(InputType element) {
return element;
}
@Override
public void abort() {
}
}
@@ -1,14 +1,17 @@
package com.sap.sse.datamining.components;
public interface Processor<InputType> {
public void onElement(InputType element);
/**
* Tells this Processor, that there will be no incoming data.<br />
* The called Processor will finish his work and call <code>finish()</code> on all subsequent processors.
* @throws InterruptedException
*/
public void finish() throws InterruptedException;
public void onElement(InputType element);
/**
* Tells this Processor, that there will be no incoming data.<br />
* The called Processor will finish his work and call <code>finish()</code> on all subsequent processors.
*
* @throws InterruptedException
*/
public void finish() throws InterruptedException;
public void abort();
}
@@ -3,7 +3,7 @@ package com.sap.sse.datamining.impl.components;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.FilterCriteria;
import com.sap.sse.datamining.components.Processor;
@@ -13,7 +13,7 @@ public abstract class AbstractFilteringRetrievalProcessor<InputType, WorkingType
private final FilterCriteria<WorkingType> criteria;
public AbstractFilteringRetrievalProcessor(Executor executor, Collection<Processor<ResultType>> resultReceivers, FilterCriteria<WorkingType> criteria) {
public AbstractFilteringRetrievalProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers, FilterCriteria<WorkingType> criteria) {
super(executor, resultReceivers);
this.criteria = criteria;
}
@@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -18,10 +18,10 @@ public abstract class AbstractPartitioningParallelProcessor<InputType, WorkingTy
private static final int SLEEP_TIME_DURING_FINISHING = 100;
private final Set<Processor<ResultType>> resultReceivers;
private final Executor executor;
private final ExecutorService executor;
private final UnfinishedInstructionsCounter unfinishedInstructionsCounter;
public AbstractPartitioningParallelProcessor(Executor executor, Collection<Processor<ResultType>> resultReceivers) {
public AbstractPartitioningParallelProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers) {
this.executor = executor;
this.resultReceivers = new HashSet<Processor<ResultType>>(resultReceivers);
unfinishedInstructionsCounter = new UnfinishedInstructionsCounter();
@@ -85,7 +85,7 @@ public abstract class AbstractPartitioningParallelProcessor<InputType, WorkingTy
@Override
public void finish() throws InterruptedException {
sleepUntilAllInstructionsFinished();
notifyResultReceiversToFinish();
tellResultReceiversToFinish();
}
protected void sleepUntilAllInstructionsFinished() throws InterruptedException {
@@ -98,7 +98,7 @@ public abstract class AbstractPartitioningParallelProcessor<InputType, WorkingTy
return unfinishedInstructionsCounter.getUnfinishedInstructionsAmount() > 0;
}
protected void notifyResultReceiversToFinish() {
protected void tellResultReceiversToFinish() {
for (Processor<ResultType> resultReceiver : getResultReceivers()) {
try {
resultReceiver.finish();
@@ -108,6 +108,18 @@ public abstract class AbstractPartitioningParallelProcessor<InputType, WorkingTy
}
}
@Override
public void abort() {
executor.shutdownNow();
tellResultReceiversToAbort();
}
private void tellResultReceiversToAbort() {
for (Processor<ResultType> resultReceiver : getResultReceivers()) {
resultReceiver.abort();
}
}
/**
* Thread safe class to manage, if there are unfinished instructions.
*/
@@ -3,14 +3,14 @@ package com.sap.sse.datamining.impl.components;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
public abstract class AbstractSimpleParallelProcessor<InputType, ResultType>
extends AbstractPartitioningParallelProcessor<InputType, InputType, ResultType> {
public AbstractSimpleParallelProcessor(Executor executor, Collection<Processor<ResultType>> resultReceivers) {
public AbstractSimpleParallelProcessor(ExecutorService executor, Collection<Processor<ResultType>> resultReceivers) {
super(executor, resultReceivers);
}
@@ -2,7 +2,7 @@ package com.sap.sse.datamining.impl.components;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.FilterCriteria;
import com.sap.sse.datamining.components.Processor;
@@ -11,7 +11,7 @@ public class ParallelFilteringProcessor<InputType> extends AbstractSimpleParalle
private final FilterCriteria<InputType> filterCriteria;
public ParallelFilteringProcessor(Executor executor, Collection<Processor<InputType>> resultReceivers, FilterCriteria<InputType> filterCriteria) {
public ParallelFilteringProcessor(ExecutorService executor, Collection<Processor<InputType>> resultReceivers, FilterCriteria<InputType> filterCriteria) {
super(executor, resultReceivers);
this.filterCriteria = filterCriteria;
}
@@ -3,7 +3,7 @@ package com.sap.sse.datamining.impl.components;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.functions.Function;
@@ -16,7 +16,7 @@ public class ParallelMultiDimensionalGroupingProcessor<DataType>
private Iterable<Function<?>> dimensions;
public ParallelMultiDimensionalGroupingProcessor(Executor executor, Collection<Processor<GroupedDataEntry<DataType>>> resultReceivers,
public ParallelMultiDimensionalGroupingProcessor(ExecutorService executor, Collection<Processor<GroupedDataEntry<DataType>>> resultReceivers,
Iterable<Function<?>> dimensions) {
super(executor, resultReceivers);
verifyThatDimensionsAreDimensions(dimensions);
@@ -85,8 +85,8 @@ public class ProcessorQuery<AggregatedType, DataSourceType> implements Query<Agg
synchronized (monitorObject) {
while (!workIsDone) {
monitorObject.wait();
if (processorTimedOut) {
// TODO Abort the processing
if (processorTimedOut && !workIsDone) {
firstProcessor.abort();
throw new TimeoutException("The query processing timed out");
}
}
@@ -139,6 +139,11 @@ public class ProcessorQuery<AggregatedType, DataSourceType> implements Query<Agg
}
}
@Override
public void abort() {
result = null;
}
public QueryResult<AggregatedType> getResult() {
return result;
}
@@ -2,7 +2,7 @@ package com.sap.sse.datamining.impl.components.aggregators;
import java.util.Collection;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import com.sap.sse.datamining.components.Processor;
@@ -13,7 +13,7 @@ public abstract class AbstractParallelStoringAggregationProcessor<InputType, Agg
private final ReentrantReadWriteLock storeLock;
public AbstractParallelStoringAggregationProcessor(Executor executor, Collection<Processor<AggregatedType>> resultReceivers) {
public AbstractParallelStoringAggregationProcessor(ExecutorService executor, Collection<Processor<AggregatedType>> resultReceivers) {
super(executor, resultReceivers);
storeLock = new ReentrantReadWriteLock();
}
@@ -44,7 +44,7 @@ public abstract class AbstractParallelStoringAggregationProcessor<InputType, Agg
public void finish() throws InterruptedException {
super.sleepUntilAllInstructionsFinished();
super.forwardResultToReceivers(aggregateResult());
super.notifyResultReceiversToFinish();
super.tellResultReceiversToFinish();
}
protected abstract AggregatedType aggregateResult();
@@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
@@ -16,7 +16,7 @@ public class ParallelGroupedDoubleDataAverageAggregationProcessor extends
private final AbstractParallelStoringAggregationProcessor<GroupedDataEntry<Double>, Map<GroupKey, Double>> sumAggregationProcessor;
private final Map<GroupKey, Integer> elementAmountPerKey;
public ParallelGroupedDoubleDataAverageAggregationProcessor(Executor executor,
public ParallelGroupedDoubleDataAverageAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Double>>> resultReceivers) {
super(executor, resultReceivers);
elementAmountPerKey = new HashMap<>();
@@ -7,7 +7,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
@@ -18,7 +18,7 @@ public class ParallelGroupedDoubleDataMedianAggregationProcessor
private Map<GroupKey, List<Double>> groupedValues;
public ParallelGroupedDoubleDataMedianAggregationProcessor(Executor executor,
public ParallelGroupedDoubleDataMedianAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Double>>> resultReceivers) {
super(executor, resultReceivers);
groupedValues = new HashMap<>();
@@ -4,7 +4,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.components.Processor;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
@@ -15,7 +15,7 @@ public class ParallelGroupedDoubleDataSumAggregationProcessor
private Map<GroupedDataEntry<Double>, Integer> elementAmountMap;
public ParallelGroupedDoubleDataSumAggregationProcessor(Executor executor,
public ParallelGroupedDoubleDataSumAggregationProcessor(ExecutorService executor,
Collection<Processor<Map<GroupKey, Double>>> resultReceivers) {
super(executor, resultReceivers);
elementAmountMap = new HashMap<>();