From 528698114efd1b8ea0ef556a3de52a77a0a3d40c Mon Sep 17 00:00:00 2001 From: DManstrator Date: Tue, 3 Feb 2026 11:23:37 +0100 Subject: [PATCH 1/5] Added new method `wrapOptional` to `ReflectionBasedWrapper` to convert Optionals properly --- .../core/wrapper/ReflectionBasedWrapper.java | 5 +++++ .../core/wrapper/WrapperHelper.java | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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..6fc53923f 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,27 @@ 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) + .filter(Optional::isPresent) + .map(Optional::get) + .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. From 4c4e2ddc57685ac9c9544064041debf31c5f8110 Mon Sep 17 00:00:00 2001 From: DManstrator Date: Tue, 3 Feb 2026 11:30:08 +0100 Subject: [PATCH 2/5] Added missing handling for VecDocumentVersion#getSpecificationWithType --- .../wrapper/vec11to12/Vec11To12DocumentVersionWrapper.java | 4 ++++ .../wrapper/vec12to11/Vec12To11DocumentVersionWrapper.java | 4 ++++ .../wrapper/vec12to20/Vec12To20DocumentVersionWrapper.java | 5 +++++ 3 files changed, 13 insertions(+) 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); } From c37a1e9281d1018065a0742b0735483cd50248c8 Mon Sep 17 00:00:00 2001 From: DManstrator Date: Tue, 3 Feb 2026 11:57:40 +0100 Subject: [PATCH 3/5] Added test verifying the getSpecification(s)WithType methods # Conflicts: # compatibility/compatibility-vec12to20/src/test/java/com/foursoft/harness/compatibility/vec12to20/wrapper/vec12to20/Vec12To20DocumentVersionWrapperTest.java --- .../Vec12To20DocumentVersionWrapperTest.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) 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(); + } + } + } From c6eb90eed0097debb01feaca34eee4e5708e94c5 Mon Sep 17 00:00:00 2001 From: DManstrator Date: Tue, 3 Feb 2026 12:42:20 +0100 Subject: [PATCH 4/5] Added missing getSpecification(s)WithType handling for the VEC 2.0 to VEC 1.2 conversion --- .../vec20to12/Vec20To12DocumentVersionWrapper.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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); From a7bf404c7c327b07141c02e293173233673e8c2e Mon Sep 17 00:00:00 2001 From: DManstrator Date: Tue, 24 Feb 2026 11:00:44 +0100 Subject: [PATCH 5/5] Apply feedback from review --- .../harness/compatibility/core/wrapper/WrapperHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 6fc53923f..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 @@ -103,8 +103,7 @@ public List getResultList(final String methodName, final Object target, public Optional wrapOptional(final String methodName, final Object target, final Class targetClass, final Object[] args) { return getResultObject(methodName, target, Optional.class, args) - .filter(Optional::isPresent) - .map(Optional::get) + .flatMap(x -> (Optional) x) .map(wrapper.getContext().getWrapperProxyFactory()::createProxy) .filter(targetClass::isInstance) .map(targetClass::cast);