Merge branch 'master' of ssh://kielweek.web4sap.com/home/trac/git

This commit is contained in:
Marcus Kammer committed 2012-04-24 09:50:48 +02:00
commit b5587babd9
31 files changed
+324 -103

No files matched your search

@@ -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;
}
}
@@ -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());
}
}
@@ -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);
}
@@ -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();
@@ -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) {
@@ -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",
@@ -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>() {
@@ -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()));
}
});
}
}
@@ -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();
}
@@ -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);
}
@@ -284,4 +284,6 @@ public interface StringMessages extends Messages {
String degreesBoatToTheWind();
String racesInLeaderboard();
String leaderboardsInGroup();
String replication();
String errorFetchingReplicaData(String message);
}
@@ -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}
@@ -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}
@@ -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
View File
@@ -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/
@@ -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();
}
@@ -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);
}
@@ -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 {
@@ -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;
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</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;
}
@@ -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"
@@ -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>