diff --git a/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF b/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF index 46a87ad8dd..e269851e6d 100644 --- a/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF +++ b/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF @@ -6,8 +6,10 @@ Bundle-Version: 2.6.0.qualifier Bundle-Activator: org.eclipse.set.application.Activator Bundle-Vendor: Eclipse Signalling Engineering Toolbox Export-Package: org.eclipse.set.application, + org.eclipse.set.application.cacheservice, org.eclipse.set.application.controlarea, org.eclipse.set.application.geometry, + org.eclipse.set.application.graph, org.eclipse.set.application.handler, org.eclipse.set.application.nameservice Require-Bundle: org.eclipse.core.runtime, diff --git a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankServiceImpl.java b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankServiceImpl.java index 0f02162b1a..d3cd1f4ced 100644 --- a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankServiceImpl.java +++ b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankServiceImpl.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -71,25 +70,6 @@ EventHandler.class, BankService.class }) public class BankServiceImpl implements BankService, EventHandler { - private class BankingInformationSession { - private final Map> topEdgeBanking; - private final Map> bankingInformations; - - public BankingInformationSession() { - this.topEdgeBanking = new ConcurrentHashMap<>(); - this.bankingInformations = new ConcurrentHashMap<>(); - } - - public Map> getTopEdgeBanking() { - return topEdgeBanking; - } - - public Map> getBankingInformations() { - return bankingInformations; - } - - } - @Reference private TopologicalGraphService topGraph; diff --git a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankingInformationSession.java b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankingInformationSession.java new file mode 100644 index 0000000000..ccbf6d5292 --- /dev/null +++ b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/graph/BankingInformationSession.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2026 DB InfraGO AG and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + */ +package org.eclipse.set.application.graph; + +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.set.core.services.graph.BankService.BankingInformation; +import org.eclipse.set.model.planpro.Geodaten.TOP_Kante; +import org.eclipse.set.model.planpro.Geodaten.Ueberhoehungslinie; + +/** + * Helper class for find BankingInformation + */ +public class BankingInformationSession { + private final Map> topEdgeBanking; + private final Map> bankingInformations; + + /** + * Constructor + */ + public BankingInformationSession() { + this.topEdgeBanking = new ConcurrentHashMap<>(); + this.bankingInformations = new ConcurrentHashMap<>(); + } + + public Map> getTopEdgeBanking() { + return topEdgeBanking; + } + + public Map> getBankingInformations() { + return bankingInformations; + } +} diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.classpath b/java/bundles/org.eclipse.set.feature.table.pt1.test/.classpath new file mode 100644 index 0000000000..1aa9eca95a --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.gitignore b/java/bundles/org.eclipse.set.feature.table.pt1.test/.gitignore new file mode 100644 index 0000000000..07f43b870e --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.gitignore @@ -0,0 +1 @@ +data/* \ No newline at end of file diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.project b/java/bundles/org.eclipse.set.feature.table.pt1.test/.project new file mode 100644 index 0000000000..4bbd4b89a7 --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.project @@ -0,0 +1,33 @@ + + + org.eclipse.set.feature.table.pt1.test + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.core.resources.prefs b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.jdt.core.prefs b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..23fa13b170 --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=21 diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.pde.core.prefs b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000000..f29e940a00 --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/META-INF/MANIFEST.MF b/java/bundles/org.eclipse.set.feature.table.pt1.test/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..461b98c866 --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/META-INF/MANIFEST.MF @@ -0,0 +1,30 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Pt1 Table Test +Bundle-SymbolicName: org.eclipse.set.feature.table.pt1.test +Bundle-Vendor: Eclipse Signalling Engineering Toolbox +Bundle-Version: 2.6.0.qualifier +Fragment-Host: org.eclipse.set.feature.table.pt1;bundle-version="0.1.0" +Automatic-Module-Name: org.eclipse.set.feature.table.pt1.test +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-21 +Import-Package: com.google.common.util.concurrent, + com.google.common.util.concurrent.internal, + net.bytebuddy, + net.bytebuddy.agent, + org.apache.commons.collections4, + org.apache.commons.lang3, + org.apache.commons.lang3.reflect, + org.eclipse.set.application.cacheservice, + org.eclipse.set.application.geometry, + org.eclipse.set.application.graph, + org.eclipse.set.unittest.utils, + org.eclipse.set.utils, + org.eclipse.swt.widgets, + org.jgrapht.graph, + org.jheaps.tree, + org.junit.jupiter.api, + org.junit.jupiter.api.function, + org.junit.jupiter.params, + org.junit.jupiter.params.provider +Require-Bundle: org.mockito.mockito-core diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/build.properties b/java/bundles/org.eclipse.set.feature.table.pt1.test/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/pom.xml b/java/bundles/org.eclipse.set.feature.table.pt1.test/pom.xml new file mode 100644 index 0000000000..34a194726b --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + org.eclipse.set + org.eclipse.set.feature.table.pt1.test + 2.6.0-SNAPSHOT + eclipse-test-plugin + + + ../../ + org.eclipse.set + org.eclipse.set.releng.parent + 2.6.0-SNAPSHOT + + + + + + maven-resources-plugin + 3.5.0 + + + copy-news + prepare-package + + copy-resources + + + ${basedir}/data/export/excel + + + ${basedir}/../org.eclipse.set.feature/rootdir/data/export/excel + + + + + + + + + maven-clean-plugin + 3.5.0 + + + + data + false + + + + + + + \ No newline at end of file diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTest.java b/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTest.java new file mode 100644 index 0000000000..bd0be70e5c --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTest.java @@ -0,0 +1,344 @@ +/** + * Copyright (c) 2026 DB InfraGO AG and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + */ +package org.eclipse.set.feature.table.pt1.test; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.eclipse.emf.common.util.Enumerator; +import org.eclipse.set.application.cacheservice.CacheServiceImpl; +import org.eclipse.set.application.geometry.GeoKanteGeometryServiceImpl; +import org.eclipse.set.application.geometry.GeoKanteGeometrySessionData; +import org.eclipse.set.application.graph.BankServiceImpl; +import org.eclipse.set.application.graph.BankingInformationSession; +import org.eclipse.set.application.graph.TopologicalGraphServiceImpl; +import org.eclipse.set.basis.Translateable; +import org.eclipse.set.basis.constants.ContainerType; +import org.eclipse.set.basis.files.ToolboxFileRole; +import org.eclipse.set.core.services.Services; +import org.eclipse.set.core.services.cache.CacheService; +import org.eclipse.set.core.services.enumtranslation.EnumTranslation; +import org.eclipse.set.core.services.enumtranslation.EnumTranslationService; +import org.eclipse.set.core.services.geometry.GeoKanteGeometryService; +import org.eclipse.set.feature.table.PlanPro2TableTransformationService; +import org.eclipse.set.feature.table.pt1.AbstractPlanPro2TableTransformationService; +import org.eclipse.set.feature.table.pt1.messages.Messages; +import org.eclipse.set.feature.table.pt1.ssbb.SsbbTransformationService; +import org.eclipse.set.feature.table.pt1.ssit.SsitTransformationService; +import org.eclipse.set.feature.table.pt1.sska.SskaTransformationService; +import org.eclipse.set.feature.table.pt1.sskf.SskfTransformationService; +import org.eclipse.set.feature.table.pt1.sskg.SskgTransformationService; +import org.eclipse.set.feature.table.pt1.ssko.SskoTransformationService; +import org.eclipse.set.feature.table.pt1.sskp.SskpTransformationService; +import org.eclipse.set.feature.table.pt1.sskp.dm.SskpDmTransformationService; +import org.eclipse.set.feature.table.pt1.ssks.SsksTransformationService; +import org.eclipse.set.feature.table.pt1.sskt.SsktTransformationService; +import org.eclipse.set.feature.table.pt1.sskw.SskwTransformationService; +import org.eclipse.set.feature.table.pt1.sskx.SskxTransformationService; +import org.eclipse.set.feature.table.pt1.sskz.SskzTransformationService; +import org.eclipse.set.feature.table.pt1.ssla.SslaTransformationService; +import org.eclipse.set.feature.table.pt1.sslb.SslbTransformationService; +import org.eclipse.set.feature.table.pt1.ssld.SsldTransformationService; +import org.eclipse.set.feature.table.pt1.sslf.SslfTransformationService; +import org.eclipse.set.feature.table.pt1.ssli.SsliTransformationService; +import org.eclipse.set.feature.table.pt1.ssln.SslnTransformationService; +import org.eclipse.set.feature.table.pt1.sslr.SslrTransformationService; +import org.eclipse.set.feature.table.pt1.ssls.SslsTransformationService; +import org.eclipse.set.feature.table.pt1.sslw.SslwTransformationService; +import org.eclipse.set.feature.table.pt1.sslz.SslzTransformationService; +import org.eclipse.set.feature.table.pt1.ssvu.SsvuTransformationService; +import org.eclipse.set.feature.table.pt1.ssza.SszaTransformationService; +import org.eclipse.set.feature.table.pt1.sszs.SszsTransformationService; +import org.eclipse.set.feature.table.pt1.sszw.SszwTransformationService; +import org.eclipse.set.feature.table.pt1.sxxx.SxxxTransformationService; +import org.eclipse.set.model.planpro.PlanPro.PlanPro_Schnittstelle; +import org.eclipse.set.ppmodel.extensions.PlanProSchnittstelleExtensions; +import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGroup; +import org.eclipse.set.ppmodel.extensions.utils.TableNameInfo; +import org.eclipse.set.unittest.utils.AbstractToolboxTest; +import org.eclipse.set.utils.graph.AsSplitTopGraph; +import org.jgrapht.graph.WeightedPseudograph; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +/** + * Abstract class for test transformation of Pt1 tables + * + * @author Truong + */ +public class Pt1TableTest extends AbstractToolboxTest { + private static EnumTranslation mockEnumTranlsation(final Object value) { + return new EnumTranslation() { + + @Override + public String getAlternative() { + return value.toString(); + } + + @Override + public String getKeyBasis() { + return value.toString(); + } + + @Override + public String getPresentation() { + return value.toString(); + } + + @Override + public String getSorting() { + return ""; + } + }; + } + + protected static Field getSuperClassField(final Class clazz, + final String fieldName) { + Field result = null; + Class superClazz = clazz; + while (result == null && superClazz != null) { + try { + final Field declaredField = superClazz + .getDeclaredField(fieldName); + result = declaredField; + } catch (final Exception e) { + superClazz = superClazz.getSuperclass(); + continue; + } + } + return result; + } + + protected static void mockServiceFieldVariable( + final PlanPro2TableTransformationService service, + final Object fieldVariable) throws Exception { + for (final Field field : service.getClass().getDeclaredFields()) { + if (field.getType().isInstance(fieldVariable)) { + FieldUtils.writeField(field, service, fieldVariable, true); + } + } + } + + protected static void mockTableNameInfo( + final PlanPro2TableTransformationService service) { + final String packageName = service.getClass().getPackageName(); + String tableName = packageName + .substring(packageName.lastIndexOf(".") + 1); + if (tableName.equals("dm")) { + tableName = "sskp_dm"; + } + final TableNameInfo mockTableNameInfo = Mockito + .mock(TableNameInfo.class); + Mockito.doReturn(mockTableNameInfo).when(service).getTableNameInfo(); + Mockito.when(mockTableNameInfo.getShortName()).thenReturn(tableName); + + } + + private BankServiceImpl bankService; + private CacheService cacheService; + + private GeoKanteGeometryService geometryService; + + private Messages messages; + + private EnumTranslationService mockEnumTranslation; + private TopologicalGraphServiceImpl topologicalGraphService; + + List transformationServices; + + protected List getLSTContainer() { + return List + .of(ContainerType.FINAL, ContainerType.INITIAL, + ContainerType.SINGLE) + .stream() + .map(containerType -> PlanProSchnittstelleExtensions + .getContainer(planProSchnittstelle, containerType)) + .filter(Objects::nonNull) + .toList(); + } + + /** + * IMPROVE: use OSGi service unit test to inject these service + */ + protected void givenTransformationService() { + transformationServices = List + .of(new SsbbTransformationService(), + new SsitTransformationService(), + new SskaTransformationService(), + new SskfTransformationService(), + new SskgTransformationService(), + new SskoTransformationService(), + new SskpTransformationService(), + new SskpDmTransformationService(), + new SsksTransformationService(), + new SsktTransformationService(), + new SskwTransformationService(), + new SskxTransformationService(), + new SskzTransformationService(), + new SslaTransformationService(), + new SslbTransformationService(), + new SsldTransformationService(), + new SslfTransformationService(), + new SsliTransformationService(), + new SslnTransformationService(), + new SslrTransformationService(), + new SslsTransformationService(), + new SslwTransformationService(), + new SslzTransformationService(), + new SsvuTransformationService(), + new SszaTransformationService(), + new SszsTransformationService(), + new SszwTransformationService(), + new SxxxTransformationService()) + .stream() + .map(Mockito::spy) + .toList(); + } + + protected void setupBankingService() throws Exception { + if (topologicalGraphService == null) { + setupTopGraphService(); + } + bankService = new BankServiceImpl(); + final Method declaredMethod = bankService.getClass() + .getDeclaredMethod("addBankingForContainer", + BankingInformationSession.class, + MultiContainer_AttributeGroup.class); + declaredMethod.setAccessible(true); + final BankingInformationSession bankingInformationSession = new BankingInformationSession(); + for (final MultiContainer_AttributeGroup container : getLSTContainer()) { + declaredMethod.invoke(bankService, bankingInformationSession, + container); + } + } + + protected void setupEnumTranslationService() { + mockEnumTranslation = Mockito.mock(EnumTranslationService.class); + Mockito.when(mockEnumTranslation.translate(any(), any())) + .thenAnswer(invocation -> { + return mockEnumTranlsation(invocation.getArguments()[1]); + }); + Mockito.when(mockEnumTranslation.translate(anyBoolean())) + .thenAnswer(invocation -> mockEnumTranlsation( + invocation.getArgument(0))); + Mockito.when(mockEnumTranslation.translate(any(Enumerator.class))) + .thenAnswer(invocation -> mockEnumTranlsation( + invocation.getArgument(0))); + Mockito.when(mockEnumTranslation.translate(any(Translateable.class))) + .thenAnswer(invocation -> mockEnumTranlsation( + invocation.getArgument(0))); + } + + protected void setupGeometryService() throws Exception { + geometryService = new GeoKanteGeometryServiceImpl(); + final Map sessionesData = new HashMap<>(); + + final GeoKanteGeometrySessionData geometrySessionData = new GeoKanteGeometrySessionData(); + sessionesData.put(planProSchnittstelle, geometrySessionData); + + FieldUtils.writeField(geometryService, "sessionesData", sessionesData, + true); + + final Method declaredMethod = geometryService.getClass() + .getDeclaredMethod("findGeoKanteGeometry", + GeoKanteGeometrySessionData.class, + MultiContainer_AttributeGroup.class); + declaredMethod.setAccessible(true); + + declaredMethod.invoke(geometryService, geometrySessionData, + PlanProSchnittstelleExtensions.getContainer( + planProSchnittstelle, ContainerType.INITIAL)); + declaredMethod.invoke(geometryService, geometrySessionData, + PlanProSchnittstelleExtensions.getContainer( + planProSchnittstelle, ContainerType.FINAL)); + FieldUtils.writeField(geometryService, "isProcessComplete", + Boolean.TRUE, true); + + } + + protected void setupMessages() throws Exception { + messages = new Messages(); + for (final Field field : messages.getClass().getDeclaredFields()) { + FieldUtils.writeField(field, messages, field.getName()); + } + + } + + protected void setupMockServices( + final MockedStatic mockServices) { + mockServices.when(Services::getCacheService).thenReturn(cacheService); + mockServices.when(Services::getTopGraphService) + .thenReturn(topologicalGraphService); + mockServices.when(Services::getEnumTranslationService) + .thenReturn(mockEnumTranslation); + mockServices.when(Services::getGeometryService) + .thenReturn(geometryService); + } + + protected void setupTopGraphService() throws Exception { + if (topologicalGraphService != null) { + return; + } + topologicalGraphService = new TopologicalGraphServiceImpl(); + final Method declaredMethod = topologicalGraphService.getClass() + .getDeclaredMethod("addContainerToGraph", + WeightedPseudograph.class, + MultiContainer_AttributeGroup.class); + declaredMethod.setAccessible(true); + final WeightedPseudograph weightedPseudograph = new WeightedPseudograph<>( + AsSplitTopGraph.Edge.class); + final List containers = getLSTContainer(); + for (final MultiContainer_AttributeGroup contanier : containers) { + declaredMethod.invoke(topologicalGraphService, weightedPseudograph, + contanier); + } + final Map> topGraphBaseMap = new HashMap<>(); + topGraphBaseMap.put(planProSchnittstelle, weightedPseudograph); + FieldUtils.writeField(topologicalGraphService, "topGraphBaseMap", + topGraphBaseMap, true); + } + + protected void setupTransformationService() throws Exception { + setupTopGraphService(); + setupBankingService(); + setupEnumTranslationService(); + setupMessages(); + setupGeometryService(); + givenCacheService(); + givenTransformationService(); + for (final AbstractPlanPro2TableTransformationService impl : transformationServices) { + mockServiceFieldVariable(impl, topologicalGraphService); + mockServiceFieldVariable(impl, messages); + mockServiceFieldVariable(impl, bankService); + mockServiceFieldVariable(impl, mockEnumTranslation); + mockTableNameInfo(impl); + } + } + + void givenCacheService() { + cacheService = new CacheServiceImpl() { + @Override + protected ToolboxFileRole getSessionRole( + final PlanPro_Schnittstelle schnittStelle) { + return ToolboxFileRole.SESSION; + } + }; + } + +} \ No newline at end of file diff --git a/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTransformationTest.java b/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTransformationTest.java new file mode 100644 index 0000000000..e057c9298b --- /dev/null +++ b/java/bundles/org.eclipse.set.feature.table.pt1.test/src/org/eclipse/set/feature/table/pt1/test/Pt1TableTransformationTest.java @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2026 DB InfraGO AG and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + */ +package org.eclipse.set.feature.table.pt1.test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import java.util.Comparator; +import java.util.stream.Stream; + +import org.eclipse.emf.common.util.ECollections; +import org.eclipse.set.basis.ToolboxProperties; +import org.eclipse.set.basis.constants.TableType; +import org.eclipse.set.core.services.Services; +import org.eclipse.set.feature.table.pt1.AbstractPlanPro2TableTransformationService; +import org.eclipse.set.model.tablemodel.RowGroup; +import org.eclipse.set.model.tablemodel.Table; +import org.eclipse.set.ppmodel.extensions.MultiContainer_AttributeGroupExtensions; +import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGroup; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +/** + * Test Pt1 Table transformation + * + * @author Truong + */ +class Pt1TableTransformationTest extends Pt1TableTest { + + /** + * @return the reference files + */ + protected static Stream getReferenceFiles() { + return Stream.of(Arguments.of(PPHN_1_10_0_3_20220517_PLANPRO, "pphn"), + Arguments.of(SINGLE_STATE_PLAN, "zustandpphn")); + } + + @ParameterizedTest + @MethodSource("getReferenceFiles") + void testTransformator(final String file) throws Exception { + givenPlanProFile(file); + setupTransformationService(); + System.setProperty(ToolboxProperties.DEVELOPMENT_MODE, + Boolean.FALSE.toString()); + try (final MockedStatic mockServices = Mockito + .mockStatic(Services.class);) { + setupMockServices(mockServices); + for (final AbstractPlanPro2TableTransformationService transformationService : transformationServices) { + for (final MultiContainer_AttributeGroup container : getLSTContainer()) { + // Test transformation table + final Table transformedTable = assertDoesNotThrow( + () -> transformationService.transform(container), + () -> "Error by transformation Table: " + + transformationService.getClass() + .getPackageName()); + final TableType defaultTableType = MultiContainer_AttributeGroupExtensions + .getContainerType(container) + .getDefaultTableType(); + // Test sorting table + assertDoesNotThrow(() -> { + final Comparator comparator = transformationService + .getRowGroupComparator(defaultTableType); + ECollections.sort(transformedTable.getTablecontent() + .getRowgroups(), comparator); + }, () -> "Error by sort table: " + + transformationService.getClass() + .getPackageName()); + } + } + } + } +} diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/messages/Messages.java b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/messages/Messages.java index d44aa07835..885f01724b 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/messages/Messages.java +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/messages/Messages.java @@ -22,7 +22,7 @@ public class Messages extends AbstractMessageService { @Reference - private void bindBundleLocalization( + protected void bindBundleLocalization( final BundleLocalization bundleLocalization) throws IllegalArgumentException, IllegalAccessException { super.setupLocalization(bundleLocalization); diff --git a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/UrObjectExtensions.xtend b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/UrObjectExtensions.xtend index 636157e1b3..74d1ded530 100644 --- a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/UrObjectExtensions.xtend +++ b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/UrObjectExtensions.xtend @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 DB Netz AG and others. +. * Copyright (c) 2015 DB Netz AG and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 @@ -83,7 +83,7 @@ class UrObjectExtensions extends BasisAttributExtensions { } def static boolean isPlanningObject(Ur_Objekt object) { - val modelSession = Services.toolboxViewModelService.session.orElse(null) + val modelSession = Services.toolboxViewModelService?.session?.orElse(null) if (modelSession !== null && modelSession.isPlanningAreaIgnored) { return true; } diff --git a/java/bundles/org.eclipse.set.releng.set.product/set.product b/java/bundles/org.eclipse.set.releng.set.product/set.product index 8adc79ff55..a5ccc2cfdc 100644 --- a/java/bundles/org.eclipse.set.releng.set.product/set.product +++ b/java/bundles/org.eclipse.set.releng.set.product/set.product @@ -64,7 +64,6 @@ - diff --git a/java/bundles/org.eclipse.set.unittest.utils/res/Info__2026-04-21_10-40.planpro b/java/bundles/org.eclipse.set.unittest.utils/res/Info__2026-04-21_10-40.planpro new file mode 100644 index 0000000000..419f1b99f5 Binary files /dev/null and b/java/bundles/org.eclipse.set.unittest.utils/res/Info__2026-04-21_10-40.planpro differ diff --git a/java/bundles/org.eclipse.set.unittest.utils/src/org/eclipse/set/unittest/utils/AbstractToolboxTest.java b/java/bundles/org.eclipse.set.unittest.utils/src/org/eclipse/set/unittest/utils/AbstractToolboxTest.java index 3200576910..afae75a3a7 100644 --- a/java/bundles/org.eclipse.set.unittest.utils/src/org/eclipse/set/unittest/utils/AbstractToolboxTest.java +++ b/java/bundles/org.eclipse.set.unittest.utils/src/org/eclipse/set/unittest/utils/AbstractToolboxTest.java @@ -20,7 +20,9 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -39,6 +41,7 @@ import org.eclipse.set.core.services.Services; import org.eclipse.set.core.services.cache.NoCacheService; import org.eclipse.set.core.version.PlanProVersionServiceImpl; +import org.eclipse.set.model.planpro.Layoutinformationen.PlanPro_Layoutinfo; import org.eclipse.set.model.planpro.PlanPro.DocumentRoot; import org.eclipse.set.model.planpro.PlanPro.PlanProPackage; import org.eclipse.set.model.planpro.PlanPro.PlanPro_Schnittstelle; @@ -71,13 +74,18 @@ public class AbstractToolboxTest { public static String PPHN_1_10_0_1_20220517_PPXML = getModel( "PPHN_1.10.0.1_01-02_Ibn-Z._-_2._AeM_2022-05-17_13-44_tg2.ppxml"); //$NON-NLS-1$ + /** + * Info__2026-04-21_10-40.planpro + */ + public static String SINGLE_STATE_PLAN = getModel( + "Info__2026-04-21_10-40.planpro"); //$NON-NLS-1$ private static final String UNZIP_DIR = "res/toolbox"; //$NON-NLS-1$ private static final String CONTENT_MODEL = "content"; //$NON-NLS-1$ private static final String LAYOUT_MODEL = "layout"; //$NON-NLS-1$ private static final String PLANPRO_ZIPPED_EXTENSION = "planpro"; //$NON-NLS-1$ - private static final String PLANPRO_PLAIN_EXTENSION = "ppxml"; //$NON-NLS-1$ protected PlanPro_Schnittstelle planProSchnittstelle; + protected PlanPro_Layoutinfo layoutInfo; private ResourceSet resourceSet; protected static String getModel(final Class clazz, final String name) { @@ -187,6 +195,9 @@ private void loadZippedPlanProFile(final String filePath) if (root instanceof final DocumentRoot model) { planProSchnittstelle = model.getPlanProSchnittstelle(); ToolboxIDResolver.resolveIDReferences(planProSchnittstelle); + } else if (root instanceof final org.eclipse.set.model.planpro.Layoutinformationen.DocumentRoot layoutRoot) { + layoutInfo = layoutRoot.getPlanProLayoutinfo(); + ToolboxIDResolver.resolveIDReferences(layoutInfo); } else { throw new IllegalArgumentException( "Resource contains no PlanPro model with the requested version."); //$NON-NLS-1$ @@ -196,7 +207,16 @@ private void loadZippedPlanProFile(final String filePath) private static void unzip(final String filePath) throws IOException { final Path unzipDir = Paths.get(UNZIP_DIR); - Files.createDirectories(unzipDir); + if (Files.exists(unzipDir)) { + try (Stream paths = Files.walk(unzipDir)) { + paths.sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } else { + Files.createDirectories(unzipDir); + } + // unzip the archive final byte[] buffer = new byte[1024]; try (final ZipInputStream zipIn = new ZipInputStream( diff --git a/java/pom.xml b/java/pom.xml index f8d60ed10e..6b14dff7f2 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -49,8 +49,9 @@ bundles/org.eclipse.set.emfforms bundles/org.eclipse.set.feature.table - bundles/org.eclipse.set.feature.table.pt1 bundles/org.eclipse.set.feature.table.test + bundles/org.eclipse.set.feature.table.pt1 + bundles/org.eclipse.set.feature.table.pt1.test bundles/org.eclipse.set.feature.export