package org.openflexo.foundation.rm;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoObservable;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.xmlcode.XMLSerializable;
public class ExternalResource implements FlexoObserver, XMLSerializable {
public static interface ExternalResourceOwner {
public void externalResourceFound(ExternalResource externalResource, FlexoResource resource);
public void externalResourceNotFound(ExternalResource externalResource);
}
private ExternalResourceOwner owner;
private String projectURI;
private String resourceIdentifier;
private FlexoProject project;
private FlexoProject observedProject;
// Created by deserialization
public ExternalResource(FlexoProjectBuilder builder) {
this.project = builder.project;
this.project.addObserver(this);
}
// Created during serialization
public ExternalResource(FlexoResource<?> resource) {
this.projectURI = resource.getProject().getProjectURI();
this.resourceIdentifier = resource.getResourceIdentifier();
}
public void delete() {
if (project != null) {
project.deleteObserver(this);
}
if (observedProject != null) {
observedProject.deleteObserver(this);
}
owner = null;
}
public String getProjectURI() {
return projectURI;
}
public void setProjectURI(String projectURI) {
this.projectURI = projectURI;
}
public String getResourceIdentifier() {
return resourceIdentifier;
}
public void setResourceIdentifier(String resourceIdentifier) {
this.resourceIdentifier = resourceIdentifier;
}
public ExternalResourceOwner getOwner() {
return owner;
}
public void setOwner(ExternalResourceOwner owner) {
if (owner != null) {
this.owner = owner;
}
}
@Override
public void update(FlexoObservable observable, DataModification dataModification) {
if (dataModification instanceof ImportedProjectLoaded && ((ImportedProjectLoaded) dataModification).getProject() != null
&& ((ImportedProjectLoaded) dataModification).getProject().getURI().equals(getProjectURI())) {
FlexoProject project = ((ImportedProjectLoaded) dataModification).getProject();
FlexoResource<FlexoResourceData> resource = (FlexoResource<FlexoResourceData>) project.resourceForKey(getResourceIdentifier());
if (resource != null) {
owner.externalResourceFound(this, resource);
delete();
} else {
if (this.project != null) {
this.project.deleteObserver(this);
}
project.addObserver(this);
observedProject = project;
owner.externalResourceNotFound(this);
}
} else if (observable instanceof FlexoProject && dataModification instanceof ResourceAdded
&& ((FlexoProject) observable).getProjectURI().equals(getProjectURI())) {
FlexoProject project = (FlexoProject) observable;
FlexoResource<FlexoResourceData> resource = (FlexoResource<FlexoResourceData>) project.resourceForKey(getResourceIdentifier());
if (resource != null) {
owner.externalResourceFound(this, resource);
delete();
}
}
}
}