mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
Merge branch 'master' of ssh://kielweek.web4sap.com/home/trac/git
This commit is contained in:
commit
b5587babd9
31 files changed
+324
-103
No files matched your search
+26
@@ -31,4 +31,30 @@ public abstract class AbstractSerializationTest {
|
||||
dis.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
static Object[] cloneManyBySerialization(DomainFactory resolveAgainst, final Serializable... objects) throws IOException, ClassNotFoundException {
|
||||
PipedOutputStream pos = new PipedOutputStream();
|
||||
PipedInputStream pis = new PipedInputStream(pos);
|
||||
final ObjectOutputStream dos = new ObjectOutputStream(pos);
|
||||
new Thread("clone writer") {
|
||||
public void run() {
|
||||
try {
|
||||
for (Serializable s : objects) {
|
||||
dos.writeObject(s);
|
||||
}
|
||||
dos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
ObjectInputStream dis = resolveAgainst.createObjectInputStreamResolvingAgainstThisFactory(pis);
|
||||
Object[] result = new Object[objects.length];
|
||||
for (int i=0; i<objects.length; i++) {
|
||||
result[i] = dis.readObject();
|
||||
}
|
||||
dis.close();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+14
@@ -1,5 +1,7 @@
|
||||
package com.sap.sailing.domain.test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNotSame;
|
||||
import static org.junit.Assert.assertSame;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -76,4 +78,16 @@ public class OfflineSerializationTest extends AbstractSerializationTest {
|
||||
Competitor receiversSecondCopyOfCompetitor1 = cloneBySerialization(sendersCompetitor1, receiverDomainFactory);
|
||||
assertSame(receiversCompetitor1, receiversSecondCopyOfCompetitor1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ensureSameObjectWrittenTwiceComesOutIdentical() throws ClassNotFoundException, IOException {
|
||||
final DomainFactoryImpl senderDomainFactory = new DomainFactoryImpl();
|
||||
DomainFactory receiverDomainFactory = new DomainFactoryImpl();
|
||||
Nationality n = senderDomainFactory.getOrCreateNationality("GER");
|
||||
Object[] copies = cloneManyBySerialization(receiverDomainFactory, n, n);
|
||||
assertEquals(2, copies.length);
|
||||
assertSame(copies[0], copies[1]);
|
||||
assertNotSame(n, copies[0]);
|
||||
assertEquals(n.getName(), ((Nationality) copies[0]).getName());
|
||||
}
|
||||
}
|
||||
+2
-1
@@ -1,5 +1,6 @@
|
||||
package com.sap.sailing.domain.leaderboard;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
@@ -13,6 +14,6 @@ import com.sap.sailing.domain.common.TimePoint;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface ResultDiscardingRule {
|
||||
public interface ResultDiscardingRule extends Serializable {
|
||||
Set<RaceInLeaderboard> getDiscardedRaceColumns(Competitor competitor, Leaderboard leaderboard, TimePoint timePoint);
|
||||
}
|
||||
+3
-1
@@ -1,5 +1,7 @@
|
||||
package com.sap.sailing.domain.leaderboard;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.MaxPointsReason;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
@@ -15,7 +17,7 @@ import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface ScoreCorrection {
|
||||
public interface ScoreCorrection extends Serializable {
|
||||
public interface Result {
|
||||
int getCorrectedScore();
|
||||
MaxPointsReason getMaxPointsReason();
|
||||
|
||||
+1
@@ -26,6 +26,7 @@ import com.sap.sailing.domain.leaderboard.ThresholdBasedResultDiscardingRule;
|
||||
*
|
||||
*/
|
||||
public class ResultDiscardingRuleImpl implements ThresholdBasedResultDiscardingRule {
|
||||
private static final long serialVersionUID = 386341628517357988L;
|
||||
private final int[] discardIndexResultsStartingWithHowManyRaces;
|
||||
|
||||
public ResultDiscardingRuleImpl(int[] discardIndexResultsStartingWithHowManyRaces) {
|
||||
|
||||
+2
@@ -22,6 +22,8 @@ import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
*
|
||||
*/
|
||||
public class ScoreCorrectionImpl implements SettableScoreCorrection {
|
||||
private static final long serialVersionUID = -7088305215528928135L;
|
||||
|
||||
/**
|
||||
* If no max point reason is provided for a competitor/race, {@link MaxPointsReason#NONE} should be the default.
|
||||
*/
|
||||
|
||||
@@ -17,7 +17,8 @@ Require-Bundle: com.sap.sailing.domain,
|
||||
com.google.gwt.osgi;bundle-version="2.4.0",
|
||||
com.sap.sailing.domain.common,
|
||||
org.moxieapps.gwt.highcharts;bundle-version="1.1.4",
|
||||
com.sap.sailing.geocoding
|
||||
com.sap.sailing.geocoding,
|
||||
com.sap.sailing.server.replication
|
||||
Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Export-Package: com.sap.sailing.gwt.ui.client;x-friends:="com.sap.sailing.gwt.ui.test",
|
||||
|
||||
+1
@@ -70,6 +70,7 @@ public class AdminConsoleEntryPoint extends AbstractEntryPoint implements EventR
|
||||
leaderboardConfigPanel.setSize("90%", "90%");
|
||||
tabPanel.add(leaderboardConfigPanel, stringMessages.leaderboardConfiguration(), /* asHTML */ false);
|
||||
eventDisplayers.add(leaderboardConfigPanel);
|
||||
tabPanel.add(new ReplicationPanel(sailingService, this, stringMessages), stringMessages.replication(), /* asHTML */ false);
|
||||
|
||||
tabPanel.selectTab(0);
|
||||
tabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
|
||||
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.ListBox;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
|
||||
/**
|
||||
* Allows administrators to manage all aspects of server instance replication such as showing whether the instance
|
||||
* is a master or a replica and for a master showing the replicas to which the master is currently replicating.
|
||||
*
|
||||
* @author Axel Uhl (D043530)
|
||||
*
|
||||
*/
|
||||
public class ReplicationPanel extends FlowPanel {
|
||||
private final ListBox registeredReplicas;
|
||||
private final SailingServiceAsync sailingService;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
public ReplicationPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter, StringMessages stringMessages) {
|
||||
this.sailingService = sailingService;
|
||||
this.stringMessages = stringMessages;
|
||||
this.errorReporter = errorReporter;
|
||||
registeredReplicas = new ListBox();
|
||||
add(registeredReplicas);
|
||||
Button refreshButton = new Button(stringMessages.refresh());
|
||||
refreshButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
updateReplicaList();
|
||||
}
|
||||
});
|
||||
add(refreshButton);
|
||||
}
|
||||
|
||||
private void updateReplicaList() {
|
||||
sailingService.getHostnamesOfReplica(new AsyncCallback<List<String>>() {
|
||||
@Override
|
||||
public void onSuccess(List<String> hostnames) {
|
||||
registeredReplicas.clear();
|
||||
for (String hostname : hostnames) {
|
||||
registeredReplicas.addItem(hostname);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable e) {
|
||||
errorReporter.reportError(stringMessages.errorFetchingReplicaData(e.getMessage()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+2
@@ -178,4 +178,6 @@ public interface SailingService extends RemoteService {
|
||||
void setRaceIsKnownToStartUpwind(EventAndRaceIdentifier raceIdentifier, boolean raceIsKnownToStartUpwind);
|
||||
|
||||
void setWindSourcesToExclude(EventAndRaceIdentifier raceIdentifier, Iterable<WindSource> windSourcesToExclude);
|
||||
|
||||
List<String> getHostnamesOfReplica();
|
||||
}
|
||||
+2
@@ -314,4 +314,6 @@ public interface SailingServiceAsync {
|
||||
void getRaceMapData(RaceIdentifier raceIdentifier, Date date, Map<CompetitorDTO, Date> from,
|
||||
Map<CompetitorDTO, Date> to, boolean extrapolate, AsyncCallback<RaceMapDataDTO> callback);
|
||||
|
||||
void getHostnamesOfReplica(AsyncCallback<List<String>> callback);
|
||||
|
||||
}
|
||||
+2
@@ -284,4 +284,6 @@ public interface StringMessages extends Messages {
|
||||
String degreesBoatToTheWind();
|
||||
String racesInLeaderboard();
|
||||
String leaderboardsInGroup();
|
||||
String replication();
|
||||
String errorFetchingReplicaData(String message);
|
||||
}
|
||||
+3
-1
@@ -278,4 +278,6 @@ speedPlaySpeedUp=Speed play speed up
|
||||
showHideComponent=Show/Hide {0}
|
||||
degreesBoatToTheWind=Angle to wind
|
||||
racesInLeaderboard=Races in leaderboard
|
||||
leaderboardsInGroup=Leaderboards in group
|
||||
leaderboardsInGroup=Leaderboards in group
|
||||
replication=Replication
|
||||
errorFetchingReplicaData=Error fetching replica data: {0}
|
||||
+3
-1
@@ -279,4 +279,6 @@ speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen
|
||||
showHideComponent={0} anzeigen/verstecken
|
||||
degreesBoatToTheWind=Winkel zum Wind
|
||||
racesInLeaderboard=Rennen im Leaderboard
|
||||
leaderboardsInGroup=Leaderboards in der Gruppe
|
||||
leaderboardsInGroup=Leaderboards in der Gruppe
|
||||
replication=Replikation
|
||||
errorFetchingReplicaData=Fehler beim Beschaffen der Replikationsdaten: {0}
|
||||
+22
@@ -163,6 +163,7 @@ import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardCarryVa
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardGroup;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardMaxPointsReason;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateLeaderboardScoreCorrection;
|
||||
import com.sap.sailing.server.replication.ReplicationService;
|
||||
|
||||
/**
|
||||
* The server side implementation of the RPC service.
|
||||
@@ -176,6 +177,8 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
|
||||
private final ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker;
|
||||
|
||||
private final ServiceTracker<ReplicationService, ReplicationService> replicationServiceTracker;
|
||||
|
||||
private final MongoObjectFactory mongoObjectFactory;
|
||||
|
||||
private final SwissTimingAdapterPersistence swissTimingAdapterPersistence;
|
||||
@@ -195,6 +198,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
public SailingServiceImpl() {
|
||||
BundleContext context = Activator.getDefault();
|
||||
racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
|
||||
replicationServiceTracker = createAndOpenReplicationServiceTracker(context);
|
||||
mongoObjectFactory = MongoObjectFactory.INSTANCE;
|
||||
domainObjectFactory = DomainObjectFactory.INSTANCE;
|
||||
swissTimingAdapterPersistence = SwissTimingAdapterPersistence.INSTANCE;
|
||||
@@ -213,6 +217,14 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
return result;
|
||||
}
|
||||
|
||||
protected ServiceTracker<ReplicationService, ReplicationService> createAndOpenReplicationServiceTracker(
|
||||
BundleContext context) {
|
||||
ServiceTracker<ReplicationService, ReplicationService> result = new ServiceTracker<ReplicationService, ReplicationService>(
|
||||
context, ReplicationService.class.getName(), null);
|
||||
result.open();
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LeaderboardDTO getLeaderboardByName(String leaderboardName, Date date,
|
||||
final Collection<String> namesOfRacesForWhichToLoadLegDetails)
|
||||
@@ -1101,6 +1113,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
return racingEventServiceTracker.getService(); // grab the service
|
||||
}
|
||||
|
||||
private ReplicationService getReplicationService() {
|
||||
return replicationServiceTracker.getService();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getLeaderboardNames() throws Exception {
|
||||
return new ArrayList<String>(getService().getLeaderboards().keySet());
|
||||
@@ -1716,4 +1732,10 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
getService().apply(new UpdateLeaderboardGroup(oldName, newName, description, leaderboardNames));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getHostnamesOfReplica() {
|
||||
ReplicationService service = getReplicationService();
|
||||
return service.getHostnamesOfReplica();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,6 +10,11 @@ Import-Package: javax.jms;version="1.1.0",
|
||||
org.apache.activemq;version="5.4.3",
|
||||
org.apache.activemq.broker;version="5.4.3",
|
||||
org.osgi.framework;version="1.3.0"
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Export-Package: com.sap.sailing.server.replication
|
||||
Require-Bundle: com.sap.sailing.operationaltransformation;bundle-version="1.0.0",
|
||||
com.sap.sailing.server;bundle-version="1.0.0"
|
||||
Require-Bundle: com.sap.sailing.server;bundle-version="1.0.0",
|
||||
javax.servlet;bundle-version="2.5.0",
|
||||
com.sap.sailing.domain.common,
|
||||
com.sap.sailing.domain
|
||||
Bundle-ClassPath: .
|
||||
Web-ContextPath: /replication
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee"
|
||||
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
|
||||
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
||||
|
||||
<servlet>
|
||||
<servlet-name>Replication</servlet-name>
|
||||
<servlet-class>com.sap.sailing.server.replication.impl.ReplicationServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>Replication</servlet-name>
|
||||
<url-pattern>/replication</url-pattern>
|
||||
</servlet-mapping>
|
||||
</web-app>
|
||||
@@ -1,4 +1,5 @@
|
||||
source.. = src/
|
||||
output.. = bin/
|
||||
bin.includes = META-INF/,\
|
||||
.
|
||||
.,\
|
||||
WEB-INF/
|
||||
+5
-3
@@ -1,11 +1,13 @@
|
||||
package com.sap.sailing.server.replication;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
|
||||
public interface ServerReplicationMasterService {
|
||||
public interface ReplicationService {
|
||||
void broadcastOperation(RacingEventServiceOperation<?> operation) throws Exception;
|
||||
|
||||
void broadcastInitialServerState(Serializable state) throws Exception;
|
||||
List<String> getHostnamesOfReplica();
|
||||
|
||||
boolean isMaster();
|
||||
}
|
||||
-9
@@ -1,9 +0,0 @@
|
||||
package com.sap.sailing.server.replication;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public interface ServerReplicationSlaveService {
|
||||
ReplicationSlaveDescriptor registerSlave(UUID slaveId);
|
||||
|
||||
ReplicationSlaveDescriptor unregisterSlave(UUID slaveId);
|
||||
}
|
||||
+7
-12
@@ -1,10 +1,11 @@
|
||||
package com.sap.sailing.server.replication.impl;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import org.osgi.framework.BundleActivator;
|
||||
import org.osgi.framework.BundleContext;
|
||||
|
||||
import com.sap.sailing.server.replication.ServerReplicationMasterService;
|
||||
import com.sap.sailing.server.replication.ServerReplicationSlaveService;
|
||||
import com.sap.sailing.server.replication.ReplicationService;
|
||||
|
||||
public class Activator implements BundleActivator {
|
||||
private MessageBrokerManager messageBrokerManager;
|
||||
@@ -14,21 +15,15 @@ public class Activator implements BundleActivator {
|
||||
public void start(BundleContext bundleContext) throws Exception {
|
||||
MessageBrokerConfiguration brokerConfig = new MessageBrokerConfiguration();
|
||||
brokerConfig.setBrokerUrl("tcp://localhost:61616");
|
||||
brokerConfig.setDataStoreDirectory("c:\\temp\\kahadb");
|
||||
String tmpDir = System.getProperty("java.io.tmpdir");
|
||||
brokerConfig.setDataStoreDirectory(new File(tmpDir, "kahadb").getAbsolutePath());
|
||||
brokerConfig.setBrokerName("SailingServerReplicationBroker");
|
||||
|
||||
messageBrokerManager = new MessageBrokerManager(brokerConfig);
|
||||
|
||||
messageBrokerManager.startMessageBroker();
|
||||
messageBrokerManager.createAndStartConnection();
|
||||
|
||||
replicationInstancesManager = new ReplicationInstancesManager();
|
||||
|
||||
ServerReplicationSlaveService serverReplicationSlaveService = new ServerReplicationSlaveServiceImpl(replicationInstancesManager);
|
||||
ServerReplicationMasterService serverReplicationMasterService = new ServerReplicationMasterServiceImpl(replicationInstancesManager, messageBrokerManager);
|
||||
|
||||
bundleContext.registerService(ServerReplicationSlaveService.class, serverReplicationSlaveService, null);
|
||||
bundleContext.registerService(ServerReplicationMasterService.class, serverReplicationMasterService, null);
|
||||
ReplicationService serverReplicationMasterService = new ReplicationServiceImpl(replicationInstancesManager, messageBrokerManager, true);
|
||||
bundleContext.registerService(ReplicationService.class, serverReplicationMasterService, null);
|
||||
}
|
||||
|
||||
public void stop(BundleContext bundleContext) throws Exception {
|
||||
|
||||
+2
-5
@@ -33,18 +33,15 @@ public class ReplicationInstancesManager {
|
||||
return replicationMasterDescriptor;
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor findSlaveDescriptor(UUID slaveUUID)
|
||||
{
|
||||
public ReplicationSlaveDescriptor findSlaveDescriptor(UUID slaveUUID) {
|
||||
return replicationSlavesDescriptors.get(slaveUUID);
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor addSlave(UUID slaveUUID)
|
||||
{
|
||||
public ReplicationSlaveDescriptor addSlave(UUID slaveUUID) {
|
||||
ReplicationSlaveDescriptor replicationSlaveDescriptor = replicationSlavesDescriptors.get(slaveUUID);
|
||||
if(replicationSlaveDescriptor == null) {
|
||||
replicationSlaveDescriptor = new ReplicationSlaveDescriptor(slaveUUID);
|
||||
}
|
||||
|
||||
return replicationSlaveDescriptor;
|
||||
}
|
||||
|
||||
|
||||
+37
-9
@@ -1,6 +1,9 @@
|
||||
package com.sap.sailing.server.replication.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.jms.DeliveryMode;
|
||||
import javax.jms.JMSException;
|
||||
@@ -10,22 +13,36 @@ import javax.jms.TextMessage;
|
||||
import javax.jms.Topic;
|
||||
|
||||
import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
import com.sap.sailing.server.replication.ServerReplicationMasterService;
|
||||
import com.sap.sailing.server.replication.ReplicationService;
|
||||
import com.sap.sailing.server.replication.ReplicationSlaveDescriptor;
|
||||
|
||||
public class ServerReplicationMasterServiceImpl implements ServerReplicationMasterService {
|
||||
public class ReplicationServiceImpl implements ReplicationService {
|
||||
private final ReplicationInstancesManager replicationInstancesManager;
|
||||
|
||||
private final MessageBrokerManager messageBrokerManager;
|
||||
|
||||
private Topic replicationTopic;
|
||||
|
||||
public ServerReplicationMasterServiceImpl(final ReplicationInstancesManager replicationInstancesManager, final MessageBrokerManager messageBrokerManager) {
|
||||
private final boolean isMaster;
|
||||
|
||||
public ReplicationServiceImpl(final ReplicationInstancesManager replicationInstancesManager,
|
||||
final MessageBrokerManager messageBrokerManager, boolean isMaster) {
|
||||
this.replicationInstancesManager = replicationInstancesManager;
|
||||
this.messageBrokerManager = messageBrokerManager;
|
||||
this.isMaster = isMaster;
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor registerSlave(UUID slaveId) {
|
||||
return replicationInstancesManager.addSlave(slaveId);
|
||||
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor unregisterSlave(UUID slaveId) {
|
||||
return replicationInstancesManager.removeSlave(slaveId);
|
||||
}
|
||||
|
||||
private Topic getReplicationTopic() throws JMSException{
|
||||
if(replicationTopic== null) {
|
||||
if (replicationTopic== null) {
|
||||
Session session = messageBrokerManager.getSession();
|
||||
if(session == null) {
|
||||
session = messageBrokerManager.createSession(true);
|
||||
@@ -38,15 +55,26 @@ public class ServerReplicationMasterServiceImpl implements ServerReplicationMast
|
||||
public void broadcastOperation(RacingEventServiceOperation<?> operation) throws Exception {
|
||||
Topic topic = getReplicationTopic();
|
||||
Session session = messageBrokerManager.getSession();
|
||||
|
||||
MessageProducer producer = messageBrokerManager.getSession().createProducer(topic);
|
||||
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
|
||||
TextMessage message = session.createTextMessage("Hello World!");
|
||||
System.out.println("Sending message: " + message.getText());
|
||||
producer.send(message);
|
||||
}
|
||||
|
||||
public void broadcastInitialServerState(Serializable state) throws Exception {
|
||||
return;
|
||||
|
||||
@Override
|
||||
public List<String> getHostnamesOfReplica() {
|
||||
List<String> result = new ArrayList<String>();
|
||||
for (Iterator<ReplicationSlaveDescriptor> i=replicationInstancesManager.getSlavesDescriptors(); i.hasNext(); ) {
|
||||
ReplicationSlaveDescriptor d = i.next();
|
||||
result.add(d.getIpAddress());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMaster() {
|
||||
return isMaster;
|
||||
}
|
||||
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.sap.sailing.server.replication.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectOutputStream;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.Servlet;
|
||||
|
||||
/**
|
||||
* As the response to any type of <code>GET</code> request, sends a serialized copy of the {@link RacingEventService} to
|
||||
* the response's output stream.
|
||||
*
|
||||
* @author Axel Uhl (D043530)
|
||||
*
|
||||
*/
|
||||
public class ReplicationServlet extends Servlet {
|
||||
private static final long serialVersionUID = 4835516998934433846L;
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(resp.getOutputStream());
|
||||
getService().serializeForInitialReplication(oos);
|
||||
}
|
||||
}
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
package com.sap.sailing.server.replication.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sailing.server.replication.ReplicationSlaveDescriptor;
|
||||
import com.sap.sailing.server.replication.ServerReplicationSlaveService;
|
||||
|
||||
public class ServerReplicationSlaveServiceImpl implements ServerReplicationSlaveService {
|
||||
private final ReplicationInstancesManager replicationInstancesManager;
|
||||
|
||||
public ServerReplicationSlaveServiceImpl(ReplicationInstancesManager replicationInstancesManager) {
|
||||
this.replicationInstancesManager = replicationInstancesManager;
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor registerSlave(UUID slaveId) {
|
||||
return replicationInstancesManager.addSlave(slaveId);
|
||||
|
||||
}
|
||||
|
||||
public ReplicationSlaveDescriptor unregisterSlave(UUID slaveId) {
|
||||
return replicationInstancesManager.removeSlave(slaveId);
|
||||
}
|
||||
|
||||
// private void createMessageConsumer() throws JMSException, InterruptedException {
|
||||
// MessageConsumer consumer = session.createConsumer(destination);
|
||||
// SampleMessageConsumer messageConsumer = new SampleMessageConsumer();
|
||||
// connection.setExceptionListener(messageConsumer);
|
||||
// consumer.setMessageListener(messageConsumer);
|
||||
// }
|
||||
}
|
||||
@@ -21,10 +21,10 @@
|
||||
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
|
||||
<stringAttribute key="pde.version" value="3.3"/>
|
||||
<booleanAttribute key="show_selected_only" value="false"/>
|
||||
<stringAttribute key="target_bundles" value="javax.servlet@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.nested@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,slf4j.api@default:default,slf4j.jdk14@default:false"/>
|
||||
<stringAttribute key="target_bundles" value="javax.servlet@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.nested@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,slf4j.api@default:default,slf4j.jdk14@default:false"/>
|
||||
<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.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.server@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.tractrac.clientmodule@default:default,com.tractrac.resultapi@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.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.tractrac.clientmodule@default:default,com.tractrac.resultapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
|
||||
<stringAttribute key="yk-options" value=" additional-options2=onexit\=snapshot "/>
|
||||
</launchConfiguration>
|
||||
@@ -2,6 +2,8 @@ package com.sap.sailing.server;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.SocketException;
|
||||
import java.net.URI;
|
||||
@@ -347,4 +349,23 @@ public interface RacingEventService extends TrackedEventRegistry, EventFetcher,
|
||||
void addOperationExecutionListener(OperationExecutionListener listener);
|
||||
|
||||
void removeOperationExecutionListener(OperationExecutionListener listener);
|
||||
|
||||
/**
|
||||
* Produces a one-shot serializable copy of those elements required for replication into <code>oos</code> so that
|
||||
* afterwards the {@link RacingEventServiceOperation}s can be {@link #apply(RacingEventServiceOperation) applied} to
|
||||
* maintain consistency with the master copy of the service. The dual operation is {@link #initiallyFillFrom}.
|
||||
*/
|
||||
void serializeForInitialReplication(ObjectOutputStream oos) throws IOException;
|
||||
|
||||
/**
|
||||
* Dual, reading operation for {@link #serializeForInitialReplication(ObjectOutputStream)}. In other words,
|
||||
* when this operation returns, this service instance is in a state "equivalent" to that of the service instance
|
||||
* that produced the stream contents in its {@link #serializeForInitialReplication(ObjectOutputStream)}. "Equivalent"
|
||||
* here means that a replica will have equal sets of events, tracked events, leaderboards and leaderboard groups
|
||||
* but will not have any active trackers for wind or positions because it relies on these elements to be sent
|
||||
* through the replication channel.<p>
|
||||
*
|
||||
* <b>Caution:</b> All relevant contents of this service instance will be replaced by the stream contents.
|
||||
*/
|
||||
void initiallyFillFrom(ObjectInputStream ois) throws IOException, ClassNotFoundException;
|
||||
}
|
||||
+26
@@ -1,6 +1,8 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.SocketException;
|
||||
import java.net.URI;
|
||||
@@ -942,4 +944,28 @@ public class RacingEventServiceImpl implements RacingEventService {
|
||||
operationExecutionListeners.remove(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serializeForInitialReplication(ObjectOutputStream oos) throws IOException {
|
||||
oos.writeObject(eventsByName);
|
||||
oos.writeObject(eventsObservedForDefaultLeaderboard);
|
||||
oos.writeObject(eventTrackingCache);
|
||||
oos.writeObject(leaderboardGroupsByName);
|
||||
oos.writeObject(leaderboardsByName);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") // the type-parameters in the casts of the de-serialized collection objects can't be checked
|
||||
@Override
|
||||
public void initiallyFillFrom(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
||||
eventsByName.clear();
|
||||
eventsByName.putAll((Map<String, Event>) ois.readObject());
|
||||
eventsObservedForDefaultLeaderboard.clear();
|
||||
eventsObservedForDefaultLeaderboard.addAll((Set<DynamicTrackedEvent>) ois.readObject());
|
||||
eventTrackingCache.clear();
|
||||
eventTrackingCache.putAll((Map<Event, DynamicTrackedEvent>) ois.readObject());
|
||||
leaderboardGroupsByName.clear();
|
||||
leaderboardGroupsByName.putAll((Map<String, LeaderboardGroup>) ois.readObject());
|
||||
leaderboardsByName.clear();
|
||||
leaderboardsByName.putAll((Map<String, Leaderboard>) ois.readObject());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,49 +13,49 @@
|
||||
</license>
|
||||
|
||||
<plugin
|
||||
id="activeio.core"
|
||||
id="org.apache.activemq.activeio-core"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="3.1.2"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="activemq.core"
|
||||
id="org.apache.activemq.activemq-core"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="5.4.3"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="geronimo.j2ee.management.1.1.spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.1.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="geronimo.jms.1.1.spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.1.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="geronimo.annotation.1.0.spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.1.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="geronimo.jta.1.0.1B.spec"
|
||||
id="org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.0.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="kahadb"
|
||||
id="org.apache.geronimo.specs.geronimo-jms_1.1_spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.1.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.geronimo.specs.geronimo-annotation_1.0_spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.1.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.geronimo.specs.geronimo-jta_1.0.1B_spec"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="1.0.1"
|
||||
unpack="false"/>
|
||||
|
||||
<plugin
|
||||
id="org.apache.activemq.kahadb"
|
||||
download-size="0"
|
||||
install-size="0"
|
||||
version="5.4.3"
|
||||
|
||||
BIN
Binary file not shown.
@@ -9,6 +9,7 @@
|
||||
</location>
|
||||
<location includeAllPlatforms="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
|
||||
<unit id="com.sap.sailing.target.base.feature.group" version="1.0.0"/>
|
||||
<unit id="com.sap.sailing.target.jms.feature.group" version="1.0.0"/>
|
||||
<unit id="com.sap.sailing.target.test.feature.group" version="1.0.0"/>
|
||||
<repository location="http://sapcoe-app01.pironet-ndh.com/p2/sailing/"/>
|
||||
</location>
|
||||
|
||||
Reference in new issue
Block a user