Merge: 497958b 68dcaa7
[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.AlignViewport;
9 import jalview.gui.AlignmentPanel;
10 import jalview.gui.FeatureRenderer;
11 import jalview.json.binding.v1.BioJsAlignmentPojo;
12 import jalview.json.binding.v1.BioJsFeaturePojo;
13 import jalview.json.binding.v1.BioJsSeqPojo;
14 import jalview.schemes.ColourSchemeProperty;
15 import jalview.util.MessageManager;
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 AlignViewport 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     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.isVisible(sf.getType()))
151           {
152
153             // TODO: translate graduated/complex colourschemes to biojs model
154             String featureColour = jalview.util.Format.getHexString(fr
155                     .findFeatureColour(Color.white, seq,
156                             seq.findIndex(sf.getBegin())));
157             BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo();
158             bjsFeature.setFillColor(featureColour);
159             bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
160             bjsFeature.setXend(seq.findIndex(sf.getEnd()));
161             bjsFeature.setText(sf.getType());
162             bjsSeqFeatures.add(bjsFeature);
163           }
164         }
165         seqPojo.setFeatures(bjsSeqFeatures);
166       }
167       bjsAlignment.getSeqs().add(seqPojo);
168     }
169
170     return new com.json.JSONObject(bjsAlignment).toString()
171             .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd");
172   }
173
174   public static String getBioJsTemplateAsString(Object currentObj)
175           throws IOException
176   {
177     InputStreamReader isReader = null;
178     BufferedReader buffReader = null;
179     StringBuilder sb = new StringBuilder();
180     URL url = currentObj.getClass().getResource(
181             "/templates/BioJSTemplate.txt");
182     if (url != null)
183     {
184       try
185       {
186         isReader = new InputStreamReader(url.openStream());
187         buffReader = new BufferedReader(isReader);
188         String line;
189         String lineSeparator = System.getProperty("line.separator");
190         while ((line = buffReader.readLine()) != null)
191         {
192           sb.append(line).append(lineSeparator);
193         }
194
195       } catch (Exception ex)
196       {
197         ex.printStackTrace();
198       } finally
199       {
200         if (isReader != null)
201         {
202           isReader.close();
203         }
204
205         if (buffReader != null)
206         {
207           buffReader.close();
208         }
209       }
210     }
211     return sb.toString();
212   }
213
214   public String getGlobalColorScheme()
215   {
216     return globalColorScheme;
217   }
218
219   public void setGlobalColorScheme(String globalColorScheme)
220   {
221     this.globalColorScheme = globalColorScheme;
222   }
223
224 }