add graph package
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
new file mode 100644
index 0000000..d5f16c2
--- /dev/null
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GenerateGraphViz.java
@@ -0,0 +1,96 @@
+package edu.uci.ics.genomix.hadoop.graph;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.Iterator;
+
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.SequenceFile;
+
+import edu.uci.ics.genomix.type.NodeWritable;
+import edu.uci.ics.genomix.type.VKmerBytesWritable;
+
+public class GenerateGraphViz {
+
+	/**
+     * Construct a DOT graph in memory, convert it
+     * to image and store the image in the file system.
+     */
+    public static void convertGraphBuildingOutputToGraphViz(String srcDir, String destDir) throws Exception {
+        GraphViz gv = new GraphViz();
+        gv.addln(gv.start_graph());
+        
+        Configuration conf = new Configuration();
+        FileSystem fileSys = FileSystem.getLocal(conf);
+        File srcPath = new File(srcDir);
+
+        String outputNode = "";
+        String outputEdge = "";
+        for (File f : srcPath.listFiles((FilenameFilter) (new WildcardFileFilter("part*")))) {
+            SequenceFile.Reader reader = new SequenceFile.Reader(fileSys, new Path(f.getAbsolutePath()), conf);
+            VKmerBytesWritable key = new VKmerBytesWritable();
+            NodeWritable value = new NodeWritable();
+            
+            gv.addln("rankdir=LR\n");
+
+            while (reader.next(key, value)) {
+                outputNode = "";
+                outputEdge = "";
+                if (key == null) {
+                    break;
+                }
+                outputNode += key.toString();
+                /** convert edge to graph **/
+                outputEdge = convertEdgeToGraph(outputNode, value);
+                gv.addln(outputEdge);
+                /** add readIdSet **/
+                outputNode += " [shape=record, label = \"<f0> " + key.toString() 
+                        + "|<f1> " + value.getNodeIdList().printReadIdSet()
+                        + "\"]\n";
+                gv.addln(outputNode);
+            }
+            reader.close();
+        }
+        
+        gv.addln(gv.end_graph());
+        System.out.println(gv.getDotSource());
+
+        String type = "ps";
+        File folder = new File(destDir);
+        folder.mkdirs();
+        File out = new File(destDir + "/result." + type); // Linux
+        gv.writeGraphToFile(gv.getGraph(gv.getDotSource(), type), out);
+    }
+    
+    public static String convertEdgeToGraph(String outputNode, NodeWritable value){
+        String outputEdge = "";
+        Iterator<VKmerBytesWritable> kmerIterator;
+        kmerIterator = value.getFFList().iterator();
+        while(kmerIterator.hasNext()){
+            VKmerBytesWritable edge = kmerIterator.next(); 
+            outputEdge += outputNode + " -> " + edge.toString() + "[color = \"black\" label =\"FF\"]\n";
+        }
+        kmerIterator = value.getFRList().iterator();
+        while(kmerIterator.hasNext()){
+            VKmerBytesWritable edge = kmerIterator.next();
+            outputEdge += outputNode + " -> " + edge.toString() + "[color = \"blue\" label =\"FR\"]\n";
+        }
+        kmerIterator = value.getRFList().iterator();
+        while(kmerIterator.hasNext()){
+            VKmerBytesWritable edge = kmerIterator.next();
+            outputEdge += outputNode + " -> " + edge.toString() + "[color = \"green\" label =\"RF\"]\n";
+        }
+        kmerIterator = value.getRRList().iterator();
+        while(kmerIterator.hasNext()){
+            VKmerBytesWritable edge = kmerIterator.next();
+            outputEdge += outputNode + " -> " + edge.toString() + "[color = \"red\" label =\"RR\"]\n";
+        }
+        //TODO should output actualKmer instead of kmer
+        if(outputEdge == "")
+            outputEdge += outputNode;
+        return outputEdge;
+    }
+}
diff --git a/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphViz.java b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphViz.java
new file mode 100644
index 0000000..ec22f80
--- /dev/null
+++ b/genomix/genomix-hadoop/src/main/java/edu/uci/ics/genomix/hadoop/graph/GraphViz.java
@@ -0,0 +1,297 @@
+package edu.uci.ics.genomix.hadoop.graph;

+

+// GraphViz.java - a simple API to call dot from Java programs

+

+/*$Id$*/

+/*

+ ******************************************************************************

+ *                                                                            *

+ *              (c) Copyright 2003 Laszlo Szathmary                           *

+ *                                                                            *

+ * This program is free software; you can redistribute it and/or modify it    *

+ * under the terms of the GNU Lesser General Public License as published by   *

+ * the Free Software Foundation; either version 2.1 of the License, or        *

+ * (at your option) any later version.                                        *

+ *                                                                            *

+ * This program is distributed in the hope that it will be useful, but        *

+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *

+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public    *

+ * License for more details.                                                  *

+ *                                                                            *

+ * You should have received a copy of the GNU Lesser General Public License   *

+ * along with this program; if not, write to the Free Software Foundation,    *

+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                              *

+ *                                                                            *

+ ******************************************************************************

+ */

+

+import java.io.BufferedReader;

+import java.io.DataInputStream;

+import java.io.File;

+import java.io.FileInputStream;

+import java.io.FileOutputStream;

+import java.io.FileWriter;

+import java.io.InputStreamReader;

+

+/**

+ * <dl>

+ * <dt>Purpose: GraphViz Java API

+ * <dd>

+ * <dt>Description:

+ * <dd>With this Java class you can simply call dot from your Java programs

+ * <dt>Example usage:

+ * <dd>

+ * 

+ * <pre>

+ * GraphViz gv = new GraphViz();

+ * gv.addln(gv.start_graph());

+ * gv.addln(&quot;A -&gt; B;&quot;);

+ * gv.addln(&quot;A -&gt; C;&quot;);

+ * gv.addln(gv.end_graph());

+ * System.out.println(gv.getDotSource());

+ * 

+ * String type = &quot;gif&quot;;

+ * File out = new File(&quot;out.&quot; + type); // out.gif in this example

+ * gv.writeGraphToFile(gv.getGraph(gv.getDotSource(), type), out);

+ * </pre>

+ * 

+ * </dd>

+ * </dl>

+ * 

+ * @version v0.4, 2011/02/05 (February) -- Patch of Keheliya Gallaba is added. Now you

+ *          can specify the type of the output file: gif, dot, fig, pdf, ps, svg, png, etc.

+ * @version v0.3, 2010/11/29 (November) -- Windows support + ability

+ *          to read the graph from a text file

+ * @version v0.2, 2010/07/22 (July) -- bug fix

+ * @version v0.1, 2003/12/04 (December) -- first release

+ * @author Laszlo Szathmary (<a href="jabba.laci@gmail.com">jabba.laci@gmail.com</a>)

+ */

+public class GraphViz {

+    /**

+     * The dir. where temporary files will be created.

+     */

+    private static String TEMP_DIR = "/tmp"; // Linux

+    //  private static String TEMP_DIR = "c:/temp";	// Windows

+

+    /**

+     * Where is your dot program located? It will be called externally.

+     */

+    private static String DOT = "/usr/bin/dot"; // Linux

+    //   private static String DOT = "c:/Program Files/Graphviz2.26.3/bin/dot.exe";	// Windows

+

+    /**

+     * The source of the graph written in dot language.

+     */

+    private StringBuilder graph = new StringBuilder();

+

+    /**

+     * Constructor: creates a new GraphViz object that will contain

+     * a graph.

+     */

+    public GraphViz() {

+    }

+

+    /**

+     * Returns the graph's source description in dot language.

+     * 

+     * @return Source of the graph in dot language.

+     */

+    public String getDotSource() {

+        return graph.toString();

+    }

+

+    /**

+     * Adds a string to the graph's source (without newline).

+     */

+    public void add(String line) {

+        graph.append(line);

+    }

+

+    /**

+     * Adds a string to the graph's source (with newline).

+     */

+    public void addln(String line) {

+        graph.append(line + "\n");

+    }

+

+    /**

+     * Adds a newline to the graph's source.

+     */

+    public void addln() {

+        graph.append('\n');

+    }

+

+    /**

+     * Returns the graph as an image in binary format.

+     * 

+     * @param dot_source

+     *            Source of the graph to be drawn.

+     * @param type

+     *            Type of the output image to be produced, e.g.: gif, dot, fig, pdf, ps, svg, png.

+     * @return A byte array containing the image of the graph.

+     */

+    public byte[] getGraph(String dot_source, String type) {

+        File dot;

+        byte[] img_stream = null;

+

+        try {

+            dot = writeDotSourceToFile(dot_source);

+            if (dot != null) {

+                img_stream = get_img_stream(dot, type);

+                if (dot.delete() == false)

+                    System.err.println("Warning: " + dot.getAbsolutePath() + " could not be deleted!");

+                return img_stream;

+            }

+            return null;

+        } catch (java.io.IOException ioe) {

+            return null;

+        }

+    }

+

+    /**

+     * Writes the graph's image in a file.

+     * 

+     * @param img

+     *            A byte array containing the image of the graph.

+     * @param file

+     *            Name of the file to where we want to write.

+     * @return Success: 1, Failure: -1

+     */

+    public int writeGraphToFile(byte[] img, String file) {

+        File to = new File(file);

+        return writeGraphToFile(img, to);

+    }

+

+    /**

+     * Writes the graph's image in a file.

+     * 

+     * @param img

+     *            A byte array containing the image of the graph.

+     * @param to

+     *            A File object to where we want to write.

+     * @return Success: 1, Failure: -1

+     */

+    public int writeGraphToFile(byte[] img, File to) {

+        try {

+            FileOutputStream fos = new FileOutputStream(to);

+            fos.write(img);

+            fos.close();

+        } catch (java.io.IOException ioe) {

+            return -1;

+        }

+        return 1;

+    }

+

+    /**

+     * It will call the external dot program, and return the image in

+     * binary format.

+     * 

+     * @param dot

+     *            Source of the graph (in dot language).

+     * @param type

+     *            Type of the output image to be produced, e.g.: gif, dot, fig, pdf, ps, svg, png.

+     * @return The image of the graph in .gif format.

+     */

+    private byte[] get_img_stream(File dot, String type) {

+        File img;

+        byte[] img_stream = null;

+

+        try {

+            img = File.createTempFile("graph_", "." + type, new File(GraphViz.TEMP_DIR));

+            Runtime rt = Runtime.getRuntime();

+

+            // patch by Mike Chenault

+            String[] args = { DOT, "-T" + type, dot.getAbsolutePath(), "-o", img.getAbsolutePath() };

+            Process p = rt.exec(args);

+

+            p.waitFor();

+

+            FileInputStream in = new FileInputStream(img.getAbsolutePath());

+            img_stream = new byte[in.available()];

+            in.read(img_stream);

+            // Close it if we need to

+            if (in != null)

+                in.close();

+

+            if (img.delete() == false)

+                System.err.println("Warning: " + img.getAbsolutePath() + " could not be deleted!");

+        } catch (java.io.IOException ioe) {

+            System.err.println("Error:    in I/O processing of tempfile in dir " + GraphViz.TEMP_DIR + "\n");

+            System.err.println("       or in calling external command");

+            ioe.printStackTrace();

+        } catch (java.lang.InterruptedException ie) {

+            System.err.println("Error: the execution of the external program was interrupted");

+            ie.printStackTrace();

+        }

+

+        return img_stream;

+    }

+

+    /**

+     * Writes the source of the graph in a file, and returns the written file

+     * as a File object.

+     * 

+     * @param str

+     *            Source of the graph (in dot language).

+     * @return The file (as a File object) that contains the source of the graph.

+     */

+    private File writeDotSourceToFile(String str) throws java.io.IOException {

+        File temp;

+        try {

+            temp = File.createTempFile("graph_", ".dot.tmp", new File(GraphViz.TEMP_DIR));

+            FileWriter fout = new FileWriter(temp);

+            fout.write(str);

+            fout.close();

+        } catch (Exception e) {

+            System.err.println("Error: I/O error while writing the dot source to temp file!");

+            return null;

+        }

+        return temp;

+    }

+

+    /**

+     * Returns a string that is used to start a graph.

+     * 

+     * @return A string to open a graph.

+     */

+    public String start_graph() {

+        return "digraph G {";

+    }

+

+    /**

+     * Returns a string that is used to end a graph.

+     * 

+     * @return A string to close a graph.

+     */

+    public String end_graph() {

+        return "}";

+    }

+

+    /**

+     * Read a DOT graph from a text file.

+     * 

+     * @param input

+     *            Input text file containing the DOT graph

+     *            source.

+     */

+    public void readSource(String input) {

+        StringBuilder sb = new StringBuilder();

+

+        try {

+            FileInputStream fis = new FileInputStream(input);

+            DataInputStream dis = new DataInputStream(fis);

+            BufferedReader br = new BufferedReader(new InputStreamReader(dis));

+            String line;

+            while ((line = br.readLine()) != null) {

+                sb.append(line);

+            }

+            dis.close();

+        } catch (Exception e) {

+            System.err.println("Error: " + e.getMessage());

+        }

+

+        this.graph = sb;

+    }

+

+} // end of class GraphViz

+