House keeping
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceFeature;
5 import jalview.datamodel.SequenceI;
6 import jalview.exceptions.NoFileSelectedException;
7 import jalview.gui.AlignViewport;
8 import jalview.gui.AlignmentPanel;
9 import jalview.gui.FeatureRenderer;
10 import jalview.json.binding.v1.BioJsAlignmentPojo;
11 import jalview.json.binding.v1.BioJsFeaturePojo;
12 import jalview.json.binding.v1.BioJsSeqPojo;
13 import jalview.schemes.ColourSchemeProperty;
14 import jalview.util.MessageManager;
15
16 import java.io.BufferedReader;
17 import java.io.IOException;
18 import java.io.InputStreamReader;
19 import java.io.PrintWriter;
20 import java.net.URL;
21 import java.util.ArrayList;
22 import java.util.Hashtable;
23
24 import com.json.JSONException;
25
26 public class BioJsHTMLOutput
27 {
28   private AlignViewport av;
29
30   private FeatureRenderer fr;
31
32   private String globalColorScheme;
33
34   private Hashtable displayedFeatures;
35
36   private String jalviewVersion;
37
38   private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
39
40   public BioJsHTMLOutput(AlignmentPanel ap,
41           FeatureRenderer fr1)
42   {
43
44     jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
45     webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
46             "www.jalview.org", "http://www.jalview.org")
47             + "/services/launchApp";
48     if (ap != null)
49     {
50       this.av = ap.av;
51       this.globalColorScheme = ColourSchemeProperty.getColourName(av
52               .getGlobalColourScheme());
53       this.fr = new FeatureRenderer(ap);
54     fr.transferSettings(fr1);
55       displayedFeatures = av.getFeaturesDisplayed();
56
57     exportJalviewAlignmentAsBioJsHtmlFile();
58   }
59   }
60
61   private void exportJalviewAlignmentAsBioJsHtmlFile()
62   {
63     try
64     {
65       String outputFile = getOutputFile();
66       String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av
67               .getAlignment());
68       String bioJSTemplateString = getBioJsTemplateAsString(this);
69       String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString
70               .replaceAll(
71 "#sequenceData#", jalviewAlignmentJson)
72               .toString();
73
74       PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
75               outputFile));
76       out.print(generatedBioJsWithJalviewAlignmentAsJson);
77       out.flush();
78       out.close();
79       jalview.util.BrowserLauncher.openURL("file:///" + outputFile);
80     } catch (NoFileSelectedException ex)
81     {
82       // do noting if no file was selected
83     } catch (Exception e)
84     {
85       e.printStackTrace();
86     }
87   }
88
89   public String getOutputFile() throws NoFileSelectedException
90   {
91     String selectedFile = null;
92     JalviewFileChooser jvFileChooser = new JalviewFileChooser(
93             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
94             { "html" }, new String[]
95             { "HTML files" }, "HTML files");
96     jvFileChooser.setFileView(new JalviewFileView());
97
98     // TODO uncomment when supported by MassageManager
99     jvFileChooser.setDialogTitle(MessageManager
100             .getString("label.save_as_biojs_html"));
101     jvFileChooser.setDialogTitle("save as BioJs HTML");
102     jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
103
104     int fileChooserOpt = jvFileChooser.showSaveDialog(null);
105     if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
106     {
107       jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
108               .getSelectedFile().getParent());
109       selectedFile = jvFileChooser.getSelectedFile().getPath();
110     }
111     else
112     {
113       throw new NoFileSelectedException("No file was selected.");
114     }
115
116     return selectedFile;
117   }
118
119   public String getJalviewAlignmentAsJsonString(AlignmentI alignment)
120           throws IOException, JSONException
121   {
122     BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo();
123
124     bjsAlignment.setGlobalColorScheme(getGlobalColorScheme());
125     bjsAlignment.setJalviewVersion(jalviewVersion);
126     bjsAlignment.setWebStartUrl(webStartLaunchServletUrl);
127
128     int count = 0;
129     for (SequenceI seq : alignment.getSequences())
130     {
131       StringBuilder name = new StringBuilder();
132       name.append(seq.getName()).append("/").append(seq.getStart())
133               .append("-").append(seq.getEnd());
134
135       BioJsSeqPojo seqPojo = new BioJsSeqPojo();
136       seqPojo.setId(String.valueOf(++count));
137       seqPojo.setEnd(seq.getEnd());
138       seqPojo.setStart(seq.getStart());
139       seqPojo.setName(name.toString());
140       seqPojo.setSeq(seq.getSequenceAsString());
141
142       SequenceFeature[] seqFeatures = seq.getDatasetSequence()
143               .getSequenceFeatures();
144       if (seqFeatures != null)
145       {
146         ArrayList<BioJsFeaturePojo> bjsSeqFeatures = new ArrayList<BioJsFeaturePojo>();
147         for (SequenceFeature sf : seqFeatures)
148         {
149           if (displayedFeatures != null
150                   && displayedFeatures.get(sf.getType()) != null)
151           {
152             String featureColour = jalview.util.Format.getHexString(fr
153                     .getColour(sf));
154             BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo();
155             bjsFeature.setFillColor(featureColour);
156             bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
157             bjsFeature.setXend(seq.findIndex(sf.getEnd()));
158             bjsFeature.setText(sf.getType());
159             bjsSeqFeatures.add(bjsFeature);
160           }
161         }
162         seqPojo.setFeatures(bjsSeqFeatures);
163       }
164       bjsAlignment.getSeqs().add(seqPojo);
165     }
166
167     return new com.json.JSONObject(bjsAlignment).toString()
168             .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd");
169   }
170
171   public static String getBioJsTemplateAsString(Object currentObj)
172           throws IOException
173   {
174     InputStreamReader isReader = null;
175     BufferedReader buffReader = null;
176     StringBuilder sb = new StringBuilder();
177     URL url = currentObj.getClass().getResource(
178             "/templates/BioJSTemplate.txt");
179     if (url != null)
180     {
181       try
182       {
183         isReader = new InputStreamReader(url.openStream());
184         buffReader = new BufferedReader(isReader);
185         String line;
186         String lineSeparator = System.getProperty("line.separator");
187         while ((line = buffReader.readLine()) != null)
188         {
189           sb.append(line).append(lineSeparator);
190         }
191
192       } catch (Exception ex)
193       {
194         ex.printStackTrace();
195       } finally
196       {
197         if (isReader != null)
198         {
199           isReader.close();
200         }
201
202         if (buffReader != null)
203         {
204           buffReader.close();
205         }
206       }
207     }
208     return sb.toString();
209   }
210
211   public String getGlobalColorScheme()
212   {
213     return globalColorScheme;
214   }
215
216   public void setGlobalColorScheme(String globalColorScheme)
217   {
218     this.globalColorScheme = globalColorScheme;
219   }
220
221 }