From 8ca6f814671463f2a39bec5b602ff7e0c7af63a4 Mon Sep 17 00:00:00 2001
From: Alexandra Kalinova <kalinal1@fit.cvut.cz>
Date: Tue, 12 Dec 2017 18:25:46 +0100
Subject: [PATCH] Added implementation of frontend

---
 src/main/java/edu/cvut/fit/kw/vmm/Main.java   |   4 +-
 .../kw/vmm/backend/SimilarDnaFinderImpl.java  |   7 +-
 .../fit/kw/vmm/frontend/InputPageHandler.java |  23 ++-
 .../kw/vmm/frontend/OutputPageHandler.java    | 186 +++++++++++++++++-
 4 files changed, 201 insertions(+), 19 deletions(-)

diff --git a/src/main/java/edu/cvut/fit/kw/vmm/Main.java b/src/main/java/edu/cvut/fit/kw/vmm/Main.java
index 2ad8681..54cf52c 100644
--- a/src/main/java/edu/cvut/fit/kw/vmm/Main.java
+++ b/src/main/java/edu/cvut/fit/kw/vmm/Main.java
@@ -47,8 +47,8 @@ public class Main {
         //needleTest("I like trains!", "I like Bulánci sleeping!");
         //needleTest("I like pizza!", "Ich mag nudeln!");
         //needleTest("TRALALA", "Ich mag nudeln!");
-    	smithTest("CATAC", "ATCGAA");
-    	smithTest("GGTTGACTA","TGTTACGG");
+    	//smithTest("CATAC", "ATCGAA");
+    	//smithTest("GGTTGACTA","TGTTACGG");
 
         String containerPath = args.length > 0 ? args[0] : DEFAULT_CONTAINER_PATH;
         SequenceContainer container = new FileSequenceContainer(containerPath);
diff --git a/src/main/java/edu/cvut/fit/kw/vmm/backend/SimilarDnaFinderImpl.java b/src/main/java/edu/cvut/fit/kw/vmm/backend/SimilarDnaFinderImpl.java
index 4583470..fc0b665 100644
--- a/src/main/java/edu/cvut/fit/kw/vmm/backend/SimilarDnaFinderImpl.java
+++ b/src/main/java/edu/cvut/fit/kw/vmm/backend/SimilarDnaFinderImpl.java
@@ -55,10 +55,13 @@ public class SimilarDnaFinderImpl implements SimilarDnaFinder {
             String seqString = sequence.getSequence();
             SequenceComparator comparator = null;
             if(alignmentType == AlignmentType.GLOBAL) {
-                //comparator = new NeedlemanWunsch(inputSeqString, seqString);
-            	comparator = new SmithWaterman(inputSeqString, seqString);
+                comparator = new NeedlemanWunsch(inputSeqString, seqString);
                 AlignmentSolution alignment = comparator.solve();
                 similarSequences.tryAdd(inputSequence, sequence, alignment);
+            } else if (alignmentType == AlignmentType.LOCAL) { 
+            	comparator = new SmithWaterman(inputSeqString, seqString);
+            	AlignmentSolution alignment = comparator.solve();
+                similarSequences.tryAdd(inputSequence, sequence, alignment);
             }
         }
         return similarSequences.getList();
diff --git a/src/main/java/edu/cvut/fit/kw/vmm/frontend/InputPageHandler.java b/src/main/java/edu/cvut/fit/kw/vmm/frontend/InputPageHandler.java
index 6aa5f42..7926d2e 100644
--- a/src/main/java/edu/cvut/fit/kw/vmm/frontend/InputPageHandler.java
+++ b/src/main/java/edu/cvut/fit/kw/vmm/frontend/InputPageHandler.java
@@ -1,7 +1,9 @@
 package edu.cvut.fit.kw.vmm.frontend;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.Scanner;
 
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
@@ -13,17 +15,18 @@ public class InputPageHandler implements HttpHandler {
 		System.out.println("InputPage request.");
 		String response =
 				"<html><head><title>Lokalni a globalni zarovnavani DNA sekvenci</title></head>" +
-				"<body><h2>Lokalni a globalni zarovnavani DNA sekvenci</h2><br>" +
+				"<body>" +
+				"<form action=\"../outputs/\" method=\"post\">" +
+				"<h2>Lokalni a globalni zarovnavani DNA sekvenci</h2><br>" +
 				"<label><b>Vyberte zarovnavaci algoritmus: </b></label><br><br>" +
-				"<form action=\"../\" method=\"post\">" +
- 				"&ensp;<label for=\"needlemanwunsch\">NeedlemanWunsch (globalni)<input type=\"radio\" name=\"aligmnenttype\" id=\"needlemanwunsch\" value=\"needlemanwunsch\"></label>&ensp;" +
-				"&ensp;&ensp;<label for=\"smithwaterman\">SmithWaterman (lokalni)<input type=\"radio\" name=\"aligmnenttype\" id=\"smithwaterman\" value=\"smithwaterman\"></label><br><br><br>" +
-				"<label><b>Vlozte vstupni DNA sekvenci ze souboru: </b></label><br><br>" +
-				"<input name=\"myFile\" type=\"file\"><br><br><br>"	+
-				"<label><b>nebo vlozte vstupni sekvence rucne: </b></label><br><br>" +
-                "<label>1. DNA sekvence: <input type=\"text\" name=\"DNA1\"/></label>&ensp;<br><br>" +
-                "<label>2. DNA sekvence: <input type=\"text\" name=\"DNA2\"/> </label>&ensp;<br><br>" +
-                "&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<input type=\"submit\"/>" +
+ 				"&ensp;<label for=\"needlemanwunsch\">NeedlemanWunsch (globalni)<input type=\"radio\" name=\"alignmentType\" id=\"needlemanwunsch\" value=\"needlemanwunsch\"></label>&ensp;" +
+				"&ensp;&ensp;<label for=\"smithwaterman\">SmithWaterman (lokalni)<input type=\"radio\" name=\"alignmentType\" id=\"smithwaterman\" value=\"smithwaterman\"></label><br><br><br>" +
+				
+				"<label><b>Vlozte vstupni DNA sekvenci: </b></label><br><br>" +
+				"&ensp;&ensp;<label><b>ze souboru: </b></label>&ensp;&ensp;&ensp;<input name=\"myFile\" type=\"file\"><br>" +
+				"&ensp;&ensp;&ensp;&ensp;&ensp;&ensp;<label>nebo</label><br>" +
+				"&ensp;&ensp;<label><b>z klavesnice: </b>&ensp;&ensp;&ensp;</label><input name=\"DNA\" type=\"text\"/><br><br><br>" +
+                "&ensp;&ensp;&ensp;<input type=\"submit\"/>" +
                 "</form></body></html>";
         arg0.sendResponseHeaders(200, response.length());
         OutputStream os = arg0.getResponseBody();
diff --git a/src/main/java/edu/cvut/fit/kw/vmm/frontend/OutputPageHandler.java b/src/main/java/edu/cvut/fit/kw/vmm/frontend/OutputPageHandler.java
index 07be8bc..b9c9bce 100644
--- a/src/main/java/edu/cvut/fit/kw/vmm/frontend/OutputPageHandler.java
+++ b/src/main/java/edu/cvut/fit/kw/vmm/frontend/OutputPageHandler.java
@@ -1,16 +1,192 @@
 package edu.cvut.fit.kw.vmm.frontend;
 
+import java.io.File;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
 
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpHandler;
 
+import edu.cvut.fit.kw.vmm.alignment_solution.AlignedSequencePair;
+import edu.cvut.fit.kw.vmm.alignment_solution.AlignmentSolution;
+import edu.cvut.fit.kw.vmm.alignment_solution.StringOperation;
+import edu.cvut.fit.kw.vmm.backend.AlignmentType;
+import edu.cvut.fit.kw.vmm.backend.SimilarDnaFinder;
+import edu.cvut.fit.kw.vmm.backend.SimilarDnaFinderImpl;
+import edu.cvut.fit.kw.vmm.backend.sequence_containers.FileSequenceContainer;
+import edu.cvut.fit.kw.vmm.backend.sequence_containers.SequenceContainer;
+
 public class OutputPageHandler implements HttpHandler {
+	private static final String DEFAULT_CONTAINER_PATH = "." + File.separator + "data";
+	protected String response;
 
-	@Override
 	public void handle(HttpExchange arg0) throws IOException {
-		// TODO Auto-generated method stub
-		
-	}
+		System.out.println("OutputPage request.");
+		response = "";
+        logInputs(arg0);
+        arg0.sendResponseHeaders(200, response.length());
+        OutputStream os = arg0.getResponseBody();
+        os.write(response.getBytes());
+        os.close();
+    }
+    
+    private void logInputs(HttpExchange t) {
+        InputStream inputStream = t.getRequestBody();
+        Scanner s = new Scanner(inputStream);
+        String result = s.hasNext() ? s.next() : "";
+        System.out.println("Pure result: " + result);
+
+        String algnmntType = "---unknown---";
+        String myFile = "---unknown---";
+        String DNA = "---unknown---";
 
-}
+        // Split it
+        String[] params = result.split("&");
+        
+		for(String param : params) {
+            String[] paramParts = param.split("=");
+            if(paramParts.length != 2) {
+                continue; // Something weird
+            }
+            String key = paramParts[0];
+            String value = paramParts[1];
+            if(key.compareTo("alignmentType") == 0) {
+            	algnmntType = value;
+            }
+            else if(key.compareTo("myFile") == 0) {
+                myFile = value;
+            }
+            else if(key.compareTo("DNA") == 0) {
+            	DNA = value;
+            }
+        }
+        
+        String containerPath = DEFAULT_CONTAINER_PATH;
+        SequenceContainer container = new FileSequenceContainer(containerPath);
+        SimilarDnaFinder similarDnaFinder = new SimilarDnaFinderImpl(container);
+        String inputSeq = DNA;
+        List<AlignedSequencePair> kSimilar = null;
+        if(algnmntType.compareTo("needlemanwunsch") == 0) {
+        	kSimilar = similarDnaFinder.findKSimilar(inputSeq, AlignmentType.GLOBAL, 1);
+        } else if (algnmntType.compareTo("smithwaterman") == 0) {
+        	kSimilar = similarDnaFinder.findKSimilar(inputSeq, AlignmentType.LOCAL, 1);
+        }        
+        System.out.println(kSimilar);
+		for(AlignedSequencePair pair : kSimilar) {
+			response += "<html><head></head><body style=\"font-family:monospace\">" + pair.getSecondSequence().getAnimalName() + "<br>";
+            System.out.println("Animal: " + pair.getSecondSequence().getAnimalName());
+            printSolution(pair.getAlignment(), pair.getFirstSequence().getSequence(), pair.getSecondSequence().getSequence());
+            
+            System.out.println(pair.getAlignment().getSimilarity());
+            response += pair.getAlignment().getSimilarity() + "<br>";
+        }
+        
+        if (myFile !="---unknown---" && DNA !="---unknown---" || algnmntType == "---unknown---") {
+        	response += "<html><head></head><body>Takhle by to neslo! Zadejte vstup ze souboru NEBO z klavesnice.</body></html>";
+        } else if (myFile !="---unknown---" || DNA !="---unknown---") {
+        	response += myFile + "     " + algnmntType + "      " + DNA;
+        }
+     
+        System.out.println("Params were:");
+        System.out.println("Alignment type: " + algnmntType);
+        System.out.println("myFile: " + myFile);
+        System.out.println("DNA: " + DNA);  
+    }
+    
+    /**
+     * Example how can printing the solution look like
+     * @param solution solved solution - how to transform the first string into the second one
+     * @param str0 first string
+     * @param str1 second string
+     */
+    private void printSolution(AlignmentSolution solution, String str0, String str1) {
+        List<StringOperation> operations = solution.getOperations();
+        int str0Pointer = solution.getStr0Beginning();
+        int str1Pointer = solution.getStr1Beginning();
+        String res0 = "";
+        String res1 = "";
+        String verticalLines = "";
+        System.out.println("====== Printing solution: ======");
+        System.out.println(str0);
+        System.out.println(str1);
+        // PRINT THE PART BEFORE ALIGNED SEQUENCE
+        for(int i = 0; i < Integer.min(str0Pointer, str1Pointer); i++) {
+            res0 += str0.charAt(i);
+            res1 += str1.charAt(i);
+            verticalLines += ".";
+        }
+        for(int i = Integer.min(str0Pointer, str1Pointer); i < str0Pointer; i++) {
+            res0 += str0.charAt(i);
+            res1 += "-";
+            verticalLines += ".";
+        }
+        for(int i = Integer.min(str0Pointer, str1Pointer); i < str1Pointer; i++) {
+            res0 += "-";
+            res1 += str1.charAt(i);
+            verticalLines += ".";
+        }
+        // ACTUAL ALIGNED SEQUENCE
+        for(StringOperation operation:operations) {
+            switch (operation) {
+                case COPY:
+                    res0 += str0.charAt(str0Pointer);
+                    res1 += str1.charAt(str1Pointer);
+                    verticalLines += "|";
+                    str0Pointer++;
+                    str1Pointer++;
+                    break;
+                case REPLACE:
+                    res0 += str0.charAt(str0Pointer);
+                    res1 += str1.charAt(str1Pointer);
+                    verticalLines += ".";
+                    str0Pointer++;
+                    str1Pointer++;
+                    break;
+                case ADD:
+                    res0 += "-";
+                    res1 += str1.charAt(str1Pointer);
+                    verticalLines += ".";
+                    str1Pointer++;
+                    break;
+                case DELETE:
+                    res0 += str0.charAt(str0Pointer);
+                    res1 += "-";
+                    verticalLines += ".";
+                    str0Pointer++;
+            }
+        }
+        // PRINT THE PART AFTER ALIGNED SEQUENCE
+        while(str0Pointer < str0.length() && str1Pointer < str1.length()) {
+            res0 += str0.charAt(str0Pointer);
+            res1 += str1.charAt(str1Pointer);
+            verticalLines += ".";
+            str0Pointer++;
+            str1Pointer++;
+        }
+        while(str0Pointer < str0.length()) {
+            res0 += str0.charAt(str0Pointer);
+            res1 += "-";
+            verticalLines += ".";
+            str0Pointer++;
+        }
+        while(str1Pointer < str1.length()) {
+            res0 += "-";
+            res1 += str1.charAt(str1Pointer);
+            verticalLines += ".";
+            str1Pointer++;
+        }
+        // PRINT IT TO STDOUT
+        
+        response += res0 + "<br>";
+        response += verticalLines + "<br>";
+        response += res1 + "<br>";
+        
+        System.out.println(res0);
+        System.out.println(verticalLines);
+        System.out.println(res1);
+    }
+}
\ No newline at end of file
-- 
GitLab