refactored Mongo DB connector: new Activator which encapsulates DB connection

This commit is contained in:
Axel Uhl committed 2011-11-08 17:10:10 +01:00
1 parent 68aaec81df
commit 2a12d45fc0
17 files changed
+162 -123

No files matched your search

@@ -0,0 +1,7 @@
package com.sap.sailing.domain.swisstimingadapter;
import com.sap.sailing.domain.swisstimingadapter.impl.DomainFactoryImpl;
public interface DomainFactory {
final static DomainFactory INSTANCE = new DomainFactoryImpl();
}
@@ -8,7 +8,7 @@ public interface SwissTimingFactory {
SwissTimingMessageParser createMessageParser();
SailMasterConnector createSailMasterConnector(String host, int port);
SailMasterConnector createSailMasterConnector(String hostname, int port);
SwissTimingConfiguration createSwissTimingConfiguration(String name, String hostname, int port);
@@ -0,0 +1,7 @@
package com.sap.sailing.domain.swisstimingadapter.impl;
import com.sap.sailing.domain.swisstimingadapter.DomainFactory;
public class DomainFactoryImpl implements DomainFactory {
}
@@ -26,8 +26,7 @@ public class SwissTimingFactoryImpl implements SwissTimingFactory {
@Override
public SwissTimingRaceTracker createRaceTracker(String raceID, String hostname, int port, WindStore windStore) {
// TODO Auto-generated method stub
return null;
return new SwissTimingRaceTrackerImpl(raceID, hostname, port, this);
}
}
@@ -2,10 +2,13 @@ package com.sap.sailing.domain.swisstimingadapter.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.swisstimingadapter.SailMasterConnector;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingRaceTracker;
import com.sap.sailing.domain.tracking.DynamicTrackedEvent;
import com.sap.sailing.domain.tracking.RaceHandle;
@@ -13,18 +16,23 @@ import com.sap.sailing.domain.tracking.WindStore;
import com.sap.sailing.util.Util.Triple;
public class SwissTimingRaceTrackerImpl implements SwissTimingRaceTracker {
protected SwissTimingRaceTrackerImpl(String raceID, String hostname, int port) {
// TODO implement SwissTimingRaceTrackerImpl constructor
private final SailMasterConnector connector;
private final Set<RaceDefinition> races;
protected SwissTimingRaceTrackerImpl(String raceID, String hostname, int port, SwissTimingFactory factory) {
connector = factory.createSailMasterConnector(hostname, port);
races = new HashSet<RaceDefinition>();
}
@Override
public void stop() throws MalformedURLException, IOException, InterruptedException {
// TODO Auto-generated method stub
connector.stop();
}
@Override
public Set<RaceDefinition> getRaces() {
// races = connector.getRaces();
// TODO Auto-generated method stub
return null;
}
@@ -113,5 +113,5 @@ public interface SailingService extends RemoteService {
void storeSwissTimingConfiguration(String a, String hostname, int port);
void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean trackWind,
boolean correctWindByDeclination);
boolean correctWindByDeclination) throws Exception;
}
@@ -1029,8 +1029,20 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
@Override
public void trackWithSwissTiming(SwissTimingRaceRecordDAO rr, String hostname, int port, boolean trackWind,
boolean correctWindByDeclination) {
// TODO Auto-generated method stub
final boolean correctWindByDeclination) throws Exception {
final RaceHandle raceHandle = getService().addSwissTimingRace(rr.ID, hostname, port,
MongoWindStoreFactory.INSTANCE.getMongoWindStore(mongoObjectFactory, domainObjectFactory),
TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
if (trackWind) {
new Thread("Wind tracking starter for race "+rr.ID+"/"+rr.description) {
public void run() {
try {
startTrackingWind(raceHandle, correctWindByDeclination, TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}.start();
}
}
}
@@ -9,7 +9,7 @@ import org.junit.Before;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
import com.sap.sailing.mongodb.impl.Activator;
public abstract class AbstractMongoDBTest implements MongoDBTest {
protected Mongo mongo;
@@ -17,7 +17,7 @@ public abstract class AbstractMongoDBTest implements MongoDBTest {
protected Mongo newMongo() throws UnknownHostException, MongoException {
return new Mongo(System.getProperty("mongo.host", "127.0.0.1"),
((MongoWindStoreFactoryImpl) MongoWindStoreFactoryImpl.getDefaultInstance()).getDefaultPort());
Activator.getDefaultInstance().getDefaultPort());
}
@Before
@@ -3,20 +3,20 @@ package com.sap.sailing.mongodb.test;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.sap.sailing.domain.base.impl.DegreeBearingImpl;
import com.sap.sailing.mongodb.impl.Activator;
import com.sap.sailing.mongodb.impl.FieldNames;
import com.sap.sailing.mongodb.impl.MongoObjectFactoryImpl;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
/**
* Reverses the wind directions of <em>all</em> wind records stored in the MongoDB that is obtained using
* {@link MongoWindStoreFactoryImpl#getDB()}.
* {@link Activator#getDB()}.
*
* @author Axel Uhl (d043530)
*
*/
public class ConvertWindData extends AbstractMongoDBTest {
public static void main(String[] args) {
MongoObjectFactoryImpl mof = new MongoObjectFactoryImpl(MongoWindStoreFactoryImpl.getDefaultInstance().getDB());
MongoObjectFactoryImpl mof = new MongoObjectFactoryImpl(Activator.getDefaultInstance().getDB());
DBCollection windTracksCollection = mof.getWindTrackCollection();
for (DBObject dbo : windTracksCollection.find()) {
windTracksCollection.remove(dbo);
@@ -32,9 +32,9 @@ import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.domain.tractracadapter.DomainFactory;
import com.sap.sailing.domain.tractracadapter.Receiver;
import com.sap.sailing.domain.tractracadapter.ReceiverType;
import com.sap.sailing.mongodb.impl.Activator;
import com.sap.sailing.mongodb.impl.DomainObjectFactoryImpl;
import com.sap.sailing.mongodb.impl.MongoObjectFactoryImpl;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLiveTest implements MongoDBTest {
@@ -47,7 +47,7 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive
private Mongo newMongo() throws UnknownHostException, MongoException {
return new Mongo(System.getProperty("mongo.host", "127.0.0.1"),
((MongoWindStoreFactoryImpl) MongoWindStoreFactoryImpl.getDefaultInstance()).getDefaultPort());
Activator.getDefaultInstance().getDefaultPort());
}
@Before
@@ -13,4 +13,4 @@ Require-Bundle: com.mongodb.driver;bundle-version="2.6.2",
Export-Package: com.sap.sailing.mongodb,
com.sap.sailing.mongodb.impl;x-friends:="com.sap.sailing.mongodb.test"
Bundle-ActivationPolicy: lazy
Bundle-Activator: com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl
Bundle-Activator: com.sap.sailing.mongodb.impl.Activator
@@ -7,8 +7,8 @@ import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
import com.sap.sailing.domain.tracking.WindSource;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
import com.sap.sailing.mongodb.impl.Activator;
import com.sap.sailing.mongodb.impl.DomainObjectFactoryImpl;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
/**
* Offers methods to load domain objects from a Mongo DB
@@ -17,7 +17,7 @@ import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
*
*/
public interface DomainObjectFactory {
DomainObjectFactory INSTANCE = new DomainObjectFactoryImpl(MongoWindStoreFactoryImpl.getDefaultInstance().getDB());
DomainObjectFactory INSTANCE = new DomainObjectFactoryImpl(Activator.getDefaultInstance().getDB());
WindTrack loadWindTrack(Event event, RaceDefinition race, WindSource windSource, long millisecondsOverWhichToAverage);
@@ -9,8 +9,8 @@ import com.sap.sailing.domain.tracking.TrackedEvent;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.WindSource;
import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
import com.sap.sailing.mongodb.impl.Activator;
import com.sap.sailing.mongodb.impl.MongoObjectFactoryImpl;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
/**
* Offers methods to construct {@link DBObject MongoDB objects} from domain objects.
@@ -19,7 +19,7 @@ import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
*
*/
public interface MongoObjectFactory {
MongoObjectFactory INSTANCE = new MongoObjectFactoryImpl(MongoWindStoreFactoryImpl.getDefaultInstance().getDB());
MongoObjectFactory INSTANCE = new MongoObjectFactoryImpl(Activator.getDefaultInstance().getDB());
/**
* Registers for changes of the wind coming from <code>windSource</code> on the <code>trackedRace</code>. Each
@@ -2,14 +2,12 @@ package com.sap.sailing.mongodb;
import java.net.UnknownHostException;
import com.mongodb.DB;
import com.mongodb.MongoException;
import com.sap.sailing.mongodb.impl.Activator;
import com.sap.sailing.mongodb.impl.MongoWindStoreFactoryImpl;
public interface MongoWindStoreFactory {
MongoWindStoreFactory INSTANCE = MongoWindStoreFactoryImpl.getDefaultInstance();
String DEFAULT_DB_NAME = "winddb";
MongoWindStoreFactory INSTANCE = new MongoWindStoreFactoryImpl(Activator.getDefaultInstance().getDB());
/**
* Gets the default Mongo store based on the properties mongo.hostname[=localhost], mongo.port[=27017]
@@ -17,11 +15,4 @@ public interface MongoWindStoreFactory {
*/
MongoWindStore getMongoWindStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) throws UnknownHostException, MongoException;
/**
* Obtains a DB instance based on the default settings which can be provided by
* system properties and/or OSGi bundle properties, respectively. See also
* {@link #getMongoWindStore(MongoObjectFactory, DomainObjectFactory)}.
*/
DB getDB();
}
@@ -0,0 +1,94 @@
package com.sap.sailing.mongodb.impl;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.sap.sailing.util.Util.Pair;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
private static final String MONGO_PORT = "mongo.port";
private static final String MONGO_HOSTNAME = "mongo.host";
private static final String MONGO_DB_NAME = "mongo.dbName";
String DEFAULT_DB_NAME = "winddb";
private static Activator defaultInstance;
private String defaultHostName;
private int defaultPort;
private String defaultDatabaseName;
private final Map<Pair<String, Integer>, Mongo> mongos;
public Activator() {
defaultHostName = System.getProperty(MONGO_HOSTNAME, "127.0.0.1");
defaultPort = Integer.valueOf(System.getProperty(MONGO_PORT, "27017"));
defaultDatabaseName = System.getProperty(MONGO_DB_NAME, DEFAULT_DB_NAME);
mongos = new HashMap<Pair<String, Integer>, Mongo>();
}
@Override
public void start(BundleContext context) throws Exception {
defaultInstance = this;
defaultDatabaseName = context.getProperty(MONGO_DB_NAME);
if (defaultDatabaseName == null) {
defaultDatabaseName = DEFAULT_DB_NAME;
} else {
logger.log(Level.INFO, "found mongo.dbName="+defaultDatabaseName);
}
defaultHostName = context.getProperty(MONGO_HOSTNAME);
if (defaultHostName == null) {
defaultHostName = "127.0.0.1";
} else {
logger.log(Level.INFO, "found "+MONGO_HOSTNAME+"="+defaultHostName);
}
defaultPort = context.getProperty(MONGO_PORT) != null ? Integer.valueOf(context.getProperty(MONGO_PORT)) : 27017;
logger.log(Level.INFO, "Using port "+defaultPort+" as default for Mongo wind stores");
}
@Override
public void stop(BundleContext context) throws Exception {
// TODO Auto-generated method stub
}
public DB getDB() {
try {
return getDB(defaultHostName, defaultPort, defaultDatabaseName);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
private synchronized DB getDB(String hostname, int port, String dbName) throws UnknownHostException {
Pair<String, Integer> key = new Pair<String, Integer>(hostname, port);
Mongo mongo = mongos.get(key);
if (mongo == null) {
mongo = new Mongo(hostname, port);
mongos.put(key, mongo);
}
return mongo.getDB(dbName);
}
public static Activator getDefaultInstance() {
if (defaultInstance == null) {
defaultInstance = new Activator();
}
return defaultInstance;
}
public Integer getDefaultPort() {
return defaultPort;
}
}
@@ -1,107 +1,28 @@
package com.sap.sailing.mongodb.impl;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import com.mongodb.DB;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.sap.sailing.mongodb.DomainObjectFactory;
import com.sap.sailing.mongodb.MongoObjectFactory;
import com.sap.sailing.mongodb.MongoWindStore;
import com.sap.sailing.mongodb.MongoWindStoreFactory;
import com.sap.sailing.util.Util.Pair;
public class MongoWindStoreFactoryImpl implements MongoWindStoreFactory, BundleActivator {
private static final String MONGO_PORT = "mongo.port";
private static final String MONGO_HOSTNAME = "mongo.host";
private static final String MONGO_DB_NAME = "mongo.dbName";
private static final Logger logger = Logger.getLogger(MongoWindStoreFactoryImpl.class.getName());
public class MongoWindStoreFactoryImpl implements MongoWindStoreFactory {
private final DB db;
private static MongoWindStoreFactory defaultInstance;
private String defaultHostName;
private int defaultPort;
private String defaultDatabaseName;
private final Map<Pair<String, Integer>, Mongo> mongos;
public MongoWindStoreFactoryImpl() {
defaultHostName = System.getProperty(MONGO_HOSTNAME, "127.0.0.1");
defaultPort = Integer.valueOf(System.getProperty(MONGO_PORT, "27017"));
defaultDatabaseName = System.getProperty(MONGO_DB_NAME, DEFAULT_DB_NAME);
mongos = new HashMap<Pair<String, Integer>, Mongo>();
public MongoWindStoreFactoryImpl(DB db) {
this.db = db;
}
@Override
public MongoWindStore getMongoWindStore(MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) throws UnknownHostException, MongoException {
return getMongoWindStore(defaultHostName, defaultPort, defaultDatabaseName, mongoObjectFactory, domainObjectFactory);
return new MongoWindStoreImpl(db, mongoObjectFactory, domainObjectFactory);
}
private MongoWindStore getMongoWindStore(String hostname, int port, String dbName,
MongoObjectFactory mongoObjectFactory, DomainObjectFactory domainObjectFactory) throws UnknownHostException, MongoException {
return new MongoWindStoreImpl(getDB(hostname, port, dbName), mongoObjectFactory, domainObjectFactory);
}
@Override
public DB getDB() {
try {
return getDB(defaultHostName, defaultPort, defaultDatabaseName);
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
private synchronized DB getDB(String hostname, int port, String dbName) throws UnknownHostException {
Pair<String, Integer> key = new Pair<String, Integer>(hostname, port);
Mongo mongo = mongos.get(key);
if (mongo == null) {
mongo = new Mongo(hostname, port);
mongos.put(key, mongo);
}
return mongo.getDB(dbName);
}
@Override
public void start(BundleContext context) throws Exception {
defaultInstance = this;
defaultDatabaseName = context.getProperty(MONGO_DB_NAME);
if (defaultDatabaseName == null) {
defaultDatabaseName = DEFAULT_DB_NAME;
} else {
logger.log(Level.INFO, "found mongo.dbName="+defaultDatabaseName);
}
defaultHostName = context.getProperty(MONGO_HOSTNAME);
if (defaultHostName == null) {
defaultHostName = "127.0.0.1";
} else {
logger.log(Level.INFO, "found "+MONGO_HOSTNAME+"="+defaultHostName);
}
defaultPort = context.getProperty(MONGO_PORT) != null ? Integer.valueOf(context.getProperty(MONGO_PORT)) : 27017;
logger.log(Level.INFO, "Using port "+defaultPort+" as default for Mongo wind stores");
}
public static MongoWindStoreFactory getDefaultInstance() {
if (defaultInstance == null) {
defaultInstance = new MongoWindStoreFactoryImpl();
}
return defaultInstance;
}
public Integer getDefaultPort() {
return defaultPort;
}
@Override
public void stop(BundleContext context) throws Exception {
public static MongoWindStoreFactory getInstance(DB db) {
return new MongoWindStoreFactoryImpl(db);
}
}
@@ -221,11 +221,11 @@ public class RacingEventServiceImpl implements RacingEventService {
@Override
public synchronized RaceHandle addSwissTimingRace(String raceID, String hostname, int port, WindStore windStore, long timeoutInMilliseconds) {
Pair<String, Integer> key = new Pair<String, Integer>(hostname, port);
Triple<String, String, Integer> key = new Triple<String, String, Integer>(raceID, hostname, port);
RaceTracker tracker = raceTrackersByID.get(key);
if (tracker == null) {
tracker = getSwissTimingFactory().createRaceTracker(raceID, hostname, port, windStore);
raceTrackersByID.put(key, tracker);
raceTrackersByID.put(tracker.getID(), tracker);
Set<RaceTracker> trackers = raceTrackersByEvent.get(tracker.getEvent());
if (trackers == null) {
trackers = new HashSet<RaceTracker>();
@@ -266,7 +266,7 @@ public class RacingEventServiceImpl implements RacingEventService {
RaceTracker tracker = raceTrackersByID.get(key);
if (tracker == null) {
tracker = getDomainFactory().createRaceTracker(paramURL, liveURI, storedURI, windStore);
raceTrackersByID.put(key, tracker);
raceTrackersByID.put(tracker.getID(), tracker);
Set<RaceTracker> trackers = raceTrackersByEvent.get(tracker.getEvent());
if (trackers == null) {
trackers = new HashSet<RaceTracker>();