mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-25 21:43:49 +00:00
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:
commit
97cf2804ad
45 files changed
+568
-359
No files matched your search
+2
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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"),
|
||||
|
||||
+47
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+26
@@ -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;
|
||||
|
||||
+16
@@ -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;
|
||||
}
|
||||
}
|
||||
+9
-22
@@ -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">
|
||||
|
||||
+3
-4
@@ -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);
|
||||
|
||||
+12
-6
@@ -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
|
||||
+18
@@ -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
|
||||
+251
-275
@@ -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=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
+39
-1
@@ -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,
|
||||
|
||||
+2
@@ -54,6 +54,8 @@ public class TestAbstractParallelProcessorFinishing {
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() { }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -31,6 +31,9 @@ public class TestAbstractParallelProcessorWithManySimpleInstructions {
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
};
|
||||
|
||||
Collection<Processor<Integer>> receivers = new ArrayList<>();
|
||||
|
||||
+6
@@ -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));
|
||||
|
||||
+3
@@ -98,6 +98,9 @@ public class TestFilteringProcessors {
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
|
||||
+3
@@ -46,6 +46,9 @@ public class TestParallelExtractionProcessor {
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
|
||||
+2
@@ -38,6 +38,8 @@ public class TestParallelMultiDimensionalGroupingProcessor {
|
||||
}
|
||||
@Override
|
||||
public void finish() throws InterruptedException { }
|
||||
@Override
|
||||
public void abort() { }
|
||||
};
|
||||
|
||||
receivers = new ArrayList<>();
|
||||
|
||||
+8
-3
@@ -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
|
||||
|
||||
+3
@@ -32,6 +32,9 @@ public class TestAbstractStoringParallelAggregationProcessor {
|
||||
public void finish() throws InterruptedException {
|
||||
receiverWasToldToFinish = true;
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new HashSet<>();
|
||||
|
||||
+3
@@ -185,6 +185,9 @@ public class TestParallelDoubleAggregationProcessors {
|
||||
@Override
|
||||
public void finish() throws InterruptedException {
|
||||
}
|
||||
@Override
|
||||
public void abort() {
|
||||
}
|
||||
};
|
||||
|
||||
receivers = new ArrayList<>();
|
||||
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
+8
-1
@@ -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,
|
||||
|
||||
+4
@@ -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();
|
||||
|
||||
}
|
||||
+2
-2
@@ -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;
|
||||
}
|
||||
|
||||
+17
-5
@@ -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.
|
||||
*/
|
||||
|
||||
+2
-2
@@ -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
-2
@@ -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;
|
||||
}
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
+7
-2
@@ -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;
|
||||
}
|
||||
|
||||
+3
-3
@@ -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();
|
||||
|
||||
+2
-2
@@ -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<>();
|
||||
|
||||
+2
-2
@@ -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<>();
|
||||
|
||||
+2
-2
@@ -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<>();
|
||||
|
||||
Reference in new issue
Block a user