import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
+import org.simantics.acorn.MainProgram.MainProgramRunnable;
import org.simantics.acorn.exception.AcornAccessVerificationException;
import org.simantics.acorn.exception.IllegalAcornStateException;
import org.simantics.acorn.internal.ClusterChange;
clusters.clusterLRU.releaseMutex();
}
}
-
+
@Override
public boolean undo(long[] changeSetIds, OnChangeSetUpdate onChangeSetUpdate) throws SDBException {
- try {
- final ArrayList<Pair<ClusterUID, byte[]>> clusterChanges = new ArrayList<Pair<ClusterUID, byte[]>>();
-
- UndoClusterSupport support = new UndoClusterSupport(clusters);
-
- final int changeSetId = clusters.state.headChangeSetId;
-
- if(ClusterUpdateProcessorBase.DEBUG)
- System.err.println(" === BEGIN UNDO ===");
-
- for(int i=0;i<changeSetIds.length;i++) {
- final long id = changeSetIds[changeSetIds.length-1-i];
- ArrayList<String> ccss = clusters.getChanges(id);
-
- for(int j=0;j<ccss.size();j++) {
- String ccsid = ccss.get(ccss.size()-j-1);
- try {
- if(ClusterUpdateProcessorBase.DEBUG)
- System.err.println("performUndo " + ccsid);
- performUndo(ccsid, clusterChanges, support);
- } catch (DatabaseException e) {
- e.printStackTrace();
- }
- }
- }
-
- if(ClusterUpdateProcessorBase.DEBUG)
- System.err.println(" === END UNDO ===");
-
- for(int i=0;i<clusterChanges.size();i++) {
-
- final int changeSetIndex = i;
-
- final Pair<ClusterUID, byte[]> pair = clusterChanges.get(i);
-
- final ClusterUID cuid = pair.first;
- final byte[] data = pair.second;
-
- onChangeSetUpdate.onChangeSetUpdate(new ChangeSetUpdate() {
-
- @Override
- public long getChangeSetId() {
- return changeSetId;
- }
-
- @Override
- public int getChangeSetIndex() {
- return 0;
- }
-
- @Override
- public int getNumberOfClusterChangeSets() {
- return clusterChanges.size();
- }
-
- @Override
- public int getIndexOfClusterChangeSet() {
- return changeSetIndex;
- }
-
- @Override
- public byte[] getClusterId() {
- return cuid.asBytes();
- }
-
- @Override
- public boolean getNewCluster() {
- return false;
- }
-
- @Override
- public byte[] getData() {
- return data;
- }
-
- });
- }
- } catch (AcornAccessVerificationException | IllegalAcornStateException e1) {
- throw new ProCoreException(e1);
- }
+
+ Exception exception = mainProgram.runIdle(new MainProgramRunnable() {
+
+ @Override
+ public void run() throws Exception {
+
+ try {
+
+ final ArrayList<Pair<ClusterUID, byte[]>> clusterChanges = new ArrayList<Pair<ClusterUID, byte[]>>();
+
+ UndoClusterSupport support = new UndoClusterSupport(clusters);
+
+ final int changeSetId = clusters.state.headChangeSetId;
+
+ if(ClusterUpdateProcessorBase.DEBUG)
+ System.err.println(" === BEGIN UNDO ===");
+
+ for(int i=0;i<changeSetIds.length;i++) {
+ final long id = changeSetIds[changeSetIds.length-1-i];
+ ArrayList<String> ccss = clusters.getChanges(id);
+
+ for(int j=0;j<ccss.size();j++) {
+ String ccsid = ccss.get(ccss.size()-j-1);
+ try {
+ if(ClusterUpdateProcessorBase.DEBUG)
+ System.err.println("performUndo " + ccsid);
+ performUndo(ccsid, clusterChanges, support);
+ } catch (DatabaseException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ if(ClusterUpdateProcessorBase.DEBUG)
+ System.err.println(" === END UNDO ===");
+
+ for(int i=0;i<clusterChanges.size();i++) {
+
+ final int changeSetIndex = i;
+
+ final Pair<ClusterUID, byte[]> pair = clusterChanges.get(i);
+
+ final ClusterUID cuid = pair.first;
+ final byte[] data = pair.second;
+
+ onChangeSetUpdate.onChangeSetUpdate(new ChangeSetUpdate() {
+
+ @Override
+ public long getChangeSetId() {
+ return changeSetId;
+ }
+
+ @Override
+ public int getChangeSetIndex() {
+ return 0;
+ }
+
+ @Override
+ public int getNumberOfClusterChangeSets() {
+ return clusterChanges.size();
+ }
+
+ @Override
+ public int getIndexOfClusterChangeSet() {
+ return changeSetIndex;
+ }
+
+ @Override
+ public byte[] getClusterId() {
+ return cuid.asBytes();
+ }
+
+ @Override
+ public boolean getNewCluster() {
+ return false;
+ }
+
+ @Override
+ public byte[] getData() {
+ return data;
+ }
+
+ });
+ }
+ } catch (AcornAccessVerificationException | IllegalAcornStateException e1) {
+ throw new ProCoreException(e1);
+ }
+
+ }
+
+ @Override
+ public void done() {
+
+ }
+
+ });
+
+ if(exception instanceof SDBException) throw (SDBException)exception;
+ else if(exception != null) throw new IllegalAcornStateException(exception);
+
return false;
+
}
public ServiceLocator getServiceLocator() {