JAL-1541 upadated BioJs emmitter to store alignment data as json
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import static java.nio.file.Files.readAllBytes;
4 import static java.nio.file.Paths.get;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.SequenceI;
7 import jalview.gui.AlignViewport;
8 import jalview.gui.AlignmentPanel;
9 import jalview.gui.FeatureRenderer;
10 import jalview.gui.SequenceRenderer;
11 import jalview.json.binding.v1.BioJsAlignmentPojo;
12 import jalview.json.binding.v1.BioJsSeqPojo;
13 import jalview.util.MessageManager;
14
15 import java.io.IOException;
16 import java.io.PrintWriter;
17
18 import org.jsoup.Jsoup;
19 import org.jsoup.nodes.Document;
20 import org.jsoup.nodes.Element;
21
22 import com.json.JSONException;
23 import com.json.JSONObject;
24
25 public class BioJsHTMLOutput
26 {
27   private AlignViewport av;
28   private FeatureRenderer fr;
29
30   public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr,
31           FeatureRenderer fr1)
32   {
33     this.av = ap.av;
34
35     this.fr = new FeatureRenderer(ap);
36     fr.transferSettings(fr1);
37     exportAsBioJsHtml();
38   }
39
40   private void exportAsBioJsHtml()
41   {
42     try
43     {
44       JalviewFileChooser jvFileChooser = getJalviewFileChooserOption();
45       int fileChooserOpt = jvFileChooser.showSaveDialog(null);
46       if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
47       {
48         jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
49                 .getSelectedFile().getParent());
50         String selectedFile = jvFileChooser.getSelectedFile().getPath();
51         String generartedBioJs = generateBioJsAlignmentData(av
52                 .getAlignment());
53         PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
54                 selectedFile));
55         out.print(generartedBioJs);
56         out.close();
57         jalview.util.BrowserLauncher.openURL("file:///" + selectedFile);
58       }
59     } catch (Exception ex)
60     {
61       ex.printStackTrace();
62     }
63   }
64
65   private JalviewFileChooser getJalviewFileChooserOption()
66   {
67     JalviewFileChooser chooser = new JalviewFileChooser(
68             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
69             { "html" }, new String[]
70             { "HTML files" }, "HTML files");
71
72     chooser.setFileView(new JalviewFileView());
73     // TODO uncomment when supported by MassageManager
74     // chooser.setDialogTitle(MessageManager.getString("label.save_as_biojs_html"));
75     chooser.setDialogTitle("save as BioJs HTML");
76     chooser.setToolTipText(MessageManager.getString("action.save"));
77
78     return chooser;
79   }
80
81   private String generateBioJsAlignmentData(AlignmentI alignment)
82           throws IOException, JSONException
83   {
84     BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo();
85
86     int count = 0;
87     for (SequenceI seq : alignment.getSequences())
88     {
89       bjsAlignment.getSeqs().add(
90               new BioJsSeqPojo(String.valueOf(++count), seq.getName(), seq
91                       .getSequenceAsString()));
92     }
93
94     String seqs = new JSONObject(bjsAlignment).getString("seqs");
95     String bioJSTemplate = new String(
96             readAllBytes(get("resources/templates/BioJSTemplate.txt")));
97
98     return bioJSTemplate.replaceAll("#sequenceData#", seqs);
99   }
100
101   public static void main(String[] args) throws IOException
102   {
103     Document doc = Jsoup.parse(new String(
104             readAllBytes(get("resources/templates/BioJSTemplate.txt"))));
105
106     Element content = doc.getElementById("seqData");
107     System.out.println(content.val());
108   }
109
110 }
111