diff --git a/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/ReflectionBasedWrapper.java b/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/ReflectionBasedWrapper.java index 3abc46f41..c7a86ff96 100644 --- a/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/ReflectionBasedWrapper.java +++ b/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/ReflectionBasedWrapper.java @@ -107,6 +107,11 @@ protected List getResultList(final String methodName, return wrapperHelper.getResultList(methodName, target, targetClass, args); } + protected Optional wrapOptional(final String methodName, + final Class targetClass, final Object... args) { + return wrapperHelper.wrapOptional(methodName, target, targetClass, args); + } + protected List wrapList(final String methodName, final Class targetClass, final Object... args) { return wrapperHelper.wrapList(methodName, target, targetClass, args); diff --git a/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/WrapperHelper.java b/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/WrapperHelper.java index 8b70d3480..048990906 100644 --- a/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/WrapperHelper.java +++ b/compatibility/compatibility-core/src/main/java/com/foursoft/harness/compatibility/core/wrapper/WrapperHelper.java @@ -89,6 +89,26 @@ public List getResultList(final String methodName, final Object target, return invokeListMethod(false, methodName, target, targetClass, args); } + /** + * Helper method for methods which return an {@link Optional}. + * This method creates a proxy for the Optional. + * + * @param methodName Name of the method to invoke. The return type of that method needs to be an Optional. + * @param target Target object used for the method invocation. + * @param targetClass The target class the Optional should contain after a proxy was created. + * @param args Additional method arguments. + * @param Target type of the Optional. + * @return Possibly-empty Optional containing the proxy element of the given target class. + */ + public Optional wrapOptional(final String methodName, final Object target, + final Class targetClass, final Object[] args) { + return getResultObject(methodName, target, Optional.class, args) + .flatMap(x -> (Optional) x) + .map(wrapper.getContext().getWrapperProxyFactory()::createProxy) + .filter(targetClass::isInstance) + .map(targetClass::cast); + } + /** * Helper method for methods which return a list. * This method creates a proxy for every list element. diff --git a/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec11to12/Vec11To12DocumentVersionWrapper.java b/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec11to12/Vec11To12DocumentVersionWrapper.java index 72b0f3e80..2d8174c79 100644 --- a/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec11to12/Vec11To12DocumentVersionWrapper.java +++ b/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec11to12/Vec11To12DocumentVersionWrapper.java @@ -52,6 +52,10 @@ protected Object wrapObject(final Object obj, final Method method, final Object[ final Class vec12xClass = (Class) allArguments[0]; final Class vec11xClass = getContext().getClassMapper().map(vec12xClass); return wrapList("getSpecificationsWithType", vec12xClass, vec11xClass); + } else if ("getSpecificationWithType".equals(method.getName())) { + final Class vec12xClass = (Class) allArguments[0]; + final Class vec11xClass = getContext().getClassMapper().map(vec12xClass); + return wrapOptional("getSpecificationWithType", vec12xClass, vec11xClass); } return super.wrapObject(obj, method, allArguments); diff --git a/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec12to11/Vec12To11DocumentVersionWrapper.java b/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec12to11/Vec12To11DocumentVersionWrapper.java index 08508d61b..29da3308b 100644 --- a/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec12to11/Vec12To11DocumentVersionWrapper.java +++ b/compatibility/compatibility-vec11to12/src/main/java/com/foursoft/harness/compatibility/vec11to12/wrapper/vec12to11/Vec12To11DocumentVersionWrapper.java @@ -52,6 +52,10 @@ protected Object wrapObject(final Object obj, final Method method, final Object[ final Class vec11xClass = (Class) allArguments[0]; final Class vec12xClass = getContext().getClassMapper().map(vec11xClass); return wrapList("getSpecificationsWithType", vec11xClass, vec12xClass); + } else if ("getSpecificationWithType".equals(method.getName())) { + final Class vec11xClass = (Class) allArguments[0]; + final Class vec12xClass = getContext().getClassMapper().map(vec11xClass); + return wrapOptional("getSpecificationWithType", vec11xClass, vec12xClass); } return super.wrapObject(obj, method, allArguments); diff --git a/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapper.java b/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapper.java index 6d265f8fe..8741b322b 100644 --- a/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapper.java +++ b/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapper.java @@ -69,7 +69,12 @@ protected Object wrapObject(final Object obj, final Method method, final Object[ final Class vec20xClass = (Class) allArguments[0]; final Class vec12xClass = getContext().getClassMapper().map(vec20xClass); return wrapList("getSpecificationsWithType", vec20xClass, vec12xClass); + } else if ("getSpecificationWithType".equals(method.getName())) { + final Class vec20xClass = (Class) allArguments[0]; + final Class vec12xClass = getContext().getClassMapper().map(vec20xClass); + return wrapOptional("getSpecificationWithType", vec20xClass, vec12xClass); } + return super.wrapObject(obj, method, allArguments); } diff --git a/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec20to12/Vec20To12DocumentVersionWrapper.java b/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec20to12/Vec20To12DocumentVersionWrapper.java index b504760b1..969893c76 100644 --- a/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec20to12/Vec20To12DocumentVersionWrapper.java +++ b/compatibility/compatibility-vec12to20/src/main/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec20to12/Vec20To12DocumentVersionWrapper.java @@ -64,6 +64,14 @@ protected Object wrapObject(final Object obj, final Method method, final Object[ } else if ("setNumberOfSheets".equals(methodName)) { numberOfSheets = (String) allArguments[0]; return null; + } else if ("getSpecificationsWithType".equals(method.getName())) { + final Class vec12xClass = (Class) allArguments[0]; + final Class vec20xClass = getContext().getClassMapper().map(vec12xClass); + return wrapList("getSpecificationsWithType", vec12xClass, vec20xClass); + } else if ("getSpecificationWithType".equals(method.getName())) { + final Class vec12xClass = (Class) allArguments[0]; + final Class vec20xClass = getContext().getClassMapper().map(vec12xClass); + return wrapOptional("getSpecificationWithType", vec12xClass, vec20xClass); } return super.wrapObject(obj, method, allArguments); diff --git a/compatibility/compatibility-vec12to20/src/test/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapperTest.java b/compatibility/compatibility-vec12to20/src/test/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapperTest.java index 8be9774ff..85b54fe50 100644 --- a/compatibility/compatibility-vec12to20/src/test/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapperTest.java +++ b/compatibility/compatibility-vec12to20/src/test/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapperTest.java @@ -28,8 +28,8 @@ import com.foursoft.harness.compatibility.vec12to20.TestFiles; import com.foursoft.harness.compatibility.vec12to20.util.DefaultVecReader; import com.foursoft.harness.compatibility.vec12to20.wrapper.AbstractBaseWrapperTest; -import com.foursoft.harness.vec.v2x.VecContent; -import com.foursoft.harness.vec.v2x.VecDocumentVersion; +import com.foursoft.harness.vec.common.util.StreamUtils; +import com.foursoft.harness.vec.v2x.*; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -57,4 +57,29 @@ void invokeTest() throws IOException { assertThat(vecDocumentVersion.getNumberOfSheets()).isEqualTo(5); } } + + @Test + void testGetSpecificationWithType() throws IOException { + try (final InputStream inputOriginal = TestFiles.getInputStream(TestFiles.OLD_BEETLE_V12X)) { + final VecContent originalContent = DefaultVecReader.read(inputOriginal, "test"); + assertThat(originalContent).isNotNull(); + + final VecDocumentVersion vecDocumentVersion = originalContent.getDocumentVersions().stream() + .filter(d -> d.getDocumentNumber().equals("3D2_937_499")) + .collect(StreamUtils.findOne()); + + assertThat(vecDocumentVersion.getSpecifications()) + .hasSize(45); + + assertThat(vecDocumentVersion.getSpecificationsWithType(VecConnectorHousingSpecification.class)) + .hasSize(32); + + assertThat(vecDocumentVersion.getSpecificationWithType(VecSignalSpecification.class)) + .isPresent(); + + assertThat(vecDocumentVersion.getSpecificationWithType(VecBatterySpecification.class)) + .isEmpty(); + } + } + }