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-06-16 00:11:35 +02:00
|
|
|
import java.util.Date;
|
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 00:11:35 +02:00
|
|
|
import com.metaweb.gridworks.history.Change;
|
|
|
|
import com.metaweb.gridworks.history.HistoryEntry;
|
|
|
|
import com.metaweb.gridworks.model.AbstractOperation;
|
2010-05-05 01:24:48 +02:00
|
|
|
import com.metaweb.gridworks.model.Project;
|
|
|
|
|
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;
|
|
|
|
protected List<String> _expressions;
|
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
|
|
|
|
|
|
|
public abstract boolean importProject(long projectID);
|
|
|
|
|
2010-06-16 09:44:46 +02:00
|
|
|
public abstract void importProject(long projectID, InputStream inputStream, boolean gziped) throws IOException;
|
|
|
|
|
|
|
|
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-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public void addLatestExpression(String s) {
|
|
|
|
synchronized (this) {
|
|
|
|
_expressions.remove(s);
|
|
|
|
_expressions.add(0, s);
|
|
|
|
while (_expressions.size() > s_expressionHistoryMax) {
|
|
|
|
_expressions.remove(_expressions.size() - 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2010-06-15 21:34:40 +02:00
|
|
|
|
2010-05-05 01:24:48 +02:00
|
|
|
public List<String> getExpressions() {
|
|
|
|
return _expressions;
|
|
|
|
}
|
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
|
|
|
|
|
|
|
public abstract void deleteProject(long projectID) ;
|
|
|
|
|
2010-06-16 00:11:35 +02:00
|
|
|
public abstract HistoryEntry createHistoryEntry(long id, long projectID, String description, AbstractOperation operation, Date time);
|
|
|
|
public abstract HistoryEntry createHistoryEntry(long id, Project project, String description, AbstractOperation operation, Change change);
|
2010-05-05 01:24:48 +02:00
|
|
|
}
|