package org.openflexo.foundation.ontology.xsd; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.openflexo.foundation.Inspectors; import org.openflexo.foundation.ontology.OntologyClass; import org.openflexo.foundation.ontology.OntologyIndividual; import org.openflexo.foundation.ontology.OntologyProperty; import org.w3c.dom.Document; import org.w3c.dom.Element; public class XSOntIndividual extends AbstractXSOntObject implements OntologyIndividual, XSOntologyURIDefinitions { private XSOntClass type; private Map<OntologyProperty, Object> values = new HashMap<OntologyProperty, Object>(); private Set<XSOntIndividual> children = new HashSet<XSOntIndividual>(); private XSOntIndividual parent; protected XSOntIndividual(XSOntology ontology, String name, String uri) { super(ontology, name, uri); } public XSOntClass getType() { return type; } public void setType(XSOntClass type) { this.type = type; } @Override public List<XSOntClass> getTypes() { List<XSOntClass> result = new ArrayList<XSOntClass>(); if (getType() != null) { result.add(getType()); } return result; } @Override public Object addType(OntologyClass type) { // Can only have one type. if (type instanceof XSOntClass) { setType((XSOntClass) type); } return null; } @Override public Object getPropertyValue(OntologyProperty property) { if (property.getURI().equals(XS_HASCHILD_PROPERTY_NAME)) { return children; } if (property.getURI().equals(XS_HASPARENT_PROPERTY_NAME)) { return parent; } return values.get(property); } @Override public void setPropertyValue(OntologyProperty property, Object newValue) { if (property.getURI().equals(XS_HASCHILD_PROPERTY_NAME)) { // adds a child instead of a regular set // TODO make sure that's the way to do it if (newValue instanceof XSOntIndividual) { addChild((XSOntIndividual) newValue); } } else if (property.getURI().equals(XS_HASPARENT_PROPERTY_NAME)) { if (newValue instanceof XSOntIndividual) { setParent((XSOntIndividual) newValue); } } else { values.put(property, newValue); } } @Override public String getDisplayableDescription() { return getName(); } protected void setParent(XSOntIndividual parent) { this.parent = parent; } protected XSOntIndividual getParent() { return parent; } protected void addChild(XSOntIndividual child) { children.add(child); child.setParent(this); } protected Element toXML(Document doc) { Element element = doc.createElement(getType().getName()); for (XSOntIndividual child : children) { Element childElement = child.toXML(doc); element.appendChild(childElement); } for (OntologyProperty property : values.keySet()) { if (property instanceof XSOntDataProperty) { if (((XSOntDataProperty) property).getIsFromAttribute()) { element.setAttribute(property.getName(), values.get(property).toString()); } else { Element dataElement = doc.createElement(property.getName()); dataElement.setTextContent(values.get(property).toString()); element.appendChild(dataElement); } } } return element; } @Override public boolean isOntologyIndividual() { return true; } @Override public String getClassNameKey() { return "XSD_ontology_individual"; } @Override public String getInspectorName() { if (getIsReadOnly()) { return Inspectors.VE.ONTOLOGY_INDIVIDUAL_READ_ONLY_INSPECTOR; } else { return Inspectors.VE.ONTOLOGY_INDIVIDUAL_INSPECTOR; } } }