diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java index 49f2431202f..3727481be44 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java @@ -2,6 +2,8 @@ package com.sap.sailing.datamining; import java.util.HashSet; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; @@ -12,27 +14,56 @@ 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; public class Activator implements BundleActivator { public static final String dataRetrieverGroupName = "Sailing"; + private static final Logger LOGGER = Logger.getLogger(Activator.class.getSimpleName()); private static BundleContext context; - private ServiceReference classesWithFunctionsRegistrationServiceReference; + private static ServiceReference classesWithFunctionsRegistrationServiceReference; + private static ServiceReference dataRetrieverChainDefinitionRegistrationServiceServiceReference; @Override public void start(BundleContext context) throws Exception { Activator.context = context; classesWithFunctionsRegistrationServiceReference = Activator.context.getServiceReference(ClassesWithFunctionsRegistrationService.class); - Activator.context.getService(classesWithFunctionsRegistrationServiceReference).registerInternalClassesWithMarkedMethods(getInternalClassesWithMarkedMethods()); - Activator.context.getService(classesWithFunctionsRegistrationServiceReference).registerExternalLibraryClasses(getExternalLibraryClasses()); + if (classesWithFunctionsRegistrationServiceReference != null) { + Activator.context.getService(classesWithFunctionsRegistrationServiceReference) + .registerInternalClassesWithMarkedMethods(getInternalClassesWithMarkedMethods()); + Activator.context.getService(classesWithFunctionsRegistrationServiceReference) + .registerExternalLibraryClasses(getExternalLibraryClasses()); + } else { + LOGGER.log(Level.WARNING, "Couldn't register the sailing classes with functions. No registration service was available."); + } + + dataRetrieverChainDefinitionRegistrationServiceServiceReference = Activator.context.getServiceReference(DataRetrieverChainDefinitionRegistrationService.class); + if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) { + for (DataRetrieverChainDefinition dataRetrieverChainDefinition : SailingDataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) { + Activator.context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference).addDataRetrieverChainDefinition(dataRetrieverChainDefinition); + } + } else { + LOGGER.log(Level.WARNING, "Couldn't register the sailing data retriever chain definitions. No registration service was available."); + } } @Override public void stop(BundleContext context) throws Exception { - Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(getInternalClassesWithMarkedMethods()); - Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf(getExternalLibraryClasses()); + if (classesWithFunctionsRegistrationServiceReference != null) { + Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf( + getInternalClassesWithMarkedMethods()); + Activator.context.getService(classesWithFunctionsRegistrationServiceReference).unregisterAllFunctionsOf( + getExternalLibraryClasses()); + } + + if (dataRetrieverChainDefinitionRegistrationServiceServiceReference != null) { + for (DataRetrieverChainDefinition dataRetrieverChainDefinition : SailingDataRetrieverChainDefinitions.getDataRetrieverChainDefinitions()) { + Activator.context.getService(dataRetrieverChainDefinitionRegistrationServiceServiceReference).removeDataRetrieverChainDefinition(dataRetrieverChainDefinition); + } + } } public static Set> getInternalClassesWithMarkedMethods() { diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingDataRetrieverChainDefinitions.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingDataRetrieverChainDefinitions.java new file mode 100644 index 00000000000..0082d5f52b6 --- /dev/null +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingDataRetrieverChainDefinitions.java @@ -0,0 +1,62 @@ +package com.sap.sailing.datamining; + +import java.util.ArrayList; +import java.util.Collection; + +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.sailing.datamining.impl.components.GPSFixRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor; +import com.sap.sailing.domain.leaderboard.LeaderboardGroup; +import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.datamining.DataRetrieverChainDefinition; +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition; + +public class SailingDataRetrieverChainDefinitions { + + private static Collection> dataRetrieverChainDefinitions; + + public static Collection> getDataRetrieverChainDefinitions() { + if (dataRetrieverChainDefinitions == null) { + initializeDataRetrieverChainDefinitions(); + } + return dataRetrieverChainDefinitions; + } + + private static void initializeDataRetrieverChainDefinitions() { + dataRetrieverChainDefinitions = new ArrayList<>(); + + DataRetrieverChainDefinition legRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(RacingEventService.class); + @SuppressWarnings("unchecked") + Class> leaderboardGroupRetrieverType = (Class>)(Class) LeaderboardGroupRetrievalProcessor.class; + legRetrieverChainDefinition.startWith(leaderboardGroupRetrieverType, LeaderboardGroup.class); + @SuppressWarnings("unchecked") + Class> regattaLeaderboardRetrieverType = (Class>)(Class) RegattaLeaderboardFilteringRetrievalProcessor.class; + legRetrieverChainDefinition.addAsLast(leaderboardGroupRetrieverType, regattaLeaderboardRetrieverType, RegattaLeaderboard.class); + @SuppressWarnings("unchecked") + Class> raceRetrieverType = (Class>)(Class) TrackedRaceFilteringRetrievalProcessor.class; + legRetrieverChainDefinition.addAsLast(regattaLeaderboardRetrieverType, raceRetrieverType, HasTrackedRaceContext.class); + @SuppressWarnings("unchecked") + Class> legRetrieverType = (Class>)(Class) TrackedLegFilteringRetrievalProcessor.class; + legRetrieverChainDefinition.addAsLast(raceRetrieverType, legRetrieverType, HasTrackedLegContext.class); + @SuppressWarnings("unchecked") + Class> legOfCompetitorRetrieverType = (Class>)(Class) TrackedLegOfCompetitorFilteringRetrievalProcessor.class; + legRetrieverChainDefinition.addAsLast(legRetrieverType, legOfCompetitorRetrieverType, HasTrackedLegOfCompetitorContext.class); + dataRetrieverChainDefinitions.add(legRetrieverChainDefinition); + + DataRetrieverChainDefinition gpsFixRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(legRetrieverChainDefinition); + @SuppressWarnings("unchecked") + Class> gpsFixRetrieverType = (Class>)(Class) GPSFixRetrievalProcessor.class; + gpsFixRetrieverChainDefinition.addAsLast(legOfCompetitorRetrieverType, gpsFixRetrieverType, HasGPSFixContext.class); + dataRetrieverChainDefinitions.add(gpsFixRetrieverChainDefinition); + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java index 6d89150156c..6a01d4092d7 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedLegContext.java @@ -12,9 +12,9 @@ public interface HasTrackedLegContext { public TrackedLeg getTrackedLeg(); - @Dimension(messageKey="LegType", ordinal=5) + @Dimension(messageKey="LegType", ordinal=6) public LegType getLegType(); - @Dimension(messageKey="LegNumber", ordinal=6) + @Dimension(messageKey="LegNumber", ordinal=7) public int getLegNumber(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java index eb2226089ff..2f579f18c91 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasTrackedRaceContext.java @@ -16,19 +16,19 @@ public interface HasTrackedRaceContext { @Connector(messageKey="Regatta", ordinal=0) public Regatta getRegatta(); - @Connector(messageKey="CourseArea", ordinal=2) + @Connector(messageKey="CourseArea", ordinal=3) public CourseArea getCourseArea(); @Connector(messageKey="BoatClass", ordinal=1) public BoatClass getBoatClass(); - @Connector(messageKey="Fleet", ordinal=3) + @Connector(messageKey="Fleet", ordinal=4) public Fleet getFleet(); - @Connector(messageKey="Race", ordinal=4) + @Connector(messageKey="Race", ordinal=5) public RaceDefinition getRace(); - @Dimension(messageKey="Year", ordinal=10) + @Dimension(messageKey="Year", ordinal=2) public Integer getYear(); } \ No newline at end of file diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java index 81ea1ad316d..a03717d23b5 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/factories/SailingDataMiningFactory.java @@ -3,6 +3,8 @@ package com.sap.sailing.datamining.factories; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -10,18 +12,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -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.sailing.datamining.impl.components.GPSFixRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.RegattaLeaderboardFilteringRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedLegFilteringRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorFilteringRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedRaceFilteringRetrievalProcessor; -import com.sap.sailing.domain.leaderboard.LeaderboardGroup; -import com.sap.sailing.domain.leaderboard.RegattaLeaderboard; import com.sap.sailing.server.RacingEventService; import com.sap.sse.datamining.DataRetrieverChainBuilder; import com.sap.sse.datamining.DataRetrieverChainDefinition; @@ -33,8 +23,8 @@ 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.DataRetrieverChainDefinitionRegistry; import com.sap.sse.datamining.impl.ProcessorQuery; -import com.sap.sse.datamining.impl.SimpleDataRetrieverChainDefinition; import com.sap.sse.datamining.impl.components.GroupedDataEntry; import com.sap.sse.datamining.impl.criterias.AndCompoundFilterCriterion; import com.sap.sse.datamining.impl.criterias.CompoundFilterCriterion; @@ -44,39 +34,9 @@ import com.sap.sse.datamining.shared.QueryDefinition; import com.sap.sse.datamining.shared.dto.FunctionDTO; public class SailingDataMiningFactory { - - // TODO Remove after the DataRetrieverChainDefinitionProvider has been implemented - private final DataRetrieverChainDefinition dataRetrieverChainDefinition; - - public SailingDataMiningFactory() { - dataRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(RacingEventService.class); - - @SuppressWarnings("unchecked") - Class> leaderboardGroupRetrieverType = (Class>)(Class) LeaderboardGroupRetrievalProcessor.class; - dataRetrieverChainDefinition.startWith(leaderboardGroupRetrieverType, LeaderboardGroup.class); - - @SuppressWarnings("unchecked") - Class> regattaLeaderboardRetrieverType = (Class>)(Class) RegattaLeaderboardFilteringRetrievalProcessor.class; - dataRetrieverChainDefinition.addAsLast(leaderboardGroupRetrieverType, regattaLeaderboardRetrieverType, RegattaLeaderboard.class); - @SuppressWarnings("unchecked") - Class> raceRetrieverType = (Class>)(Class) TrackedRaceFilteringRetrievalProcessor.class; - dataRetrieverChainDefinition.addAsLast(regattaLeaderboardRetrieverType, raceRetrieverType, HasTrackedRaceContext.class); - - @SuppressWarnings("unchecked") - Class> legRetrieverType = (Class>)(Class) TrackedLegFilteringRetrievalProcessor.class; - dataRetrieverChainDefinition.addAsLast(raceRetrieverType, legRetrieverType, HasTrackedLegContext.class); - - @SuppressWarnings("unchecked") - Class> legOfCompetitorRetrieverType = (Class>)(Class) TrackedLegOfCompetitorFilteringRetrievalProcessor.class; - dataRetrieverChainDefinition.addAsLast(legRetrieverType, legOfCompetitorRetrieverType, HasTrackedLegOfCompetitorContext.class); - - @SuppressWarnings("unchecked") - Class> gpsFixRetrieverType = (Class>)(Class) GPSFixRetrievalProcessor.class; - dataRetrieverChainDefinition.addAsLast(legOfCompetitorRetrieverType, gpsFixRetrieverType, HasGPSFixContext.class); - } - - public Query createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition, final FunctionProvider functionProvider) { + public Query createQuery(RacingEventService dataSource, final QueryDefinition queryDefinition, + final FunctionProvider functionProvider, final DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) { return new ProcessorQuery(DataMiningActivator.getExecutor(), dataSource, DataMiningActivator.getStringMessages(), DataMiningStringMessages.Util.getLocaleFor(queryDefinition.getLocaleInfoName())) { @Override @@ -91,9 +51,10 @@ public class SailingDataMiningFactory { @SuppressWarnings("unchecked") Processor> groupingProcessor = ProcessorFactory.createGroupingProcessor((Class) extractionFunction.getDeclaringType(), extractionProcessor, dimensionsToGroupBy); + Class dataTypeToRetrieve = extractionFunction.getDeclaringType(); + DataRetrieverChainDefinition dataRetrieverChainDefinition = getDataRetrieverChainDefinition(dataRetrieverChainDefinitionRegistry, dataTypeToRetrieve); DataRetrieverChainBuilder chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor()); Map, FilterCriterion> criteriaMappedByDataType = createFilterCriteria(queryDefinition.getFilterSelection(), functionProvider); - Class dataTypeToRetrieve = extractionFunction.getDeclaringType(); do { if (criteriaMappedByDataType.containsKey(chainBuilder.getCurrentRetrievedDataType())) { chainBuilder.setFilter(criteriaMappedByDataType.get(chainBuilder.getCurrentRetrievedDataType())); @@ -132,15 +93,18 @@ public class SailingDataMiningFactory { return (Map, FilterCriterion>)(Map, ?>) criteriaMappedByDataType; } - public Query> createDimensionValuesQuery(RacingEventService dataSource, final Collection dimensionDTOs, final FunctionProvider functionProvider) { + public Query> createDimensionValuesQuery(RacingEventService dataSource, final Collection dimensionDTOs, + final FunctionProvider functionProvider, final DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) { return new ProcessorQuery, RacingEventService>(DataMiningActivator.getExecutor(), dataSource) { @Override protected Processor createFirstProcessor() { Processor, Map>> valueCollector = ProcessorFactory.createGroupedDataCollectingAsSetProcessor(/*query*/ this); - - DataRetrieverChainBuilder chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor()); + Collection> dimensions = convertDTOsToFunctions(dimensionDTOs, functionProvider); + Class dataTypeToRetrieve = getDeepestDataType(dimensions); Map, Collection>> dimensionsMappedByDeclaringType = mapFunctionsByDeclaringType(dimensions); + DataRetrieverChainDefinition dataRetrieverChainDefinition = getDataRetrieverChainDefinition(dataRetrieverChainDefinitionRegistry, dataTypeToRetrieve); + DataRetrieverChainBuilder chainBuilder = dataRetrieverChainDefinition.startBuilding(DataMiningActivator.getExecutor()); while (!dimensionsMappedByDeclaringType.isEmpty()) { Class dataType = chainBuilder.getCurrentRetrievedDataType(); @@ -182,4 +146,22 @@ public class SailingDataMiningFactory { return mappedFunctions; } + protected Class getDeepestDataType(Collection> dimensions) { + List> sortedDimensions = new ArrayList<>(dimensions); + Collections.sort(sortedDimensions, new Comparator>() { + @Override + public int compare(Function d1, Function d2) { + return Integer.compare(d1.getOrdinal(), d2.getOrdinal()); + } + }); + return sortedDimensions.get(sortedDimensions.size() - 1).getDeclaringType(); + } + + private DataRetrieverChainDefinition getDataRetrieverChainDefinition( + final DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry, + Class dataTypeToRetrieve) { + // There's currently only one DataRetrieverChainDefinition per possible dataTypeToRetrieve + return dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(RacingEventService.class, dataTypeToRetrieve).iterator().next(); + } + } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java index bab5f9f8a7d..5d3b4d1d2e7 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java @@ -6,10 +6,10 @@ import com.sap.sse.datamining.shared.annotations.Connector; import com.sap.sse.common.Named; public interface Competitor extends Named, WithID, IsManagedBySharedDomainFactory { - @Connector(messageKey="Team", ordinal=8) + @Connector(messageKey="Team", ordinal=9) Team getTeam(); - @Connector(messageKey="Boat", ordinal=9) + @Connector(messageKey="Boat", ordinal=10) Boat getBoat(); Color getColor(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java index 25d834b52f4..6f2dfde9ee7 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/DataMiningServiceImpl.java @@ -96,14 +96,18 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM @Override public QueryResult> getDimensionValuesFor(Collection dimensions) throws Exception { - Query> dimensionValuesQuery = sailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), dimensions, getDataMiningServer().getFunctionProvider()); + Query> dimensionValuesQuery = sailingDataMiningFactory.createDimensionValuesQuery(getRacingEventService(), dimensions, + getDataMiningServer().getFunctionProvider(), + getDataMiningServer().getDataRetrieverChainDefinitionRegistry()); return dimensionValuesQuery.run(); } @Override public QueryResult runQuery(QueryDefinition queryDefinition) throws Exception { @SuppressWarnings("unchecked") // TODO Fix after the data mining has been cleaned - Query query = (Query) sailingDataMiningFactory.createQuery(getRacingEventService(), queryDefinition, getDataMiningServer().getFunctionProvider()); + Query query = (Query) sailingDataMiningFactory.createQuery(getRacingEventService(), queryDefinition, + getDataMiningServer().getFunctionProvider(), + getDataMiningServer().getDataRetrieverChainDefinitionRegistry()); return query.run(); } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainDefinitionRegistry.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainDefinitionRegistry.java index 992cc25adb6..8fd16acccde 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainDefinitionRegistry.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/TestDataRetrieverChainDefinitionRegistry.java @@ -65,9 +65,30 @@ public class TestDataRetrieverChainDefinitionRegistry { expectedDataRetrieverChainDefinitions.add(legRetrieverChainDefinition); assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedDataRetrieverChainDefinitions)); } + + @SuppressWarnings("unchecked") + @Test + public void testRemoveDataRetrieverChainDefinition() { + Class> dataSourceType = (Class>)(Class) Collection.class; + + dataRetrieverChainDefinitionRegistry.remove(legRetrieverChainDefinition); + Collection>> expectedEmptyDataRetrieverChainDefinitions = new HashSet<>(); + assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedEmptyDataRetrieverChainDefinitions)); + } + + @SuppressWarnings("unchecked") + @Test + public void testAddingDataRetrieverChainDefinitionTwice() { + Class> dataSourceType = (Class>)(Class) Collection.class; + + dataRetrieverChainDefinitionRegistry.add(legRetrieverChainDefinition); + Collection>> expectedDataRetrieverChainDefinitions = new HashSet<>(); + expectedDataRetrieverChainDefinitions.add(legRetrieverChainDefinition); + assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(dataSourceType, Test_HasLegOfCompetitorContext.class), is(expectedDataRetrieverChainDefinitions)); + } @Test - public void testGetDataRetrieverChainDefinitionsForNotRegisteresChain() { + public void testGetDataRetrieverChainDefinitionsForNotRegisteredChain() { Collection> expectedEmptyDataRetrieverChainDefinitions = new HashSet>(); assertThat(dataRetrieverChainDefinitionRegistry.getDataRetrieverChainDefinitions(Test_Regatta.class, Test_HasRaceContextImpl.class), is(expectedEmptyDataRetrieverChainDefinitions)); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java index 15baf498577..1d9b9394d08 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataMiningServer.java @@ -3,13 +3,15 @@ package com.sap.sse.datamining; 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.DataRetrieverChainDefinitionRegistry; public interface DataMiningServer { - public FunctionRegistry getFunctionRegistry(); - - public FunctionProvider getFunctionProvider(); - public DataMiningStringMessages getStringMessages(); + public FunctionRegistry getFunctionRegistry(); + public FunctionProvider getFunctionProvider(); + + public DataRetrieverChainDefinitionRegistry getDataRetrieverChainDefinitionRegistry(); + } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinitionRegistrationService.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinitionRegistrationService.java new file mode 100644 index 00000000000..3b14f91e650 --- /dev/null +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainDefinitionRegistrationService.java @@ -0,0 +1,8 @@ +package com.sap.sse.datamining; + +public interface DataRetrieverChainDefinitionRegistrationService { + + public void addDataRetrieverChainDefinition(DataRetrieverChainDefinition dataRetrieverChainDefinition); + public void removeDataRetrieverChainDefinition(DataRetrieverChainDefinition dataRetrieverChainDefinition); + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java index fce7d779e12..fa91c9e081b 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningActivator.java @@ -13,13 +13,15 @@ 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.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; 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 { +public class DataMiningActivator implements BundleActivator, ClassesWithFunctionsRegistrationService, DataRetrieverChainDefinitionRegistrationService { private static final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors(), 3); private static final String STRING_MESSAGES_BASE_NAME = "stringmessages/StringMessages"; @@ -41,15 +43,17 @@ public class DataMiningActivator implements BundleActivator, ClassesWithFunction FunctionRegistry functionRegistry = new SimpleFunctionRegistry(); FunctionProvider functionProvider = new RegistryFunctionProvider(functionRegistry); - dataMiningServer = new DataMiningServerImpl(stringMessages, functionRegistry, functionProvider); + DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry = new SimpleDataRetrieverChainDefinitionRegistry(); + dataMiningServer = new DataMiningServerImpl(stringMessages, functionRegistry, functionProvider, dataRetrieverChainDefinitionRegistry); serviceRegistrations = new HashSet<>(); registerDataMiningServer(); - registerClassesWithFunctionsRegistrationService(); + registerRegistrationServices(); } - private void registerClassesWithFunctionsRegistrationService() { + private void registerRegistrationServices() { serviceRegistrations.add(context.registerService(ClassesWithFunctionsRegistrationService.class, this, null)); + serviceRegistrations.add(context.registerService(DataRetrieverChainDefinitionRegistrationService.class, this, null)); } private void registerDataMiningServer() { @@ -70,6 +74,17 @@ public class DataMiningActivator implements BundleActivator, ClassesWithFunction public void unregisterAllFunctionsOf(Set> classesToUnregister) { dataMiningServer.getFunctionRegistry().unregisterAllFunctionsOf(classesToUnregister); } + + @Override + public void addDataRetrieverChainDefinition(DataRetrieverChainDefinition dataRetrieverChainDefinition) { + dataMiningServer.getDataRetrieverChainDefinitionRegistry().add(dataRetrieverChainDefinition); + } + + @Override + public void removeDataRetrieverChainDefinition(DataRetrieverChainDefinition dataRetrieverChainDefinition) { + dataMiningServer.getDataRetrieverChainDefinitionRegistry().remove(dataRetrieverChainDefinition); + + } @Override public void stop(BundleContext context) throws Exception { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java index 2a017557452..cdf15014ea0 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataMiningServerImpl.java @@ -8,13 +8,17 @@ import com.sap.sse.datamining.i18n.DataMiningStringMessages; public class DataMiningServerImpl implements DataMiningServer { private final DataMiningStringMessages stringMessages; + private final FunctionRegistry functionRegistry; private final FunctionProvider functionProvider; + + private DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry; - public DataMiningServerImpl(DataMiningStringMessages stringMessages, FunctionRegistry functionRegistry, FunctionProvider functionProvider) { + public DataMiningServerImpl(DataMiningStringMessages stringMessages, FunctionRegistry functionRegistry, FunctionProvider functionProvider, DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry) { this.stringMessages = stringMessages; this.functionRegistry = functionRegistry; this.functionProvider = functionProvider; + this.dataRetrieverChainDefinitionRegistry = dataRetrieverChainDefinitionRegistry; } @Override @@ -32,4 +36,9 @@ public class DataMiningServerImpl implements DataMiningServer { return stringMessages; } + @Override + public DataRetrieverChainDefinitionRegistry getDataRetrieverChainDefinitionRegistry() { + return dataRetrieverChainDefinitionRegistry; + } + } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataRetrieverChainDefinitionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataRetrieverChainDefinitionRegistry.java index fac4329c5e6..c39e750be1c 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataRetrieverChainDefinitionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/DataRetrieverChainDefinitionRegistry.java @@ -6,7 +6,8 @@ import com.sap.sse.datamining.DataRetrieverChainDefinition; public interface DataRetrieverChainDefinitionRegistry { - public void add(DataRetrieverChainDefinition raceRetrieverChainDefinition); + public void add(DataRetrieverChainDefinition dataRetrieverChainDefinition); + public void remove(DataRetrieverChainDefinition dataRetrieverChainDefinition); public Collection> getDataRetrieverChainDefinitions( Class dataSourceType, Class retrievedDataType); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinitionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinitionRegistry.java index a1fba3d175c..a85ec6f82f8 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinitionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinitionRegistry.java @@ -17,12 +17,20 @@ public class SimpleDataRetrieverChainDefinitionRegistry implements DataRetriever } @Override - public void add(DataRetrieverChainDefinition raceRetrieverChainDefinition) { - RegistrationKey key = new RegistrationKey(raceRetrieverChainDefinition.getDataSourceType(), raceRetrieverChainDefinition.getRetrievedDataType()); + public void add(DataRetrieverChainDefinition dataRetrieverChainDefinition) { + RegistrationKey key = new RegistrationKey(dataRetrieverChainDefinition.getDataSourceType(), dataRetrieverChainDefinition.getRetrievedDataType()); if (!chainDefinitions.containsKey(key)) { chainDefinitions.put(key, new HashSet>()); } - chainDefinitions.get(key).add(raceRetrieverChainDefinition); + chainDefinitions.get(key).add(dataRetrieverChainDefinition); + } + + @Override + public void remove(DataRetrieverChainDefinition dataRetrieverChainDefinition) { + RegistrationKey key = new RegistrationKey(dataRetrieverChainDefinition.getDataSourceType(), dataRetrieverChainDefinition.getRetrievedDataType()); + if (chainDefinitions.containsKey(key)) { + chainDefinitions.get(key).remove(dataRetrieverChainDefinition); + } } @SuppressWarnings("unchecked")