]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.acorn/src/org/simantics/acorn/lru/ClusterUpdateOperation.java
NPE fix for Acorn cluster stream undo handling
[simantics/platform.git] / bundles / org.simantics.acorn / src / org / simantics / acorn / lru / ClusterUpdateOperation.java
index 40a44bc43bc17e85c1114b3bae21aee53bb6573d..254fbf55c10cf121f16479261534894d86e4f51b 100644 (file)
@@ -2,10 +2,9 @@ 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.exception.AcornAccessVerificationException;
+import org.simantics.acorn.exception.IllegalAcornStateException;
 import org.simantics.acorn.internal.ClusterUpdateProcessor;
-import org.simantics.acorn.internal.ClusterUpdateProcessor2;
 import org.simantics.db.service.Bytes;
 import org.simantics.db.service.ClusterUID;
 
@@ -21,7 +20,7 @@ final public class ClusterUpdateOperation {
        public ClusterChangeSet ccs;
        boolean finished = false;
 
-       public ClusterUpdateOperation(ClusterManager manager, byte[] data) {
+       public ClusterUpdateOperation(ClusterManager manager, byte[] data) throws IllegalAcornStateException, AcornAccessVerificationException {
                
                long cuid1 = Bytes.readLE8(data, 8);
                long cuid2 = Bytes.readLE8(data, 16);
@@ -30,20 +29,19 @@ final public class ClusterUpdateOperation {
                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) {
+       public void scheduled(String ccsInfoId) throws AcornAccessVerificationException, IllegalAcornStateException {
                ccs = new ClusterChangeSet(ccsInfoId, uid);
                chunk = ccs.getChunk(manager);
                manager.addIntoCurrentChangeSet(ccsInfoId);
        }
        
-       public void run() {
+       public void run() throws AcornAccessVerificationException, IllegalAcornStateException {
                ClusterUpdateOperation op = null;
                byte[] data = null;
                chunk.acquireMutex();
@@ -51,35 +49,23 @@ final public class ClusterUpdateOperation {
                        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) {
-               
+       public void runWithData(byte[] data) throws IllegalAcornStateException, AcornAccessVerificationException {
                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();
-                       }
+                       ClusterUpdateProcessor processor = new ClusterUpdateProcessor(manager, manager.support, data, this);
+                       ClusterImpl cluster = info.getForUpdate();
+                       cluster = processor.process(cluster);
+                       manager.update(uid, cluster);
+               } catch (IllegalAcornStateException | AcornAccessVerificationException e) {
+                   throw e;
                } catch (Throwable t) {
-                       t.printStackTrace();
+                       throw new IllegalAcornStateException(t);
                }
-               
        }
        
        @Override