From bac0c288092f2da37d1fccbda991b7f8f002f095 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Tue, 15 Sep 2015 14:06:55 +0200 Subject: [PATCH] Retrieval Processor can now have settings --- .../TestDataRetrieverChainCreation.java | 63 +++++++++++++++ ...estNullRetrievalProcessorWithSettings.java | 29 +++++++ .../Test_NullRetrievalProcessorSettings.java | 15 ++++ .../components/DataRetrieverChainBuilder.java | 9 +++ .../impl/components/DataRetrieverLevel.java | 2 +- .../SimpleDataRetrieverChainBuilder.java | 81 ++++++++++++------- 6 files changed, 168 insertions(+), 31 deletions(-) create mode 100644 java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/TestNullRetrievalProcessorWithSettings.java create mode 100644 java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/Test_NullRetrievalProcessorSettings.java diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestDataRetrieverChainCreation.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestDataRetrieverChainCreation.java index 859293b6fd1..ce22bb8c1bd 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestDataRetrieverChainCreation.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/components/TestDataRetrieverChainCreation.java @@ -1,8 +1,10 @@ package com.sap.sse.datamining.impl.components; +import static com.sap.sse.datamining.test.util.ConcurrencyTestsUtil.getExecutor; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import java.util.Collection; import java.util.List; @@ -24,8 +26,10 @@ import com.sap.sse.datamining.test.util.ComponentTestsUtil; import com.sap.sse.datamining.test.util.ConcurrencyTestsUtil; import com.sap.sse.datamining.test.util.components.NullProcessor; import com.sap.sse.datamining.test.util.components.TestLegOfCompetitorWithContextRetrievalProcessor; +import com.sap.sse.datamining.test.util.components.TestNullRetrievalProcessorWithSettings; import com.sap.sse.datamining.test.util.components.TestRaceWithContextRetrievalProcessor; import com.sap.sse.datamining.test.util.components.TestRegattaRetrievalProcessor; +import com.sap.sse.datamining.test.util.components.Test_NullRetrievalProcessorSettings; public class TestDataRetrieverChainCreation { @@ -96,18 +100,27 @@ public class TestDataRetrieverChainCreation { try { chainBuilder.getCurrentRetrievedDataType(); + fail("An IllegalStateException is expected."); } catch (IllegalStateException e) { } try { chainBuilder.setFilter(null); + fail("An IllegalStateException is expected."); + } catch (IllegalStateException e) { + } + try { + chainBuilder.setSettings(null); + fail("An IllegalStateException is expected."); } catch (IllegalStateException e) { } try { chainBuilder.addResultReceiver(null); + fail("An IllegalStateException is expected."); } catch (IllegalStateException e) { } try { chainBuilder.build(); + fail("An IllegalStateException is expected."); } catch (IllegalStateException e) { } } @@ -243,5 +256,55 @@ public class TestDataRetrieverChainCreation { dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor()); } + + @Test(expected=IllegalStateException.class) + public void testSteppingToFar() { + DataRetrieverChainBuilder> chainBuilder = dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor()); + while (chainBuilder.canStepFurther()) { + chainBuilder.stepFurther(); + } + chainBuilder.stepFurther(); + } + + @Test + public void testRetrieverChainWithSettingsCreation() { + DataRetrieverChainDefinition, Test_HasLegOfCompetitorContext> chainWithSettings = + new SimpleDataRetrieverChainDefinition<>(dataRetrieverChainDefinition, Test_HasLegOfCompetitorContext.class, "TestRetrieverChain"); + chainWithSettings.endWith(TestLegOfCompetitorWithContextRetrievalProcessor.class, TestNullRetrievalProcessorWithSettings.class, Test_HasLegOfCompetitorContext.class, + Test_NullRetrievalProcessorSettings.class, "legOfCompetitor"); + + DataRetrieverChainBuilder> chainBuilder = chainWithSettings.startBuilding(getExecutor()); + while (chainBuilder.canStepFurther()) { + chainBuilder.stepFurther(); + } + + chainBuilder.build(); + + Test_NullRetrievalProcessorSettings settings = new Test_NullRetrievalProcessorSettings("Settings Value"); + chainBuilder.setSettings(settings); + + chainBuilder.build(); + } + + @Test(expected=IllegalArgumentException.class) + public void testRetrieverChainWithWrongSettingsCreation() { + DataRetrieverChainDefinition, Test_HasLegOfCompetitorContext> chainWithSettings = + new SimpleDataRetrieverChainDefinition<>(dataRetrieverChainDefinition, Test_HasLegOfCompetitorContext.class, "TestRetrieverChain"); + chainWithSettings.endWith(TestLegOfCompetitorWithContextRetrievalProcessor.class, TestNullRetrievalProcessorWithSettings.class, Test_HasLegOfCompetitorContext.class, + Test_NullRetrievalProcessorSettings.class, "legOfCompetitor"); + + DataRetrieverChainBuilder> chainBuilder = chainWithSettings.startBuilding(getExecutor()); + while (chainBuilder.canStepFurther()) { + chainBuilder.stepFurther(); + } + chainBuilder.setSettings("Error"); + } + + @Test(expected=IllegalStateException.class) + public void testRetrieverWithNoSettingsButSettedSettingsCreated() { + DataRetrieverChainBuilder> chainBuilder = dataRetrieverChainDefinition.startBuilding(ConcurrencyTestsUtil.getExecutor()); + chainBuilder.stepFurther(); // Initialization + chainBuilder.setSettings("Error"); + } } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/TestNullRetrievalProcessorWithSettings.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/TestNullRetrievalProcessorWithSettings.java new file mode 100644 index 00000000000..3b2da4d178d --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/TestNullRetrievalProcessorWithSettings.java @@ -0,0 +1,29 @@ +package com.sap.sse.datamining.test.util.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.ExecutorService; + +import com.sap.sse.datamining.components.Processor; +import com.sap.sse.datamining.impl.components.AbstractRetrievalProcessor; +import com.sap.sse.datamining.test.data.Test_HasLegOfCompetitorContext; + +public class TestNullRetrievalProcessorWithSettings extends AbstractRetrievalProcessor{ + + @SuppressWarnings("unused") + private Test_NullRetrievalProcessorSettings settings; + + public TestNullRetrievalProcessorWithSettings(ExecutorService executor, Collection> resultReceivers, + Test_NullRetrievalProcessorSettings settings, int retrievalLevel) { + super(Test_HasLegOfCompetitorContext.class, Test_HasLegOfCompetitorContext.class, executor, resultReceivers, retrievalLevel); + this.settings = settings; + } + + @Override + protected Iterable retrieveData(Test_HasLegOfCompetitorContext legWithContext) { + Collection legsWithContext = new ArrayList<>(); + legsWithContext.add(legWithContext); + return legsWithContext; + } + +} diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/Test_NullRetrievalProcessorSettings.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/Test_NullRetrievalProcessorSettings.java new file mode 100644 index 00000000000..3ee03070d75 --- /dev/null +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/components/Test_NullRetrievalProcessorSettings.java @@ -0,0 +1,15 @@ +package com.sap.sse.datamining.test.util.components; + +public class Test_NullRetrievalProcessorSettings { + + private final String value; + + public Test_NullRetrievalProcessorSettings(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + +} diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/DataRetrieverChainBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/DataRetrieverChainBuilder.java index ea6bd17e413..476c19f0ea0 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/DataRetrieverChainBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/components/DataRetrieverChainBuilder.java @@ -49,6 +49,15 @@ public interface DataRetrieverChainBuilder { * {@link #getCurrentRetrievedDataType() current retrieved data type}. */ public DataRetrieverChainBuilder setFilter(FilterCriterion filter); + + /** + * Sets the settings for the data retriever of the current level. + * + * @throws IllegalStateException if {@link #stepFurther()} has not yet been called. + * @throws IllegalArgumentException if the SettingsType isn't applicable for the + * {@link DataRetrieverLevel#getSettingsType() settings of the current retriever level}. + */ + public DataRetrieverChainBuilder setSettings(SettingsType settings); /** * Adds a result receiver to the data retriever of the current level. diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/DataRetrieverLevel.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/DataRetrieverLevel.java index 78a8b611320..6aaf7595fbe 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/DataRetrieverLevel.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/DataRetrieverLevel.java @@ -45,7 +45,7 @@ public class DataRetrieverLevel { public String toString() { return "Level " + retrieverLevel + " [retrieverType: " + retrieverType.getSimpleName() + ", retrievedDataType: " + retrievedDataType.getSimpleName() - + ", settingsType: " + settingsType.getSimpleName() + + ", settingsType: " + (settingsType == null ? "null" : settingsType.getSimpleName()) + ", messageKey: " + retrievedDataTypeMessageKey + "]"; } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SimpleDataRetrieverChainBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SimpleDataRetrieverChainBuilder.java index 49a348692c4..9407666eda7 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SimpleDataRetrieverChainBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/components/SimpleDataRetrieverChainBuilder.java @@ -19,11 +19,12 @@ import com.sap.sse.datamining.components.Processor; public class SimpleDataRetrieverChainBuilder implements DataRetrieverChainBuilder { private final ExecutorService executor; - private final List> dataRetrieverTypesWithInformation; + private final List> retrieverLevels; private final Map> filters; private final Map>> receivers; - private int currentRetrieverTypeIndex; + private final Map settings; + private int currentRetrieverLevelIndex; /** * Creates a data retriever chain builder for the given list of {@link DataRetrieverLevel}.
@@ -44,16 +45,17 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr SimpleDataRetrieverChainBuilder(ExecutorService executor, List> dataRetrieverTypesWithInformation) { this.executor = executor; - this.dataRetrieverTypesWithInformation = new ArrayList<>(dataRetrieverTypesWithInformation); + this.retrieverLevels = new ArrayList<>(dataRetrieverTypesWithInformation); filters = new HashMap<>(); receivers = new HashMap<>(); - currentRetrieverTypeIndex = -1; + settings = new HashMap<>(); + currentRetrieverLevelIndex = -1; } @Override public boolean canStepFurther() { - return currentRetrieverTypeIndex + 1 < dataRetrieverTypesWithInformation.size(); + return currentRetrieverLevelIndex + 1 < retrieverLevels.size(); } @Override @@ -62,7 +64,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr throw new IllegalStateException("The builder can't step any further"); } - currentRetrieverTypeIndex++; + currentRetrieverLevelIndex++; return this; } @@ -77,7 +79,26 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr + "') isn't able to match the current retrieved data type '" + getCurrentRetrievedDataType().getSimpleName() + "'"); } - filters.put(currentRetrieverTypeIndex, filter); + filters.put(currentRetrieverLevelIndex, filter); + return this; + } + + @Override + public DataRetrieverChainBuilder setSettings(SettingsType settings) { + if (!hasBeenInitialized()) { + throw new IllegalStateException("The builder hasn't been initialized"); + } + if (getCurrentRetrieverLevel().getSettingsType() == null) { + throw new IllegalStateException("The current retrieval level " + getCurrentRetrieverLevel() + " has no settings."); + } + + if (!getCurrentRetrieverLevel().getSettingsType().isAssignableFrom(settings.getClass())) { + throw new IllegalArgumentException("The given settings (with type '" + settings.getClass().getSimpleName() + + "') isn't applicable for the settings type of the current retriever Level '" + + getCurrentRetrieverLevel().getSettingsType().getSimpleName() + "'"); + } + + this.settings.put(currentRetrieverLevelIndex, settings); return this; } @@ -92,10 +113,10 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr + "') isn't able to process the current retrieved data type '" + getCurrentRetrievedDataType().getSimpleName() + "'"); } - if (!receivers.containsKey(currentRetrieverTypeIndex)) { - receivers.put(currentRetrieverTypeIndex, new HashSet>()); + if (!receivers.containsKey(currentRetrieverLevelIndex)) { + receivers.put(currentRetrieverLevelIndex, new HashSet>()); } - receivers.get(currentRetrieverTypeIndex).add(resultReceiver); + receivers.get(currentRetrieverLevelIndex).add(resultReceiver); return this; } @@ -105,12 +126,12 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr throw new IllegalStateException("The builder hasn't been initialized"); } - return dataRetrieverTypesWithInformation.get(currentRetrieverTypeIndex).getRetrievedDataType(); + return retrieverLevels.get(currentRetrieverLevelIndex).getRetrievedDataType(); } @Override public DataRetrieverLevel getCurrentRetrieverLevel() { - return hasBeenInitialized() ? dataRetrieverTypesWithInformation.get(currentRetrieverTypeIndex) : null; + return hasBeenInitialized() ? retrieverLevels.get(currentRetrieverLevelIndex) : null; } @SuppressWarnings("unchecked") @@ -121,37 +142,37 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr } Processor firstRetriever = null; - for (int retrieverTypeIndex = currentRetrieverTypeIndex; retrieverTypeIndex >= 0; retrieverTypeIndex--) { - DataRetrieverLevel dataRetrieverTypeWithInformation = dataRetrieverTypesWithInformation.get(retrieverTypeIndex); - firstRetriever = createRetriever(dataRetrieverTypeWithInformation, firstRetriever, retrieverTypeIndex); + for (int retrieverLevelIndex = currentRetrieverLevelIndex; retrieverLevelIndex >= 0; retrieverLevelIndex--) { + DataRetrieverLevel retrieverLevel = retrieverLevels.get(retrieverLevelIndex); + firstRetriever = createRetriever(retrieverLevel, firstRetriever, retrieverLevelIndex); } return (Processor) firstRetriever; } public boolean hasBeenInitialized() { - return currentRetrieverTypeIndex >= 0; + return currentRetrieverLevelIndex >= 0; } @SuppressWarnings("unchecked") - private Processor createRetriever(DataRetrieverLevel dataRetrieverTypeWithInformation, Processor previousRetriever, int retrieverTypeIndex) { - Class retrievedDataType = (Class) dataRetrieverTypeWithInformation.getRetrievedDataType(); + private Processor createRetriever(DataRetrieverLevel retrieverLevel, Processor previousRetriever, int retrieverLevelIndex) { + Class retrievedDataType = (Class) retrieverLevel.getRetrievedDataType(); - Collection storedResultReceivers = receivers.get(retrieverTypeIndex); + Collection storedResultReceivers = receivers.get(retrieverLevelIndex); Collection> resultReceivers = storedResultReceivers != null ? new ArrayList>((Collection>) storedResultReceivers) : new ArrayList>(); if (previousRetriever != null) { resultReceivers.add((Processor) previousRetriever); } - FilterCriterion filter = (FilterCriterion) filters.get(retrieverTypeIndex); + FilterCriterion filter = (FilterCriterion) filters.get(retrieverLevelIndex); - Class> retrieverType = (Class>)(Class) dataRetrieverTypeWithInformation.getRetrieverType(); - Class settingsType = dataRetrieverTypeWithInformation.getSettingsType(); - return createRetriever(retrieverType, retrievedDataType, resultReceivers, filter, settingsType, retrieverTypeIndex); + Class> retrieverType = (Class>)(Class) retrieverLevel.getRetrieverType(); + Class settingsType = retrieverLevel.getSettingsType(); + return createRetriever(retrieverType, retrievedDataType, resultReceivers, filter, settingsType, retrieverLevelIndex); } private Processor createRetriever(Class> retrieverType, Class retrievedDataType, - Collection> resultReceivers, FilterCriterion filter, Class settingsType, int retrieverTypeIndex) { + Collection> resultReceivers, FilterCriterion filter, Class settingsType, int retrieverLevelIndex) { Constructor> retrieverConstructor = null; try { if (settingsType == null) { @@ -166,13 +187,13 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr Object settings = null; if (settingsType != null) { - // TODO Get Settings for retriever. + this.settings.get(retrieverLevelIndex); } - return constructRetriever(retrieverConstructor, retrievedDataType, resultReceivers, filter, settings, retrieverTypeIndex); + return constructRetriever(retrieverConstructor, retrievedDataType, resultReceivers, filter, settings, settingsType, retrieverLevelIndex); } private Processor constructRetriever(Constructor> retrieverConstructor, Class retrievedDataType, - Collection> resultReceivers, FilterCriterion filter, Object settings, int retrieverTypeIndex) { + Collection> resultReceivers, FilterCriterion filter, Object settings, Class settingsType, int retrieverLevelIndex) { try { Collection> retrievalResultReceivers = resultReceivers; if (filter != null) { @@ -188,10 +209,10 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr retrieverConstructor.setAccessible(true); } - if (settings == null) { - return retrieverConstructor.newInstance(executor, retrievalResultReceivers, retrieverTypeIndex); + if (settingsType == null) { + return retrieverConstructor.newInstance(executor, retrievalResultReceivers, retrieverLevelIndex); } else { - return retrieverConstructor.newInstance(executor, retrievalResultReceivers, settings, retrieverTypeIndex); + return retrieverConstructor.newInstance(executor, retrievalResultReceivers, settings, retrieverLevelIndex); } } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {