JAL-1541 Modified BioJs exporter to take advantage of the abstracted JSONFile export...
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import jalview.exceptions.NoFileSelectedException;
4 import jalview.gui.AlignViewport;
5 import jalview.gui.AlignmentPanel;
6 import jalview.gui.FeatureRenderer;
7 import jalview.util.MessageManager;
8
9 import java.io.BufferedReader;
10 import java.io.IOException;
11 import java.io.InputStreamReader;
12 import java.io.PrintWriter;
13 import java.net.URL;
14
15 public class BioJsHTMLOutput
16 {
17   private AlignViewport av;
18
19
20   public BioJsHTMLOutput(AlignmentPanel ap,
21           FeatureRenderer fr1)
22   {
23
24     if (ap != null)
25     {
26
27       this.av = ap.av;
28       av.setFeatureRenderer(new FeatureRenderer(ap));
29     }
30     exportJalviewAlignmentAsBioJsHtmlFile();
31   }
32
33   private void exportJalviewAlignmentAsBioJsHtmlFile()
34   {
35     try
36     {
37       String outputFile = getOutputFile();
38       String jalviewAlignmentJson = JSONFile.getJSONData(av);
39       String bioJSTemplateString = getBioJsTemplateAsString(this);
40       String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString
41               .replaceAll(
42 "#sequenceData#", jalviewAlignmentJson)
43               .toString();
44
45       PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
46               outputFile));
47       out.print(generatedBioJsWithJalviewAlignmentAsJson);
48       out.flush();
49       out.close();
50       jalview.util.BrowserLauncher.openURL("file:///" + outputFile);
51     } catch (NoFileSelectedException ex)
52     {
53       // do noting if no file was selected
54     } catch (Exception e)
55     {
56       e.printStackTrace();
57     }
58   }
59
60   public String getOutputFile() throws NoFileSelectedException
61   {
62     String selectedFile = null;
63     JalviewFileChooser jvFileChooser = new JalviewFileChooser(
64             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
65             { "html" }, new String[]
66             { "HTML files" }, "HTML files");
67     jvFileChooser.setFileView(new JalviewFileView());
68
69     // TODO uncomment when supported by MassageManager
70     jvFileChooser.setDialogTitle(MessageManager
71             .getString("label.save_as_biojs_html"));
72     jvFileChooser.setDialogTitle("save as BioJs HTML");
73     jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
74
75     int fileChooserOpt = jvFileChooser.showSaveDialog(null);
76     if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
77     {
78       jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
79               .getSelectedFile().getParent());
80       selectedFile = jvFileChooser.getSelectedFile().getPath();
81     }
82     else
83     {
84       throw new NoFileSelectedException("No file was selected.");
85     }
86     return selectedFile;
87   }
88
89
90   public static String getBioJsTemplateAsString(Object currentObj)
91           throws IOException
92   {
93     InputStreamReader isReader = null;
94     BufferedReader buffReader = null;
95     StringBuilder sb = new StringBuilder();
96     URL url = currentObj.getClass().getResource(
97             "/templates/BioJSTemplate.txt");
98     if (url != null)
99     {
100       try
101       {
102         isReader = new InputStreamReader(url.openStream());
103         buffReader = new BufferedReader(isReader);
104         String line;
105         String lineSeparator = System.getProperty("line.separator");
106         while ((line = buffReader.readLine()) != null)
107         {
108           sb.append(line).append(lineSeparator);
109         }
110
111       } catch (Exception ex)
112       {
113         ex.printStackTrace();
114       } finally
115       {
116         if (isReader != null)
117         {
118           isReader.close();
119         }
120
121         if (buffReader != null)
122         {
123           buffReader.close();
124         }
125       }
126     }
127     return sb.toString();
128   }
129 }