diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java index 95108a1c662..23441d87feb 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionDTOConstruction.java @@ -17,7 +17,7 @@ import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; import com.sap.sse.datamining.shared.dto.FunctionDTO; import com.sap.sse.datamining.shared.impl.dto.FunctionDTOImpl; -import com.sap.sse.datamining.test.functions.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.TestsUtil; @@ -35,7 +35,7 @@ public class TestFunctionDTOConstruction { public void initializeMethods() { dimensionMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "dimension"); sideEffectFreeValueMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "sideEffectFreeValue"); - externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo"); + externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"); incrementMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "increment", int.class); } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java index dd6196b2324..edcc9e48871 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestFunctionProvider.java @@ -18,14 +18,12 @@ import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.functions.FunctionProvider; import com.sap.sse.datamining.functions.FunctionRegistry; import com.sap.sse.datamining.i18n.DataMiningStringMessages; -import com.sap.sse.datamining.impl.functions.RegistryFunctionProvider; -import com.sap.sse.datamining.impl.functions.SimpleFunctionRegistry; import com.sap.sse.datamining.shared.dto.FunctionDTO; +import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; import com.sap.sse.datamining.test.functions.test_classes.ContainerElement; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; -import com.sap.sse.datamining.test.functions.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.functions.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.functions.test_classes.MarkedContainer; import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; import com.sap.sse.datamining.test.util.FunctionTestsUtil; @@ -42,15 +40,11 @@ public class TestFunctionProvider { functionRegistry = new SimpleFunctionRegistry(); Collection> internalClassesToScan = new HashSet<>(); - internalClassesToScan.add(SimpleClassWithMarkedMethods.class); - internalClassesToScan.add(DataTypeWithContext.class); - internalClassesToScan.add(ExtendingInterface.class); - internalClassesToScan.add(MarkedContainer.class); - internalClassesToScan.add(ContainerElement.class); + internalClassesToScan.add(Test_HasLegContext.class); functionRegistry.registerAllWithInternalFunctionPolicy(internalClassesToScan); Collection> externalClassesToScan = new HashSet<>(); - externalClassesToScan.add(ExternalLibraryClass.class); + externalClassesToScan.add(Test_ExternalLibraryClass.class); functionRegistry.registerAllWithExternalFunctionPolicy(externalClassesToScan); } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java index ad171480731..7ab4342714b 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestMethodWrappingFunction.java @@ -13,7 +13,7 @@ import com.sap.sse.datamining.factories.FunctionFactory; import com.sap.sse.datamining.functions.Function; import com.sap.sse.datamining.i18n.DataMiningStringMessages; import com.sap.sse.datamining.impl.functions.MethodWrappingFunction; -import com.sap.sse.datamining.test.functions.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; import com.sap.sse.datamining.test.util.FunctionTestsUtil; import com.sap.sse.datamining.test.util.TestsUtil; @@ -28,7 +28,7 @@ public class TestMethodWrappingFunction { public void initializeMethods() { dimensionMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "dimension"); sideEffectFreeValueMethod = FunctionTestsUtil.getMethodFromClass(SimpleClassWithMarkedMethods.class, "sideEffectFreeValue"); - externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo"); + externalLibraryMethod = FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo"); } @Test(expected=IllegalArgumentException.class) diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistryRegistrations.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistryRegistrations.java index 8517b44a7cf..30a1d668ab0 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistryRegistrations.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/TestSimpleFunctionRegistryRegistrations.java @@ -21,29 +21,38 @@ import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Leg; import com.sap.sse.datamining.test.functions.registry.test_classes.Test_Named; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasLegContext; import com.sap.sse.datamining.test.functions.registry.test_contexts.Test_HasRaceContext; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; public class TestSimpleFunctionRegistryRegistrations { private Set> internalClassesToScan; + private HashSet> externalClassesToScan; @Before public void initializeClassesToScan() { internalClassesToScan = new HashSet<>(); internalClassesToScan.add(Test_HasLegContext.class); internalClassesToScan.add(Test_HasRaceContext.class); + + externalClassesToScan = new HashSet<>(); + externalClassesToScan.add(Test_ExternalLibraryClass.class); } @Test public void testRegistration() throws NoSuchMethodException, SecurityException { FunctionRegistry registry = new SimpleFunctionRegistry(); registry.registerAllWithInternalFunctionPolicy(internalClassesToScan); + registry.registerAllWithExternalFunctionPolicy(externalClassesToScan); Collection> expectedDimensions = createExpectedDimensions(); assertThat(registry.getDimensions(), is(expectedDimensions)); Collection> expectedStatistics = createExpectedStatistics(); assertThat(registry.getStatistics(), is(expectedStatistics)); + + Collection> expectedExternalFunctions = createExpectedExternalFunctions(); + assertThat(registry.getExternalFunctions(), is(expectedExternalFunctions)); } private Collection> createExpectedDimensions() throws NoSuchMethodException, SecurityException { @@ -97,4 +106,13 @@ public class TestSimpleFunctionRegistryRegistrations { return statistics; } + private Collection> createExpectedExternalFunctions() throws NoSuchMethodException, SecurityException { + Method fooMethod = Test_ExternalLibraryClass.class.getMethod("foo", new Class[0]); + Function foo = FunctionFactory.createMethodWrappingFunction(fooMethod); + + Collection> externalFunctions = new HashSet<>(); + externalFunctions.add(foo); + return externalFunctions; + } + } diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java index d180b383486..9a6484ec500 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/impl/functions/criterias/TestDeclaringTypeOrParameterTypeCriteria.java @@ -14,7 +14,7 @@ import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; import com.sap.sse.datamining.test.functions.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.functions.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.util.FunctionTestsUtil; public class TestDeclaringTypeOrParameterTypeCriteria { @@ -31,7 +31,7 @@ public class TestDeclaringTypeOrParameterTypeCriteria { getRaceNameLengthValue = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExtendingInterface.class, "getRaceNameLength")); getRegattaNameDimension = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(DataTypeWithContext.class, "getRegattaName")); - libraryFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(ExternalLibraryClass.class, "foo")); + libraryFunction = FunctionFactory.createMethodWrappingFunction(FunctionTestsUtil.getMethodFromClass(Test_ExternalLibraryClass.class, "foo")); } @Test diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExternalLibraryClass.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java similarity index 89% rename from java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExternalLibraryClass.java rename to java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java index a740264a924..87e886985ff 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/ExternalLibraryClass.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/functions/test_classes/Test_ExternalLibraryClass.java @@ -5,7 +5,7 @@ package com.sap.sse.datamining.test.functions.test_classes; * The tests will fail, because they are reflected via constant strings. */ -public class ExternalLibraryClass { +public class Test_ExternalLibraryClass { //This method shouldn't be retrieved, because it has no return type public void fooVoid() { diff --git a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java index 8d90690425e..19c442c88cc 100644 --- a/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java +++ b/java/com.sap.sse.datamining.test/src/com/sap/sse/datamining/test/util/FunctionTestsUtil.java @@ -13,7 +13,7 @@ import com.sap.sse.datamining.test.functions.test_classes.DataTypeInterface; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContext; import com.sap.sse.datamining.test.functions.test_classes.DataTypeWithContextImpl; import com.sap.sse.datamining.test.functions.test_classes.ExtendingInterface; -import com.sap.sse.datamining.test.functions.test_classes.ExternalLibraryClass; +import com.sap.sse.datamining.test.functions.test_classes.Test_ExternalLibraryClass; import com.sap.sse.datamining.test.functions.test_classes.SimpleClassWithMarkedMethods; public class FunctionTestsUtil extends ConcurrencyTestsUtil { @@ -36,7 +36,7 @@ public class FunctionTestsUtil extends ConcurrencyTestsUtil { } public static Method getMethodFromExternalLibraryClass(String name) { - return getMethodFromClass(ExternalLibraryClass.class, name); + return getMethodFromClass(Test_ExternalLibraryClass.class, name); } public static Collection> getMarkedMethodsOfDataTypeWithContextImplAndItsSupertypes() { diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java index 273e84e6d90..4a80be9f675 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/functions/FunctionRegistry.java @@ -10,5 +10,6 @@ public interface FunctionRegistry { public Collection> getAllFunctions(); public Collection> getStatistics(); public Collection> getDimensions(); + public Collection> getExternalFunctions(); } diff --git a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java index 26ed1e5250d..6a00098f44e 100644 --- a/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java +++ b/java/com.sap.sse.datamining/src/com/sap/sse/datamining/impl/functions/SimpleFunctionRegistry.java @@ -18,10 +18,12 @@ public class SimpleFunctionRegistry implements FunctionRegistry { private final Set> statistics; private final Set> dimensions; + private final Set> externalFunctions; public SimpleFunctionRegistry() { statistics = new HashSet<>(); dimensions = new HashSet<>(); + externalFunctions = new HashSet<>(); } @Override @@ -87,14 +89,26 @@ public class SimpleFunctionRegistry implements FunctionRegistry { @Override public void registerAllWithExternalFunctionPolicy(Collection> externalClassesToScan) { - // TODO Not yet implemented + for (Class externalClass : externalClassesToScan) { + for (Method method : externalClass.getMethods()) { + if (isValidExternalFunction(method)) { + Function function = FunctionFactory.createMethodWrappingFunction(method); + externalFunctions.add(function); + } + } + } } + private boolean isValidExternalFunction(Method method) { + return !method.getReturnType().equals(Void.TYPE) && !method.getDeclaringClass().equals(Object.class); + } + @Override public Collection> getAllFunctions() { Collection> allFunctions = new HashSet<>(); allFunctions.addAll(statistics); allFunctions.addAll(dimensions); + allFunctions.addAll(externalFunctions); return allFunctions; } @@ -107,5 +121,10 @@ public class SimpleFunctionRegistry implements FunctionRegistry { public Collection> getDimensions() { return dimensions; } + + @Override + public Collection> getExternalFunctions() { + return externalFunctions; + } }