package org.simantics.acorn.lru; import org.simantics.acorn.ClusterManager; import org.simantics.acorn.cluster.ClusterImpl; import org.simantics.acorn.internal.ClusterChange; import org.simantics.acorn.internal.ClusterChange2; import org.simantics.acorn.internal.ClusterUpdateProcessor; import org.simantics.acorn.internal.ClusterUpdateProcessor2; import org.simantics.db.service.Bytes; import org.simantics.db.service.ClusterUID; final public class ClusterUpdateOperation { final public ClusterUID uid; final protected ClusterManager manager; final protected ClusterInfo info; public byte[] data; public ClusterStreamChunk chunk; public ClusterChangeSet ccs; boolean finished = false; public ClusterUpdateOperation(ClusterManager manager, byte[] data) { long cuid1 = Bytes.readLE8(data, 8); long cuid2 = Bytes.readLE8(data, 16); this.manager = manager; this.uid = ClusterUID.make(cuid1, cuid2); this.data = data; this.info = manager.clusterLRU.getOrCreate(uid, true); } public void finish() { finished = true; } public void scheduled(String ccsInfoId) { ccs = new ClusterChangeSet(ccsInfoId, uid); chunk = ccs.getChunk(manager); manager.addIntoCurrentChangeSet(ccsInfoId); } public void run() { ClusterUpdateOperation op = null; byte[] data = null; chunk.acquireMutex(); try { chunk.makeResident(); op = chunk.operations.get(ccs.chunkOffset); data = op.data; } catch (Throwable t) { throw new IllegalStateException(t); } finally { chunk.releaseMutex(); } op.runWithData(data); } public void runWithData(byte[] data) { try { int version = Bytes.readLE4(data, 4); if(version == ClusterChange.VERSION) { ClusterUpdateProcessor processor = new ClusterUpdateProcessor(manager, manager.support, data, this); ClusterImpl cluster = info.getForUpdate(); cluster = processor.process(cluster); manager.update(uid, cluster); } else if (version == ClusterChange2.VERSION) { ClusterUpdateProcessor2 processor = new ClusterUpdateProcessor2(manager.support, data, this); ClusterImpl cluster = info.getForUpdate(); processor.process(cluster); manager.update(uid, cluster); } else { throw new IllegalStateException(); } } catch (Throwable t) { t.printStackTrace(); } } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("ClusterUpdateOperation [uid=").append(uid).append("] [info=").append(info).append("] [ccs=").append(ccs).append("] [chunk=").append("]"); return sb.toString(); } }