7423e20c1b34d580bb05947ea9e8e182ef6903f7
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceI;
5 import jalview.gui.AlignViewport;
6 import jalview.gui.AlignmentPanel;
7 import jalview.gui.FeatureRenderer;
8 import jalview.gui.SequenceRenderer;
9 import jalview.json.binding.v1.BioJsAlignmentPojo;
10 import jalview.json.binding.v1.BioJsSeqPojo;
11 import jalview.util.MessageManager;
12
13 import java.io.BufferedReader;
14 import java.io.IOException;
15 import java.io.InputStreamReader;
16 import java.io.PrintWriter;
17 import java.net.URL;
18
19 import com.json.JSONException;
20
21 public class BioJsHTMLOutput
22 {
23   private AlignViewport av;
24
25   private FeatureRenderer fr;
26
27   public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr,
28           FeatureRenderer fr1)
29   {
30     this.av = ap.av;
31     this.fr = new FeatureRenderer(ap);
32     fr.transferSettings(fr1);
33     exportAsBioJsHtml();
34   }
35
36   private void exportAsBioJsHtml()
37   {
38     try
39     {
40       JalviewFileChooser jvFileChooser = getJalviewFileChooserOption();
41       int fileChooserOpt = jvFileChooser.showSaveDialog(null);
42       if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
43       {
44         jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
45                 .getSelectedFile().getParent());
46         String selectedFile = jvFileChooser.getSelectedFile().getPath();
47         String generartedBioJs = generateBioJsAlignmentData(av
48                 .getAlignment());
49         PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
50                 selectedFile));
51         out.print(generartedBioJs);
52         out.close();
53         jalview.util.BrowserLauncher.openURL("file:///" + selectedFile);
54       }
55     } catch (Exception ex)
56     {
57       ex.printStackTrace();
58     }
59   }
60
61   private JalviewFileChooser getJalviewFileChooserOption()
62   {
63     JalviewFileChooser chooser = new JalviewFileChooser(
64             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
65             { "html" }, new String[]
66             { "HTML files" }, "HTML files");
67     chooser.setFileView(new JalviewFileView());
68
69     // TODO uncomment when supported by MassageManager
70     chooser.setDialogTitle(MessageManager
71             .getString("label.save_as_biojs_html"));
72     chooser.setDialogTitle("save as BioJs HTML");
73     chooser.setToolTipText(MessageManager.getString("action.save"));
74
75     return chooser;
76   }
77
78   private String generateBioJsAlignmentData(AlignmentI alignment)
79           throws IOException, JSONException
80   {
81     BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo();
82     int count = 0;
83     for (SequenceI seq : alignment.getSequences())
84     {
85       StringBuilder name = new StringBuilder();
86       name.append(seq.getName()).append("/").append(seq.getStart())
87               .append("-").append(seq.getEnd());
88       bjsAlignment.getSeqs().add(
89               new BioJsSeqPojo(String.valueOf(++count), name.toString(),
90                       seq.getSequenceAsString()));
91     }
92
93     String seqs = new com.json.JSONObject(bjsAlignment).getString("seqs");
94     // String bioJSTemplate = new String(
95     // java.nio.file.Files.readAllBytes(java.nio.file.Paths
96     // .get("resources/templates/BioJSTemplate.txt")));
97     String bioJSTemplate = getBioJsTemplateAsString(alignment);
98
99     return bioJSTemplate.replaceAll("#sequenceData#", seqs).replaceAll(
100             "#scheme#", "zappo");
101   }
102
103
104   public static String getBioJsTemplateAsString(AlignmentI bio)
105           throws IOException
106   {
107      StringBuilder sb = new StringBuilder();
108     URL url = bio.getClass().getResource(
109             "/templates/BioJSTemplate.txt");
110     if (url != null)
111     {
112       try
113       {
114         BufferedReader reader = new BufferedReader(new InputStreamReader(
115                 url.openStream()));
116         String line;
117         String lineSeparator = System.getProperty("line.separator");
118         while ((line = reader.readLine()) != null)
119         {
120           sb.append(line).append(lineSeparator);
121         }
122       } catch (Exception ex)
123       {
124         ex.printStackTrace();
125       }
126     }
127
128     return sb.toString();
129   }
130
131 }