mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 13:20:57 +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<>();
|
||||
|
||||
@@ -101,7 +101,7 @@ Selecting the "Expert information" option you'll have access to the expert infor
|
||||
|
||||
When trying to logon onto a course area the RaceCommittee App opens an error dialog showing an error similar to "Failure to load data: 'null'" or something more expressive. Most of the times this happens when the current version of the app is not compatible with the server. Redo the synchronization step or even force an update via the app's preference screen.
|
||||
|
||||
If this doesn't help have a log in the runtime-log (see below).
|
||||
If this doesn't help have a look in the runtime-log (see below).
|
||||
|
||||
### Runtime- and Crash-Logs
|
||||
|
||||
|
||||
Reference in new issue
Block a user