From bda102aafca49e33b4e52409ee1c40ec696faf91 Mon Sep 17 00:00:00 2001 From: Lennart Hensler Date: Thu, 16 Apr 2015 18:25:03 +0200 Subject: [PATCH] The retriever chain builders stepFurther method is more safe to use --- .../sse/datamining/DataRetrieverChainBuilder.java | 2 ++ .../impl/SimpleDataRetrieverChainBuilder.java | 14 +++++++++----- .../impl/SimpleDataRetrieverChainDefinition.java | 8 ++++---- wiki/data-mining-architecture.md | 1 + 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainBuilder.java index f3b62aa85a6..4c42050baba 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/DataRetrieverChainBuilder.java @@ -20,6 +20,8 @@ public interface DataRetrieverChainBuilder { /** * Steps to the next data retriever in the chain. + * + * @throws IllegalStateException if {@link #canStepFurther()} would return false. */ public DataRetrieverChainBuilder stepFurther(); diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainBuilder.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainBuilder.java index 1b2ada2339f..893ecfb8acc 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainBuilder.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainBuilder.java @@ -58,6 +58,10 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public DataRetrieverChainBuilder stepFurther() { + if (!canStepFurther()) { + throw new IllegalStateException("The builder can't step any further"); + } + currentRetrieverTypeIndex++; return this; } @@ -65,7 +69,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public DataRetrieverChainBuilder setFilter(FilterCriterion filter) { if (!hasBeenInitialized()) { - throw new IllegalStateException(); + throw new IllegalStateException("The builder hasn't been initialized"); } if (!filter.getElementType().isAssignableFrom(getCurrentRetrievedDataType())) { @@ -80,7 +84,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public DataRetrieverChainBuilder addResultReceiver(Processor resultReceiver) { if (!hasBeenInitialized()) { - throw new IllegalStateException(); + throw new IllegalStateException("The builder hasn't been initialized"); } if (!resultReceiver.getInputType().isAssignableFrom(getCurrentRetrievedDataType())) { @@ -98,7 +102,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public Class getCurrentRetrievedDataType() { if (!hasBeenInitialized()) { - throw new IllegalStateException(); + throw new IllegalStateException("The builder hasn't been initialized"); } return dataRetrieverTypesWithInformation.get(currentRetrieverTypeIndex).getRetrievedDataType(); @@ -107,7 +111,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public int getCurrentRetrieverLevel() { if (!hasBeenInitialized()) { - throw new IllegalStateException(); + throw new IllegalStateException("The builder hasn't been initialized"); } return currentRetrieverTypeIndex; @@ -117,7 +121,7 @@ public class SimpleDataRetrieverChainBuilder implements DataRetr @Override public Processor build() { if (!hasBeenInitialized()) { - throw new IllegalStateException(); + throw new IllegalStateException("The builder hasn't been initialized"); } Processor firstRetriever = null; diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java index 089f5b5fb91..a81d0304195 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/SimpleDataRetrieverChainDefinition.java @@ -64,7 +64,7 @@ public class SimpleDataRetrieverChainDefinition implem public void startWith(Class> retrieverType, Class retrievedDataType, String retrievedDataTypeMessageKey) { if (isInitialized()) { - throw new UnsupportedOperationException("This retriever chain definition already has been started with '" + throw new IllegalStateException("This retriever chain definition already has been started with '" + dataRetrieverTypesWithInformation.get(0).getRetrieverType().getSimpleName() + "'"); } checkThatRetrieverHasUsableConstructor(retrieverType); @@ -83,10 +83,10 @@ public class SimpleDataRetrieverChainDefinition implem Class> nextRetrieverType, Class retrievedDataType, String retrievedDataTypeMessageKey) { if (!isInitialized()) { - throw new UnsupportedOperationException("This retriever chain definition hasn't been started yet"); + throw new IllegalStateException("This retriever chain definition hasn't been started yet"); } if (isComplete) { - throw new UnsupportedOperationException("This retriever chain definition is already complete"); + throw new IllegalStateException("This retriever chain definition is already complete"); } DataRetrieverTypeWithInformation dataRetrieverTypeWithInformation = dataRetrieverTypesWithInformation.get(dataRetrieverTypesWithInformation.size() - 1); @SuppressWarnings("unchecked") @@ -129,7 +129,7 @@ public class SimpleDataRetrieverChainDefinition implem @Override public DataRetrieverChainBuilder startBuilding(ExecutorService executor) { if (!isComplete) { - throw new UnsupportedOperationException("This retriever chain definition hasn't been completed yet"); + throw new IllegalStateException("This retriever chain definition hasn't been completed yet"); } return new SimpleDataRetrieverChainBuilder<>(executor, dataRetrieverTypesWithInformation); diff --git a/wiki/data-mining-architecture.md b/wiki/data-mining-architecture.md index c51e75448d4..82122311314 100644 --- a/wiki/data-mining-architecture.md +++ b/wiki/data-mining-architecture.md @@ -87,6 +87,7 @@ Concrete data retriever chain instances can be constructed with a `DataRetriever * The method `stepFurther` iterates over the retriever chain and sets the next retrieval processor as the one to modify. * Is similar to the `next` method of `Iterator`. * Initializes the builder, which is necessary to call the modifying methods. + * Throws an exception, if the builder can't step any further. * The method `canStepFurther` returns `true`, if `stepFurther` can be called at least once more. * Is similar to the `hasNext` method of `Iterator`