import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.simantics.db.server.ProCoreException;
import org.simantics.db.service.ClusterSetsSupport;
import org.simantics.db.service.ClusterUID;
+import org.simantics.db.service.EventSupport;
import org.simantics.db.service.LifecycleSupport;
-import org.simantics.utils.DataContainer;
import org.simantics.utils.datastructures.Pair;
import org.simantics.utils.logging.TimeLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import fi.vtt.simantics.procore.internal.EventSupportImpl;
import gnu.trove.map.hash.TLongObjectHashMap;
public class GraphClientImpl2 implements Database.Session {
private static final Logger LOGGER = LoggerFactory.getLogger(GraphClientImpl2.class);
public static final boolean DEBUG = false;
+
+ public static final String CLOSE = "close";
+ public static final String PURGE = "purge";
final ClusterManager clusters;
private Path dbFolder;
private final Database database;
private ServiceLocator locator;
+ private FileCache fileCache;
private MainProgram mainProgram;
+ private EventSupportImpl eventSupport;
private static class ClientThreadFactory implements ThreadFactory {
this.database = database;
this.dbFolder = dbFolder;
this.locator = locator;
- this.clusters = new ClusterManager(dbFolder);
+ this.fileCache = new FileCache();
+ // This disposes the cache when the session is shut down
+ locator.registerService(FileCache.class, fileCache);
+ this.clusters = new ClusterManager(dbFolder, fileCache);
load();
ClusterSetsSupport cssi = locator.getService(ClusterSetsSupport.class);
cssi.setReadDirectory(clusters.lastSessionDirectory);
cssi.updateWriteDirectory(clusters.workingDirectory);
mainProgram = new MainProgram(this, clusters);
executor.execute(mainProgram);
+ eventSupport = (EventSupportImpl)locator.getService(EventSupport.class);
+
}
public Path getDbFolder() {
throw new ProCoreException(e1);
}
closed = true;
+ eventSupport.fireEvent(CLOSE, null);
}
//impl.close();
}
LOGGER.info("performUndo " + ccsid);
performUndo(ccsid, clusterChanges, support);
} catch (DatabaseException e) {
- e.printStackTrace();
+ LOGGER.error("failed to perform undo for cluster change set {}", ccsid, e);
}
}
}
unexpectedClose = true;
} finally {
try {
- if(tr != null)
+ if(tr != null) {
endTransaction(tr.getTransactionId());
+ eventSupport.fireEvent(PURGE, null);
+ }
if (unexpectedClose) {
LifecycleSupport support = getServiceLocator().getService(LifecycleSupport.class);
try {