mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-22 12:03:58 +00:00
Merge remote-tracking branch 'server/master'
This commit is contained in:
commit
6f37a77db6
40 files changed
+474
-261
No files matched your search
@@ -46,7 +46,7 @@ public class Activator extends AbstractDataMiningActivator {
|
||||
|
||||
public Activator() {
|
||||
dataRetrieverChainDefinitions = new SailingDataRetrievalChainDefinitions();
|
||||
sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
|
||||
sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClassLoader());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-4
@@ -77,7 +77,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
|
||||
@Override
|
||||
public HashSet<FunctionDTO> getStatisticsFor(DataRetrieverChainDefinitionDTO retrieverChainDefinition, String localeInfoName) {
|
||||
Class<?> retrievedDataType = getDataMiningServer().getDataRetrieverChainDefinition(retrieverChainDefinition.getId()).getRetrievedDataType();
|
||||
Class<?> retrievedDataType = getDataMiningServer().getDataRetrieverChainDefinitionForDTO(retrieverChainDefinition).getRetrievedDataType();
|
||||
Iterable<Function<?>> statistics = getDataMiningServer().getStatisticsFor(retrievedDataType);
|
||||
return functionsAsDTOs(statistics, localeInfoName);
|
||||
}
|
||||
@@ -121,7 +121,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
|
||||
@Override
|
||||
public HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getDimensionsMappedByLevelFor(DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName) {
|
||||
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinition(dataRetrieverChainDefinitionDTO.getId());
|
||||
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinitionForDTO(dataRetrieverChainDefinitionDTO);
|
||||
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> dimensions = getDataMiningServer()
|
||||
.getDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
|
||||
return dimensionsMappedByLevelAsDTOs(dimensions, localeInfoName);
|
||||
@@ -130,7 +130,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
@Override
|
||||
public HashMap<DataRetrieverLevelDTO, HashSet<FunctionDTO>> getReducedDimensionsMappedByLevelFor(
|
||||
DataRetrieverChainDefinitionDTO dataRetrieverChainDefinitionDTO, String localeInfoName) {
|
||||
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinition(dataRetrieverChainDefinitionDTO.getId());
|
||||
DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition = getDataMiningServer().getDataRetrieverChainDefinitionForDTO(dataRetrieverChainDefinitionDTO);
|
||||
Map<DataRetrieverLevel<?, ?>, Iterable<Function<?>>> reducedDimensions = getDataMiningServer()
|
||||
.getReducedDimensionsMappedByLevelFor(dataRetrieverChainDefinition);
|
||||
return dimensionsMappedByLevelAsDTOs(reducedDimensions, localeInfoName);
|
||||
@@ -191,7 +191,7 @@ public class DataMiningServiceImpl extends RemoteServiceServlet implements DataM
|
||||
DataRetrieverLevelDTO retrieverLevelDTO, HashSet<FunctionDTO> dimensionDTOs, HashMap<DataRetrieverLevelDTO, SerializableSettings> retrieverSettingsDTO,
|
||||
HashMap<DataRetrieverLevelDTO, HashMap<FunctionDTO, HashSet<? extends Serializable>>> filterSelectionDTO, String localeInfoName) {
|
||||
DataMiningServer dataMiningServer = getDataMiningServer();
|
||||
DataRetrieverChainDefinition<RacingEventService, ?> retrieverChainDefinition = dataMiningServer.getDataRetrieverChainDefinition(dataRetrieverChainDefinitionDTO.getId());
|
||||
DataRetrieverChainDefinition<RacingEventService, ?> retrieverChainDefinition = dataMiningServer.getDataRetrieverChainDefinitionForDTO(dataRetrieverChainDefinitionDTO);
|
||||
DataRetrieverLevel<?, ?> retrieverLevel = retrieverChainDefinition.getDataRetrieverLevel(retrieverLevelDTO.getLevel());
|
||||
Iterable<Function<?>> dimensions = functionDTOsAsFunctions(dimensionDTOs);
|
||||
Map<DataRetrieverLevel<?, ?>, SerializableSettings> retrieverSettings = retrieverSettingsDTOAsRetrieverSettings(retrieverSettingsDTO, retrieverChainDefinition);
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ public class Activator extends AbstractDataMiningActivator {
|
||||
|
||||
public Activator() {
|
||||
dataRetrieverChainDefinitions = new PolarsDataRetrievalChainDefinitions();
|
||||
sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClass().getClassLoader());
|
||||
sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClassLoader());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
@@ -230,6 +230,7 @@ import com.sap.sse.replication.OperationWithResult;
|
||||
import com.sap.sse.replication.ReplicationMasterDescriptor;
|
||||
import com.sap.sse.replication.impl.OperationWithResultWithIdWrapper;
|
||||
import com.sap.sse.util.ClearStateTestSupport;
|
||||
import com.sap.sse.util.JoinedClassLoader;
|
||||
import com.sap.sse.util.impl.ThreadFactoryWithPriority;
|
||||
|
||||
public class RacingEventServiceImpl implements RacingEventService, ClearStateTestSupport, RegattaListener,
|
||||
|
||||
+17
-19
@@ -3,38 +3,31 @@ package com.sap.sse.datamining.shared.impl.dto;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.common.settings.SerializableSettings;
|
||||
|
||||
public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable<DataRetrieverChainDefinitionDTO> {
|
||||
private static final long serialVersionUID = 7806173601799997214L;
|
||||
|
||||
private UUID id;
|
||||
private String name;
|
||||
private String dataSourceTypeName;
|
||||
|
||||
private ArrayList<DataRetrieverLevelDTO> retrieverLevels;
|
||||
|
||||
private String displayName;
|
||||
|
||||
/**
|
||||
* <b>Constructor for the GWT-Serialization. Don't use this!</b>
|
||||
*/
|
||||
@Deprecated
|
||||
DataRetrieverChainDefinitionDTO() { }
|
||||
|
||||
public DataRetrieverChainDefinitionDTO(UUID id, String name, String dataSourceTypeName, ArrayList<DataRetrieverLevelDTO> retrieverLevels) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
public DataRetrieverChainDefinitionDTO(String name, String dataSourceTypeName, ArrayList<DataRetrieverLevelDTO> retrieverLevels) {
|
||||
this.displayName = name;
|
||||
this.dataSourceTypeName = dataSourceTypeName;
|
||||
this.retrieverLevels = new ArrayList<>(retrieverLevels);
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
return displayName;
|
||||
}
|
||||
|
||||
public String getDataSourceTypeName() {
|
||||
@@ -112,15 +105,15 @@ public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getDataSourceTypeName() + " -> " + getRetrievedDataTypeName() +
|
||||
"[ID: " + id + ", name: " + name + "]";
|
||||
return getDataSourceTypeName() + " -> " + getRetrievedDataTypeName() + "[name: " + displayName + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
result = prime * result + ((dataSourceTypeName == null) ? 0 : dataSourceTypeName.hashCode());
|
||||
result = prime * result + ((retrieverLevels == null) ? 0 : retrieverLevels.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -133,10 +126,15 @@ public class DataRetrieverChainDefinitionDTO implements Serializable, Comparable
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
DataRetrieverChainDefinitionDTO other = (DataRetrieverChainDefinitionDTO) obj;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
if (dataSourceTypeName == null) {
|
||||
if (other.dataSourceTypeName != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
} else if (!dataSourceTypeName.equals(other.dataSourceTypeName))
|
||||
return false;
|
||||
if (retrieverLevels == null) {
|
||||
if (other.retrieverLevels != null)
|
||||
return false;
|
||||
} else if (!retrieverLevels.equals(other.retrieverLevels))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
-1
@@ -12,7 +12,6 @@ public class DataRetrieverLevelDTO implements Serializable, Comparable<DataRetri
|
||||
private LocalizedTypeDTO retrievedDataType;
|
||||
private SerializableSettings defaultSettings;
|
||||
|
||||
|
||||
/**
|
||||
* <b>Constructor for the GWT-Serialization. Don't use this!</b>
|
||||
*/
|
||||
|
||||
+2
-3
@@ -10,7 +10,6 @@ import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.RejectedExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
@@ -306,7 +305,7 @@ public class TestProcessorQuery {
|
||||
|
||||
@Test
|
||||
public void testQueryAdditionalData() {
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData(UUID.randomUUID());
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData();
|
||||
Query<?> query = new ProcessorQuery<Double, Double>(0.0, Double.class, additionalData) {
|
||||
@Override
|
||||
protected Processor<Double, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, Double>, Void> resultReceiver) {
|
||||
@@ -317,7 +316,7 @@ public class TestProcessorQuery {
|
||||
assertThat(query.getAdditionalData(AdditionalStatisticQueryData.class), is(additionalData));
|
||||
assertThat(query.getAdditionalData(AdditionalDimensionValuesQueryData.class), nullValue());
|
||||
|
||||
additionalData = new AdditionalDimensionValuesQueryData(UUID.randomUUID(), new ArrayList<Function<?>>());
|
||||
additionalData = new AdditionalDimensionValuesQueryData(new ArrayList<Function<?>>());
|
||||
query = new ProcessorQuery<Double, Double>(0.0, Double.class, additionalData) {
|
||||
@Override
|
||||
protected Processor<Double, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, Double>, Void> resultReceiver) {
|
||||
|
||||
+2
-2
@@ -87,8 +87,8 @@ public class TestDataRetrieverChainCreation {
|
||||
|
||||
List<DataRetrieverLevel<?, ?>> cloneDataRetrieverTypesWithInformation = (List<DataRetrieverLevel<?, ?>>) chainClone.getDataRetrieverLevels();
|
||||
assertThat(cloneDataRetrieverTypesWithInformation, is(dataRetrieverChainDefinition.getDataRetrieverLevels()));
|
||||
|
||||
assertThat(chainClone.getID(), not(dataRetrieverChainDefinition.getID()));
|
||||
|
||||
assertThat(chainClone, not(dataRetrieverChainDefinition));
|
||||
|
||||
chainClone.startBuilding(ConcurrencyTestsUtil.getExecutor());
|
||||
}
|
||||
|
||||
+87
-19
@@ -1,11 +1,15 @@
|
||||
package com.sap.sse.datamining.impl.components.management;
|
||||
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -13,11 +17,19 @@ import org.junit.Test;
|
||||
import com.sap.sse.datamining.ModifiableDataMiningServer;
|
||||
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.Processor;
|
||||
import com.sap.sse.datamining.factories.DataMiningDTOFactory;
|
||||
import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor;
|
||||
import com.sap.sse.datamining.impl.components.SimpleDataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.impl.components.SingleDataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO;
|
||||
import com.sap.sse.datamining.test.data.Test_HasLegOfCompetitorContext;
|
||||
import com.sap.sse.datamining.test.data.Test_HasRaceContext;
|
||||
import com.sap.sse.datamining.test.data.Test_HasRaceContextImpl;
|
||||
import com.sap.sse.datamining.test.domain.Test_Race;
|
||||
import com.sap.sse.datamining.test.domain.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.domain.Test_Series;
|
||||
import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil;
|
||||
import com.sap.sse.datamining.test.util.TestsUtil;
|
||||
import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor;
|
||||
@@ -26,6 +38,9 @@ import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor
|
||||
|
||||
public class TestDataRetrieverChainDefinitionManagement {
|
||||
|
||||
private static final DataMiningDTOFactory dtoFactory = new DataMiningDTOFactory();
|
||||
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>, Test_Regatta> regattaRetrieverChainDefinition;
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>, Test_HasRaceContext> raceRetrieverChainDefinition;
|
||||
private DataRetrieverChainDefinition<Collection<Test_Regatta>, Test_HasLegOfCompetitorContext> legRetrieverChainDefinition;
|
||||
private ModifiableDataMiningServer server;
|
||||
@@ -33,23 +48,14 @@ public class TestDataRetrieverChainDefinitionManagement {
|
||||
@SuppressWarnings("unchecked")
|
||||
@Before
|
||||
public void initializeRetrieverChainsAndRegistry() {
|
||||
raceRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, Test_HasRaceContext.class, "TestRaceRetrieverChain");
|
||||
Class<Processor<Collection<Test_Regatta>, Test_Regatta>> regattaRetrieverClass = (Class<Processor<Collection<Test_Regatta>, Test_Regatta>>)(Class<?>) TestRegattaRetrievalProcessor.class;
|
||||
raceRetrieverChainDefinition.startWith(regattaRetrieverClass, Test_Regatta.class, "regatta");
|
||||
regattaRetrieverChainDefinition = new SingleDataRetrieverChainDefinition<>((Class<Collection<Test_Regatta>>)(Class<?>) Collection.class, Test_Regatta.class, "TestRaceRetrieverChain");
|
||||
regattaRetrieverChainDefinition.startWith(TestRegattaRetrievalProcessor.class, Test_Regatta.class, "regatta");
|
||||
|
||||
Class<Processor<Test_Regatta, Test_HasRaceContext>> raceRetrieverClass =
|
||||
(Class<Processor<Test_Regatta, Test_HasRaceContext>>)(Class<?>) TestRaceWithContextRetrievalProcessor.class;
|
||||
raceRetrieverChainDefinition.endWith(regattaRetrieverClass,
|
||||
raceRetrieverClass,
|
||||
Test_HasRaceContext.class, "race");
|
||||
raceRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(regattaRetrieverChainDefinition, Test_HasRaceContext.class, "TestRaceRetrieverChain");
|
||||
raceRetrieverChainDefinition.endWith(TestRegattaRetrievalProcessor.class, TestRaceWithContextRetrievalProcessor.class, Test_HasRaceContext.class, "race");
|
||||
|
||||
legRetrieverChainDefinition = new SimpleDataRetrieverChainDefinition<>(raceRetrieverChainDefinition, Test_HasLegOfCompetitorContext.class, "TestLegRetrieverChain");
|
||||
|
||||
Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>> legRetrieverClass =
|
||||
(Class<Processor<Test_HasRaceContext, Test_HasLegOfCompetitorContext>>)(Class<?>) TestLegOfCompetitorWithContextRetrievalProcessor.class;
|
||||
legRetrieverChainDefinition.endWith(raceRetrieverClass,
|
||||
legRetrieverClass,
|
||||
Test_HasLegOfCompetitorContext.class, "legOfCompetitor");
|
||||
legRetrieverChainDefinition.endWith(TestRaceWithContextRetrievalProcessor.class, TestLegOfCompetitorWithContextRetrievalProcessor.class, Test_HasLegOfCompetitorContext.class, "legOfCompetitor");
|
||||
|
||||
server = TestsUtil.createNewServer();
|
||||
server.registerDataRetrieverChainDefinition(raceRetrieverChainDefinition);
|
||||
@@ -73,6 +79,7 @@ public class TestDataRetrieverChainDefinitionManagement {
|
||||
expectedRetrieverChainDefinitions.add(raceRetrieverChainDefinition);
|
||||
expectedRetrieverChainDefinitions.add(legRetrieverChainDefinition);
|
||||
assertThat(server.getDataRetrieverChainDefinitionsBySourceType(dataSourceType), is(expectedRetrieverChainDefinitions));
|
||||
assertThat(server.getDataRetrieverChainDefinitions(), is(expectedRetrieverChainDefinitions));
|
||||
|
||||
expectedRetrieverChainDefinitions = new HashSet<>();
|
||||
expectedRetrieverChainDefinitions.add(legRetrieverChainDefinition);
|
||||
@@ -84,12 +91,40 @@ public class TestDataRetrieverChainDefinitionManagement {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSingleGetDataRetrieverChainDefinition() {
|
||||
assertThat(server.getDataRetrieverChainDefinition(raceRetrieverChainDefinition.getID()),
|
||||
is(raceRetrieverChainDefinition));
|
||||
public void testGetDataRetrieverChainDefinitionForDTO() {
|
||||
DataRetrieverChainDefinitionDTO raceRetrieverChainDTO = dtoFactory.createDataRetrieverChainDefinitionDTO(raceRetrieverChainDefinition);
|
||||
assertThat(server.getDataRetrieverChainDefinitionForDTO(raceRetrieverChainDTO), is(raceRetrieverChainDefinition));
|
||||
|
||||
DataRetrieverChainDefinitionDTO legRetrieverChainDTO = dtoFactory.createDataRetrieverChainDefinitionDTO(legRetrieverChainDefinition);
|
||||
assertThat(server.getDataRetrieverChainDefinitionForDTO(legRetrieverChainDTO), is(legRetrieverChainDefinition));
|
||||
|
||||
assertThat(server.getDataRetrieverChainDefinition(legRetrieverChainDefinition.getID()),
|
||||
is(legRetrieverChainDefinition));
|
||||
ArrayList<DataRetrieverLevelDTO> retrieverLevels = new ArrayList<DataRetrieverLevelDTO>();
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(0, TestRegattaRetrievalProcessor.class.getName(), new LocalizedTypeDTO("Not relevant", "Not relevant"), null));
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(1, TestSeriesRetrievalProcessor.class.getName(), new LocalizedTypeDTO("Not relevant", "Not relevant"), null));
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(2, TestRaceFromSeriesRetrievalProcessor.class.getName(), new LocalizedTypeDTO(Test_HasRaceContext.class.getName(), "Not relevant"), null));
|
||||
DataRetrieverChainDefinitionDTO dtoWithMoreLevels = new DataRetrieverChainDefinitionDTO("Not relevant", Collection.class.getName(), retrieverLevels);
|
||||
assertThat(server.getDataRetrieverChainDefinitionForDTO(dtoWithMoreLevels), nullValue());
|
||||
|
||||
retrieverLevels = new ArrayList<DataRetrieverLevelDTO>();
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(0, TestRaceWithContextRetrievalProcessor.class.getName(), new LocalizedTypeDTO(Test_Race.class.getName(), "Race"), null));
|
||||
DataRetrieverChainDefinitionDTO dtoWithLessLevels = new DataRetrieverChainDefinitionDTO("Not relevant", Test_Regatta.class.getName(), retrieverLevels);
|
||||
assertThat(server.getDataRetrieverChainDefinitionForDTO(dtoWithLessLevels), nullValue());
|
||||
|
||||
retrieverLevels = new ArrayList<DataRetrieverLevelDTO>();
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(0, TestRegattaRetrievalProcessor.class.getName(), new LocalizedTypeDTO("Not relevant", "Not relevant"), null));
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(1, TestRaceFromSeriesRetrievalProcessor.class.getName(), new LocalizedTypeDTO(Test_HasRaceContext.class.getName(), "Not relevant"), null));
|
||||
DataRetrieverChainDefinitionDTO dtoWithUnmatchingLevels = new DataRetrieverChainDefinitionDTO("Not relevant", Collection.class.getName(), retrieverLevels);
|
||||
assertThat(server.getDataRetrieverChainDefinitionForDTO(dtoWithUnmatchingLevels), nullValue());
|
||||
|
||||
retrieverLevels = new ArrayList<DataRetrieverLevelDTO>();
|
||||
retrieverLevels.add(new DataRetrieverLevelDTO(0, "Not relevant", new LocalizedTypeDTO("Impossible Class", "Impossible Class"), null));
|
||||
DataRetrieverChainDefinitionDTO errorDTO = new DataRetrieverChainDefinitionDTO("Impossible Class", "Impossible Class", retrieverLevels);
|
||||
try {
|
||||
server.getDataRetrieverChainDefinitionForDTO(errorDTO);
|
||||
fail("An IllegalArgumentException is expected.");
|
||||
} catch (IllegalArgumentException e) {
|
||||
// Exception is expected
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -131,5 +166,38 @@ public class TestDataRetrieverChainDefinitionManagement {
|
||||
Collection<DataRetrieverChainDefinition<Test_Regatta, Test_HasRaceContextImpl>> expectedEmptyDataRetrieverChainDefinitions = new HashSet<>();
|
||||
assertThat(server.getDataRetrieverChainDefinitions(Test_Regatta.class, Test_HasRaceContextImpl.class), is(expectedEmptyDataRetrieverChainDefinitions));
|
||||
}
|
||||
|
||||
private class TestSeriesRetrievalProcessor extends AbstractRetrievalProcessor<Test_Regatta, Test_Series> {
|
||||
|
||||
public TestSeriesRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<Test_Series, ?>> resultReceivers, int retrievalLevel) {
|
||||
super(Test_Regatta.class, Test_Series.class, executor, resultReceivers, retrievalLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Test_Series> retrieveData(Test_Regatta regatta) {
|
||||
return regatta.getSeries();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class TestRaceFromSeriesRetrievalProcessor extends AbstractRetrievalProcessor<Test_Series, Test_HasRaceContext> {
|
||||
|
||||
public TestRaceFromSeriesRetrievalProcessor(ExecutorService executor,
|
||||
Collection<Processor<Test_HasRaceContext, ?>> resultReceivers, int retrievalLevel) {
|
||||
super(Test_Series.class, Test_HasRaceContext.class, executor, resultReceivers, retrievalLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Test_HasRaceContext> retrieveData(Test_Series series) {
|
||||
Collection<Test_HasRaceContext> racesWithContext = new ArrayList<>();
|
||||
for (Test_Race race : series.getRaces()) {
|
||||
Test_Regatta regatta = series.getRegatta();
|
||||
racesWithContext.add(new Test_HasRaceContextImpl(regatta, race, regatta.getBoatClass(), regatta.getYear()));
|
||||
}
|
||||
return racesWithContext;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+18
-18
@@ -47,7 +47,7 @@ public class TestServerQueryManagement {
|
||||
@Test
|
||||
public void testStatisticQueryManagementWithConflict() {
|
||||
DataMiningSession session = new UUIDDataMiningSession(UUID.randomUUID());
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData();
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
@@ -58,7 +58,7 @@ public class TestServerQueryManagement {
|
||||
public void testStatisticQueryManagementWithoutConflict() {
|
||||
DataMiningSession firstQuerySession = new UUIDDataMiningSession(UUID.randomUUID());
|
||||
DataMiningSession secondQuerySession = new UUIDDataMiningSession(UUID.randomUUID());
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData();
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
@@ -71,7 +71,7 @@ public class TestServerQueryManagement {
|
||||
Collection<Function<?>> dimensions = new ArrayList<>();
|
||||
Method getYear = FunctionTestsUtil.getMethodFromClass(Test_HasRaceContext.class, "getYear");
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getYear));
|
||||
AdditionalQueryData additionalData = new AdditionalDimensionValuesQueryData(new UUID(0, 0), dimensions);
|
||||
AdditionalQueryData additionalData = new AdditionalDimensionValuesQueryData(dimensions);
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
@@ -85,13 +85,13 @@ public class TestServerQueryManagement {
|
||||
Collection<Function<?>> firstQueryDimensions = new ArrayList<>();
|
||||
Method getYear = FunctionTestsUtil.getMethodFromClass(Test_HasRaceContext.class, "getYear");
|
||||
firstQueryDimensions.add(functionFactory.createMethodWrappingFunction(getYear));
|
||||
AdditionalQueryData firstQueryAdditionalData = new AdditionalDimensionValuesQueryData(new UUID(0, 0), firstQueryDimensions);
|
||||
AdditionalQueryData firstQueryAdditionalData = new AdditionalDimensionValuesQueryData(firstQueryDimensions);
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, firstQueryAdditionalData);
|
||||
|
||||
Collection<Function<?>> secondQueryDimensions = new ArrayList<>();
|
||||
Method getLegNumber = FunctionTestsUtil.getMethodFromClass(Test_HasLegOfCompetitorContext.class, "getLegNumber");
|
||||
secondQueryDimensions.add(functionFactory.createMethodWrappingFunction(getLegNumber));
|
||||
AdditionalQueryData secondQueryAdditionalData = new AdditionalDimensionValuesQueryData(new UUID(0, 0), secondQueryDimensions);
|
||||
AdditionalQueryData secondQueryAdditionalData = new AdditionalDimensionValuesQueryData(secondQueryDimensions);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, secondQueryAdditionalData);
|
||||
|
||||
runQueriesAndVerifyNoConflict(session, firstQuery, session, secondQuery);
|
||||
@@ -105,9 +105,9 @@ public class TestServerQueryManagement {
|
||||
Method getYear = FunctionTestsUtil.getMethodFromClass(Test_HasRaceContext.class, "getYear");
|
||||
dimensions.add(functionFactory.createMethodWrappingFunction(getYear));
|
||||
|
||||
AdditionalQueryData firstQueryAdditionalData = new AdditionalDimensionValuesQueryData(new UUID(0, 0), dimensions);
|
||||
AdditionalQueryData firstQueryAdditionalData = new AdditionalDimensionValuesQueryData(dimensions);
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, firstQueryAdditionalData);
|
||||
AdditionalQueryData secondQueryAdditionalData = new AdditionalDimensionValuesQueryData(new UUID(0, 0), dimensions);
|
||||
AdditionalQueryData secondQueryAdditionalData = new AdditionalDimensionValuesQueryData(dimensions);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, secondQueryAdditionalData);
|
||||
|
||||
runQueriesAndVerifyNoConflict(firstQuerySession, firstQuery, secondQuerySession, secondQuery);
|
||||
@@ -116,7 +116,7 @@ public class TestServerQueryManagement {
|
||||
@Test
|
||||
public void testOtherQueryManagement() {
|
||||
DataMiningSession session = new UUIDDataMiningSession(UUID.randomUUID());
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData();
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
@@ -166,7 +166,7 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingRandomQueryOfNullManager() {
|
||||
DataMiningQueryManager manager = new NullDataMiningQueryManager();
|
||||
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData();
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
runQueriesAbortRandomOneAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
@@ -176,7 +176,7 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingRandomQueryOfSingleQueryPerKeyManager() {
|
||||
DataMiningQueryManager manager = new SingleQueryPerSessionManager();
|
||||
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData();
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
runQueriesAbortRandomOneAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
@@ -186,8 +186,8 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingRandomQueryOfStrategyPerQueryTypeManager() {
|
||||
DataMiningQueryManager manager = new StrategyPerQueryTypeManager();
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalStatisticQueryData(new UUID(0, 0)));
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalOtherQueryData(new UUID(0, 0)));
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalStatisticQueryData());
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalOtherQueryData());
|
||||
runQueriesAbortRandomOneAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingAllQueryOfNullManager() {
|
||||
DataMiningQueryManager manager = new NullDataMiningQueryManager();
|
||||
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData();
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
runQueriesAbortAllAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
@@ -224,7 +224,7 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingAllQueryOfSingleQueryPerKeyManager() {
|
||||
DataMiningQueryManager manager = new SingleQueryPerSessionManager();
|
||||
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalStatisticQueryData();
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
runQueriesAbortAllAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
@@ -234,8 +234,8 @@ public class TestServerQueryManagement {
|
||||
public void testAbortingAllQueryOfStrategyPerQueryTypeManager() {
|
||||
DataMiningQueryManager manager = new StrategyPerQueryTypeManager();
|
||||
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalStatisticQueryData(new UUID(0, 0)));
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalOtherQueryData(new UUID(0, 0)));
|
||||
final ControllablePseudoQuery<Double> firstQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalStatisticQueryData());
|
||||
final ControllablePseudoQuery<Double> secondQuery = new ControllablePseudoQuery<Double>(Double.class, new AdditionalOtherQueryData());
|
||||
runQueriesAbortAllAndVerifyAbortion(manager, firstQuery, secondQuery);
|
||||
}
|
||||
|
||||
@@ -260,7 +260,7 @@ public class TestServerQueryManagement {
|
||||
|
||||
@Test
|
||||
public void testControllablePseudoQuery() {
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData(new UUID(0, 0));
|
||||
AdditionalQueryData additionalData = new AdditionalOtherQueryData();
|
||||
|
||||
final ControllablePseudoQuery<Double> normalQuery = new ControllablePseudoQuery<Double>(Double.class, additionalData);
|
||||
assertThat(normalQuery.getState(), is(QueryState.NOT_STARTED));
|
||||
@@ -435,7 +435,7 @@ public class TestServerQueryManagement {
|
||||
}
|
||||
@Override
|
||||
public AdditionalQueryData getAdditionalData() {
|
||||
return new AdditionalStatisticQueryData(new UUID(0, 0));
|
||||
return new AdditionalStatisticQueryData();
|
||||
}
|
||||
@Override
|
||||
public <T extends AdditionalQueryData> T getAdditionalData(Class<T> additionalDataType) {
|
||||
|
||||
+2
@@ -8,6 +8,8 @@ public interface Test_Regatta extends Test_Named {
|
||||
|
||||
public int getYear();
|
||||
|
||||
public Collection<Test_Series> getSeries();
|
||||
|
||||
public Collection<Test_Race> getRaces();
|
||||
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package com.sap.sse.datamining.test.domain;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface Test_Series extends Test_Named {
|
||||
|
||||
public Test_Regatta getRegatta();
|
||||
|
||||
public Collection<Test_Race> getRaces();
|
||||
|
||||
}
|
||||
+13
@@ -1,22 +1,30 @@
|
||||
package com.sap.sse.datamining.test.domain.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sse.datamining.test.domain.Test_BoatClass;
|
||||
import com.sap.sse.datamining.test.domain.Test_Race;
|
||||
import com.sap.sse.datamining.test.domain.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.domain.Test_Series;
|
||||
|
||||
public class Test_RegattaImpl extends Test_NamedImpl implements Test_Regatta {
|
||||
|
||||
private Test_BoatClass boatClass;
|
||||
private int year;
|
||||
private Collection<Test_Series> series;
|
||||
private Collection<Test_Race> races;
|
||||
|
||||
public Test_RegattaImpl(String name, Test_BoatClass boatClass, int year, Test_Race... races) {
|
||||
this(name, boatClass, year, new ArrayList<Test_Series>(), races);
|
||||
}
|
||||
|
||||
public Test_RegattaImpl(String name, Test_BoatClass boatClass, int year, Collection<Test_Series> series, Test_Race... races) {
|
||||
super(name);
|
||||
this.boatClass = boatClass;
|
||||
this.year = year;
|
||||
this.series = series;
|
||||
this.races = Arrays.asList(races);
|
||||
}
|
||||
|
||||
@@ -30,6 +38,11 @@ public class Test_RegattaImpl extends Test_NamedImpl implements Test_Regatta {
|
||||
return year;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Test_Series> getSeries() {
|
||||
return series;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Test_Race> getRaces() {
|
||||
return races;
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.sap.sse.datamining.test.domain.impl;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sse.datamining.test.domain.Test_Regatta;
|
||||
import com.sap.sse.datamining.test.domain.Test_Series;
|
||||
import com.sap.sse.datamining.test.domain.Test_Race;
|
||||
|
||||
public class Test_SeriesImpl extends Test_NamedImpl implements Test_Series {
|
||||
|
||||
private final Test_Regatta regatta;
|
||||
private final Collection<Test_Race> races;
|
||||
|
||||
public Test_SeriesImpl(String name, Test_Regatta regatta, Test_Race... races) {
|
||||
super(name);
|
||||
this.regatta = regatta;
|
||||
this.races = Arrays.asList(races);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Test_Regatta getRegatta() {
|
||||
return regatta;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Test_Race> getRaces() {
|
||||
return races;
|
||||
}
|
||||
|
||||
}
|
||||
-5
@@ -18,10 +18,5 @@ public class TestRegattaRetrievalProcessor extends AbstractRetrievalProcessor<Co
|
||||
protected Iterable<Test_Regatta> retrieveData(Collection<Test_Regatta> regattas) {
|
||||
return regattas;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public Iterable<Processor<Test_Regatta, ?>> getResultReceivers() {
|
||||
// return super.getResultReceivers();
|
||||
// }
|
||||
|
||||
}
|
||||
@@ -1,7 +1,5 @@
|
||||
package com.sap.sse.datamining;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
import com.sap.sse.datamining.impl.NullAdditionalQueryData;
|
||||
|
||||
@@ -11,6 +9,4 @@ public interface AdditionalQueryData {
|
||||
|
||||
public QueryType getType();
|
||||
|
||||
public UUID getDataRetrieverChainID();
|
||||
|
||||
}
|
||||
@@ -16,6 +16,11 @@ import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
*
|
||||
*/
|
||||
public interface DataMiningBundleService {
|
||||
|
||||
/**
|
||||
* @return The {@link #getClassLoader()} for the data mining bundle.
|
||||
*/
|
||||
public ClassLoader getClassLoader();
|
||||
|
||||
/**
|
||||
* @return a {@link ResourceBundleStringMessages} that can provide the string messages used by this bundle.
|
||||
|
||||
@@ -5,7 +5,6 @@ import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.common.settings.SerializableSettings;
|
||||
@@ -20,6 +19,7 @@ import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
|
||||
import com.sap.sse.datamining.shared.DataMiningSession;
|
||||
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
|
||||
import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
@@ -51,10 +51,10 @@ public interface DataMiningServer {
|
||||
public <DataSourceType> Iterable<DataRetrieverChainDefinition<DataSourceType, ?>> getDataRetrieverChainDefinitionsBySourceType(
|
||||
Class<DataSourceType> dataSourceType);
|
||||
public <DataType> Iterable<DataRetrieverChainDefinition<?, DataType>> getDataRetrieverChainDefinitionsByDataType(
|
||||
Class<DataType> dataType);
|
||||
Class<DataType> retrievedDataType);
|
||||
public <DataSourceType, DataType> Iterable<DataRetrieverChainDefinition<DataSourceType, DataType>> getDataRetrieverChainDefinitions(
|
||||
Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType);
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinition(UUID id);
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinitionForDTO(DataRetrieverChainDefinitionDTO retrieverChainDTO);
|
||||
|
||||
public <DataSourceType> Query<HashSet<Object>> createDimensionValuesQuery(DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition, DataRetrieverLevel<?, ?> retrieverLevel,
|
||||
Iterable<Function<?>> dimensions, Map<DataRetrieverLevel<?, ?>, SerializableSettings> settings, Map<DataRetrieverLevel<?, ?>, Map<Function<?>, Collection<?>>> filterSelection, Locale locale);
|
||||
|
||||
@@ -9,6 +9,9 @@ import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
|
||||
public interface ModifiableDataMiningServer extends DataMiningServer {
|
||||
|
||||
public void addDataMiningBundleClassLoader(ClassLoader classLoader);
|
||||
public void removeDataMiningBundleClassLoader(ClassLoader classLoader);
|
||||
|
||||
public void addStringMessages(ResourceBundleStringMessages stringMessages);
|
||||
public void removeStringMessages(ResourceBundleStringMessages stringMessages);
|
||||
|
||||
|
||||
-3
@@ -3,7 +3,6 @@ package com.sap.sse.datamining.components;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.common.settings.SerializableSettings;
|
||||
@@ -35,8 +34,6 @@ import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
*/
|
||||
public interface DataRetrieverChainDefinition<DataSourceType, DataType> {
|
||||
|
||||
public UUID getID();
|
||||
|
||||
public Class<DataSourceType> getDataSourceType();
|
||||
|
||||
public Class<DataType> getRetrievedDataType();
|
||||
|
||||
+4
-4
@@ -1,8 +1,7 @@
|
||||
package com.sap.sse.datamining.components.management;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
|
||||
public interface DataRetrieverChainDefinitionProvider {
|
||||
|
||||
@@ -12,11 +11,12 @@ public interface DataRetrieverChainDefinitionProvider {
|
||||
Class<DataSourceType> dataSourceType);
|
||||
|
||||
public <DataType> Iterable<DataRetrieverChainDefinition<?, DataType>> getByDataType(
|
||||
Class<DataType> dataType);
|
||||
Class<DataType> retrievedDataType);
|
||||
|
||||
public <DataSourceType, DataType> Iterable<DataRetrieverChainDefinition<DataSourceType, DataType>> get(
|
||||
Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType);
|
||||
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> get(UUID id);
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getForDTO(
|
||||
DataRetrieverChainDefinitionDTO retrieverChainDTO, ClassLoader classLoader);
|
||||
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sse.datamining.exceptions;
|
||||
|
||||
public class MultipleDataMiningComponentsFoundForDTOException extends RuntimeException {
|
||||
private static final long serialVersionUID = 8369550688604565448L;
|
||||
|
||||
public MultipleDataMiningComponentsFoundForDTOException(Object dto, Iterable<?> componentsFound) {
|
||||
super(buildErrorMessage(dto, componentsFound));
|
||||
}
|
||||
|
||||
private static String buildErrorMessage(Object dto, Iterable<?> componentsFound) {
|
||||
StringBuilder messageBuilder = new StringBuilder("Multiple components found for " + dto.toString() + ". The found components are:");
|
||||
boolean first = true;
|
||||
for (Object component : componentsFound) {
|
||||
if (first) {
|
||||
messageBuilder.append("\n");
|
||||
}
|
||||
messageBuilder.append(component.toString());
|
||||
}
|
||||
return messageBuilder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
+8
-9
@@ -58,7 +58,7 @@ public class DataMiningDTOFactory {
|
||||
* The display name of the resulting DTO is the message key of the given aggregation definition.
|
||||
*/
|
||||
public AggregationProcessorDefinitionDTO createAggregationProcessorDefinitionDTO(AggregationProcessorDefinition<?, ?> aggregatorDefinition) {
|
||||
return createAggregationProcessorDefinitionDTO(aggregatorDefinition, aggregatorDefinition.getAggregationNameMessageKey());
|
||||
return createAggregationProcessorDefinitionDTO(aggregatorDefinition, ResourceBundleStringMessages.NULL, null);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,14 +67,14 @@ public class DataMiningDTOFactory {
|
||||
*/
|
||||
public AggregationProcessorDefinitionDTO createAggregationProcessorDefinitionDTO(AggregationProcessorDefinition<?, ?> aggregatorDefinition,
|
||||
ResourceBundleStringMessages stringMessages, Locale locale) {
|
||||
return createAggregationProcessorDefinitionDTO(aggregatorDefinition, stringMessages.get(locale, aggregatorDefinition.getAggregationNameMessageKey()));
|
||||
}
|
||||
|
||||
private AggregationProcessorDefinitionDTO createAggregationProcessorDefinitionDTO(AggregationProcessorDefinition<?, ?> aggregatorDefinition, String displayName) {
|
||||
return new AggregationProcessorDefinitionDTO(aggregatorDefinition.getAggregationNameMessageKey(),
|
||||
aggregatorDefinition.getExtractedType().getName(),
|
||||
aggregatorDefinition.getAggregatedType().getName(),
|
||||
displayName);
|
||||
stringMessages.get(locale, aggregatorDefinition.getAggregationNameMessageKey()));
|
||||
}
|
||||
|
||||
public DataRetrieverChainDefinitionDTO createDataRetrieverChainDefinitionDTO(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
return createDataRetrieverChainDefinitionDTO(dataRetrieverChainDefinition, ResourceBundleStringMessages.NULL, null);
|
||||
}
|
||||
|
||||
public DataRetrieverChainDefinitionDTO createDataRetrieverChainDefinitionDTO(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition,
|
||||
@@ -83,9 +83,8 @@ public class DataMiningDTOFactory {
|
||||
for (DataRetrieverLevel<?, ?> retrieverLevel : dataRetrieverChainDefinition.getDataRetrieverLevels()) {
|
||||
retrieverLevels.add(createDataRetrieverLevelDTO(retrieverLevel, stringMessages, locale));
|
||||
}
|
||||
return new DataRetrieverChainDefinitionDTO(dataRetrieverChainDefinition.getID(),
|
||||
dataRetrieverChainDefinition.getLocalizedName(locale, stringMessages), dataRetrieverChainDefinition
|
||||
.getDataSourceType().getName(), retrieverLevels);
|
||||
return new DataRetrieverChainDefinitionDTO(dataRetrieverChainDefinition.getLocalizedName(locale, stringMessages),
|
||||
dataRetrieverChainDefinition.getDataSourceType().getName(), retrieverLevels);
|
||||
}
|
||||
|
||||
public DataRetrieverLevelDTO createDataRetrieverLevelDTO(DataRetrieverLevel<?, ?> retrieverLevel,
|
||||
|
||||
@@ -37,7 +37,7 @@ public class QueryFactory {
|
||||
|
||||
public <DataSourceType, DataType, ExtractedType, ResultType> Query<ResultType> createQuery(DataSourceType dataSource, StatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> queryDefinition,
|
||||
ResourceBundleStringMessages stringMessages, ExecutorService executor) {
|
||||
return new ProcessorQuery<ResultType, DataSourceType>(dataSource, stringMessages, queryDefinition.getLocale(), queryDefinition.getResultType(), new AdditionalStatisticQueryData(queryDefinition.getDataRetrieverChainDefinition().getID())) {
|
||||
return new ProcessorQuery<ResultType, DataSourceType>(dataSource, stringMessages, queryDefinition.getLocale(), queryDefinition.getResultType(), new AdditionalStatisticQueryData()) {
|
||||
@Override
|
||||
protected Processor<DataSourceType, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, ResultType>, Void> resultReceiver) {
|
||||
ProcessorFactory processorFactory = new ProcessorFactory(executor);
|
||||
@@ -131,7 +131,7 @@ public class QueryFactory {
|
||||
final ResourceBundleStringMessages stringMessages, final ExecutorService executor) {
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<HashSet<Object>> resultType = (Class<HashSet<Object>>)(Class<?>) HashSet.class;
|
||||
return new ProcessorQuery<HashSet<Object>, DataSourceType>(dataSource, stringMessages, locale, resultType, new AdditionalDimensionValuesQueryData(dataRetrieverChainDefinition.getID(), dimensions)) {
|
||||
return new ProcessorQuery<HashSet<Object>, DataSourceType>(dataSource, stringMessages, locale, resultType, new AdditionalDimensionValuesQueryData(dimensions)) {
|
||||
@Override
|
||||
protected Processor<DataSourceType, ?> createChainAndReturnFirstProcessor(Processor<Map<GroupKey, HashSet<Object>>, Void> resultReceiver) {
|
||||
ProcessorFactory processorFactory = new ProcessorFactory(executor);
|
||||
|
||||
+1
-16
@@ -1,18 +1,14 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalQueryData;
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
|
||||
public abstract class AbstractAdditionalQueryData implements AdditionalQueryData {
|
||||
|
||||
private final QueryType type;
|
||||
private final UUID dataRetrieverChainID;
|
||||
|
||||
public AbstractAdditionalQueryData(QueryType type, UUID dataRetrieverChainID) {
|
||||
public AbstractAdditionalQueryData(QueryType type) {
|
||||
this.type = type;
|
||||
this.dataRetrieverChainID = dataRetrieverChainID;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -20,16 +16,10 @@ public abstract class AbstractAdditionalQueryData implements AdditionalQueryData
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getDataRetrieverChainID() {
|
||||
return dataRetrieverChainID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((dataRetrieverChainID == null) ? 0 : dataRetrieverChainID.hashCode());
|
||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||
return result;
|
||||
}
|
||||
@@ -43,11 +33,6 @@ public abstract class AbstractAdditionalQueryData implements AdditionalQueryData
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
AbstractAdditionalQueryData other = (AbstractAdditionalQueryData) obj;
|
||||
if (dataRetrieverChainID == null) {
|
||||
if (other.dataRetrieverChainID != null)
|
||||
return false;
|
||||
} else if (!dataRetrieverChainID.equals(other.dataRetrieverChainID))
|
||||
return false;
|
||||
if (type != other.type)
|
||||
return false;
|
||||
return true;
|
||||
|
||||
+5
@@ -19,5 +19,10 @@ public abstract class AbstractDataMiningActivator implements BundleActivator, Da
|
||||
public void stop(BundleContext context) throws Exception {
|
||||
context.ungetService(dataMiningBundleServiceReference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClassLoader getClassLoader() {
|
||||
return this.getClass().getClassLoader();
|
||||
}
|
||||
|
||||
}
|
||||
+2
-4
@@ -1,7 +1,5 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
import com.sap.sse.datamining.functions.Function;
|
||||
|
||||
@@ -9,8 +7,8 @@ public class AdditionalDimensionValuesQueryData extends AbstractAdditionalQueryD
|
||||
|
||||
private final Iterable<Function<?>> dimensions;
|
||||
|
||||
public AdditionalDimensionValuesQueryData(UUID dataRetrieverChainID, Iterable<Function<?>> dimensions) {
|
||||
super(QueryType.DIMENSION_VALUES, dataRetrieverChainID);
|
||||
public AdditionalDimensionValuesQueryData(Iterable<Function<?>> dimensions) {
|
||||
super(QueryType.DIMENSION_VALUES);
|
||||
this.dimensions = dimensions;
|
||||
}
|
||||
|
||||
|
||||
+2
-4
@@ -1,13 +1,11 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
|
||||
public class AdditionalOtherQueryData extends AbstractAdditionalQueryData {
|
||||
|
||||
public AdditionalOtherQueryData(UUID dataRetrieverChainID) {
|
||||
super(QueryType.OTHER, dataRetrieverChainID);
|
||||
public AdditionalOtherQueryData() {
|
||||
super(QueryType.OTHER);
|
||||
}
|
||||
|
||||
}
|
||||
+2
-4
@@ -1,13 +1,11 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
|
||||
public class AdditionalStatisticQueryData extends AbstractAdditionalQueryData {
|
||||
|
||||
public AdditionalStatisticQueryData(UUID dataRetrieverChainID) {
|
||||
super(QueryType.STATISTIC, dataRetrieverChainID);
|
||||
public AdditionalStatisticQueryData() {
|
||||
super(QueryType.STATISTIC);
|
||||
}
|
||||
|
||||
}
|
||||
+7
-7
@@ -58,7 +58,7 @@ public class DataMiningFrameworkActivator implements BundleActivator {
|
||||
DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry = new DataRetrieverChainDefinitionManager();
|
||||
AggregationProcessorDefinitionRegistry aggregationProcessorDefinitionRegistry = new AggregationProcessorDefinitionManager();
|
||||
ModifiableDataMiningServer dataMiningServer = new DataMiningServerImpl(executor, functionRegistry, dataSourceProviderRegistry, dataRetrieverChainDefinitionRegistry, aggregationProcessorDefinitionRegistry);
|
||||
dataMiningServer.addStringMessages(new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, DataMiningFrameworkActivator.class.getClassLoader()));
|
||||
dataMiningServer.addStringMessages(new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, this.getClass().getClassLoader()));
|
||||
for (AggregationProcessorDefinition<?, ?> aggregationProcessorDefinition : getDefaultAggregationProcessors()) {
|
||||
dataMiningServer.registerAggregationProcessor(aggregationProcessorDefinition);
|
||||
}
|
||||
@@ -88,11 +88,9 @@ public class DataMiningFrameworkActivator implements BundleActivator {
|
||||
return dataMiningBundleService;
|
||||
}
|
||||
@Override
|
||||
public void modifiedService(ServiceReference<DataMiningBundleService> reference,
|
||||
DataMiningBundleService service) { }
|
||||
public void modifiedService(ServiceReference<DataMiningBundleService> reference, DataMiningBundleService service) { }
|
||||
@Override
|
||||
public void removedService(ServiceReference<DataMiningBundleService> reference,
|
||||
DataMiningBundleService dataMiningBundleService) {
|
||||
public void removedService(ServiceReference<DataMiningBundleService> reference, DataMiningBundleService dataMiningBundleService) {
|
||||
unregisterDataMiningBundle(dataMiningBundleService);
|
||||
}
|
||||
});
|
||||
@@ -102,7 +100,8 @@ public class DataMiningFrameworkActivator implements BundleActivator {
|
||||
}
|
||||
|
||||
private void registerDataMiningBundle(DataMiningBundleService dataMiningBundleService) {
|
||||
logger.info("Registering data mining bundle "+dataMiningBundleService);
|
||||
logger.info("Registering data mining bundle " + dataMiningBundleService);
|
||||
dataMiningServer.addDataMiningBundleClassLoader(dataMiningBundleService.getClassLoader());
|
||||
dataMiningServer.addStringMessages(dataMiningBundleService.getStringMessages());
|
||||
dataMiningServer.registerAllClasses(dataMiningBundleService.getClassesWithMarkedMethods());
|
||||
for (DataSourceProvider<?> dataSourceProvider : dataMiningBundleService.getDataSourceProviders()) {
|
||||
@@ -117,7 +116,8 @@ public class DataMiningFrameworkActivator implements BundleActivator {
|
||||
}
|
||||
|
||||
private void unregisterDataMiningBundle(DataMiningBundleService dataMiningBundleService) {
|
||||
logger.info("Unregistering data mining bundle "+dataMiningBundleService);
|
||||
logger.info("Unregistering data mining bundle " + dataMiningBundleService);
|
||||
dataMiningServer.removeDataMiningBundleClassLoader(dataMiningBundleService.getClassLoader());
|
||||
dataMiningServer.removeStringMessages(dataMiningBundleService.getStringMessages());
|
||||
dataMiningServer.unregisterAllFunctionsOf(dataMiningBundleService.getClassesWithMarkedMethods());
|
||||
for (DataSourceProvider<?> dataSourceProvider : dataMiningBundleService.getDataSourceProviders()) {
|
||||
|
||||
+26
-6
@@ -8,8 +8,8 @@ import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@@ -41,17 +41,21 @@ import com.sap.sse.datamining.impl.components.management.StrategyPerQueryTypeMan
|
||||
import com.sap.sse.datamining.shared.DataMiningSession;
|
||||
import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.FunctionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.QueryResultDTO;
|
||||
import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
import com.sap.sse.i18n.impl.CompoundResourceBundleStringMessages;
|
||||
import com.sap.sse.util.JoinedClassLoader;
|
||||
|
||||
public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
|
||||
private static final long MEMORY_CHECK_PERIOD = 5;
|
||||
private static final TimeUnit MEMORY_CHECK_PERIOD_UNIT = TimeUnit.SECONDS;
|
||||
|
||||
private final Set<ClassLoader> dataMiningClassLoaders;
|
||||
|
||||
private final CompoundResourceBundleStringMessages stringMessages;
|
||||
private final ExecutorService executorService;
|
||||
private Date componentsChangedTimepoint;
|
||||
@@ -69,6 +73,8 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
DataSourceProviderRegistry dataSourceProviderRegistry,
|
||||
DataRetrieverChainDefinitionRegistry dataRetrieverChainDefinitionRegistry,
|
||||
AggregationProcessorDefinitionRegistry aggregationProcessorDefinitionRegistry) {
|
||||
dataMiningClassLoaders = new HashSet<ClassLoader>();
|
||||
dataMiningClassLoaders.add(this.getClass().getClassLoader());
|
||||
this.stringMessages = new CompoundResourceBundleStringMessages();
|
||||
this.executorService = executorService;
|
||||
componentsChangedTimepoint = new Date();
|
||||
@@ -126,6 +132,20 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
return executorService;
|
||||
}
|
||||
|
||||
private JoinedClassLoader getJoinedClassLoader() {
|
||||
return new JoinedClassLoader(dataMiningClassLoaders);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDataMiningBundleClassLoader(ClassLoader classLoader) {
|
||||
dataMiningClassLoaders.add(classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeDataMiningBundleClassLoader(ClassLoader classLoader) {
|
||||
dataMiningClassLoaders.remove(classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceBundleStringMessages getStringMessages() {
|
||||
return stringMessages;
|
||||
@@ -272,8 +292,8 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
|
||||
@Override
|
||||
public <DataType> Iterable<DataRetrieverChainDefinition<?, DataType>> getDataRetrieverChainDefinitionsByDataType(
|
||||
Class<DataType> dataType) {
|
||||
return dataRetrieverChainDefinitionRegistry.getByDataType(dataType);
|
||||
Class<DataType> retrievedDataType) {
|
||||
return dataRetrieverChainDefinitionRegistry.getByDataType(retrievedDataType);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -283,8 +303,8 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinition(UUID id) {
|
||||
return dataRetrieverChainDefinitionRegistry.get(id);
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getDataRetrieverChainDefinitionForDTO(DataRetrieverChainDefinitionDTO retrieverChainDTO) {
|
||||
return dataRetrieverChainDefinitionRegistry.getForDTO(retrieverChainDTO, getJoinedClassLoader());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -335,7 +355,7 @@ public class DataMiningServerImpl implements ModifiableDataMiningServer {
|
||||
ModifiableStatisticQueryDefinition<DataSourceType, DataType, ExtractedType, ResultType> queryDefinition = null;
|
||||
|
||||
Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(queryDefinitionDTO.getLocaleInfoName());
|
||||
DataRetrieverChainDefinition<DataSourceType, DataType> retrieverChain = getDataRetrieverChainDefinition(queryDefinitionDTO.getDataRetrieverChainDefinition().getId());
|
||||
DataRetrieverChainDefinition<DataSourceType, DataType> retrieverChain = getDataRetrieverChainDefinitionForDTO(queryDefinitionDTO.getDataRetrieverChainDefinition());
|
||||
@SuppressWarnings("unchecked")
|
||||
Function<ExtractedType> statisticToCalculate = (Function<ExtractedType>) getFunctionForDTO(queryDefinitionDTO.getStatisticToCalculate());
|
||||
|
||||
|
||||
-10
@@ -1,7 +1,5 @@
|
||||
package com.sap.sse.datamining.impl;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sse.datamining.AdditionalQueryData;
|
||||
import com.sap.sse.datamining.Query.QueryType;
|
||||
|
||||
@@ -9,23 +7,15 @@ import com.sap.sse.datamining.Query.QueryType;
|
||||
* Null Object pattern for {@link AdditionalQueryData} with the values:
|
||||
* <ul>
|
||||
* <li><b>Type</b>: {@link QueryType#OTHER}</li>
|
||||
* <li><b>Data Retriever Chain ID</b>: {@link UUID#UUID(long, long) UUID(0, 0)}</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Lennart Hensler (D054527)
|
||||
*/
|
||||
public class NullAdditionalQueryData implements AdditionalQueryData {
|
||||
|
||||
private final UUID nullUUID = new UUID(0, 0);
|
||||
|
||||
@Override
|
||||
public QueryType getType() {
|
||||
return QueryType.OTHER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getDataRetrieverChainID() {
|
||||
return nullUUID;
|
||||
}
|
||||
|
||||
}
|
||||
+4
-8
@@ -8,8 +8,9 @@ public class DataRetrieverLevel<InputType, RetrievedDataType> {
|
||||
private final int retrieverLevel;
|
||||
private final Class<? extends Processor<InputType, RetrievedDataType>> retrieverType;
|
||||
private final Class<RetrievedDataType> retrievedDataType;
|
||||
private final String retrievedDataTypeMessageKey;
|
||||
private final Class<?> settingsType;
|
||||
|
||||
private final String retrievedDataTypeMessageKey;
|
||||
private final SerializableSettings defaultSettings;
|
||||
|
||||
public DataRetrieverLevel(int retrieverLevel,
|
||||
@@ -19,8 +20,9 @@ public class DataRetrieverLevel<InputType, RetrievedDataType> {
|
||||
this.retrieverLevel = retrieverLevel;
|
||||
this.retrieverType = retrieverType;
|
||||
this.retrievedDataType = retrievedDataType;
|
||||
this.retrievedDataTypeMessageKey = retrievedDataTypeMessageKey;
|
||||
this.settingsType = settingsType;
|
||||
|
||||
this.retrievedDataTypeMessageKey = retrievedDataTypeMessageKey;
|
||||
this.defaultSettings = defaultSettings;
|
||||
}
|
||||
|
||||
@@ -65,7 +67,6 @@ public class DataRetrieverLevel<InputType, RetrievedDataType> {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((retrievedDataType == null) ? 0 : retrievedDataType.hashCode());
|
||||
result = prime * result + ((retrievedDataTypeMessageKey == null) ? 0 : retrievedDataTypeMessageKey.hashCode());
|
||||
result = prime * result + retrieverLevel;
|
||||
result = prime * result + ((retrieverType == null) ? 0 : retrieverType.hashCode());
|
||||
result = prime * result + ((settingsType == null) ? 0 : settingsType.hashCode());
|
||||
@@ -86,11 +87,6 @@ public class DataRetrieverLevel<InputType, RetrievedDataType> {
|
||||
return false;
|
||||
} else if (!retrievedDataType.equals(other.retrievedDataType))
|
||||
return false;
|
||||
if (retrievedDataTypeMessageKey == null) {
|
||||
if (other.retrievedDataTypeMessageKey != null)
|
||||
return false;
|
||||
} else if (!retrievedDataTypeMessageKey.equals(other.retrievedDataTypeMessageKey))
|
||||
return false;
|
||||
if (retrieverLevel != other.retrieverLevel)
|
||||
return false;
|
||||
if (retrieverType == null) {
|
||||
|
||||
+5
-21
@@ -4,7 +4,6 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sse.common.settings.SerializableSettings;
|
||||
@@ -15,24 +14,20 @@ import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
|
||||
public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implements
|
||||
DataRetrieverChainDefinition<DataSourceType, DataType> {
|
||||
|
||||
private final UUID id;
|
||||
private final String nameMessageKey;
|
||||
|
||||
private final Class<DataSourceType> dataSourceType;
|
||||
private final Class<DataType> retrievedDataType;
|
||||
private final List<DataRetrieverLevel<?, ?>> dataRetrieverTypesWithInformation;
|
||||
|
||||
|
||||
private final String nameMessageKey;
|
||||
protected boolean isComplete;
|
||||
|
||||
public SimpleDataRetrieverChainDefinition(Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType, String nameMessageKey) {
|
||||
id = UUID.randomUUID();
|
||||
this.nameMessageKey = nameMessageKey;
|
||||
|
||||
this.dataSourceType = dataSourceType;
|
||||
this.retrievedDataType = retrievedDataType;
|
||||
dataRetrieverTypesWithInformation = new ArrayList<>();
|
||||
|
||||
|
||||
this.nameMessageKey = nameMessageKey;
|
||||
isComplete = false;
|
||||
}
|
||||
|
||||
@@ -41,11 +36,6 @@ public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implem
|
||||
dataRetrieverTypesWithInformation.addAll(dataRetrieverChainDefinition.getDataRetrieverLevels());
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getID() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLocalizedName(Locale locale, ResourceBundleStringMessages stringMessages) {
|
||||
return stringMessages.get(locale, nameMessageKey);
|
||||
@@ -184,7 +174,7 @@ public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implem
|
||||
@Override
|
||||
public String toString() {
|
||||
return getDataSourceType().getSimpleName() + " -> " + getRetrievedDataType().getSimpleName() +
|
||||
"[ID: " + getID() + ", messageKey: " + nameMessageKey + ", isComplete: " + isComplete + "]";
|
||||
"[messageKey: " + nameMessageKey + ", isComplete: " + isComplete + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -195,7 +185,6 @@ public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implem
|
||||
+ ((dataRetrieverTypesWithInformation == null) ? 0 : dataRetrieverTypesWithInformation.hashCode());
|
||||
result = prime * result + ((dataSourceType == null) ? 0 : dataSourceType.hashCode());
|
||||
result = prime * result + ((retrievedDataType == null) ? 0 : retrievedDataType.hashCode());
|
||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -223,11 +212,6 @@ public class SimpleDataRetrieverChainDefinition<DataSourceType, DataType> implem
|
||||
return false;
|
||||
} else if (!retrievedDataType.equals(other.retrievedDataType))
|
||||
return false;
|
||||
if (id == null) {
|
||||
if (other.id != null)
|
||||
return false;
|
||||
} else if (!id.equals(other.id))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+1
-5
@@ -67,7 +67,7 @@ public class AggregationProcessorDefinitionManager implements AggregationProcess
|
||||
}
|
||||
|
||||
Collection<AggregationProcessorDefinition<ExtractedType, ResultType>> definitionsMatchingDTO = getDefinitionsForDTO(aggregatorDefinitionDTO);
|
||||
if (moreThanOneDefinitionMatchedDTO(definitionsMatchingDTO)) {
|
||||
if (definitionsMatchingDTO.size() > 1) {
|
||||
logThatMoreThanOneDefinitionMatchedDTO(aggregatorDefinitionDTO, definitionsMatchingDTO);
|
||||
}
|
||||
|
||||
@@ -98,10 +98,6 @@ public class AggregationProcessorDefinitionManager implements AggregationProcess
|
||||
return allDefinitions;
|
||||
}
|
||||
|
||||
private <ExtractedType, ResultType> boolean moreThanOneDefinitionMatchedDTO(Collection<AggregationProcessorDefinition<ExtractedType, ResultType>> definitionsMatchingDTO) {
|
||||
return definitionsMatchingDTO.size() > 1;
|
||||
}
|
||||
|
||||
private <ExtractedType, ResultType> void logThatMoreThanOneDefinitionMatchedDTO(AggregationProcessorDefinitionDTO aggregatorDefinitionDTO,
|
||||
Collection<AggregationProcessorDefinition<ExtractedType, ResultType>> definitionsMatchingDTO) {
|
||||
logger.log(Level.INFO, "More than on registered aggregator definition matched the DTO '" + aggregatorDefinitionDTO + "'");
|
||||
|
||||
+121
-72
@@ -1,138 +1,187 @@
|
||||
package com.sap.sse.datamining.impl.components.management;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sap.sse.datamining.components.DataRetrieverChainDefinition;
|
||||
import com.sap.sse.datamining.components.management.DataRetrieverChainDefinitionRegistry;
|
||||
import com.sap.sse.datamining.exceptions.MultipleDataMiningComponentsFoundForDTOException;
|
||||
import com.sap.sse.datamining.impl.components.DataRetrieverLevel;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO;
|
||||
import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO;
|
||||
|
||||
public class DataRetrieverChainDefinitionManager implements DataRetrieverChainDefinitionRegistry {
|
||||
|
||||
private final Logger logger = Logger.getLogger(this.getClass().getName());
|
||||
private final Map<Class<?>, Collection<DataRetrieverChainDefinition<?, ?>>> chainDefinitionsMappedBySourceType;
|
||||
private final Map<Class<?>, Collection<DataRetrieverChainDefinition<?, ?>>> chainDefinitionsMappedByDataType;
|
||||
private final Map<UUID, DataRetrieverChainDefinition<?, ?>> chainDefinitionsMappedByID;
|
||||
private final Map<Class<?>, Set<DataRetrieverChainDefinition<?, ?>>> chainDefinitionsMappedBySourceType;
|
||||
private final Map<Class<?>, Set<DataRetrieverChainDefinition<?, ?>>> chainDefinitionsMappedByDataType;
|
||||
|
||||
public DataRetrieverChainDefinitionManager() {
|
||||
chainDefinitionsMappedBySourceType = new HashMap<>();
|
||||
chainDefinitionsMappedByDataType = new HashMap<>();
|
||||
chainDefinitionsMappedByID = new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean register(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
if (chainDefinitionsMappedByID.containsKey(dataRetrieverChainDefinition.getID())) {
|
||||
logger.info("Can't register the data retriever chain definition " + dataRetrieverChainDefinition +
|
||||
", because there's allready a definition registered for the ID " + dataRetrieverChainDefinition.getID());
|
||||
return false;
|
||||
}
|
||||
Class<?> sourceType = dataRetrieverChainDefinition.getDataSourceType();
|
||||
Class<?> retrievedDataType = dataRetrieverChainDefinition.getRetrievedDataType();
|
||||
|
||||
registerToBySourceTypeMap(dataRetrieverChainDefinition);
|
||||
registerToByDataTypeMap(dataRetrieverChainDefinition);
|
||||
DataRetrieverChainDefinition<?, ?> previousDefinition = chainDefinitionsMappedByID.put(dataRetrieverChainDefinition.getID(), dataRetrieverChainDefinition);
|
||||
if (previousDefinition == null) {
|
||||
logger.info("Registering the data retriever chain definition " + dataRetrieverChainDefinition +
|
||||
" for the ID " + dataRetrieverChainDefinition.getID());
|
||||
} else {
|
||||
logger.info("Registering the data retriever chain definition " + dataRetrieverChainDefinition +
|
||||
" for the ID " + dataRetrieverChainDefinition.getID() +
|
||||
" replacing " + previousDefinition);
|
||||
boolean changedBySource = registerToByTypeMap(sourceType, chainDefinitionsMappedBySourceType, dataRetrieverChainDefinition);
|
||||
boolean changedByData = registerToByTypeMap(retrievedDataType, chainDefinitionsMappedByDataType, dataRetrieverChainDefinition);
|
||||
if (changedByData || changedBySource) {
|
||||
StringBuilder logBuilder = new StringBuilder("Registering the data retriever chain definition " +
|
||||
dataRetrieverChainDefinition + " for the ");
|
||||
if (changedByData && changedBySource) {
|
||||
logBuilder.append("source type " + sourceType.getSimpleName() + " and the retrieved data type " + retrievedDataType.getSimpleName());
|
||||
} else if (changedByData) {
|
||||
logBuilder.append("retrieved data type " + retrievedDataType.getSimpleName());
|
||||
} else {
|
||||
logBuilder.append("source type " + sourceType.getSimpleName());
|
||||
}
|
||||
logger.info(logBuilder.toString());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void registerToBySourceTypeMap(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
registerToByTypeMap(dataRetrieverChainDefinition.getDataSourceType(), chainDefinitionsMappedBySourceType, dataRetrieverChainDefinition);
|
||||
return changedByData || changedBySource;
|
||||
}
|
||||
|
||||
private void registerToByDataTypeMap(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
registerToByTypeMap(dataRetrieverChainDefinition.getRetrievedDataType(), chainDefinitionsMappedByDataType, dataRetrieverChainDefinition);
|
||||
}
|
||||
|
||||
private void registerToByTypeMap(Class<?> key, Map<Class<?>, Collection<DataRetrieverChainDefinition<?, ?>>> byTypeMap, DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
private boolean registerToByTypeMap(Class<?> key, Map<Class<?>, Set<DataRetrieverChainDefinition<?, ?>>> byTypeMap, DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
if (!byTypeMap.containsKey(key)) {
|
||||
byTypeMap.put(key, new HashSet<DataRetrieverChainDefinition<?, ?>>());
|
||||
}
|
||||
byTypeMap.get(key).add(dataRetrieverChainDefinition);
|
||||
return byTypeMap.get(key).add(dataRetrieverChainDefinition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean unregister(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
unregisterFromBySourceTypeMap(dataRetrieverChainDefinition);
|
||||
unregisterFromByDataTypeMap(dataRetrieverChainDefinition);
|
||||
DataRetrieverChainDefinition<?, ?> removedDefinition = chainDefinitionsMappedByID.remove(dataRetrieverChainDefinition.getID());
|
||||
Class<?> sourceType = dataRetrieverChainDefinition.getDataSourceType();
|
||||
Class<?> retrievedDataType = dataRetrieverChainDefinition.getRetrievedDataType();
|
||||
|
||||
if (removedDefinition != null) {
|
||||
logger.info("Unregistering the data retriever chain definition " + dataRetrieverChainDefinition +
|
||||
" for the ID " + dataRetrieverChainDefinition.getID());
|
||||
return true;
|
||||
} else {
|
||||
logger.info("Can't unregister the data retriever chain definition " + dataRetrieverChainDefinition +
|
||||
", because there's no definition registered for the ID" + dataRetrieverChainDefinition.getID());
|
||||
return false;
|
||||
boolean changedBySource = unregisterFromByTypeMap(sourceType, chainDefinitionsMappedBySourceType, dataRetrieverChainDefinition);
|
||||
boolean changedByData = unregisterFromByTypeMap(retrievedDataType, chainDefinitionsMappedByDataType, dataRetrieverChainDefinition);
|
||||
|
||||
if (changedByData || changedBySource) {
|
||||
StringBuilder logBuilder = new StringBuilder("Unregistering the data retriever chain definition " +
|
||||
dataRetrieverChainDefinition + " for the ");
|
||||
if (changedByData && changedBySource) {
|
||||
logBuilder.append("source type " + sourceType.getSimpleName() + " and the retrieved data type " + retrievedDataType.getSimpleName());
|
||||
} else if (changedByData) {
|
||||
logBuilder.append("retrieved data type " + retrievedDataType.getSimpleName());
|
||||
} else {
|
||||
logBuilder.append("source type " + sourceType.getSimpleName());
|
||||
}
|
||||
logger.info(logBuilder.toString());
|
||||
}
|
||||
return changedByData || changedBySource;
|
||||
}
|
||||
|
||||
private void unregisterFromBySourceTypeMap(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
unregisterFromByTypeMap(dataRetrieverChainDefinition.getDataSourceType(), chainDefinitionsMappedBySourceType, dataRetrieverChainDefinition);
|
||||
}
|
||||
|
||||
private void unregisterFromByDataTypeMap(DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
unregisterFromByTypeMap(dataRetrieverChainDefinition.getRetrievedDataType(), chainDefinitionsMappedByDataType, dataRetrieverChainDefinition);
|
||||
}
|
||||
|
||||
private void unregisterFromByTypeMap(Class<?> key, Map<Class<?>, Collection<DataRetrieverChainDefinition<?, ?>>> byTypeMap, DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
private boolean unregisterFromByTypeMap(Class<?> key, Map<Class<?>, Set<DataRetrieverChainDefinition<?, ?>>> byTypeMap, DataRetrieverChainDefinition<?, ?> dataRetrieverChainDefinition) {
|
||||
if (byTypeMap.containsKey(key)) {
|
||||
byTypeMap.get(key).remove(dataRetrieverChainDefinition);
|
||||
return byTypeMap.get(key).remove(dataRetrieverChainDefinition);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<DataRetrieverChainDefinition<?, ?>> getAll() {
|
||||
return new HashSet<>(chainDefinitionsMappedByID.values());
|
||||
Set<DataRetrieverChainDefinition<?, ?>> chainDefinitions = new HashSet<>();
|
||||
for (Collection<DataRetrieverChainDefinition<?, ?>> chainDefinitionsBySourceType : chainDefinitionsMappedBySourceType.values()) {
|
||||
chainDefinitions.addAll(chainDefinitionsBySourceType);
|
||||
}
|
||||
for (Collection<DataRetrieverChainDefinition<?, ?>> chainDefinitionsByDataType : chainDefinitionsMappedByDataType.values()) {
|
||||
chainDefinitions.addAll(chainDefinitionsByDataType);
|
||||
}
|
||||
return Collections.unmodifiableSet(chainDefinitions);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <DataSourceType> Iterable<DataRetrieverChainDefinition<DataSourceType, ?>> getBySourceType(
|
||||
Class<DataSourceType> dataSourceType) {
|
||||
return chainDefinitionsMappedBySourceType.containsKey(dataSourceType) ?
|
||||
(Collection<DataRetrieverChainDefinition<DataSourceType, ?>>)(Collection<?>)
|
||||
new HashSet<>(chainDefinitionsMappedBySourceType.get(dataSourceType)) :
|
||||
new HashSet<DataRetrieverChainDefinition<DataSourceType, ?>>();
|
||||
if (!chainDefinitionsMappedBySourceType.containsKey(dataSourceType)) {
|
||||
return new HashSet<DataRetrieverChainDefinition<DataSourceType, ?>>();
|
||||
}
|
||||
Collection<DataRetrieverChainDefinition<?, ?>> retrieverChains = Collections.unmodifiableSet(chainDefinitionsMappedBySourceType.get(dataSourceType));
|
||||
return (Collection<DataRetrieverChainDefinition<DataSourceType, ?>>)(Collection<?>) retrieverChains;
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <DataType> Iterable<DataRetrieverChainDefinition<?, DataType>> getByDataType(Class<DataType> dataType) {
|
||||
return chainDefinitionsMappedByDataType.containsKey(dataType) ?
|
||||
(Collection<DataRetrieverChainDefinition<?, DataType>>)(Collection<?>)
|
||||
new HashSet<>(chainDefinitionsMappedByDataType.get(dataType)) :
|
||||
new HashSet<DataRetrieverChainDefinition<?, DataType>>();
|
||||
public <DataType> Iterable<DataRetrieverChainDefinition<?, DataType>> getByDataType(Class<DataType> retrievedDataType) {
|
||||
if (!chainDefinitionsMappedByDataType.containsKey(retrievedDataType)) {
|
||||
return new HashSet<DataRetrieverChainDefinition<?, DataType>>();
|
||||
}
|
||||
Collection<DataRetrieverChainDefinition<?, ?>> retrieverChains = Collections.unmodifiableSet(chainDefinitionsMappedByDataType.get(retrievedDataType));
|
||||
return (Collection<DataRetrieverChainDefinition<?, DataType>>)(Collection<?>) retrieverChains;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <DataSourceType, DataType> Iterable<DataRetrieverChainDefinition<DataSourceType, DataType>> get(
|
||||
Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType) {
|
||||
Collection<DataRetrieverChainDefinition<DataSourceType, DataType>> dataRetrieverChainDefinitions = new HashSet<>();
|
||||
for (DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition : getBySourceType(dataSourceType)) {
|
||||
if (Objects.equals(retrievedDataType, dataRetrieverChainDefinition.getRetrievedDataType())) {
|
||||
dataRetrieverChainDefinitions.add((DataRetrieverChainDefinition<DataSourceType, DataType>) dataRetrieverChainDefinition);
|
||||
}
|
||||
}
|
||||
return dataRetrieverChainDefinitions;
|
||||
return Collections.unmodifiableSet(getInternalFor(dataSourceType, retrievedDataType));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> get(UUID id) {
|
||||
return (DataRetrieverChainDefinition<DataSourceType, DataType>) chainDefinitionsMappedByID.get(id);
|
||||
public <DataSourceType, DataType> DataRetrieverChainDefinition<DataSourceType, DataType> getForDTO(DataRetrieverChainDefinitionDTO retrieverChainDTO, ClassLoader classLoader) {
|
||||
DataRetrieverChainDefinition<DataSourceType, DataType> chainDefinition = null;
|
||||
try {
|
||||
Class<DataSourceType> dataSourceType = (Class<DataSourceType>) Class.forName(retrieverChainDTO.getDataSourceTypeName(), true, classLoader);
|
||||
Class<DataType> retrievedDataType = (Class<DataType>) Class.forName(retrieverChainDTO.getRetrievedDataTypeName(), true, classLoader);
|
||||
Set<DataRetrieverChainDefinition<DataSourceType, DataType>> chainDefinitions = getInternalFor(dataSourceType, retrievedDataType);
|
||||
|
||||
if (!chainDefinitions.isEmpty()) {
|
||||
Set<DataRetrieverChainDefinition<DataSourceType, DataType>> matchingChainDefinitions = new HashSet<>();
|
||||
for (DataRetrieverChainDefinition<DataSourceType, DataType> chain : chainDefinitions) {
|
||||
List<? extends DataRetrieverLevel<?, ?>> retrieverLevels = chain.getDataRetrieverLevels();
|
||||
if (retrieverLevels.size() == retrieverChainDTO.getLevelAmount()) {
|
||||
boolean matches = true;
|
||||
for (DataRetrieverLevel<?, ?> retrieverLevel : retrieverLevels) {
|
||||
DataRetrieverLevelDTO retrieverLevelDTO = retrieverChainDTO.getRetrieverLevel(retrieverLevel.getLevel());
|
||||
Class<?> retrieverType = Class.forName(retrieverLevelDTO.getRetrieverTypeName(), true, classLoader);
|
||||
if (!retrieverLevel.getRetrieverType().isAssignableFrom(retrieverType)) {
|
||||
matches = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (matches) {
|
||||
matchingChainDefinitions.add((DataRetrieverChainDefinition<DataSourceType, DataType>) chain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (matchingChainDefinitions.size() == 1) {
|
||||
chainDefinition = matchingChainDefinitions.iterator().next();
|
||||
} else if (matchingChainDefinitions.size() > 1) {
|
||||
throw new MultipleDataMiningComponentsFoundForDTOException(retrieverChainDTO, matchingChainDefinitions);
|
||||
}
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new IllegalArgumentException("Couldn't get classes for the retriever chain DTO " + retrieverChainDTO, e);
|
||||
}
|
||||
if (chainDefinition == null) {
|
||||
logger.log(Level.WARNING, "No retriever chain definition found for the DTO: " + retrieverChainDTO);
|
||||
}
|
||||
return chainDefinition;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <DataSourceType, DataType> Set<DataRetrieverChainDefinition<DataSourceType, DataType>> getInternalFor(
|
||||
Class<DataSourceType> dataSourceType, Class<DataType> retrievedDataType) {
|
||||
Set<DataRetrieverChainDefinition<DataSourceType, DataType>> chainDefinitions = new HashSet<>();
|
||||
for (DataRetrieverChainDefinition<DataSourceType, ?> dataRetrieverChainDefinition : getBySourceType(dataSourceType)) {
|
||||
if (Objects.equals(retrievedDataType, dataRetrieverChainDefinition.getRetrievedDataType())) {
|
||||
chainDefinitions.add((DataRetrieverChainDefinition<DataSourceType, DataType>) dataRetrieverChainDefinition);
|
||||
}
|
||||
}
|
||||
return chainDefinitions;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-5
@@ -337,7 +337,7 @@ public class FunctionManager implements FunctionRegistry, FunctionProvider {
|
||||
}
|
||||
|
||||
Collection<Function<?>> functionsMatchingDTO = getFunctionsForDTO(functionDTO);
|
||||
if (moreThanOneFunctionMatchedDTO(functionsMatchingDTO)) {
|
||||
if (functionsMatchingDTO.size() > 1) {
|
||||
logThatMoreThanOneFunctionMatchedDTO(functionDTO, functionsMatchingDTO);
|
||||
}
|
||||
|
||||
@@ -367,10 +367,6 @@ public class FunctionManager implements FunctionRegistry, FunctionProvider {
|
||||
return allFunctions;
|
||||
}
|
||||
|
||||
private boolean moreThanOneFunctionMatchedDTO(Collection<Function<?>> functionsMatchingDTO) {
|
||||
return functionsMatchingDTO.size() > 1;
|
||||
}
|
||||
|
||||
private void logThatMoreThanOneFunctionMatchedDTO(FunctionDTO functionDTO, Collection<Function<?>> functionsMatchingDTO) {
|
||||
logger.log(Level.INFO, "More than on registered function matched the function DTO '" + functionDTO.toString() + "'");
|
||||
for (Function<?> function : functionsMatchingDTO) {
|
||||
|
||||
@@ -4,6 +4,8 @@ import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sap.sse.i18n.impl.NullResourceBundleStringMessages;
|
||||
|
||||
/**
|
||||
* Allow server-side internationalization similar to GWT client-side by using property files.
|
||||
*
|
||||
@@ -18,6 +20,8 @@ import java.util.Map;
|
||||
* </pre>
|
||||
*/
|
||||
public interface ResourceBundleStringMessages {
|
||||
|
||||
public static final ResourceBundleStringMessages NULL = new NullResourceBundleStringMessages();
|
||||
|
||||
public String getResourceBaseName();
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
package com.sap.sse.i18n.impl;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import com.sap.sse.i18n.ResourceBundleStringMessages;
|
||||
|
||||
/**
|
||||
* Null pattern for {@link ResourceBundleStringMessages}.<br>
|
||||
* Returns the following values:
|
||||
* <ul>
|
||||
* <li>{@link #getResourceBaseName()}: An empty String
|
||||
* <li>{@link #get(Locale, String)}: The <code>messageKey</code>
|
||||
* <li>{@link #get(Locale, String, String...)}: <code>messageKey(parameter1, parameter2, ...)</code>
|
||||
* </ul>
|
||||
*
|
||||
* @author Lennart Hensler (D054527)
|
||||
*
|
||||
*/
|
||||
public class NullResourceBundleStringMessages implements ResourceBundleStringMessages {
|
||||
|
||||
/**
|
||||
* @return An empty String.
|
||||
*/
|
||||
@Override
|
||||
public String getResourceBaseName() {
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The <code>messageKey</code>.
|
||||
*/
|
||||
@Override
|
||||
public String get(Locale locale, String messageKey) {
|
||||
return messageKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return <code>messageKey(parameter1, parameter2, ...)</code>
|
||||
*/
|
||||
@Override
|
||||
public String get(Locale locale, String messageKey, String... parameters) {
|
||||
StringBuilder b = new StringBuilder(messageKey + "(");
|
||||
boolean first = true;
|
||||
for (String parameter : parameters) {
|
||||
if (!first) {
|
||||
b.append(", ");
|
||||
}
|
||||
b.append(parameter);
|
||||
first = false;
|
||||
}
|
||||
b.append(")");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.server.impl;
|
||||
package com.sap.sse.util;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
Reference in new issue
Block a user