Optimization and bug fix of isValid methods in Digital Nameplate Submodel and associated SMC

Signed-off-by: Ashfaqul Haque <ashfaqul.haque@iese.fraunhofer.de>
Change-Id: I83cad74e4a2cf9d10855e655bd60f54b8b3fba29
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/DigitalNameplateSubmodel.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/DigitalNameplateSubmodel.java
index a0de434..a29b4f5 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/DigitalNameplateSubmodel.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/DigitalNameplateSubmodel.java
@@ -17,7 +17,6 @@
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.LangStrings;
 import org.eclipse.basyx.submodel.metamodel.map.reference.Key;
 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.MultiLanguageProperty;
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDef;
@@ -186,15 +185,16 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
 		DigitalNameplateSubmodel submodel = createAsFacadeNonStrict(obj);
 		
-		return SubmodelElementCollection.isValid(obj)
-				&& submodel.getManufacturerName() != null
-				&& submodel.getManufacturerProductDesignation() != null
-				&& submodel.getAddress() != null
-				&& submodel.getManufacturerProductFamily() != null
-				&& submodel.getYearOfConstruction() != null;
+		return SubModel.isValid(obj)
+				&& MultiLanguageProperty.isValid((Map<String, Object>) submodel.getManufacturerName())
+				&& MultiLanguageProperty.isValid((Map<String, Object>) submodel.getManufacturerProductDesignation())
+				&& Address.isValid((Map<String, Object>) submodel.getAddress())
+				&& MultiLanguageProperty.isValid((Map<String, Object>) submodel.getManufacturerProductFamily())
+				&& Property.isValid((Map<String, Object>) submodel.getYearOfConstruction());
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Address.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Address.java
index 2c1cbd2..ac71604 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Address.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Address.java
@@ -152,13 +152,15 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
 		Address address = createAsFacadeNonStrict(obj);
+		
 		return SubmodelElementCollection.isValid(obj)
-				&& address.getStreet() != null
-				&& address.getZipCode() != null
-				&& address.getCityTown() != null
-				&& address.getNationalCode() != null;
+				&& MultiLanguageProperty.isValid((Map<String, Object>) address.getStreet())
+				&& MultiLanguageProperty.isValid((Map<String, Object>) address.getZipCode())
+				&& MultiLanguageProperty.isValid((Map<String, Object>) address.getCityTown())
+				&& MultiLanguageProperty.isValid((Map<String, Object>) address.getNationalCode());
 	}
 
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Email.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Email.java
index ff223fd..dba6565 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Email.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Email.java
@@ -102,9 +102,12 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
+		Email email = createAsFacadeNonStrict(obj);
+		
 		return SubmodelElementCollection.isValid(obj)
-				&& createAsFacadeNonStrict(obj).getEmailAddress() != null;
+				&& Property.isValid((Map<String, Object>) email.getEmailAddress());
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Fax.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Fax.java
index 431d50a..9da20bd 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Fax.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Fax.java
@@ -100,9 +100,11 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
+		Fax fax = createAsFacadeNonStrict(obj);
 		return SubmodelElementCollection.isValid(obj)
-				&& createAsFacadeNonStrict(obj).getFaxNumber() != null;
+				&& MultiLanguageProperty.isValid((Map<String, Object>) fax.getFaxNumber());
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Phone.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Phone.java
index 45b6a0b..31a3283 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Phone.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/address/Phone.java
@@ -100,9 +100,12 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
+		Phone phone = createAsFacadeNonStrict(obj);
+		
 		return SubmodelElementCollection.isValid(obj)
-				&& createAsFacadeNonStrict(obj).getTelephoneNumber() != null;
+				&& MultiLanguageProperty.isValid((Map<String, Object>) phone.getTelephoneNumber());
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/AssetSpecificProperties.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/AssetSpecificProperties.java
index 5125de5..8f02382 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/AssetSpecificProperties.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/AssetSpecificProperties.java
@@ -96,9 +96,18 @@
 	public static boolean isValid(Map<String, Object> obj) {
 		AssetSpecificProperties props = createAsFacadeNonStrict(obj);
 		
-		return SubmodelElementCollection.isValid(obj)
+		if (SubmodelElementCollection.isValid(obj)
 				&& props.getGuidelineSpecificProperties() != null
-				&& props.getGuidelineSpecificProperties().size() > 0;
+				&& props.getGuidelineSpecificProperties().size() > 0) {
+			for (GuidelineSpecificProperties prop : props.getGuidelineSpecificProperties()) {
+				if (!GuidelineSpecificProperties.isValid((Map<String, Object>) prop)) {
+					return false;
+				}
+			}
+			return true;
+		} else {
+			return false;	
+		}
 	}
 	
 	public void setGuidelineSpecificProperties(List<GuidelineSpecificProperties> properties) {
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/GuidelineSpecificProperties.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/GuidelineSpecificProperties.java
index ad7db0e..90a4882 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/GuidelineSpecificProperties.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/assetspecificproperties/GuidelineSpecificProperties.java
@@ -104,13 +104,24 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
 		GuidelineSpecificProperties props = createAsFacadeNonStrict(obj);
 		
-		return SubmodelElementCollection.isValid(obj)
-				&& props.getGuidelineForConformityDeclaration() != null
+		if (SubmodelElementCollection.isValid(obj)
+				&& Property.isValid((Map<String, Object>) props.getGuidelineForConformityDeclaration())
 				&& props.getArbitrary() != null
-				&& props.getArbitrary().size() > 0;
+				&& props.getArbitrary().size() > 0) {
+			for (IProperty arbitrary: props.getArbitrary()) {
+				if (!Property.isValid((Map<String, Object>) arbitrary)) {
+					return false;
+				}	
+			}
+			return true;
+		}
+		else {
+			return false;	
+		}
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Marking.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Marking.java
index 48a1829..2e88634 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Marking.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Marking.java
@@ -111,11 +111,12 @@
 	 * 
 	 * @return true/false
 	 */
+	@SuppressWarnings("unchecked")
 	public static boolean isValid(Map<String, Object> obj) {
 		Marking marking = createAsFacadeNonStrict(obj);
 		return SubmodelElementCollection.isValid(obj)
-				&& marking.getMarkingName() != null
-				&& marking.getMarkingFile() != null;
+				&& Property.isValid((Map<String, Object>) marking.getMarkingName())
+				&& File.isValid((Map<String, Object>) marking.getMarkingFile());
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Markings.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Markings.java
index 69cc9a7..ec6d2e2 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Markings.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/types/digitalnameplate/submodelelementcollections/markings/Markings.java
@@ -97,9 +97,20 @@
 	 */
 	public static boolean isValid(Map<String, Object> obj) {
 		Markings markings = createAsFacadeNonStrict(obj);
-		return SubmodelElementCollection.isValid(obj)
+		
+		if (SubmodelElementCollection.isValid(obj)
 				&& markings.getMarking() != null
-				&& markings.getMarking().size() > 0;
+				&& markings.getMarking().size() > 0) {
+			for (Marking marking : markings.getMarking()) {
+				if (!Marking.isValid((Map<String, Object>) marking)) {
+					return false;
+				}	
+			}
+			return true;
+		}
+		else {
+			return false;	
+		}
 	}
 	
 	/**
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/submodel/types/digitalnameplate/submodelelementcollections/TestDigitalNameplateSubmodel.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/submodel/types/digitalnameplate/submodelelementcollections/TestDigitalNameplateSubmodel.java
index bff74fb..b2e1c39 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/submodel/types/digitalnameplate/submodelelementcollections/TestDigitalNameplateSubmodel.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/submodel/types/digitalnameplate/submodelelementcollections/TestDigitalNameplateSubmodel.java
@@ -13,7 +13,9 @@
 import org.eclipse.basyx.submodel.metamodel.api.reference.enums.KeyElements;
 import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
 import org.eclipse.basyx.submodel.metamodel.map.SubModel;
+import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.HasSemantics;
+import org.eclipse.basyx.submodel.metamodel.map.qualifier.Identifiable;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.LangString;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.LangStrings;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
@@ -23,7 +25,6 @@
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDef;
 import org.eclipse.basyx.submodel.types.digitalnameplate.submodelelementcollections.address.Address;
-import org.eclipse.basyx.submodel.types.digitalnameplate.submodelelementcollections.address.Fax;
 import org.eclipse.basyx.submodel.types.digitalnameplate.submodelelementcollections.assetspecificproperties.AssetSpecificProperties;
 import org.eclipse.basyx.submodel.types.digitalnameplate.submodelelementcollections.markings.Marking;
 import org.eclipse.basyx.submodel.types.digitalnameplate.submodelelementcollections.markings.Markings;
@@ -52,7 +53,7 @@
 	public static Property yearsOfConstruction = new Property(DigitalNameplateSubmodel.YEARSOFCONSTRUCTIONID, PropertyValueTypeDef.String);
 	public static Markings markings;
 	public static AssetSpecificProperties assetSpecificProperties = new AssetSpecificProperties(Collections.singletonList(TestAssetSpecificProperties.guidelineSpecificProperties));
-	
+	public static Identifier identifier = new Identifier(IdentifierType.IRI, "https://admin-shell.io/zvei/nameplate/1/0/Nameplate");
 	private Map<String, Object> submodelMap = new HashMap<String, Object>();
 	
 	@Before
@@ -88,6 +89,7 @@
 		submodelMap.put(Referable.IDSHORT, DigitalNameplateSubmodel.SUBMODELID);
 		submodelMap.put(HasSemantics.SEMANTICID, DigitalNameplateSubmodel.SEMANTICID);
 		submodelMap.put(SubModel.SUBMODELELEMENT, elements);
+		submodelMap.put(Identifiable.IDENTIFICATION, identifier);
 	}
 
 	@Test
@@ -103,12 +105,19 @@
 		assertEquals(markings, submodelFromMap.getMarkings());
 		assertEquals(assetSpecificProperties, submodelFromMap.getAssetSpecificProperties());
 		assertEquals(DigitalNameplateSubmodel.SUBMODELID, submodelFromMap.getIdShort());
+		assertEquals(identifier, submodelFromMap.getIdentification());
 	}
 	
 	@Test (expected = MetamodelConstructionException.class)
 	public void testCreateAsFacadeExceptionIdShort() {
 		submodelMap.remove(Referable.IDSHORT);
-		Fax.createAsFacade(submodelMap);
+		DigitalNameplateSubmodel.createAsFacade(submodelMap);
+	}
+	
+	@Test (expected = MetamodelConstructionException.class)
+	public void testCreateAsFacadeExceptionIdentifier() {
+		submodelMap.remove(Identifiable.IDENTIFICATION);
+		DigitalNameplateSubmodel.createAsFacade(submodelMap);
 	}
 	
 	@SuppressWarnings("unchecked")