2010-05-05 01:24:48 +02:00
|
|
|
package com.metaweb.gridworks;
|
|
|
|
|
2010-06-16 09:44:46 +02:00
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
2010-05-05 01:24:48 +02:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map.Entry;
|
|
|
|
|
2010-06-16 09:44:46 +02:00
|
|
|
import org.apache.tools.tar.TarOutputStream;
|
2010-05-05 01:24:48 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
2010-06-16 14:35:37 +02:00
|
|
|
import com.metaweb.gridworks.history.HistoryEntryManager;
|
2010-05-05 01:24:48 +02:00
|
|
|
import com.metaweb.gridworks.model.Project;
|
2010-06-17 04:15:26 +02:00
|
|
|
import com.metaweb.gridworks.preference.PreferenceStore;
|
|
|
|
import com.metaweb.gridworks.preference.TopList;
|
2010-05-05 01:24:48 +02:00
|
|
|
|
2010-06-15 21:34:40 +02:00
|
|
|
|
|
|
|
public abstract class ProjectManager {
|
2010-05-05 01:24:48 +02:00
|
|
|
// last n expressions used across all projects
|
|
|
|
static protected final int s_expressionHistoryMax = 100;
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
protected Map<Long, ProjectMetadata> _projectsMetadata;
|
2010-06-17 04:15:26 +02:00
|
|
|
protected PreferenceStore _preferenceStore;
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
final static Logger logger = LoggerFactory.getLogger("project_manager");
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
/**
|
|
|
|
* What caches the joins between projects.
|
|
|
|
*/
|
2010-05-09 06:34:36 +02:00
|
|
|
transient protected InterProjectModel _interProjectModel = new InterProjectModel();
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-09 06:34:36 +02:00
|
|
|
/**
|
|
|
|
* Flags
|
|
|
|
*/
|
2010-06-15 21:34:40 +02:00
|
|
|
transient protected int _busy = 0; // heavy operations like creating or importing projects are going on
|
|
|
|
|
|
|
|
/**
|
|
|
|
* While each project's metadata is loaded completely at start-up, each project's raw data
|
|
|
|
* is loaded only when the project is accessed by the user. This is because project
|
|
|
|
* metadata is tiny compared to raw project data. This hash map from project ID to project
|
|
|
|
* is more like a last accessed-last out cache.
|
|
|
|
*/
|
|
|
|
transient protected Map<Long, Project> _projects;
|
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
static public ProjectManager singleton;
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public InterProjectModel getInterProjectModel() {
|
|
|
|
return _interProjectModel;
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public void registerProject(Project project, ProjectMetadata projectMetadata) {
|
|
|
|
synchronized (this) {
|
|
|
|
_projects.put(project.id, project);
|
|
|
|
_projectsMetadata.put(project.id, projectMetadata);
|
|
|
|
}
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* Load project from data storage
|
|
|
|
* @param projectID
|
|
|
|
* @return
|
|
|
|
*/
|
2010-06-15 21:34:40 +02:00
|
|
|
public abstract boolean importProject(long projectID);
|
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* Import project from a Gridworks archive
|
|
|
|
* @param projectID
|
|
|
|
* @param inputStream
|
|
|
|
* @param gziped
|
|
|
|
* @throws IOException
|
|
|
|
*/
|
2010-06-16 09:44:46 +02:00
|
|
|
public abstract void importProject(long projectID, InputStream inputStream, boolean gziped) throws IOException;
|
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* Export project to a Gridworks archive
|
|
|
|
* @param projectId
|
|
|
|
* @param tos
|
|
|
|
* @throws IOException
|
|
|
|
*/
|
2010-06-16 09:44:46 +02:00
|
|
|
public abstract void exportProject(long projectId, TarOutputStream tos) throws IOException;
|
|
|
|
|
2010-06-15 21:34:40 +02:00
|
|
|
public abstract void ensureProjectSaved(long id);
|
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public ProjectMetadata getProjectMetadata(long id) {
|
|
|
|
return _projectsMetadata.get(id);
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public ProjectMetadata getProjectMetadata(String name) {
|
|
|
|
for (ProjectMetadata pm : _projectsMetadata.values()) {
|
|
|
|
if (pm.getName().equals(name)) {
|
|
|
|
return pm;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public long getProjectID(String name) {
|
|
|
|
for (Entry<Long, ProjectMetadata> entry : _projectsMetadata.entrySet()) {
|
|
|
|
if (entry.getValue().getName().equals(name)) {
|
|
|
|
return entry.getKey();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public Map<Long, ProjectMetadata> getAllProjectMetadata() {
|
|
|
|
return _projectsMetadata;
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
|
|
|
public abstract Project getProject(long parseLong);
|
|
|
|
|
2010-05-09 06:34:36 +02:00
|
|
|
public void setBusy(boolean busy) {
|
2010-05-12 11:02:41 +02:00
|
|
|
synchronized (this) {
|
|
|
|
if (busy) {
|
|
|
|
_busy++;
|
|
|
|
} else {
|
|
|
|
_busy--;
|
|
|
|
}
|
|
|
|
}
|
2010-05-09 06:34:36 +02:00
|
|
|
}
|
2010-06-17 04:15:26 +02:00
|
|
|
|
|
|
|
public PreferenceStore getPreferenceStore() {
|
|
|
|
return _preferenceStore;
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public void addLatestExpression(String s) {
|
|
|
|
synchronized (this) {
|
2010-06-17 04:15:26 +02:00
|
|
|
((TopList) _preferenceStore.get("expressions")).add(s);
|
2010-05-05 01:24:48 +02:00
|
|
|
}
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public List<String> getExpressions() {
|
2010-06-17 04:15:26 +02:00
|
|
|
return ((TopList) _preferenceStore.get("expressions")).getList();
|
2010-05-05 01:24:48 +02:00
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* Save project to data store
|
|
|
|
* @param b
|
|
|
|
*/
|
2010-06-15 21:34:40 +02:00
|
|
|
public abstract void save(boolean b);
|
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public void deleteProject(Project project) {
|
|
|
|
deleteProject(project.id);
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* Remove project from data store
|
|
|
|
* @param projectID
|
|
|
|
*/
|
2010-06-15 21:34:40 +02:00
|
|
|
public abstract void deleteProject(long projectID) ;
|
|
|
|
|
2010-06-17 17:37:28 +02:00
|
|
|
/**
|
|
|
|
* The history entry manager deals with changes
|
|
|
|
* @return manager for handling history
|
|
|
|
*/
|
2010-06-16 16:17:17 +02:00
|
|
|
public abstract HistoryEntryManager getHistoryEntryManager();
|
2010-06-17 04:15:26 +02:00
|
|
|
|
|
|
|
static protected void preparePreferenceStore(PreferenceStore ps) {
|
|
|
|
ps.put("expressions", new TopList(s_expressionHistoryMax));
|
|
|
|
}
|
2010-05-05 01:24:48 +02:00
|
|
|
}
|