blob: d816fae2e216764c7f4307c3afb1bbf2d9ec33a3 [file] [log] [blame]
package org.eclipse.basyx.submodel.metamodel.map.submodelelement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
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.ISubmodelElementCollection;
import org.eclipse.basyx.submodel.metamodel.facade.qualifier.HasDataSpecificationFacade;
import org.eclipse.basyx.submodel.metamodel.facade.qualifier.ReferableFacade;
import org.eclipse.basyx.submodel.metamodel.facade.submodelelement.SubmodelElementFacadeFactory;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.metamodel.map.modeltype.ModelType;
import org.eclipse.basyx.submodel.metamodel.map.qualifier.LangStrings;
import org.eclipse.basyx.submodel.metamodel.map.qualifier.Referable;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.property.Property;
/**
* SubmodelElementCollection as defined by DAAS document <br/>
* A submodel element collection is a set or list of submodel elements
*
* @author schnicke
*
*/
public class SubmodelElementCollection extends SubmodelElement implements ISubmodelElementCollection {
private static final long serialVersionUID = 1L;
public static final String ORDERED = "ordered";
public static final String ALLOWDUPLICATES = "allowDuplicates";
public static final String MODELTYPE = "SubmodelElementCollection";
/**
* Constructor
*/
public SubmodelElementCollection() {
// Add model type
putAll(new ModelType(MODELTYPE));
// Put attributes
put(Property.VALUE, new ArrayList<>());
put(ORDERED, true);
put(ALLOWDUPLICATES, true);
}
/**
*
* @param value
* Submodel element contained in the collection
* @param ordered
* If ordered=false then the elements in the property collection are
* not ordered. If ordered=true then the elements in the collection
* are ordered.
* @param allowDuplicates
* If allowDuplicates=true then it is allowed that the collection
* contains the same element several times
*/
public SubmodelElementCollection(Collection<ISubmodelElement> value, boolean ordered, boolean allowDuplicates) {
// Add model type
putAll(new ModelType(MODELTYPE));
// Put attributes
put(Property.VALUE, value);
put(ORDERED, ordered);
put(ALLOWDUPLICATES, allowDuplicates);
}
/**
* Creates a SubmodelElementCollection object from a map
*
* @param obj a SubmodelElementCollection object as raw map
* @return a SubmodelElementCollection object, that behaves like a facade for the given map
*/
public static SubmodelElementCollection createAsFacade(Map<String, Object> obj) {
SubmodelElementCollection facade = new SubmodelElementCollection();
facade.putAll(obj);
return facade;
}
/**
* Adds an element to the SubmodelElementCollection
*
* @param elem
*/
public void addElement(ISubmodelElement elem) {
getValue().add(elem);
}
@Override
public Set<IReference> getDataSpecificationReferences() {
return new HasDataSpecificationFacade(this).getDataSpecificationReferences();
}
@Override
public void setDataSpecificationReferences(Set<IReference> ref) {
new HasDataSpecificationFacade(this).setDataSpecificationReferences(ref);
}
@Override
public String getIdShort() {
return new ReferableFacade(this).getIdShort();
}
@Override
public String getCategory() {
return new ReferableFacade(this).getCategory();
}
@Override
public LangStrings getDescription() {
return new ReferableFacade(this).getDescription();
}
@Override
public void setValue(Collection<ISubmodelElement> value) {
put(Property.VALUE, value);
}
@Override
@SuppressWarnings("unchecked")
public Collection<ISubmodelElement> getValue() {
Collection<ISubmodelElement> ret = new ArrayList<>();
Collection<Object> smElems = (ArrayList<Object>) get(Property.VALUE);
for(Object smElemO: smElems) {
Map<String, Object> smElem = (Map<String, Object>) smElemO;
ret.add(SubmodelElementFacadeFactory.createSubmodelElement(smElem));
}
return ret;
}
@Override
public void setOrdered(boolean value) {
put(SubmodelElementCollection.ORDERED, value);
}
@Override
public boolean isOrdered() {
return (boolean) get(SubmodelElementCollection.ORDERED);
}
@Override
public void setAllowDuplicates(boolean value) {
put(SubmodelElementCollection.ALLOWDUPLICATES, value);
}
@Override
public boolean isAllowDuplicates() {
return (boolean) get(SubmodelElementCollection.ALLOWDUPLICATES);
}
@Override
public void setElements(Map<String, ISubmodelElement> value) {
put(SubModel.SUBMODELELEMENT, value);
}
@Override
@SuppressWarnings("unchecked")
public Map<String, ISubmodelElement> getElements() {
Map<String, ISubmodelElement> ret = new HashMap<>();
Collection<Object> smElems = ((Map<String, Object>) get(SubModel.SUBMODELELEMENT)).values();
for(Object smElemO: smElems) {
Map<String, Object> smElem = (Map<String, Object>) smElemO;
ret.put((String) smElem.get(Referable.IDSHORT), SubmodelElementFacadeFactory.createSubmodelElement(smElem));
}
return ret;
}
}