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 2ad86810d9a6bb35b57050e48f038377c6ef64dd..54cf52c18db3ba0e2b0423b26e3f6fe48ce789e3 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 4583470452db7814b283a70fbc23f47b3b21e76b..fc0b665d1ce1025ddbb2b3aabb364cb1ab6c29e8 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 6aa5f42642297c1237dc06d84ab61bb13c8e5810..7926d2ed51c1472fc45e19aefb792dcd96f5d6e3 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\">" + - " <label for=\"needlemanwunsch\">NeedlemanWunsch (globalni)<input type=\"radio\" name=\"aligmnenttype\" id=\"needlemanwunsch\" value=\"needlemanwunsch\"></label> " + - "  <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> <br><br>" + - "<label>2. DNA sekvence: <input type=\"text\" name=\"DNA2\"/> </label> <br><br>" + - "            <input type=\"submit\"/>" + + " <label for=\"needlemanwunsch\">NeedlemanWunsch (globalni)<input type=\"radio\" name=\"alignmentType\" id=\"needlemanwunsch\" value=\"needlemanwunsch\"></label> " + + "  <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>" + + "  <label><b>ze souboru: </b></label>   <input name=\"myFile\" type=\"file\"><br>" + + "      <label>nebo</label><br>" + + "  <label><b>z klavesnice: </b>   </label><input name=\"DNA\" type=\"text\"/><br><br><br>" + + "   <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 07be8bcf4f027f75c3ffe3832ccbb6525f23adc4..b9c9bcebc5380d9f6f54e56898a152ddc842ce7c 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