Decentralized the data mining string messages

This commit is contained in:
Lennart Hensler committed 2014-11-17 14:16:03 +01:00
1 parent 94816f2d36
commit e1b99f91d5
18 files changed
+160 -164

No files matched your search

@@ -4,5 +4,6 @@
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="resources"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -1,4 +1,5 @@
source.. = src/
source.. = src/,\
resources/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -0,0 +1,23 @@
Competitor=Teilnehmer
DistanceTraveled=zurückgelegte Distanz
Boat=Boot
Team=Team
Name=Name
NationalityAcronym=Nationalität
SailID=Segelnummer
LegNumber=Nummer des Schenkels
LegType=Art des Schenkels
Year=Jahr
Regatta=Regatta
CourseArea=Regattabahn
BoatClass=Bootsklasse
Fleet=Flotte
Race=Rennen
SailingDomainRetrieverChain=Segel-Domänen Datenbeschaffer
LeaderboardGroup=Ranglisten Gruppe
RegattaLeaderboard=Regatta Rangliste
Leg=Schenkel
LegOfCompetitor=Schenkel eines Teilnehmers
GpsFix=GPS-Fix
Speed=Geschwindigkeit
InKnots=in Knoten
@@ -0,0 +1,23 @@
Speed=Speed
InKnots=in knots
DistanceTraveled=Distance Traveled
Name=Name
LegType=Leg Type
SailID=Sail Number
Year=Year
LegNumber=Leg Number
NationalityAcronym=Nationality
Regatta=Regatta
CourseArea=Course Area
BoatClass=Boat Class
Fleet=Fleet
Race=Race
Competitor=Competitor
Boat=Boat
Team=Team
SailingDomainRetrieverChain=Sailing Domain Retriever
LeaderboardGroup=Leaderboard Group
RegattaLeaderboard=Regatta Leaderboard
Leg=Leg
LegOfCompetitor=Leg of competitor
GpsFix=GPS-Fix
@@ -14,56 +14,57 @@ import com.sap.sailing.datamining.data.HasGPSFixContext;
import com.sap.sailing.datamining.data.HasTrackedLegContext;
import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext;
import com.sap.sailing.datamining.data.HasTrackedRaceContext;
import com.sap.sse.datamining.ClassesWithFunctionsRegistrationService;
import com.sap.sse.datamining.DataRetrieverChainDefinition;
import com.sap.sse.datamining.DataRetrieverChainDefinitionRegistrationService;
import com.sap.sse.datamining.ModifiableDataMiningServer;
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
import com.sap.sse.datamining.impl.i18n.DataMiningStringMessagesImpl;
public class Activator implements BundleActivator {
private static final Logger LOGGER = Logger.getLogger(Activator.class.getSimpleName());
private static final String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
private DataMiningStringMessages sailingDataMiningStringMessages;
private SailingDataRetrieverChainDefinitions dataRetrieverChainDefinitions;
private ServiceReference<ClassesWithFunctionsRegistrationService> classesWithFunctionsRegistrationServiceReference;
private ServiceReference<DataRetrieverChainDefinitionRegistrationService> dataRetrieverChainDefinitionRegistrationServiceServiceReference;
private ServiceReference<ModifiableDataMiningServer> dataMiningServerServiceReference;
@Override
public void start(BundleContext context) throws Exception {
dataRetrieverChainDefinitions = new SailingDataRetrieverChainDefinitions();
sailingDataMiningStringMessages = new DataMiningStringMessagesImpl(STRING_MESSAGES_BASE_NAME);
classesWithFunctionsRegistrationServiceReference = context.getServiceReference(ClassesWithFunctionsRegistrationService.class);
if (classesWithFunctionsRegistrationServiceReference != null) {
context.getService(classesWithFunctionsRegistrationServiceReference)
.registerInternalClassesWithMarkedMethods(getInternalClassesWithMarkedMethods());
context.getService(classesWithFunctionsRegistrationServiceReference)
.registerExternalLibraryClasses(getExternalLibraryClasses());
} else {
LOGGER.log(Level.WARNING, "Couldn't register the sailing classes with functions. No registration service was available.");
}
dataRetrieverChainDefinitionRegistrationServiceServiceReference = context.getServiceReference(DataRetrieverChainDefinitionRegistrationService.class);
if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) {
DataRetrieverChainDefinitionRegistrationService dataRetrieverChainDefinitionRegistrationService = context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference);
dataMiningServerServiceReference = context.getServiceReference(ModifiableDataMiningServer.class);
if (dataMiningServerServiceReference != null) {
ModifiableDataMiningServer dataMiningServer = context.getService(dataMiningServerServiceReference);
dataMiningServer.addStringMessages(sailingDataMiningStringMessages);
dataMiningServer.registerAllWithInternalFunctionPolicy(getInternalClassesWithMarkedMethods());
dataMiningServer.registerAllWithExternalFunctionPolicy(getExternalLibraryClasses());
for (DataRetrieverChainDefinition<?> dataRetrieverChainDefinition : dataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) {
dataRetrieverChainDefinitionRegistrationService.addDataRetrieverChainDefinition(dataRetrieverChainDefinition);
dataMiningServer.registerDataRetrieverChainDefinition(dataRetrieverChainDefinition);
}
} else {
LOGGER.log(Level.WARNING, "Couldn't register the sailing data retriever chain definitions. No registration service was available.");
LOGGER.log(Level.WARNING,
"Couldn't register the sailing classes with functions and data retriever chain definitions."
+ " No data mining server was available.");
}
}
@Override
public void stop(BundleContext context) throws Exception {
if (classesWithFunctionsRegistrationServiceReference != null) {
context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(
getInternalClassesWithMarkedMethods());
context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(
getExternalLibraryClasses());
}
if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) {
if (dataMiningServerServiceReference != null) {
ModifiableDataMiningServer dataMiningServer = context.getService(dataMiningServerServiceReference);
dataMiningServer.removeStringMessages(sailingDataMiningStringMessages);
dataMiningServer.unregisterAllFunctionsOf(getInternalClassesWithMarkedMethods());
dataMiningServer.unregisterAllFunctionsOf(getExternalLibraryClasses());
for (DataRetrieverChainDefinition<?> dataRetrieverChainDefinition : dataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) {
context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference).removeDataRetrieverChainDefinition(dataRetrieverChainDefinition);
dataMiningServer.unregisterDataRetrieverChainDefinition(dataRetrieverChainDefinition);
}
}
}
@@ -21,7 +21,6 @@ import com.sap.sse.datamining.factories.ProcessorFactory;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.functions.FunctionProvider;
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
import com.sap.sse.datamining.impl.DataMiningActivator;
import com.sap.sse.datamining.impl.DataRetrieverChainDefinitionProvider;
import com.sap.sse.datamining.impl.ProcessorQuery;
import com.sap.sse.datamining.impl.components.GroupedDataEntry;
@@ -36,7 +35,6 @@ import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
public class SailingDataMiningFactory {
private final ExecutorService executorService;
private final DataMiningStringMessages stringMessages;
private final ProcessorFactory processorFactory;
@@ -44,12 +42,11 @@ public class SailingDataMiningFactory {
private final FunctionProvider functionProvider;
private final DataRetrieverChainDefinitionProvider dataRetrieverChainDefinitionProvider;
public SailingDataMiningFactory(FunctionProvider functionProvider, DataRetrieverChainDefinitionProvider dataRetrieverChainDefinitionRegistry) {
DataMiningActivator dataMiningActivator = DataMiningActivator.getDefault();
executorService = dataMiningActivator.getExecutor();
stringMessages = dataMiningActivator.getStringMessages();
public SailingDataMiningFactory(ExecutorService executorService, DataMiningStringMessages stringMessages, FunctionProvider functionProvider, DataRetrieverChainDefinitionProvider dataRetrieverChainDefinitionRegistry) {
this.executorService = executorService;
this.stringMessages = stringMessages;
processorFactory = new ProcessorFactory(executorService);
processorFactory = new ProcessorFactory(this.executorService);
this.functionProvider = functionProvider;
this.dataRetrieverChainDefinitionProvider = dataRetrieverChainDefinitionRegistry;
@@ -44,7 +44,9 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
dataMiningServerTracker = createAndOpenDataMiningServerTracker(context);
racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
sailingDataMiningFactory = new SailingDataMiningFactory(getDataMiningServer().getFunctionProvider(),
sailingDataMiningFactory = new SailingDataMiningFactory(getDataMiningServer().getExecutorService(),
getDataMiningServer().getStringMessages(),
getDataMiningServer().getFunctionProvider(),
getDataMiningServer().getDataRetrieverChainDefinitionProvider());
functionDTOFactory = new FunctionDTOFactory();
}
@@ -2,6 +2,7 @@ package com.sap.sse.datamining.impl.i18n;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import java.util.Locale;
import java.util.MissingResourceException;
@@ -36,6 +37,26 @@ public class TestI18N {
assertThat(testStringMessages.get(Locale.GERMAN, TEST_MESSAGE_WITH_PARAMETERS, "Param0", "Param1"), is("Deutsch Param0 - Param1"));
}
@Test
public void testDynamicCompoundStringMessages() {
CompoundDataMiningStringMessages compoundStringMessages = new CompoundDataMiningStringMessages();
try {
compoundStringMessages.get(Locale.ENGLISH, SIMPLE_TEST_MESSAGE_KEY);
fail("There shouldn't be a string message in an empty compound string messages");
} catch (MissingResourceException e) { }
compoundStringMessages.addStringMessages(testStringMessages);
assertThat(testStringMessages.get(Locale.ENGLISH, SIMPLE_TEST_MESSAGE_KEY), is("English"));
assertThat(testStringMessages.get(Locale.GERMAN, SIMPLE_TEST_MESSAGE_KEY), is("Deutsch"));
compoundStringMessages.removeStringMessages(testStringMessages);
try {
compoundStringMessages.get(Locale.ENGLISH, SIMPLE_TEST_MESSAGE_KEY);
fail("There shouldn't be a string message in an empty compound string messages");
} catch (MissingResourceException e) { }
}
@Test
public void testGetLocaleForLocaleInfoName() {
assertThat(DataMiningStringMessages.Util.getLocaleFor("default"), is(Locale.ENGLISH));
@@ -1,32 +1,8 @@
Average=Durchschnitt
Median=Median
Sum=Summe
Distance=Distanz
Speed=Geschwindigkeit
Meters=Metern
Knots=Knoten
InKnots=in Knoten
DistanceTraveled=zurückgelegte Distanz
Collecting=Sammlung
ResultSignifier={0} ({1})
SignifierInUnit={0} in {1}
Name=Name
LegType=Art des Schenkels
SailID=Segelnummer
Year=Jahr
LegNumber=Nummer des Schenkels
NationalityAcronym=Nationalität
Regatta=Regatta
CourseArea=Regattabahn
BoatClass=Bootsklasse
Fleet=Flotte
Race=Rennen
Competitor=Teilnehmer
Boat=Boot
Team=Team
SailingDomainRetrieverChain=Segel-Domänen Datenbeschaffer
LeaderboardGroup=Ranglisten Gruppe
RegattaLeaderboard=Regatta Rangliste
Leg=Schenkel
LegOfCompetitor=Schenkel eines Teilnehmers
GpsFix=GPS-Fix
SignifierInUnit={0} in {1}
@@ -1,32 +1,8 @@
Average=Average
Median=Median
Sum=Sum
Distance=Distance
Speed=Speed
Meters=meters
Knots=knots
InKnots=in knots
DistanceTraveled=Distance Traveled
Collecting=Collection
ResultSignifier={0} ({1})
SignifierInUnit={0} in {1}
Name=Name
LegType=Leg Type
SailID=Sail Number
Year=Year
LegNumber=Leg Number
NationalityAcronym=Nationality
Regatta=Regatta
CourseArea=Course Area
BoatClass=Boat Class
Fleet=Fleet
Race=Race
Competitor=Competitor
Boat=Boat
Team=Team
SailingDomainRetrieverChain=Sailing Domain Retriever
LeaderboardGroup=Leaderboard Group
RegattaLeaderboard=Regatta Leaderboard
Leg=Leg
LegOfCompetitor=Leg of competitor
GpsFix=GPS-Fix
SignifierInUnit={0} in {1}
@@ -1,12 +0,0 @@
package com.sap.sse.datamining;
import java.util.Set;
public interface ClassesWithFunctionsRegistrationService {
public void registerInternalClassesWithMarkedMethods(Set<Class<?>> classesToScan);
public void registerExternalLibraryClasses(Set<Class<?>> externalClassesToScan);
public void unregisterAllFunctionsOf(Set<Class<?>> classesToUnregister);
}
@@ -2,6 +2,7 @@ package com.sap.sse.datamining;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.functions.FunctionProvider;
@@ -10,6 +11,8 @@ import com.sap.sse.datamining.impl.DataRetrieverChainDefinitionProvider;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
public interface DataMiningServer {
public ExecutorService getExecutorService();
public DataMiningStringMessages getStringMessages();
@@ -1,8 +0,0 @@
package com.sap.sse.datamining;
public interface DataRetrieverChainDefinitionRegistrationService {
public void addDataRetrieverChainDefinition(DataRetrieverChainDefinition<?> dataRetrieverChainDefinition);
public void removeDataRetrieverChainDefinition(DataRetrieverChainDefinition<?> dataRetrieverChainDefinition);
}
@@ -3,9 +3,13 @@ package com.sap.sse.datamining;
import java.util.Collection;
import com.sap.sse.datamining.functions.FunctionRegistry;
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
public interface ModifiableDataMiningServer extends DataMiningServer {
public void addStringMessages(DataMiningStringMessages stringMessages);
public void removeStringMessages(DataMiningStringMessages stringMessages);
public FunctionRegistry getFunctionRegistry();
public void registerAllWithInternalFunctionPolicy(Collection<Class<?>> classesToScan);
@@ -16,7 +16,6 @@ public interface DataMiningStringMessages {
public String get(Locale locale, String messageKey);
public String get(Locale locale, String messageKey, String... parameters);
//TODO Replace with static method, after Java 8 can be used
public static final class Util {
private static boolean supportedLocalesHaveBeenInitialized = false;
@@ -2,7 +2,6 @@ package com.sap.sse.datamining.impl;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -12,10 +11,7 @@ import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
import com.sap.sse.datamining.ClassesWithFunctionsRegistrationService;
import com.sap.sse.datamining.DataMiningServer;
import com.sap.sse.datamining.DataRetrieverChainDefinition;
import com.sap.sse.datamining.DataRetrieverChainDefinitionRegistrationService;
import com.sap.sse.datamining.ModifiableDataMiningServer;
import com.sap.sse.datamining.functions.FunctionProvider;
import com.sap.sse.datamining.functions.FunctionRegistry;
@@ -23,7 +19,7 @@ import com.sap.sse.datamining.i18n.DataMiningStringMessages;
import com.sap.sse.datamining.impl.functions.RegistryFunctionProvider;
import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry;
public class DataMiningActivator implements BundleActivator, ClassesWithFunctionsRegistrationService, DataRetrieverChainDefinitionRegistrationService {
public class DataMiningActivator implements BundleActivator {
private static final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors(), 3);
private static final String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages";
@@ -31,20 +27,18 @@ public class DataMiningActivator implements BundleActivator, ClassesWithFunction
private static DataMiningActivator INSTANCE;
private final ModifiableDataMiningServer dataMiningServer;
private final DataMiningStringMessages stringMessages;
private final ExecutorService executor;
private Collection<ServiceRegistration<?>> serviceRegistrations;
public DataMiningActivator() {
stringMessages = DataMiningStringMessages.Util.getInstanceFor(STRING_MESSAGES_BASE_NAME);
executor = new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, 60, TimeUnit.SECONDS,
ExecutorService executor = new ThreadPoolExecutor(THREAD_POOL_SIZE, THREAD_POOL_SIZE, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
FunctionRegistry functionRegistry = new SimpleFunctionRegistry();
FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry);
DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry = new SimpleDataRetrieverChainDefinitionRegistry();
dataMiningServer = new DataMiningServerImpl(stringMessages, functionRegistry, functionProvider, dataRetrieverChainDefinitionRegistry);
dataMiningServer = new DataMiningServerImpl(executor, functionRegistry, functionProvider, dataRetrieverChainDefinitionRegistry);
dataMiningServer.addStringMessages(DataMiningStringMessages.Util.getInstanceFor(STRING_MESSAGES_BASE_NAME));
serviceRegistrations = new HashSet<>();
}
@@ -52,37 +46,9 @@ public class DataMiningActivator implements BundleActivator, ClassesWithFunction
@Override
public void start(BundleContext context) throws Exception {
INSTANCE = this;
serviceRegistrations.add(context.registerService(DataMiningServer.class, dataMiningServer, null));
serviceRegistrations.add(context.registerService(ClassesWithFunctionsRegistrationService.class, this, null));
serviceRegistrations.add(context.registerService(DataRetrieverChainDefinitionRegistrationService.class, this, null));
}
@Override
public void registerInternalClassesWithMarkedMethods(Set<Class<?>> classesToScan) {
dataMiningServer.registerAllWithInternalFunctionPolicy(classesToScan);
}
@Override
public void registerExternalLibraryClasses(Set<Class<?>> externalClassesToScan) {
dataMiningServer.registerAllWithExternalFunctionPolicy(externalClassesToScan);
}
@Override
public void unregisterAllFunctionsOf(Set<Class<?>> classesToUnregister) {
dataMiningServer.unregisterAllFunctionsOf(classesToUnregister);
}
@Override
public void addDataRetrieverChainDefinition(DataRetrieverChainDefinition<?> dataRetrieverChainDefinition) {
dataMiningServer.registerDataRetrieverChainDefinition(dataRetrieverChainDefinition);
}
@Override
public void removeDataRetrieverChainDefinition(DataRetrieverChainDefinition<?> dataRetrieverChainDefinition) {
dataMiningServer.unregisterDataRetrieverChainDefinition(dataRetrieverChainDefinition);
serviceRegistrations.add(context.registerService(ModifiableDataMiningServer.class, dataMiningServer, null));
}
@Override
@@ -91,14 +57,6 @@ public class DataMiningActivator implements BundleActivator, ClassesWithFunction
context.ungetService(serviceRegistration.getReference());
}
}
public ExecutorService getExecutor() {
return executor;
}
public DataMiningStringMessages getStringMessages() {
return stringMessages;
}
public static DataMiningActivator getDefault() {
if (INSTANCE == null) {
@@ -2,6 +2,7 @@ package com.sap.sse.datamining.impl;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import com.sap.sse.datamining.DataRetrieverChainDefinition;
import com.sap.sse.datamining.ModifiableDataMiningServer;
@@ -9,23 +10,46 @@ import com.sap.sse.datamining.functions.Function;
import com.sap.sse.datamining.functions.FunctionProvider;
import com.sap.sse.datamining.functions.FunctionRegistry;
import com.sap.sse.datamining.i18n.DataMiningStringMessages;
import com.sap.sse.datamining.impl.i18n.CompoundDataMiningStringMessages;
import com.sap.sse.datamining.shared.dto.FunctionDTO;
public class DataMiningServerImpl implements ModifiableDataMiningServer {
private final DataMiningStringMessages stringMessages;
private final CompoundDataMiningStringMessages stringMessages;
private final ExecutorService executorService;
private final FunctionRegistry functionRegistry;
private final FunctionProvider functionProvider;
private DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry;
public DataMiningServerImpl(DataMiningStringMessages stringMessages, FunctionRegistry functionRegistry, FunctionProvider functionProvider, DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) {
this.stringMessages = stringMessages;
public DataMiningServerImpl(ExecutorService executorService, FunctionRegistry functionRegistry, FunctionProvider functionProvider, DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) {
this.stringMessages = new CompoundDataMiningStringMessages();
this.executorService = executorService;
this.functionRegistry = functionRegistry;
this.functionProvider = functionProvider;
this.dataRetrieverChainDefinitionRegistry = dataRetrieverChainDefinitionRegistry;
}
@Override
public ExecutorService getExecutorService() {
return executorService;
}
@Override
public DataMiningStringMessages getStringMessages() {
return stringMessages;
}
@Override
public void addStringMessages(DataMiningStringMessages stringMessages) {
this.stringMessages.addStringMessages(stringMessages);
}
@Override
public void removeStringMessages(DataMiningStringMessages stringMessages) {
this.stringMessages.removeStringMessages(stringMessages);
}
@Override
public FunctionRegistry getFunctionRegistry() {
@@ -51,11 +75,6 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
public FunctionProvider getFunctionProvider() {
return functionProvider;
}
@Override
public DataMiningStringMessages getStringMessages() {
return stringMessages;
}
@Override
public Collection<Function<?>> getAllStatistics() {
@@ -17,11 +17,23 @@ public class CompoundDataMiningStringMessages implements DataMiningStringMessage
private static final Logger LOGGER = Logger.getLogger(CompoundDataMiningStringMessages.class.getSimpleName());
private final Collection<DataMiningStringMessages> stringMessages;
public CompoundDataMiningStringMessages() {
stringMessages = new HashSet<>();
}
public CompoundDataMiningStringMessages(Collection<DataMiningStringMessages> stringMessages) {
this.stringMessages = new HashSet<>(stringMessages);
}
public void addStringMessages(DataMiningStringMessages stringMessages) {
this.stringMessages.add(stringMessages);
}
public void removeStringMessages(DataMiningStringMessages stringMessages) {
this.stringMessages.remove(stringMessages);
}
@Override
public String get(Locale locale, String messageKey) {
return get(locale, messageKey, new String[0]);