JAL-1641 cherry-picked changes into develop compatible branch
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import jalview.api.FeaturesDisplayedI;
4 import jalview.datamodel.AlignmentI;
5 import jalview.datamodel.SequenceFeature;
6 import jalview.datamodel.SequenceI;
7 import jalview.exceptions.NoFileSelectedException;
8 import jalview.gui.AlignmentPanel;
9 import jalview.gui.FeatureRenderer;
10 import jalview.json.binding.v1.AlignmentPojo;
11 import jalview.json.binding.v1.SequenceFeaturesPojo;
12 import jalview.json.binding.v1.SequencePojo;
13 import jalview.schemes.ColourSchemeProperty;
14 import jalview.util.MessageManager;
15 import jalview.viewmodel.AlignmentViewport;
16
17 import java.awt.Color;
18 import java.io.BufferedReader;
19 import java.io.IOException;
20 import java.io.InputStreamReader;
21 import java.io.PrintWriter;
22 import java.net.URL;
23 import java.util.ArrayList;
24
25 import com.json.JSONException;
26
27 public class BioJsHTMLOutput
28 {
29   private AlignmentViewport av;
30
31   private jalview.api.FeatureRenderer fr;
32
33   private String globalColorScheme;
34
35   private FeaturesDisplayedI displayedFeatures;
36
37   private String jalviewVersion;
38
39   private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
40
41   public BioJsHTMLOutput(AlignmentPanel ap,
42           FeatureRenderer fr1)
43   {
44
45     jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
46     webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
47             "www.jalview.org", "http://www.jalview.org")
48             + "/services/launchApp";
49     if (ap != null)
50     {
51       this.av = ap.av;
52       this.globalColorScheme = ColourSchemeProperty.getColourName(av
53               .getGlobalColourScheme());
54       this.fr = ap.cloneFeatureRenderer();
55       displayedFeatures = av.getFeaturesDisplayed();
56     }
57   }
58
59   private void exportJalviewAlignmentAsBioJsHtmlFile()
60   {
61     try
62     {
63       String outputFile = getOutputFile();
64       String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av
65               .getAlignment());
66       String bioJSTemplateString = getBioJsTemplateAsString(this);
67       String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString
68               .replaceAll(
69 "#sequenceData#", jalviewAlignmentJson)
70               .toString();
71
72       PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
73               outputFile));
74       out.print(generatedBioJsWithJalviewAlignmentAsJson);
75       out.flush();
76       out.close();
77       jalview.util.BrowserLauncher.openURL("file:///" + outputFile);
78     } catch (NoFileSelectedException ex)
79     {
80       // do noting if no file was selected
81     } catch (Exception e)
82     {
83       e.printStackTrace();
84     }
85   }
86
87   public String getOutputFile() throws NoFileSelectedException
88   {
89     String selectedFile = null;
90     JalviewFileChooser jvFileChooser = new JalviewFileChooser(
91             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
92             { "html" }, new String[]
93             { "HTML files" }, "HTML files");
94     jvFileChooser.setFileView(new JalviewFileView());
95
96     // TODO uncomment when supported by MassageManager
97     jvFileChooser.setDialogTitle(MessageManager
98             .getString("label.save_as_biojs_html"));
99     jvFileChooser.setDialogTitle("save as BioJs HTML");
100     jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
101
102     int fileChooserOpt = jvFileChooser.showSaveDialog(null);
103     if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
104     {
105       jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
106               .getSelectedFile().getParent());
107       selectedFile = jvFileChooser.getSelectedFile().getPath();
108     }
109     else
110     {
111       throw new NoFileSelectedException("No file was selected.");
112     }
113
114     return selectedFile;
115   }
116
117   public String getJalviewAlignmentAsJsonString(AlignmentI alignment)
118           throws IOException, JSONException
119   {
120     AlignmentPojo bjsAlignment = new AlignmentPojo();
121
122     // bjsAlignment.setGlobalColorScheme(getGlobalColorScheme());
123     // bjsAlignment.setJalviewVersion(jalviewVersion);
124     // bjsAlignment.setWebStartUrl(webStartLaunchServletUrl);
125
126     int count = 0;
127     for (SequenceI seq : alignment.getSequences())
128     {
129       StringBuilder name = new StringBuilder();
130       name.append(seq.getName()).append("/").append(seq.getStart())
131               .append("-").append(seq.getEnd());
132
133       SequencePojo seqPojo = new SequencePojo();
134       seqPojo.setId(String.valueOf(++count));
135       seqPojo.setEnd(seq.getEnd());
136       seqPojo.setStart(seq.getStart());
137       seqPojo.setName(name.toString());
138       seqPojo.setSeq(seq.getSequenceAsString());
139
140       SequenceFeature[] seqFeatures = seq.getSequenceFeatures();
141       if (seqFeatures != null)
142       {
143         ArrayList<SequenceFeaturesPojo> bjsSeqFeatures = new ArrayList<SequenceFeaturesPojo>();
144         for (SequenceFeature sf : seqFeatures)
145         {
146           if (displayedFeatures != null
147                   && displayedFeatures.isVisible(sf.getType()))
148           {
149
150             // TODO: translate graduated/complex colourschemes to biojs model
151             String featureColour = jalview.util.Format.getHexString(fr
152                     .findFeatureColour(Color.white, seq,
153                             seq.findIndex(sf.getBegin())));
154             // SequenceFeaturesPojo bjsFeature = new SequenceFeaturesPojo();
155             // bjsFeature.setFillColor(featureColour);
156             // bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
157             // bjsFeature.setXend(seq.findIndex(sf.getEnd()));
158             // bjsFeature.setType(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 }