package org.freeplane.plugin.workspace.model.project;
import java.net.URI;
import java.util.LinkedHashMap;
import java.util.Map;
import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType;
public abstract class AWorkspaceProject {
private Map<Class<? extends IWorkspaceProjectExtension>, IWorkspaceProjectExtension> extensions = new LinkedHashMap<Class<? extends IWorkspaceProjectExtension>, IWorkspaceProjectExtension>();
private static IWorkspaceProjectCreater creator = null;
private ProjectModel model;
private boolean isLoaded = false;
public abstract ProjectVersion getVersion();
public abstract URI getProjectHome();
public abstract String getProjectID();
public abstract URI getProjectDataPath();
public abstract URI getRelativeURI(URI uri);
public abstract String getProjectName();
public ProjectModel getModel() {
if(this.model == null) {
this.model = new ProjectModel(this);
this.model.addProjectModelListener(new DefaultModelChangeListener());
}
return this.model;
}
@SuppressWarnings("unchecked")
public <T extends IWorkspaceProjectExtension> T getExtensions(Class<T> key) {
synchronized (extensions) {
return (T) extensions.get(key);
}
}
public IWorkspaceProjectExtension addExtension(IWorkspaceProjectExtension extension) {
synchronized (extensions) {
return addExtension(extension.getClass(), extension);
}
}
public IWorkspaceProjectExtension addExtension(Class<? extends IWorkspaceProjectExtension> key, IWorkspaceProjectExtension extension) {
if(extension == null) {
return null;
}
if(key == null) {
key = extension.getClass();
}
synchronized (extensions) {
return this.extensions.put(key, extension);
}
}
public IWorkspaceProjectExtension removeExtension(Class<? extends IWorkspaceProjectExtension> key) {
if(key == null) {
return null;
}
synchronized (extensions) {
return this.extensions.remove(key);
}
}
public boolean isLoaded() {
return isLoaded;
}
public void setLoaded() {
isLoaded = true;
}
public void unload() {
isLoaded = false;
}
public static void setCurrentProjectCreator(IWorkspaceProjectCreater pCreator) {
creator = pCreator;
}
public static AWorkspaceProject create(String projectID, URI projectHome) {
if(projectHome == null) {
throw new IllegalArgumentException("projectHome(URI)");
}
if(creator == null) {
creator = new DefaultWorkspaceProjectCreator();
}
return creator.newProject(projectID, projectHome);
}
public String toString() {
return getModel().getRoot().getName() +"[id="+getProjectID()+";home="+getProjectHome()+"]";
}
private final class DefaultModelChangeListener implements IProjectModelListener {
public void treeStructureChanged(WorkspaceModelEvent event) {
}
public void treeNodesRemoved(WorkspaceModelEvent event) {
}
public void treeNodesInserted(WorkspaceModelEvent event) {
}
public void treeNodesChanged(WorkspaceModelEvent event) {
if(event.getType() == WorkspaceModelEventType.RENAMED && getModel().getRoot().equals(event.getTreePath().getLastPathComponent())) {
//WORKSPACE - info: if the project folder should have the same name as the project
// File file = URIUtils.getAbsoluteFile(getProjectHome());
// File targetFile = new File(file.getParentFile(), getModel().getRoot().getName());
// if(file.exists()) {
// file.renameTo(targetFile);
// }
//setProjectHome(targetFile.toURI());
}
}
}
}