]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.common/src/org/simantics/db/common/ByteFileWriter.java
More DB ListenerAdapter abstract to force isDisposed implementation
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / ByteFileWriter.java
index 90d8374eac6644ef742ae79c2d4471ca416de2ed..a870b0150e6b8fe512f6feab114573ee7dfdf586 100644 (file)
-package org.simantics.db.common;\r
-\r
-import java.io.File;\r
-import java.io.FileNotFoundException;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.nio.ByteBuffer;\r
-import java.nio.channels.FileChannel;\r
-\r
-import org.simantics.db.common.utils.Logger;\r
-\r
-final public class ByteFileWriter {\r
-\r
-       public static int BUFFER = 65536;\r
-\r
-    private FileChannel channel;\r
-    private FileOutputStream out;\r
-    \r
-    byte[] bytes = new byte[BUFFER];\r
-    ByteBuffer bb = ByteBuffer.wrap(bytes);\r
-    int byteIndex = 0;\r
-    \r
-    public ByteFileWriter(File file) throws FileNotFoundException {\r
-       out = new FileOutputStream(file);\r
-               channel = out.getChannel();\r
-    }\r
-       \r
-    public void write(short s) {\r
-//     System.err.println("write " + s);\r
-       if(byteIndex < (BUFFER-2)) {\r
-               bytes[byteIndex++] = (byte)(s&0xff);\r
-               bytes[byteIndex++] = (byte)((s>>>8)&0xff);\r
-       } else {\r
-               int has = BUFFER-byteIndex;\r
-               if(has == 0) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)(s&0xff);\r
-               if(has == 1) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((s>>>8)&0xff);\r
-               if(has == 2) writeReset(BUFFER);\r
-       }\r
-    }\r
-\r
-    public void write(int i) {\r
-//     System.err.println("write " + i);\r
-       if(byteIndex < (BUFFER-4)) {\r
-               bytes[byteIndex++] = (byte)(i&0xff);\r
-               bytes[byteIndex++] = (byte)((i>>>8)&0xff);\r
-               bytes[byteIndex++] = (byte)((i>>>16)&0xff);\r
-               bytes[byteIndex++] = (byte)((i>>>24)&0xff);\r
-       } else {\r
-               int has = BUFFER-byteIndex;\r
-               if(has == 0) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)(i&0xff);\r
-               if(has == 1) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((i>>>8)&0xff);\r
-               if(has == 2) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((i>>>16)&0xff);\r
-               if(has == 3) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((i>>>24)&0xff);\r
-               if(has == 4) writeReset(BUFFER);\r
-       }\r
-    }\r
-\r
-    public void write(long l) {\r
-//     System.err.println("write " + l);\r
-       if(byteIndex < (BUFFER-8)) {\r
-               bytes[byteIndex++] = (byte)(l&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>8)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>16)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>24)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>32)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>40)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>48)&0xff);\r
-               bytes[byteIndex++] = (byte)((l>>>56)&0xff);\r
-       } else {\r
-               int has = BUFFER-byteIndex;\r
-               if(has == 0) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)(l&0xff);\r
-               if(has == 1) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>8)&0xff);\r
-               if(has == 2) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>16)&0xff);\r
-               if(has == 3) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>24)&0xff);\r
-               if(has == 4) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>32)&0xff);\r
-               if(has == 5) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>40)&0xff);\r
-               if(has == 6) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>48)&0xff);\r
-               if(has == 7) writeReset(BUFFER);\r
-               bytes[byteIndex++] = (byte)((l>>>56)&0xff);\r
-               if(has == 8) writeReset(BUFFER);\r
-       }\r
-    }\r
-    \r
-       public void write(byte[] data) {\r
-               \r
-               int offset = 0;\r
-               int left = data.length;\r
-               int has = BUFFER-byteIndex;\r
-               \r
-               if(has > left) {\r
-                       \r
-                       System.arraycopy(data, 0, bytes, byteIndex, left);\r
-                       byteIndex += left;\r
-                       \r
-               } else if(has == left) {\r
-\r
-                       System.arraycopy(data, 0, bytes, byteIndex, left);\r
-                       writeReset(BUFFER);\r
-                       \r
-               } else {\r
-\r
-                       System.arraycopy(data, 0, bytes, byteIndex, has);\r
-                       writeReset(BUFFER);\r
-                       left -= has;\r
-                       offset += has;\r
-                       \r
-                       while(left > 0) {\r
-\r
-                               int length = Math.min(left, BUFFER);\r
-                               System.arraycopy(data, offset, bytes, 0, length);\r
-                               offset += length;\r
-                               left -= length;\r
-                               \r
-                               if(length < BUFFER) byteIndex = length;\r
-                               else writeReset(BUFFER);\r
-                               \r
-                       }\r
-                       \r
-               }\r
-               \r
-       }    \r
-    \r
-    public void commit() {\r
-               try {\r
-                       if(byteIndex > 0) writeReset(byteIndex);\r
-                       //channel.force(false);\r
-                       out.close();\r
-               } catch (IOException e) {\r
-                       Logger.defaultLogError(e);\r
-               }\r
-    }\r
-    \r
-    private void writeReset(int size) {\r
-       \r
-       byteIndex = 0;\r
-       bb.position(0);\r
-       bb.limit(size);\r
-       try {\r
-               \r
-               for(int got=0;got < size;) {\r
-                       got += channel.write(bb);\r
-                       if(got == -1) {\r
-                               new Exception().printStackTrace();\r
-                               return;\r
-                       }\r
-               }\r
-               \r
-               } catch (IOException e) {\r
-                       e.printStackTrace();\r
-               }\r
-               \r
-    }\r
-    \r
-}\r
+package org.simantics.db.common;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+import org.simantics.db.common.utils.Logger;
+
+final public class ByteFileWriter {
+
+       public static int BUFFER = 65536;
+
+    private FileChannel channel;
+    private FileOutputStream out;
+    
+    byte[] bytes = new byte[BUFFER];
+    ByteBuffer bb = ByteBuffer.wrap(bytes);
+    int byteIndex = 0;
+    
+    public ByteFileWriter(File file) throws FileNotFoundException {
+       out = new FileOutputStream(file);
+               channel = out.getChannel();
+    }
+       
+    public void write(short s) {
+//     System.err.println("write " + s);
+       if(byteIndex < (BUFFER-2)) {
+               bytes[byteIndex++] = (byte)(s&0xff);
+               bytes[byteIndex++] = (byte)((s>>>8)&0xff);
+       } else {
+               int has = BUFFER-byteIndex;
+               if(has == 0) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)(s&0xff);
+               if(has == 1) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((s>>>8)&0xff);
+               if(has == 2) writeReset(BUFFER);
+       }
+    }
+
+    public void write(int i) {
+//     System.err.println("write " + i);
+       if(byteIndex < (BUFFER-4)) {
+               bytes[byteIndex++] = (byte)(i&0xff);
+               bytes[byteIndex++] = (byte)((i>>>8)&0xff);
+               bytes[byteIndex++] = (byte)((i>>>16)&0xff);
+               bytes[byteIndex++] = (byte)((i>>>24)&0xff);
+       } else {
+               int has = BUFFER-byteIndex;
+               if(has == 0) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)(i&0xff);
+               if(has == 1) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((i>>>8)&0xff);
+               if(has == 2) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((i>>>16)&0xff);
+               if(has == 3) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((i>>>24)&0xff);
+               if(has == 4) writeReset(BUFFER);
+       }
+    }
+
+    public void write(long l) {
+//     System.err.println("write " + l);
+       if(byteIndex < (BUFFER-8)) {
+               bytes[byteIndex++] = (byte)(l&0xff);
+               bytes[byteIndex++] = (byte)((l>>>8)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>16)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>24)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>32)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>40)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>48)&0xff);
+               bytes[byteIndex++] = (byte)((l>>>56)&0xff);
+       } else {
+               int has = BUFFER-byteIndex;
+               if(has == 0) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)(l&0xff);
+               if(has == 1) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>8)&0xff);
+               if(has == 2) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>16)&0xff);
+               if(has == 3) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>24)&0xff);
+               if(has == 4) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>32)&0xff);
+               if(has == 5) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>40)&0xff);
+               if(has == 6) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>48)&0xff);
+               if(has == 7) writeReset(BUFFER);
+               bytes[byteIndex++] = (byte)((l>>>56)&0xff);
+               if(has == 8) writeReset(BUFFER);
+       }
+    }
+    
+       public void write(byte[] data) {
+               
+               int offset = 0;
+               int left = data.length;
+               int has = BUFFER-byteIndex;
+               
+               if(has > left) {
+                       
+                       System.arraycopy(data, 0, bytes, byteIndex, left);
+                       byteIndex += left;
+                       
+               } else if(has == left) {
+
+                       System.arraycopy(data, 0, bytes, byteIndex, left);
+                       writeReset(BUFFER);
+                       
+               } else {
+
+                       System.arraycopy(data, 0, bytes, byteIndex, has);
+                       writeReset(BUFFER);
+                       left -= has;
+                       offset += has;
+                       
+                       while(left > 0) {
+
+                               int length = Math.min(left, BUFFER);
+                               System.arraycopy(data, offset, bytes, 0, length);
+                               offset += length;
+                               left -= length;
+                               
+                               if(length < BUFFER) byteIndex = length;
+                               else writeReset(BUFFER);
+                               
+                       }
+                       
+               }
+               
+       }    
+    
+    public void commit() {
+               try {
+                       if(byteIndex > 0) writeReset(byteIndex);
+                       //channel.force(false);
+                       out.close();
+               } catch (IOException e) {
+                       Logger.defaultLogError(e);
+               }
+    }
+    
+    private void writeReset(int size) {
+       
+       byteIndex = 0;
+       bb.position(0);
+       bb.limit(size);
+       try {
+               
+               for(int got=0;got < size;) {
+                       got += channel.write(bb);
+                       if(got == -1) {
+                               new Exception().printStackTrace();
+                               return;
+                       }
+               }
+               
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+               
+    }
+    
+}