It's now possible to register external classes

This commit is contained in:
Lennart Hensler committed 2014-06-06 07:11:36 +02:00
1 parent 25b35fd615
commit 5924455fa0
9 files changed
+52 -20

No files matched your search

@@ -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);
}
@@ -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<Class<?>> 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<Class<?>> externalClassesToScan = new HashSet<>();
externalClassesToScan.add(ExternalLibraryClass.class);
externalClassesToScan.add(Test_ExternalLibraryClass.class);
functionRegistry.registerAllWithExternalFunctionPolicy(externalClassesToScan);
}
@@ -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)
@@ -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<Class<?>> internalClassesToScan;
private HashSet<Class<?>> 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<Function<?>> expectedDimensions = createExpectedDimensions();
assertThat(registry.getDimensions(), is(expectedDimensions));
Collection<Function<?>> expectedStatistics = createExpectedStatistics();
assertThat(registry.getStatistics(), is(expectedStatistics));
Collection<Function<?>> expectedExternalFunctions = createExpectedExternalFunctions();
assertThat(registry.getExternalFunctions(), is(expectedExternalFunctions));
}
private Collection<Function<?>> createExpectedDimensions() throws NoSuchMethodException, SecurityException {
@@ -97,4 +106,13 @@ public class TestSimpleFunctionRegistryRegistrations {
return statistics;
}
private Collection<Function<?>> createExpectedExternalFunctions() throws NoSuchMethodException, SecurityException {
Method fooMethod = Test_ExternalLibraryClass.class.getMethod("foo", new Class<?>[0]);
Function<?> foo = FunctionFactory.createMethodWrappingFunction(fooMethod);
Collection<Function<?>> externalFunctions = new HashSet<>();
externalFunctions.add(foo);
return externalFunctions;
}
}
@@ -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
@@ -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() {
@@ -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<Function<?>> getMarkedMethodsOfDataTypeWithContextImplAndItsSupertypes() {
@@ -10,5 +10,6 @@ public interface FunctionRegistry {
public Collection<Function<?>> getAllFunctions();
public Collection<Function<?>> getStatistics();
public Collection<Function<?>> getDimensions();
public Collection<Function<?>> getExternalFunctions();
}
@@ -18,10 +18,12 @@ public class SimpleFunctionRegistry implements FunctionRegistry {
private final Set<Function<?>> statistics;
private final Set<Function<?>> dimensions;
private final Set<Function<?>> 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<Class<?>> 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<Function<?>> getAllFunctions() {
Collection<Function<?>> 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<Function<?>> getDimensions() {
return dimensions;
}
@Override
public Collection<Function<?>> getExternalFunctions() {
return externalFunctions;
}
}