diff --git a/src/main/java/org/eclipse/basyx/submodel/factory/xml/XMLHelper.java b/src/main/java/org/eclipse/basyx/submodel/factory/xml/XMLHelper.java index 65f3a05f..67b61b8c 100644 --- a/src/main/java/org/eclipse/basyx/submodel/factory/xml/XMLHelper.java +++ b/src/main/java/org/eclipse/basyx/submodel/factory/xml/XMLHelper.java @@ -67,15 +67,20 @@ public static List> getList(Object xmlObject) { /** * If the content of a XML-Element is requested, the parser returns an Object or * null, if it doesn't exist.
- * This function casts the Object into a String and replaces null with an empty - * String. + * This function returns a String representation if possible. Null and Maps are + * replaced with an empty String. * * @param object - * a Object that is either a String or null - * @return the given String or an empty String + * @return the trimmed String object or an empty String */ public static String getString(Object object) { - return object instanceof String ? ((String) object).trim() : ""; + // On XML level, it is not differentiated between an empty tag that should + // contain text and an empty tag that should contain further text. Thus, Maps + // are replaced with "" + if (object == null || (object instanceof Map)) + return ""; + + return object.toString().trim(); } /** diff --git a/src/main/java/org/eclipse/basyx/submodel/metamodel/map/qualifier/qualifiable/Qualifier.java b/src/main/java/org/eclipse/basyx/submodel/metamodel/map/qualifier/qualifiable/Qualifier.java index 44a9f91e..d5b2de7d 100644 --- a/src/main/java/org/eclipse/basyx/submodel/metamodel/map/qualifier/qualifiable/Qualifier.java +++ b/src/main/java/org/eclipse/basyx/submodel/metamodel/map/qualifier/qualifiable/Qualifier.java @@ -156,11 +156,7 @@ public void setValue(Object obj) { @Override public Object getValue() { Object value = get(Qualifier.VALUE); - if (value instanceof String) { - return ValueTypeHelper.getJavaObject(value, getValueType()); - } else { - return value; - } + return ValueTypeHelper.getJavaObject(value, getValueType()); } public void setValueId(IReference obj) { diff --git a/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/TestAASXToMetamodelConverterFromBaSyx.java b/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/TestAASXToMetamodelConverterFromBaSyx.java index f11f7aff..085a2d15 100644 --- a/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/TestAASXToMetamodelConverterFromBaSyx.java +++ b/src/test/java/org/eclipse/basyx/testsuite/regression/aas/factory/aasx/TestAASXToMetamodelConverterFromBaSyx.java @@ -28,6 +28,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; + import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -35,6 +36,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -59,13 +61,16 @@ import org.eclipse.basyx.aas.metamodel.map.parts.Asset; import org.eclipse.basyx.submodel.metamodel.api.ISubmodel; import org.eclipse.basyx.submodel.metamodel.api.parts.IConceptDescription; +import org.eclipse.basyx.submodel.metamodel.api.qualifier.qualifiable.IConstraint; import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement; import org.eclipse.basyx.submodel.metamodel.map.Submodel; +import org.eclipse.basyx.submodel.metamodel.map.qualifier.qualifiable.Qualifier; import org.eclipse.basyx.submodel.metamodel.map.reference.Reference; import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection; import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.File; import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property; import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetype.ValueType; +import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.Operation; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; @@ -93,6 +98,8 @@ public class TestAASXToMetamodelConverterFromBaSyx { private static final String INTEGER_PROPERTY_IDSHORT = "int"; private static final String DOUBLE_PROPERTY_IDSHORT = "decimal"; private static final String STRING_PROPERTY_IDSHORT = "string"; + private static final String OPERATION_WITH_QUALIFIER_IDSHORT = "operationWithQualifier"; + private static final Integer QUALIFIER_VALUE = 100; private static final Boolean EXPECTED_BOOLEAN_VALUE = true; private static final int EXPECTED_INTEGER_VALUE = 42; private static final double EXPECTED_DOUBLE_VALUE = 3.14159265359; @@ -197,6 +204,23 @@ public void submodelElementPropertyValues() throws InvalidFormatException, IOExc assertEquals(EXPECTED_STRING_VALUE, stringProperty.getValue()); } + /** + * Test Qualifiers are parsed properly + */ + @Test + public void testQualifierValue() throws Exception { + Set bundles = packageManager.retrieveAASBundles(); + AASBundle bundle = bundles.stream().findFirst().get(); + + ISubmodel parsedSubmodel = bundle.getSubmodels().stream().findFirst().get(); + Map submodelElements = parsedSubmodel.getSubmodelElements(); + + ISubmodelElement operationWithQualifer = submodelElements.get(OPERATION_WITH_QUALIFIER_IDSHORT); + IConstraint[] constraints = operationWithQualifer.getQualifiers().toArray(new IConstraint[] {}); + Qualifier qualifier = (Qualifier)constraints[0]; + assertEquals(QUALIFIER_VALUE, qualifier.getValue()); + } + /** * Tests the connected files of the parsed AASX file. * @@ -429,6 +453,7 @@ private void createAASXFile(String filePath) throws IOException, TransformerExce sm.addSubmodelElement(createIntegerProperty()); sm.addSubmodelElement(createDoubleProperty()); sm.addSubmodelElement(createStringProperty()); + sm.addSubmodelElement(createOperationWithQualifier()); sm.addSubmodelElement(createBaSyxFile(PDF_PATH, PDF_MIMETYPE, PDF_IDSHORT)); aas.addSubmodel(sm); @@ -448,7 +473,7 @@ private void createAASXFile(String filePath) throws IOException, TransformerExce // size for the test comparison fileList.add(createInMemoryFile(IMAGE_PATH)); fileList.add(createInMemoryFile(PDF_PATH)); - submodelElementsSize = 7; + submodelElementsSize = 8; Thumbnail thumbnail = new Thumbnail(ThumbnailExtension.PNG, new ByteArrayInputStream(THUMBNAIL)); @@ -501,6 +526,16 @@ private ISubmodelElement createStringProperty() { return stringProperty; } + private ISubmodelElement createOperationWithQualifier() { + Operation operation = new Operation(OPERATION_WITH_QUALIFIER_IDSHORT); + Qualifier qualifier = new Qualifier(); + qualifier.setValue(QUALIFIER_VALUE); + qualifier.setValueType(ValueType.Int32); + qualifier.setType("newType"); + operation.setQualifiers(Collections.singletonList(qualifier)); + return operation; + } + /** * Delete created files */