package org.openflexo.foundation.rm;
import java.util.List;
import org.openflexo.foundation.utils.ProjectLoadingCancelledException;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.model.annotations.Adder;
import org.openflexo.model.annotations.Embedded;
import org.openflexo.model.annotations.Finder;
import org.openflexo.model.annotations.Getter;
import org.openflexo.model.annotations.Getter.Cardinality;
import org.openflexo.model.annotations.ImplementationClass;
import org.openflexo.model.annotations.ModelEntity;
import org.openflexo.model.annotations.Remover;
import org.openflexo.model.annotations.Setter;
import org.openflexo.model.annotations.XMLElement;
import org.openflexo.model.factory.AccessibleProxyObject;
@ModelEntity
@ImplementationClass(ProjectData.ProjectDataImpl.class)
@XMLElement
public interface ProjectData extends AccessibleProxyObject, PAMELAStorageResourceData {
public static final String IMPORTED_PROJECTS = "importedProjects";
@Finder(collection = IMPORTED_PROJECTS, attribute = FlexoProjectReference.URI, isMultiValued = false)
public FlexoProjectReference getProjectReferenceWithURI(String uri);
public FlexoProjectReference getProjectReferenceWithURI(String projectURI, boolean searchRecursively);
@Finder(collection = IMPORTED_PROJECTS, attribute = FlexoProjectReference.NAME, isMultiValued = true)
public List<FlexoProjectReference> getProjectReferenceWithName(String name);
public List<FlexoProjectReference> getProjectReferenceWithName(String name, boolean searchRecursively);
@Getter(value = IMPORTED_PROJECTS, cardinality = Cardinality.LIST, inverse = FlexoProjectReference.PROJECT_DATA)
@XMLElement(xmlTag = "ImportedProjects")
@Embedded
public List<FlexoProjectReference> getImportedProjects();
@Setter(value = IMPORTED_PROJECTS)
public void setImportedProjects(List<FlexoProjectReference> importedProjects);
@Adder(IMPORTED_PROJECTS)
public void addToImportedProjects(FlexoProjectReference projectReference) throws ProjectImportLoopException,
ProjectLoadingCancelledException;
@Remover(value = IMPORTED_PROJECTS)
public void removeFromImportedProjects(FlexoProjectReference projectReference);
public String canImportProject(FlexoProject project);
public void removeFromImportedProjects(FlexoProject project);
public static abstract class ProjectDataImpl extends PAMELAStorageResourceDataImpl implements ProjectData, AccessibleProxyObject {
@Override
public FlexoProjectReference getProjectReferenceWithURI(String projectURI, boolean searchRecursively) {
FlexoProjectReference ref = getProjectReferenceWithURI(projectURI);
if (ref != null) {
return ref;
}
if (searchRecursively) {
for (FlexoProjectReference ref2 : getImportedProjects()) {
FlexoProjectReference projectWithURI = null;
if (ref2.getReferredProject() != null) {
ProjectData projectData = ref2.getReferredProject().getProjectData();
if (projectData != null) {
projectWithURI = projectData.getProjectReferenceWithURI(projectURI, searchRecursively);
}
if (projectWithURI != null) {
return projectWithURI;
}
}
}
}
return null;
}
@Override
public List<FlexoProjectReference> getProjectReferenceWithName(String name, boolean searchRecursively) {
List<FlexoProjectReference> refs = getProjectReferenceWithName(name);
if (searchRecursively) {
for (FlexoProjectReference ref2 : getImportedProjects()) {
if (ref2.getReferredProject() != null) {
ProjectData projectData = ref2.getReferredProject().getProjectData();
if (projectData != null) {
List<FlexoProjectReference> projectReferenceWithName = projectData.getProjectReferenceWithName(name,
searchRecursively);
for (FlexoProjectReference ref : projectReferenceWithName) {
if (!refs.contains(ref)) {
refs.add(ref);
}
}
}
}
}
}
return refs;
}
@Override
public void addToImportedProjects(FlexoProjectReference projectReference) throws ProjectImportLoopException {
if (!isDeserializing()) {
if (getImportedProjects().contains(projectReference)) {
return;
}
String reason = canImportProject(projectReference.getReferredProject());
if (reason != null) {
throw new ProjectImportLoopException(reason);
}
}
performSuperAdder(IMPORTED_PROJECTS, projectReference);
if (!isDeserializing() && projectReference.getReferredProject() != null) {
getProject().getFlexoRMResource().addToDependentResources(projectReference.getReferredProject().getFlexoRMResource());
getProject().getImportedWorkflow(projectReference, true);
}
}
@Override
public void removeFromImportedProjects(FlexoProjectReference projectReference) {
// TODO: remove dependency toward external resource.
// getProject().getFlexoRMResource().removeFromDependentResources(projectReference.getReferredProject().getFlexoRMResource());
performSuperRemover(IMPORTED_PROJECTS, projectReference);
}
@Override
public String canImportProject(FlexoProject project) {
if (project.getProjectURI().equals(getProject().getProjectURI())) {
return FlexoLocalization.localizedForKey("cannot_import_itself");
}
if (getProjectReferenceWithURI(project.getProjectURI()) != null) {
return FlexoLocalization.localizedForKey("project_already_imported");
}
return null;
}
@Override
public void removeFromImportedProjects(FlexoProject project) {
for (FlexoProjectReference ref : getImportedProjects()) {
if (ref.getReferredProject() == project) {
removeFromImportedProjects(ref);
break;
}
}
}
}
}