Merge branch 'anbangx/fullstack_genomix' into genomix/fullstack_genomix
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java
index 4ce14cc..f61cb6f 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/data/Marshal.java
@@ -14,16 +14,24 @@
  */
 package edu.uci.ics.genomix.data;
 
+import java.nio.ByteBuffer;
+
 public class Marshal {
     public static int getInt(byte[] bytes, int offset) {
         return ((bytes[offset] & 0xff) << 24) + ((bytes[offset + 1] & 0xff) << 16) + ((bytes[offset + 2] & 0xff) << 8)
                 + ((bytes[offset + 3] & 0xff) << 0);
     }
     
-    public static long getLong(byte[] bytes, int offset) {
-        return ((bytes[offset] & 0xff) << 54) + ((bytes[offset] & 0xff) << 48) + ((bytes[offset + 1] & 0xff) << 40) 
-                + ((bytes[offset + 2] & 0xff) << 32) + ((bytes[offset] & 0xff) << 24) + ((bytes[offset + 1] & 0xff) << 16) 
-                + ((bytes[offset + 2] & 0xff) << 8) + ((bytes[offset + 3] & 0xff) << 0);
+    public static long getLong(byte[] bytes, int offset) {   
+        long value = 0;
+        for (int i = offset; i < bytes.length && i < offset + 8; i++)
+        {
+           value = (value << 8) + (bytes[i] & 0xff);
+        }
+        return value;
+//        return ((bytes[offset] & 0xff) << 56) + ((bytes[offset + 1] & 0xff) << 48) + ((bytes[offset + 2] & 0xff) << 40) 
+//                + ((bytes[offset + 3] & 0xff) << 32) + ((bytes[offset + 4] & 0xff) << 24) + ((bytes[offset + 5] & 0xff) << 16) 
+//                + ((bytes[offset + 6] & 0xff) << 8) + ((bytes[offset + 7] & 0xff) << 0);
     }
     
     public static void putInt(int val, byte[] bytes, int offset) {
@@ -34,14 +42,16 @@
     }
     
     public static void putLong(long val, byte[] bytes, int offset) {
-        bytes[offset] = (byte)((val >>> 54) & 0xFF);        
-        bytes[offset + 1] = (byte)((val >>> 48) & 0xFF);
-        bytes[offset + 2] = (byte)((val >>>  40) & 0xFF);
-        bytes[offset + 3] = (byte)((val >>>  32) & 0xFF);
-        bytes[offset + 4] = (byte)((val >>>  24) & 0xFF);
-        bytes[offset + 5] = (byte)((val >>>  16) & 0xFF);
-        bytes[offset + 6] = (byte)((val >>>  8) & 0xFF);
-        bytes[offset + 7] = (byte)((val >>>  0) & 0xFF);
+        ByteBuffer byteBuffer = ByteBuffer.allocate(8); 
+        System.arraycopy(byteBuffer.putLong(val).array(), 0, bytes, offset, 8);
+//        bytes[offset] = (byte)((val >>> 56) & 0xFF);        
+//        bytes[offset + 1] = (byte)((val >>> 48) & 0xFF);
+//        bytes[offset + 2] = (byte)((val >>> 40) & 0xFF);
+//        bytes[offset + 3] = (byte)((val >>> 32) & 0xFF);
+//        bytes[offset + 4] = (byte)((val >>> 24) & 0xFF);
+//        bytes[offset + 5] = (byte)((val >>> 16) & 0xFF);
+//        bytes[offset + 6] = (byte)((val >>> 8) & 0xFF);
+//        bytes[offset + 7] = (byte)((val >>> 0) & 0xFF);
     }
     
     public static int hashBytes(byte[] bytes, int offset, int length) {
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
index abc8ff1..c620fa2 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionListWritable.java
@@ -49,7 +49,10 @@
     }
     
     public void append(PositionWritable pos) {
-        append(pos.getUUID());
+        if(pos != null)
+            append(pos.getUUID());
+        else
+            throw new RuntimeException("This position is null pointer!");
     }
     
     /*
diff --git a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
index 7cf9bfc..1e4eed6 100644
--- a/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
+++ b/genomix/genomix-data/src/main/java/edu/uci/ics/genomix/type/PositionWritable.java
@@ -21,17 +21,22 @@
         offset = 0;
     }
     
-    public PositionWritable(long uuid){
+    public PositionWritable(byte mateId, long readId, int posId){
         this();
-        set(uuid);
+        set(mateId, readId, posId);
     }
     
-    public void set(long uuid){
-        Marshal.putLong(uuid, storage, offset);
+    public PositionWritable(byte[] storage, int offset) {
+        setNewReference(storage, offset);
+    }
+    
+    public void set(byte mateId, long readId, int posId){
+        long finalId = (readId << 17) + ((posId & 0xFFFF) << 1) + (mateId & 0b1);
+        Marshal.putLong(finalId, storage, offset);
     }
     
     public void set(PositionWritable pos) {
-        set(pos.getUUID());
+        set(pos.getMateId(),pos.getReadId(),pos.getPosId());
     }
     
     public void setNewReference(byte[] storage, int offset) {
@@ -39,6 +44,18 @@
         this.offset = offset;
     }
     
+    public byte getMateId(){
+        return (byte) (Marshal.getLong(storage, offset) & 0b1);
+    }
+    
+    public long getReadId(){
+        return Marshal.getLong(storage, offset) >> 17;
+    }
+    
+    public int getPosId(){
+        return (int) ((Marshal.getLong(storage, offset) >> 1) & 0xffff);
+    }
+    
     public long getUUID(){
         return Marshal.getLong(storage, offset);
     }
diff --git a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/PositionWritableTest.java b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/PositionWritableTest.java
index cad6ccb..552ec36 100644
--- a/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/PositionWritableTest.java
+++ b/genomix/genomix-data/src/test/java/edu/uci/ics/genomix/data/test/PositionWritableTest.java
@@ -1,35 +1,41 @@
 package edu.uci.ics.genomix.data.test;
-
 import junit.framework.Assert;
 
 import org.junit.Test;
 
 import edu.uci.ics.genomix.data.Marshal;
-import edu.uci.ics.genomix.oldtype.PositionWritable;
+import edu.uci.ics.genomix.type.PositionWritable;
 
 public class PositionWritableTest {
 
     @Test
     public void TestInitial() {
         PositionWritable pos = new PositionWritable();
-        pos = new PositionWritable(3, (byte) 1);
-        Assert.assertEquals(pos.getReadID(), 3);
-        Assert.assertEquals(pos.getPosInRead(), 1);
-
-        byte[] start = new byte[256];
-        for (int i = 0; i < 128; i++) {
-            Marshal.putInt(i, start, i);
-            start[i + PositionWritable.INTBYTES] = (byte) (i / 2);
-            pos = new PositionWritable(start, i);
-            Assert.assertEquals(pos.getReadID(), i);
-            Assert.assertEquals(pos.getPosInRead(), (byte) (i / 2));
-            pos.set(-i, (byte) (i / 4));
-            Assert.assertEquals(pos.getReadID(), -i);
-            Assert.assertEquals(pos.getPosInRead(), (byte) (i / 4));
-            pos.setNewReference(start, i);
-            Assert.assertEquals(pos.getReadID(), -i);
-            Assert.assertEquals(pos.getPosInRead(), (byte) (i / 4));
-
+        PositionWritable pos1 = new PositionWritable();
+        byte mateId;
+        long readId;
+        int posId;
+        byte[] start = new byte[8];
+        for (int i = 0; i < 65535; i++) {
+            mateId = (byte)1;
+            readId = (long)i;
+            posId = i;
+            pos = new PositionWritable(mateId, readId, posId);
+            Assert.assertEquals(pos.getMateId(), mateId);
+            Assert.assertEquals(pos.getReadId(), readId);
+            Assert.assertEquals(pos.getPosId(), posId);
+            
+            long finalId = ((readId + 1) << 17) + ((posId & 0xFFFF) << 1) + (mateId & 0b1);
+            Marshal.putLong(finalId, start, 0);
+            pos1 = new PositionWritable(start, 0);
+            Assert.assertEquals(pos1.getMateId(), mateId);
+            Assert.assertEquals(pos1.getReadId(), readId + 1);
+            Assert.assertEquals(pos1.getPosId(), posId);
+            
+            pos.setNewReference(start, 0);
+            Assert.assertEquals(pos.getMateId(), mateId);
+            Assert.assertEquals(pos.getReadId(), readId + 1);
+            Assert.assertEquals(pos.getPosId(), posId);
         }
     }
 }