]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.layer0.utils/src/org/simantics/layer0/utils/writer/DelayedGraphWriter.java
Delete temporary files after use in delayed writes and model TG export
[simantics/platform.git] / bundles / org.simantics.layer0.utils / src / org / simantics / layer0 / utils / writer / DelayedGraphWriter.java
index 576bc0b4b275fbbc5a80258ff1b375210ca85ed9..66ffa77de7def4253c8601babb7d978b4d2184bd 100644 (file)
@@ -12,9 +12,6 @@
 package org.simantics.layer0.utils.writer;
 
 
-import gnu.trove.map.hash.TIntIntHashMap;
-import gnu.trove.map.hash.TIntLongHashMap;
-
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
@@ -31,6 +28,9 @@ import org.simantics.db.Resource;
 import org.simantics.db.WriteOnlyGraph;
 import org.simantics.db.exception.DatabaseException;
 
+import gnu.trove.map.hash.TIntIntHashMap;
+import gnu.trove.map.hash.TIntLongHashMap;
+
 public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
 
        protected File file;
@@ -45,7 +45,6 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                        System.out.println("Temp file: " + file.getAbsolutePath());
                        s = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file), 1024*1024));
 //                     s = new ObjectOutputStream(backup);
-                       
                        file.deleteOnExit();
                } catch (IOException e) {
                        throw new RuntimeException("Opening output stream to temporary file failed", e);
@@ -79,13 +78,13 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                assert(value != null);
                assert(dataType != null);
                try {
-                       ++internalCount;                
+                       ++internalCount;
                        timestamps.add(0);
                        
-                       s.writeByte(1);                 
-                       writeRef(internalCount);                        
+                       s.writeByte(1);
+                       writeRef(internalCount);
                        s.writeUnshared(value);
-                       writeRef(getId(dataType));                                      
+                       writeRef(getId(dataType));
                        
                        s.writeByte(0);
                        writeRef(current);
@@ -110,14 +109,14 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                assert(value != null);
                assert(dataType != null);
         try {
-            ++internalCount;        
+            ++internalCount;
             timestamps.add(0);
             
-            s.writeByte(1);         
-            writeRef(internalCount);            
+            s.writeByte(1);
+            writeRef(internalCount);
             s.writeUnshared(value);
-            writeRef(getId(dataType));                  
-    
+            writeRef(getId(dataType));
+
             current = internalCount;
         } catch (IOException e) {
             throw new RuntimeException("Writing statement failed.", e);
@@ -133,7 +132,7 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                clusterHints.put(current, clusterHint);
                return this;
        }
-           
+
     @Override
     public GraphWriter createInverse(int cluster, Resource r) {
        assert(r != null);
@@ -147,7 +146,7 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
         }
         return this;
     }    
-       
+
     @Override
     public GraphWriter createInverse(Resource r) {
        assert(r != null);
@@ -160,7 +159,7 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
             throw new RuntimeException("Writing statement failed.", e);
         }
         return this;
-    }    
+    }
 
     protected Resource getResource(WriteOnlyGraph wg, Resource[] internals, long[] resourceIds, int id) {
                if(id > 0) {
@@ -185,124 +184,122 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
        
        @Override
        public void commit(IProgressMonitor monitor, WriteOnlyGraph wg) throws DatabaseException {
-               
                try {
-                   if (s != null) {
-                       s.close();
-                       s = null;
-                   }
+                       if (s != null) {
+                               s.close();
+                               s = null;
+                       }
                        externalsInv = null;
-
-                       monitor.beginTask("", 100);
-
-                       int lastPercentageDone = 0;
-                       long fileLength = file.length();
-                       
-//                     System.out.println("size of commit file: " + fileLength);
-
-                       Resource[] internals = new Resource[internalCount];
-                       resourceIds = new long[internalCount];
-                       
-                       
+                       monitor.beginTask("Writing database", 100);
                        FileInputStream fis = new FileInputStream(file);
                        FileChannel fc = fis.getChannel();
-                       ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(fis, 1024*1024));
-            int resourceCounter = 0;
-                       int statementCounter = 0;
-            int valueCounter = 0;
-                       time = 0;
-                       loop: while(true) {
-                               switch(is.read()) {
-                               case -1:
-                                       break loop;
-                               case 0: {
-                                       int s = is.readInt();
-                                       int p = is.readInt();
-                                       int o = is.readInt();
-                                       Resource rs = getResource(wg, internals, resourceIds, s);
-                                       Resource rp = getResource(wg, internals, resourceIds, p);
-                                       Resource ro = getResource(wg, internals, resourceIds, o);
-                                       Resource rpInv = inverses.get(p);
-                                       wg.claim(rs, rp, rpInv, ro);
-                                       statementCounter += 2;
-                               } break;                                        
-                               case 1: {
-                                   int id = is.readInt();
-                                       Object value = is.readUnshared();
-                                       int type = is.readInt();
-                                       
-                                       Resource r = newResource(wg, internals, id);
-                                       wg.claim(r, l0.InstanceOf, null, getResource(wg, internals, resourceIds, type));
-                                       wg.claimValue(r, value);
-                    statementCounter ++;
-                    resourceCounter ++;
-                    valueCounter ++;
-                                       
-                               } break;
-                               case 2: {
-                                   wg.flushCluster();
-                } break; 
-                               case 3: {
-
-                    int s = is.readInt();
-                    int t = is.readInt();
-                                   
-                    Resource type = getResource(wg, internals, resourceIds, t);
-                    wg.claim(newResource(wg, internals, s), l0.InstanceOf, null, type);
-                    statementCounter ++;
-                    resourceCounter ++;
-                                   
-                               } break;
-                               case 4: {
-
-                    int s = is.readInt();
-                    newResource(wg, internals, s);
-                    resourceCounter ++;
-                    
-                               } break;
-                               case 5: { // InverseOf
-
-                    int r1 = is.readInt();
-                    int r2 = is.readInt();
-                    
-                    Resource rr1 = getResource(wg, internals, resourceIds, r1);
-                    Resource rr2 = getResource(wg, internals, resourceIds, r2);
-                    wg.claim(rr1, l0.InverseOf, l0.InverseOf, rr2);
-                    statementCounter += 2;
-                    
-                    inverses.put(r1, rr2);
-                    inverses.put(r2, rr1);
-                    
-                } break;
-                               }
-
-//                if((counter % 200000) == 0) {
-//                    System.out.println("Written " + counter + " statements.");
-//                }
-
-                double percentageDone = 100.0 * (double) fc.position() / (double) fileLength;
-                int newPercentageDone = (int) Math.round(percentageDone);
-                if(newPercentageDone > lastPercentageDone) {
-                    monitor.setTaskName("Writing database (" + newPercentageDone + "%)");
-                    monitor.worked(newPercentageDone - lastPercentageDone);
-                    lastPercentageDone = newPercentageDone;
-                }
+                       try (ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(fis, 1024*1024))) {
+                               commit(monitor, wg, is, fc);
                        }
-                       
-                       System.out.println("clusterIds.size() = " + clusterIds.size());
-                       
-                       System.out.println("Wrote " + resourceCounter + " resources, " + statementCounter + " statements and " + valueCounter + " values.");
-                       
                } catch (IOException e) {
-                       throw new RuntimeException("Commiting delayed graph writings failed.", e);
+                       throw new DatabaseException("Commiting delayed graph writings failed.", e);
                } catch (ClassNotFoundException e) {
-                       throw new RuntimeException("Commiting delayed graph writings failed.", e);
-               } finally {             
+                       throw new DatabaseException("Commiting delayed graph writings failed.", e);
+               } finally {
                        file.delete();
                        monitor.done();
                }
        }
-       
+
+       private void commit(IProgressMonitor monitor, WriteOnlyGraph wg, ObjectInputStream is, FileChannel fc) throws DatabaseException, IOException, ClassNotFoundException {
+               int lastPercentageDone = 0;
+               long fileLength = file.length();
+               //System.out.println("size of commit file: " + fileLength);
+
+               Resource[] internals = new Resource[internalCount];
+               resourceIds = new long[internalCount];
+
+               int resourceCounter = 0;
+               int statementCounter = 0;
+               int valueCounter = 0;
+               time = 0;
+               while(true) {
+                       switch(is.read()) {
+                       case -1:
+                               System.out.println("clusterIds.size() = " + clusterIds.size());
+                               System.out.println("Wrote " + resourceCounter + " resources, " + statementCounter + " statements and " + valueCounter + " values.");
+                               return;
+
+                       case 0: {
+                               int s = is.readInt();
+                               int p = is.readInt();
+                               int o = is.readInt();
+                               Resource rs = getResource(wg, internals, resourceIds, s);
+                               Resource rp = getResource(wg, internals, resourceIds, p);
+                               Resource ro = getResource(wg, internals, resourceIds, o);
+                               Resource rpInv = inverses.get(p);
+                               wg.claim(rs, rp, rpInv, ro);
+                               statementCounter += 2;
+                       } break;                                        
+                       case 1: {
+                               int id = is.readInt();
+                               Object value = is.readUnshared();
+                               int type = is.readInt();
+
+                               Resource r = newResource(wg, internals, id);
+                               wg.claim(r, l0.InstanceOf, null, getResource(wg, internals, resourceIds, type));
+                               wg.claimValue(r, value);
+                               statementCounter ++;
+                               resourceCounter ++;
+                               valueCounter ++;
+
+                       } break;
+                       case 2: {
+                               wg.flushCluster();
+                       } break; 
+                       case 3: {
+
+                               int s = is.readInt();
+                               int t = is.readInt();
+
+                               Resource type = getResource(wg, internals, resourceIds, t);
+                               wg.claim(newResource(wg, internals, s), l0.InstanceOf, null, type);
+                               statementCounter ++;
+                               resourceCounter ++;
+
+                       } break;
+                       case 4: {
+
+                               int s = is.readInt();
+                               newResource(wg, internals, s);
+                               resourceCounter ++;
+
+                       } break;
+                       case 5: { // InverseOf
+
+                               int r1 = is.readInt();
+                               int r2 = is.readInt();
+
+                               Resource rr1 = getResource(wg, internals, resourceIds, r1);
+                               Resource rr2 = getResource(wg, internals, resourceIds, r2);
+                               wg.claim(rr1, l0.InverseOf, l0.InverseOf, rr2);
+                               statementCounter += 2;
+
+                               inverses.put(r1, rr2);
+                               inverses.put(r2, rr1);
+
+                       } break;
+                       }
+
+//                     if((counter % 200000) == 0) {
+//                             System.out.println("Written " + counter + " statements.");
+//                     }
+
+                       double percentageDone = 100.0 * (double) fc.position() / (double) fileLength;
+                       int newPercentageDone = (int) Math.round(percentageDone);
+                       if(newPercentageDone > lastPercentageDone) {
+                               monitor.setTaskName("Writing database (" + newPercentageDone + "%)");
+                               monitor.worked(newPercentageDone - lastPercentageDone);
+                               lastPercentageDone = newPercentageDone;
+                       }
+               }
+       }
+
        private Resource newResource(WriteOnlyGraph wg, Resource[] internals, int s) throws DatabaseException {
                int clusterHint = clusterHints.get(s);
                
@@ -323,42 +320,6 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                resourceIds[s-1] = r.getResourceId();
                return r;
        }
-       
-//    public ValueDescriptor createDescriptor(Object obj) {
-//        
-//        if(obj instanceof String[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (String[])obj);
-//        else if(obj instanceof int[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (int[])obj);
-//        else if(obj instanceof double[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (double[])obj);
-//        else if(obj instanceof float[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (float[])obj);
-//        else if(obj instanceof boolean[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (boolean[])obj);
-//        else if(obj instanceof long[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (long[])obj);
-//        else if(obj instanceof byte[])
-//            return new ValueDescriptor(ValueTrait.StaticValue, (byte[])obj);
-//        
-//        else if(obj instanceof String)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new String[] {(String)obj});
-//        else if(obj instanceof Double)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new double[] {(Double)obj});
-//        else if(obj instanceof Float)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new float[] {(Float)obj});
-//        else if(obj instanceof Integer)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new int[] {(Integer)obj});
-//        else if(obj instanceof Boolean)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new boolean[] {(Boolean)obj});
-//        else if(obj instanceof Byte)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new byte[] {(Byte)obj});
-//        else if(obj instanceof Long)
-//            return new ValueDescriptor(ValueTrait.StaticValue, new long[] {(Long)obj});
-//        
-//        throw new Error("Wrong type!");
-//        
-//    }
 
     @Override
     public GraphWriter create() {
@@ -407,8 +368,7 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
        
        @Override
     public GraphWriter create(int clusterHint, Resource type) {
-               
-               create(type);           
+               create(type);
        clusterHints.put(current, clusterHint);
         return this;
         
@@ -432,7 +392,7 @@ public class DelayedGraphWriter extends AbstractDelayedGraphWriter {
                return this;
        }
 
-       public GraphWriter flush() {       
+       public GraphWriter flush() {
         try {
             s.writeByte(2);
         } catch(IOException e) {