Optimizes property access

* Removes redundant access
* Tidies ConnectedSubModel class

Change-Id: Icf6714b573a02a5a13c0e061222e5e8c68da6798
Signed-off-by: Frank Schnicke <frank.schnicke@iese.fraunhofer.de>
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedElement.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedElement.java
index 920faf0..c5fb00d 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedElement.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedElement.java
@@ -1,6 +1,5 @@
 package org.eclipse.basyx.submodel.metamodel.connected;
 
-import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.basyx.submodel.metamodel.api.IElement;
@@ -18,11 +17,6 @@
 
 	private VABElementProxy proxy;
 
-	/*
-	 * Stores element meta-information if retrieved from c# sdk
-	 */
-	private HashMap<String, Object> localInformation = new HashMap<String, Object>();
-
 	public VABElementProxy getProxy() {
 		return proxy;
 	}
@@ -32,17 +26,6 @@
 		this.proxy = proxy;
 	}
 
-	protected void putLocal(String key, Object value) {
-		this.localInformation.put(key, value);
-	}
-
-	public void putAllLocal(Map<String, Object> opNode) {
-		this.localInformation.putAll(opNode);
-	}
-
-	protected Object getLocal(String key) {
-		return this.localInformation.get(key);
-	}
 
 	@SuppressWarnings("unchecked")
 	protected VABModelMap<Object> getElem() {
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedSubModel.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedSubModel.java
index 33a2768..a96451f 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedSubModel.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/ConnectedSubModel.java
@@ -3,16 +3,12 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.eclipse.basyx.submodel.metamodel.api.IElementContainer;
 import org.eclipse.basyx.submodel.metamodel.api.ISubModel;
 import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
 import org.eclipse.basyx.submodel.metamodel.api.qualifier.IAdministrativeInformation;
 import org.eclipse.basyx.submodel.metamodel.api.qualifier.haskind.ModelingKind;
 import org.eclipse.basyx.submodel.metamodel.api.qualifier.qualifiable.IConstraint;
 import org.eclipse.basyx.submodel.metamodel.api.reference.IReference;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.ISubmodelElement;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.dataelement.IDataElement;
-import org.eclipse.basyx.submodel.metamodel.api.submodelelement.operation.IOperation;
 import org.eclipse.basyx.submodel.metamodel.connected.facades.ConnectedVABElementContainerFacade;
 import org.eclipse.basyx.submodel.metamodel.connected.submodelelement.dataelement.property.ConnectedPropertyFactory;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.AdministrativeInformation;
@@ -33,14 +29,12 @@
  * @author rajashek
  *
  */
-public class ConnectedSubModel extends ConnectedVABModelMap<Object> implements IElementContainer, ISubModel {
+public class ConnectedSubModel extends ConnectedVABElementContainerFacade implements ISubModel {
 
 	ConnectedPropertyFactory factory = new ConnectedPropertyFactory();
-	ConnectedVABElementContainerFacade facade;
 
 	public ConnectedSubModel(VABElementProxy proxy) {
 		super(proxy);
-		facade = new ConnectedVABElementContainerFacade(proxy);
 	}
 
 	@SuppressWarnings("unchecked")
@@ -89,26 +83,6 @@
 	public IReference getParent() {
 		return Reference.createAsFacade((Map<String, Object>) getElem().getPath(Referable.PARENT));
 	}
-
-	@Override
-	public void addSubModelElement(ISubmodelElement element) {
-		facade.addSubModelElement(element);
-	}
-
-	@Override
-	public Map<String, IDataElement> getDataElements() {
-		return facade.getDataElements();
-	}
-
-	@Override
-	public Map<String, IOperation> getOperations() {
-		return facade.getOperations();
-	}
-	
-	@Override
-	public Map<String, ISubmodelElement> getSubmodelElements() {
-		return facade.getSubmodelElements();
-	}
 	
 	@Override
 	public Set<IConstraint> getQualifier() {
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/facades/ConnectedVABElementContainerFacade.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/facades/ConnectedVABElementContainerFacade.java
index 9530176..d65a4b9 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/facades/ConnectedVABElementContainerFacade.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/facades/ConnectedVABElementContainerFacade.java
@@ -17,6 +17,9 @@
 import org.eclipse.basyx.submodel.metamodel.map.modeltype.ModelType;
 import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.SubmodelElementCollection;
+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.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDefHelper;
 import org.eclipse.basyx.submodel.metamodel.map.submodelelement.relationship.RelationshipElement;
 import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
 import org.eclipse.basyx.vab.modelprovider.VABPathTools;
@@ -28,8 +31,6 @@
  *
  */
 public class ConnectedVABElementContainerFacade extends ConnectedVABModelMap<Object> implements IElementContainer {
-	ConnectedPropertyFactory factory = new ConnectedPropertyFactory();
-
 	public ConnectedVABElementContainerFacade(VABElementProxy proxy) {
 		super(proxy);
 	}
@@ -56,16 +57,24 @@
 		// Read values
 		Collection<Map<String, Object>> dataElemNodes = (Collection<Map<String, Object>>) smDeList;
 
-		// Convert to IOperation
+		// Convert to IProperty
 		for (Map<String, Object> deNode : dataElemNodes) {
 			String id = (String) deNode.get(Referable.IDSHORT);
-			ret.put(id, factory
-					.createProperty(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.PROPERTIES, id))));
+			PropertyValueTypeDef type = getType(deNode);
+			ret.put(id, ConnectedPropertyFactory.createProperty(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.PROPERTIES, id)), type));
 		}
 		// Return result
 		return ret;
 	}
 
+	private PropertyValueTypeDef getType(Map<String, Object> deNode) {
+		if (deNode.containsKey(SubModel.PROPERTIES)) {
+			return PropertyValueTypeDef.Container;
+		} else {
+			return PropertyValueTypeDefHelper.readTypeDef(deNode.get(Property.VALUETYPE));
+		}
+	}
+
 	@SuppressWarnings("unchecked")
 	@Override
 	public Map<String, IOperation> getOperations() {
@@ -82,17 +91,14 @@
 		for (Map<String, Object> opNode : operationNodes) {
 			String id = (String) opNode.get(Referable.IDSHORT);
 
-			ConnectedOperation conOp = new ConnectedOperation(
-					getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.OPERATIONS, id)));
-			// Cache operation properties
-			conOp.putAllLocal(opNode);
+			ConnectedOperation conOp = new ConnectedOperation(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.OPERATIONS, id)));
 			ret.put(id, conOp);
 		}
 
 		// Return result
 		return ret;
 	}
-	
+
 	@SuppressWarnings("unchecked")
 	@Override
 	public Map<String, ISubmodelElement> getSubmodelElements() {
@@ -104,56 +110,48 @@
 		Object opList = getProxy().getModelPropertyValue(SubModel.OPERATIONS);
 		// Read values
 		Collection<Map<String, Object>> opNodes = (Collection<Map<String, Object>>) opList;
-		
+
 		// Sub model dataElement list
 		Object deList = getProxy().getModelPropertyValue(SubModel.PROPERTIES);
 		// Read values
 		Collection<Map<String, Object>> deNodes = (Collection<Map<String, Object>>) deList;
-		
 
 		// submodel element list; this list will contain all submodelElements
 		Object smElemList = getProxy().getModelPropertyValue(SubModel.SUBMODELELEMENT);
 		// Read values
 		Collection<Map<String, Object>> smElemNodes = (Collection<Map<String, Object>>) smElemList;
-		//remove all submodelElements already contained in on of the other lists
+		// remove all submodelElements already contained in on of the other lists
 		smElemNodes.removeAll(opNodes);
 		smElemNodes.removeAll(deNodes);
-		
 
 		// Convert to IOperation
 		for (Map<String, Object> opNode : opNodes) {
 			String id = (String) opNode.get(Referable.IDSHORT);
 
-			ConnectedOperation conOp = new ConnectedOperation(
-					getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.OPERATIONS, id)));
-			// Cache operation properties
-			conOp.putAllLocal(opNode);
+			ConnectedOperation conOp = new ConnectedOperation(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.OPERATIONS, id)));
 			ret.put(id, conOp);
 		}
-		
+
 		// Convert to IProperty
 		for (Map<String, Object> deNode : deNodes) {
 			String id = (String) deNode.get(Referable.IDSHORT);
-			ret.put(id, factory
-					.createProperty(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.PROPERTIES, id))));
+			PropertyValueTypeDef type = getType(deNode);
+			ret.put(id, ConnectedPropertyFactory.createProperty(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.PROPERTIES, id)), type));
 		}
-		
+
 		// Convert to ISubmodelElement
 		for (Map<String, Object> smElemNode : smElemNodes) {
 			String id = (String) smElemNode.get(Referable.IDSHORT);
-			String modelType = ((String)((Map<String, Object>)(getProxy().getDeepProxy(
-							VABPathTools.concatenatePaths(ModelType.MODELTYPE, id)))).get(ModelType.NAME));
-			
-			//convert ISubmodelElementCollection
-			if(modelType.equals(SubmodelElementCollection.MODELTYPE)) {
-				ret.put(id, new ConnectedSubmodelElementCollection(
-						getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.SUBMODELELEMENT, id))));
+			String modelType = ((String) ((Map<String, Object>) (getProxy().getDeepProxy(VABPathTools.concatenatePaths(ModelType.MODELTYPE, id)))).get(ModelType.NAME));
+
+			// convert ISubmodelElementCollection
+			if (modelType.equals(SubmodelElementCollection.MODELTYPE)) {
+				ret.put(id, new ConnectedSubmodelElementCollection(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.SUBMODELELEMENT, id))));
 			}
 
-			//convert IRelationshipElement
-			if(modelType.equals(RelationshipElement.MODELTYPE)) {
-				ret.put(id, new ConnectedRelationshipElement(
-						getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.SUBMODELELEMENT, id))));
+			// convert IRelationshipElement
+			if (modelType.equals(RelationshipElement.MODELTYPE)) {
+				ret.put(id, new ConnectedRelationshipElement(getProxy().getDeepProxy(VABPathTools.concatenatePaths(SubModel.SUBMODELELEMENT, id))));
 			}
 		}
 
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/submodelelement/dataelement/property/ConnectedPropertyFactory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/submodelelement/dataelement/property/ConnectedPropertyFactory.java
index 50ba595..8ba3128 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/submodelelement/dataelement/property/ConnectedPropertyFactory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/submodel/metamodel/connected/submodelelement/dataelement/property/ConnectedPropertyFactory.java
@@ -1,59 +1,35 @@
 package org.eclipse.basyx.submodel.metamodel.connected.submodelelement.dataelement.property;
 
-import java.util.Map;
-
 import org.eclipse.basyx.submodel.metamodel.api.submodelelement.dataelement.property.IProperty;
-import org.eclipse.basyx.submodel.metamodel.map.SubModel;
-import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
-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.metamodel.map.submodelelement.dataelement.property.valuetypedef.PropertyValueTypeDefHelper;
 import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
- * Creates IProperties based on the attached meta data as specified in DAAS
- * document
+ * Supports with creation of connected properties
  * 
  * @author schnicke
  *
  */
 public class ConnectedPropertyFactory {
 
-	private static Logger logger = LoggerFactory.getLogger(ConnectedPropertyFactory.class);
-
-	@SuppressWarnings("unchecked")
-	public IProperty createProperty(VABElementProxy proxy) {
-		// Since the VABElementProxy is already pointing to the property, get empty
-		// property
-		Map<String, Object> property = (Map<String, Object>) proxy.getModelPropertyValue("");
-		if (property.containsKey(SubModel.PROPERTIES)) {
+	/**
+	 * Creates a connected property based on the given type
+	 * 
+	 * @param proxy
+	 *            the proxy element pointing to the specific property
+	 * @param typeDef
+	 * @return
+	 */
+	public static IProperty createProperty(VABElementProxy proxy, PropertyValueTypeDef typeDef) {
+		if (typeDef == PropertyValueTypeDef.Container) {
 			return new ConnectedContainerProperty(proxy);
-		} else if (property.containsKey(Property.VALUETYPE)) {
-			
-			PropertyValueTypeDef valueType = PropertyValueTypeDefHelper.readTypeDef(property.get(Property.VALUETYPE));
-						
-			if (valueType == PropertyValueTypeDef.Map) {
-				return new ConnectedMapProperty(proxy);
-			} else if (valueType == PropertyValueTypeDef.Collection) {
-				return new ConnectedCollectionProperty(proxy);
-			} else {
-				ConnectedSingleProperty conProp = new ConnectedSingleProperty(proxy);
-				conProp.putAllLocal(property);
-				return conProp;
-			} 
-			
-		} else if ((property.get(Property.VALUE) != null) && (property.get(Referable.IDSHORT) != null)){
-			// handle  property without valueType
+		} else if (typeDef == PropertyValueTypeDef.Map) {
+			return new ConnectedMapProperty(proxy);
+		} else if (typeDef == PropertyValueTypeDef.Collection) {
+			return new ConnectedCollectionProperty(proxy);
+		} else {
+			// It is assumed to be an atomic value (e.g. integer, double, ...)
 			ConnectedSingleProperty conProp = new ConnectedSingleProperty(proxy);
-			conProp.putAllLocal(property);
 			return conProp;
 		}
-			
-		
-		logger.warn("Unknown property type");
-		return null;
-	}
-}
+	}}