Merge remote-tracking branch 'server/master'

This commit is contained in:
Axel Uhl committed 2015-10-15 20:04:29 +02:00
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
@@ -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);
@@ -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
@@ -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,
@@ -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;
}
@@ -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>
*/
@@ -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) {
@@ -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());
}
@@ -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;
}
}
}
@@ -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) {
@@ -8,6 +8,8 @@ public interface Test_Regatta extends Test_Named {
public int getYear();
public Collection<Test_Series> getSeries();
public Collection<Test_Race> getRaces();
}
@@ -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();
}
@@ -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;
@@ -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;
}
}
@@ -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,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();
@@ -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);
}
@@ -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();
}
}
@@ -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,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;
@@ -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();
}
}
@@ -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;
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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()) {
@@ -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());
@@ -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;
}
}
@@ -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) {
@@ -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;
}
@@ -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 + "'");
@@ -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;
}
}
@@ -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,4 +1,4 @@
package com.sap.sailing.server.impl;
package com.sap.sse.util;
import java.util.Set;