/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.foundation.ontology; import java.util.Hashtable; import java.util.logging.Level; import java.util.logging.Logger; import org.openflexo.antar.binding.AbstractBinding.BindingEvaluationContext; import org.openflexo.antar.binding.BindingVariable; import org.openflexo.foundation.DataFlexoObserver; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.FlexoModelObject; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.ontology.owl.DataPropertyStatement; import org.openflexo.foundation.ontology.owl.OWLDataProperty; import org.openflexo.foundation.ontology.owl.OWLObject; import org.openflexo.foundation.ontology.owl.ObjectPropertyStatement; import org.openflexo.foundation.ontology.owl.OntologyRestrictionClass; import org.openflexo.foundation.ontology.owl.SubClassStatement; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.XMLStorageResourceData; import org.openflexo.foundation.utils.FlexoModelObjectReference; import org.openflexo.foundation.viewpoint.EditionPattern; import org.openflexo.foundation.viewpoint.PatternRole; import org.openflexo.foundation.viewpoint.ViewPoint; import org.openflexo.foundation.xml.FlexoProcessBuilder; import org.openflexo.foundation.xml.FlexoWorkflowBuilder; import org.openflexo.foundation.xml.VEShemaBuilder; import org.openflexo.logging.FlexoLogger; import org.openflexo.xmlcode.XMLMapping; public class EditionPatternReference extends FlexoModelObject implements DataFlexoObserver, BindingEvaluationContext { private static final Logger logger = FlexoLogger.getLogger(EditionPatternReference.class.getPackage().toString()); private EditionPatternInstance _editionPatternInstance; private PatternRole patternRole; private EditionPattern editionPattern; private long instanceId; private Hashtable<String, ActorReference> actors; private FlexoProject _project; private EditionPatternReference() { super(); actors = new Hashtable<String, ActorReference>(); } private EditionPatternReference(FlexoProject project) { this(); _project = project; } // Constructor used during deserialization public EditionPatternReference(VEShemaBuilder builder) { this(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public EditionPatternReference(FlexoProcessBuilder builder) { this(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public EditionPatternReference(FlexoWorkflowBuilder builder) { this(builder.getProject()); initializeDeserialization(builder); } public EditionPatternReference(EditionPatternInstance instance, PatternRole patternRole) { this(); _project = instance.getProject(); _editionPatternInstance = instance; this.patternRole = patternRole; _editionPatternInstance.addObserver(this); update(); } @Override public void finalizeDeserialization(Object builder) { super.finalizeDeserialization(builder); logger.fine("Called finalizeDeserialization() for EditionPatternReference "); for (ActorReference ref : actors.values()) { if (ref instanceof ConceptActorReference) { getProject()._addToPendingEditionPatternReferences(((ConceptActorReference) ref)._getObjectURI(), (ConceptActorReference) ref); } } } /** * Delete the reference (not the instance !!!) */ @Override public void delete() { // Why delete the edition pattern instance ???? // Just dereference myself /*if (getEditionPatternInstance() != null && !getEditionPatternInstance().isDeleted()) { getEditionPatternInstance().delete(); }*/ super.delete(); actors.clear(); editionPattern = null; patternRole = null; _editionPatternInstance = null; // deleteObservers(); } private void update() { actors.clear(); if (_editionPatternInstance != null) { editionPattern = _editionPatternInstance.getPattern(); instanceId = _editionPatternInstance.getInstanceId(); for (String role : _editionPatternInstance.getActors().keySet()) { // System.out.println("> role : "+role); FlexoModelObject o = _editionPatternInstance.getActors().get(role); if (o instanceof OntologyObject) { actors.put(role, new ConceptActorReference((OntologyObject) o, role, this)); } else if (o instanceof ObjectPropertyStatement) { actors.put(role, new ObjectPropertyStatementActorReference((ObjectPropertyStatement) o, role, this)); } else if (o instanceof DataPropertyStatement) { actors.put(role, new DataPropertyStatementActorReference((DataPropertyStatement) o, role, this)); } else if (o instanceof SubClassStatement) { actors.put(role, new SubClassStatementActorReference((SubClassStatement) o, role, this)); } /*else if (o instanceof ObjectRestrictionStatement) { actors.put(role, new RestrictionStatementActorReference((ObjectRestrictionStatement) o, role, this)); }*/else { actors.put(role, new ModelObjectActorReference(o, role, this)); } } } } @Override public String getClassNameKey() { return "edition_pattern_reference"; } @Override public String getFullyQualifiedName() { return "EditionPatternReference" + "_" + editionPattern.getName() + "_" + instanceId; } @Override public FlexoProject getProject() { return _project; } @Override public XMLMapping getXMLMapping() { // Not defined in this context, since this is cross-model object return null; } @Override public XMLStorageResourceData getXMLResourceData() { // Not defined in this context, since this is cross-model object return null; } public static abstract class ActorReference extends FlexoModelObject { public String patternRole; private FlexoProject _project; private EditionPatternReference _patternReference; protected ActorReference(FlexoProject project) { super(project); _project = project; } @Override public FlexoProject getProject() { return _project; } @Override public XMLMapping getXMLMapping() { // Not defined in this context, since this is cross-model object return null; } @Override public XMLStorageResourceData getXMLResourceData() { // Not defined in this context, since this is cross-model object return null; } public abstract FlexoModelObject retrieveObject(); public EditionPatternReference getPatternReference() { return _patternReference; } public void setPatternReference(EditionPatternReference _patternReference) { this._patternReference = _patternReference; } } public static class ConceptActorReference extends ActorReference { private OntologyObject object; private String objectURI; public ConceptActorReference(OntologyObject o, String aPatternRole, EditionPatternReference ref) { super(ref.getProject()); setPatternReference(ref); patternRole = aPatternRole; object = o; objectURI = o.getURI(); } // Constructor used during deserialization public ConceptActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ConceptActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ConceptActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "concept_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public FlexoModelObject retrieveObject() { if (object == null) { getProject().getProjectOntology().loadWhenUnloaded(); object = getProject().getProjectOntology().getOntologyObject(objectURI); } if (object == null) { logger.warning("Could not retrieve object " + objectURI); } return (FlexoModelObject) object; } public String _getObjectURI() { if (object != null) { return object.getURI(); } return objectURI; } public void _setObjectURI(String objectURI) { this.objectURI = objectURI; } public OntologyObject getObject() { return object; } } public static class ObjectPropertyStatementActorReference extends ActorReference { public ObjectPropertyStatement statement; public String subjectURI; public String objectPropertyURI; public String objectURI; public ObjectPropertyStatementActorReference(ObjectPropertyStatement o, String aPatternRole, EditionPatternReference ref) { super(ref.getProject()); setPatternReference(ref); patternRole = aPatternRole; statement = o; subjectURI = o.getSubject().getURI(); objectURI = o.getStatementObject().getURI(); objectPropertyURI = o.getProperty().getURI(); } // Constructor used during deserialization public ObjectPropertyStatementActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ObjectPropertyStatementActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ObjectPropertyStatementActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "object_property_statement_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public ObjectPropertyStatement retrieveObject() { if (statement == null) { getProject().getProjectOntology().loadWhenUnloaded(); OntologyObject subject = getProject().getProjectOntology().getOntologyObject(subjectURI); if (subject == null) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Could not find subject with URI " + subjectURI); } return null; } if (subject instanceof OWLObject == false) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Statements aren't supported by non-owl ontologies, subject's URI: " + subjectURI); } return null; } OntologyObject object = getProject().getProjectOntology().getOntologyObject(objectURI); if (object == null) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Could not find object with URI " + objectURI); } return null; } OntologyObjectProperty property = getProject().getProjectOntology().getObjectProperty(objectPropertyURI); // FIXED HUGE ISSUE HERE, with incorrect deserialization of statements statement = ((OWLObject) subject).getObjectPropertyStatement(property, object); // logger.info("Found statement: "+statement); } if (statement == null) { logger.warning("Could not retrieve object " + objectURI); } return statement; } } public static class DataPropertyStatementActorReference extends ActorReference { public DataPropertyStatement statement; public String subjectURI; public String dataPropertyURI; public String value; public DataPropertyStatementActorReference(DataPropertyStatement o, String aPatternRole, EditionPatternReference ref) { super(ref.getProject()); setPatternReference(ref); patternRole = aPatternRole; statement = o; subjectURI = o.getSubject().getURI(); value = o.getLiteral().toString(); dataPropertyURI = o.getProperty().getURI(); } // Constructor used during deserialization public DataPropertyStatementActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public DataPropertyStatementActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public DataPropertyStatementActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "data_property_statement_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public DataPropertyStatement retrieveObject() { if (statement == null) { getProject().getProjectOntology().loadWhenUnloaded(); OntologyObject subject = getProject().getProjectOntology().getOntologyObject(subjectURI); if (subject instanceof OWLObject == false) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Statements aren't supported by non-owl ontologies, subject's URI: " + subjectURI); } return null; } OWLDataProperty property = (OWLDataProperty) getProject().getProjectOntology().getDataProperty(dataPropertyURI); statement = ((OWLObject<?>) subject).getDataPropertyStatement(property); // logger.info("Found statement: "+statement); } if (statement == null) { logger.warning("Could not retrieve object " + value); } return statement; } } public static class RestrictionStatementActorReference extends ActorReference { public OntologyRestrictionClass restriction; // public String subjectURI; public String propertyURI; public String objectURI; public RestrictionStatementActorReference(OntologyRestrictionClass o, String aPatternRole, EditionPatternReference ref) { super(ref.getProject()); setPatternReference(ref); patternRole = aPatternRole; restriction = o; // subjectURI = o.getSubject().getURI(); objectURI = o.getObject().getURI(); propertyURI = o.getProperty().getURI(); } // Constructor used during deserialization public RestrictionStatementActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public RestrictionStatementActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public RestrictionStatementActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "restriction_statement_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public OntologyRestrictionClass retrieveObject() { if (restriction == null) { getProject().getProjectOntology().loadWhenUnloaded(); // OntologyObject subject = getProject().getProjectOntologyLibrary().getOntologyObject(subjectURI); OntologyObject object = getProject().getProjectOntology().getOntologyObject(objectURI); OntologyProperty property = getProject().getProjectOntology().getProperty(propertyURI); if (object instanceof OntologyClass) { // restriction = subject.getObjectRestrictionStatement(property, (OntologyClass) object); // logger.info("Found restriction: " + restriction); // TODO implement this logger.warning("Not implemented !!!"); } } if (restriction == null) { logger.warning("Could not retrieve object " + objectURI); } return restriction; } } public static class SubClassStatementActorReference extends ActorReference { public SubClassStatement statement; public String subjectURI; public String parentURI; public SubClassStatementActorReference(SubClassStatement o, String aPatternRole, EditionPatternReference ref) { super(ref.getProject()); setPatternReference(ref); patternRole = aPatternRole; statement = o; subjectURI = o.getSubject().getURI(); parentURI = o.getParent().getURI(); } // Constructor used during deserialization public SubClassStatementActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public SubClassStatementActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public SubClassStatementActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "sub_class_statement_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public SubClassStatement retrieveObject() { if (statement == null) { getProject().getProjectOntology().loadWhenUnloaded(); OntologyObject subject = getProject().getProjectOntology().getOntologyObject(subjectURI); if (subject instanceof OWLObject == false) { if (logger.isLoggable(Level.WARNING)) { logger.warning("Statements aren't supported by non-owl ontologies, subject's URI: " + subjectURI); } return null; } OntologyObject parent = getProject().getProjectOntology().getOntologyObject(parentURI); if (subject != null && parent != null) { statement = ((OWLObject<?>) subject).getSubClassStatement(parent); } logger.info("Found statement: " + statement); } if (statement == null) { logger.warning("Could not retrieve object " + parentURI); } return statement; } } public static class ModelObjectActorReference extends ActorReference { public FlexoModelObject object; public FlexoModelObjectReference objectReference; public ModelObjectActorReference(FlexoModelObject o, String aPatternRole, EditionPatternReference ref) { super(o.getProject()); setPatternReference(ref); patternRole = aPatternRole; object = o; objectReference = new FlexoModelObjectReference(o); } // Constructor used during deserialization public ModelObjectActorReference(VEShemaBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ModelObjectActorReference(FlexoProcessBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } // Constructor used during deserialization public ModelObjectActorReference(FlexoWorkflowBuilder builder) { super(builder.getProject()); initializeDeserialization(builder); } @Override public String getClassNameKey() { return "model_object_actor_reference"; } @Override public String getFullyQualifiedName() { // TODO Auto-generated method stub return null; } @Override public FlexoModelObject retrieveObject() { if (object == null) { object = objectReference.getObject(true); } if (object == null) { logger.warning("Could not retrieve object " + objectReference); } return object; } } public EditionPatternInstance getEditionPatternInstance() { if (_editionPatternInstance != null) { return _editionPatternInstance; } _editionPatternInstance = getProject().getEditionPatternInstance(this); // Warning: this is really important to keep synchro between EPInstance and EPReference if (_editionPatternInstance != null) { _editionPatternInstance.addObserver(this); } return _editionPatternInstance; } @Override public void update(FlexoObservable observable, DataModification dataModification) { if (dataModification instanceof EditionPatternActorChanged) { update(); } } private String _patternRoleName; public String getPatternRoleName() { if (patternRole != null) { return patternRole.getPatternRoleName(); } return _patternRoleName; } public void setPatternRoleName(String patternRoleName) { _patternRoleName = patternRoleName; if (getEditionPattern() != null) { patternRole = getEditionPattern().getPatternRole(_patternRoleName); } } public PatternRole getPatternRole() { if (patternRole == null && getEditionPattern() != null) { patternRole = getEditionPattern().getPatternRole(_patternRoleName); } return patternRole; } public EditionPattern getEditionPattern() { return editionPattern; } public void setEditionPattern(EditionPattern pattern) { this.editionPattern = pattern; } public ViewPoint getViewPoint() { if (getEditionPattern() != null) { return getEditionPattern().getViewPoint(); } return null; } public FlexoOntology getViewPointOntology() { if (getViewPoint() != null) { return getViewPoint().getViewpointOntology(); } return null; } public long getInstanceId() { return instanceId; } public void setInstanceId(long instanceId) { this.instanceId = instanceId; } public Hashtable<String, ActorReference> getActors() { return actors; } public void setActors(Hashtable<String, ActorReference> actors) { this.actors = actors; } public void setActorForKey(ActorReference o, String key) { actors.put(key, o); o.setPatternReference(this); } public void removeActorWithKey(String key) { actors.remove(key); } @Override public Object getValue(BindingVariable variable) { return getEditionPatternInstance().getValue(variable); } public String debug() { StringBuffer sb = new StringBuffer(); sb.append("Reference to EditionPattern with role : " + getPatternRole() + "\n"); sb.append("EditionPattern: " + getEditionPatternInstance().getPattern().getName() + "\n"); sb.append("Instance: " + instanceId + " hash=" + Integer.toHexString(hashCode()) + "\n"); for (String patternRole : actors.keySet()) { FlexoModelObject object = actors.get(patternRole); sb.append("Role: " + patternRole + " : " + object + "\n"); } return sb.toString(); } public boolean isPrimaryRole() { return getPatternRole() != null && getPatternRole().getIsPrimaryRole(); } }