package org.openflexo.foundation.rm; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.logging.Logger; import org.openflexo.foundation.utils.FlexoModelObjectReference; import org.openflexo.foundation.wkf.FlexoWorkflow; import org.openflexo.logging.FlexoLogger; public abstract class FlexoProjectReferenceImpl implements FlexoProjectReference, PropertyChangeListener { private static final Logger logger = FlexoLogger.getLogger(FlexoModelObjectReference.class.getPackage().getName()); public static interface ReferenceOwner { public void projectDeleted(FlexoProjectReference reference); } @Override public FlexoProject getReferredProject(boolean force) { FlexoProject project = getInternalReferredProject(); if (project == null && getReferringProject() != null) { project = getReferringProject().loadProjectReference(this, !force); if (project != null) { setReferredProject(project); } } return project; } private FlexoProject getInternalReferredProject() { return (FlexoProject) performSuperGetter(REFERRED_PROJECT); } @Override public void setReferredProject(FlexoProject project) { if (project != null) { String knownURI = (String) performSuperGetter(URI); if (knownURI != null && !knownURI.equals(project.getURI())) { throw new RuntimeException("Expecting a project with URI " + knownURI + " but received a project with URI " + project.getURI()); } } if (getReferredProject() != null) { getReferredProject().getPropertyChangeSupport().removePropertyChangeListener(FlexoProject.PROJECT_DIRECTORY, this); getReferredProject().getPropertyChangeSupport().removePropertyChangeListener(FlexoProject.PROJECT_URI, this); getReferredProject().getPropertyChangeSupport().removePropertyChangeListener(FlexoProject.REVISION, this); getReferredProject().getPropertyChangeSupport().removePropertyChangeListener(FlexoProject.VERSION, this); } performSuperSetter(REFERRED_PROJECT, project); if (project != null) { getReferredProject().getPropertyChangeSupport().addPropertyChangeListener(FlexoProject.PROJECT_DIRECTORY, this); getReferredProject().getPropertyChangeSupport().addPropertyChangeListener(FlexoProject.PROJECT_URI, this); getReferredProject().getPropertyChangeSupport().addPropertyChangeListener(FlexoProject.REVISION, this); getReferredProject().getPropertyChangeSupport().addPropertyChangeListener(FlexoProject.VERSION, this); FlexoWorkflowResource importedWorkflowResource = getReferringProject().getImportedWorkflowResource(this, true); importedWorkflowResource.replaceWithWorkflow(project.getWorkflow()); firePropertyChange(WORKFLOW, null, project.getWorkflow()); firePropertyChange(NAME, getInternalName(), getName()); firePropertyChange(REVISION, getInternalRevision(), getRevision()); firePropertyChange(NAME, getInternalVersion(), getVersion()); } } private void firePropertyChange(String name, Object old, Object value) { if (old == null && value == old) { return; } if (old != null && old.equals(value)) { return; } setModified(true); getPropertyChangeSupport().firePropertyChange(name, old, value); } @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getSource() == getReferredProject()) { setModified(true); } } @Override public void delete() { FlexoWorkflowResource workflowResource = getReferringProject().getImportedWorkflowResource(this); if (workflowResource != null) { workflowResource.delete(); } performSuperDelete(); } @Override public String toString() { return "FlexoProjectReference " + getName() + " " + getRevision() + " " + getURI(); } /** * @see org.openflexo.foundation.rm.FlexoProjectReference#getName() */ @Override public String getName() { if (getReferredProject() != null) { return getReferredProject().getDisplayName(); } return getInternalName(); } private String getInternalName() { return (String) performSuperGetter(NAME); } /** * @see org.openflexo.foundation.rm.FlexoProjectReference#getURI() */ @Override public String getURI() { if (getReferredProject() != null) { return getReferredProject().getProjectURI(); } return (String) performSuperGetter(URI); } /** * @see org.openflexo.foundation.rm.FlexoProjectReference#getProjectVersion() */ @Override public String getVersion() { if (getReferredProject() != null) { return getReferredProject().getVersion(); } return getInternalVersion(); } private String getInternalVersion() { return (String) performSuperGetter(VERSION); } /** * @see org.openflexo.foundation.rm.FlexoProjectReference#getProjectRevision() */ @Override public Long getRevision() { if (getReferredProject() != null) { return getReferredProject().getRevision(); } return getInternalRevision(); } private Long getInternalRevision() { return (Long) performSuperGetter(REVISION); } @Override public File getFile() { if (getReferredProject() != null) { return getReferredProject().getProjectDirectory(); } return (File) performSuperGetter(FILE); } @Override public Class<FlexoProject> getResourceDataClass() { return FlexoProject.class; } @Override public FlexoWorkflow getWorkflow() { if (getReferredProject() != null) { return getReferredProject().getWorkflow(); } else { return getReferringProject().getImportedWorkflow(this); } } }