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;
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;
23 import java.util.ArrayList;
25 import com.json.JSONException;
27 public class BioJsHTMLOutput
29 private AlignmentViewport av;
31 private jalview.api.FeatureRenderer fr;
33 private String globalColorScheme;
35 private FeaturesDisplayedI displayedFeatures;
37 private String jalviewVersion;
39 private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
41 public BioJsHTMLOutput(AlignmentPanel ap,
45 jalviewVersion = jalview.bin.Cache.getProperty("VERSION");
46 webStartLaunchServletUrl = jalview.bin.Cache.getDefault(
47 "www.jalview.org", "http://www.jalview.org")
48 + "/services/launchApp";
52 this.globalColorScheme = ColourSchemeProperty.getColourName(av
53 .getGlobalColourScheme());
54 this.fr = ap.cloneFeatureRenderer();
55 displayedFeatures = av.getFeaturesDisplayed();
59 private void exportJalviewAlignmentAsBioJsHtmlFile()
63 String outputFile = getOutputFile();
64 String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av
66 String bioJSTemplateString = getBioJsTemplateAsString(this);
67 String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString
69 "#sequenceData#", jalviewAlignmentJson)
72 PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
74 out.print(generatedBioJsWithJalviewAlignmentAsJson);
77 jalview.util.BrowserLauncher.openURL("file:///" + outputFile);
78 } catch (NoFileSelectedException ex)
80 // do noting if no file was selected
87 public String getOutputFile() throws NoFileSelectedException
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());
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"));
102 int fileChooserOpt = jvFileChooser.showSaveDialog(null);
103 if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
105 jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
106 .getSelectedFile().getParent());
107 selectedFile = jvFileChooser.getSelectedFile().getPath();
111 throw new NoFileSelectedException("No file was selected.");
117 public String getJalviewAlignmentAsJsonString(AlignmentI alignment)
118 throws IOException, JSONException
120 AlignmentPojo bjsAlignment = new AlignmentPojo();
122 // bjsAlignment.setGlobalColorScheme(getGlobalColorScheme());
123 // bjsAlignment.setJalviewVersion(jalviewVersion);
124 // bjsAlignment.setWebStartUrl(webStartLaunchServletUrl);
127 for (SequenceI seq : alignment.getSequences())
129 StringBuilder name = new StringBuilder();
130 name.append(seq.getName()).append("/").append(seq.getStart())
131 .append("-").append(seq.getEnd());
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());
140 SequenceFeature[] seqFeatures = seq.getSequenceFeatures();
141 if (seqFeatures != null)
143 ArrayList<SequenceFeaturesPojo> bjsSeqFeatures = new ArrayList<SequenceFeaturesPojo>();
144 for (SequenceFeature sf : seqFeatures)
146 if (displayedFeatures != null
147 && displayedFeatures.isVisible(sf.getType()))
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);
162 // seqPojo.setFeatures(bjsSeqFeatures);
164 bjsAlignment.getSeqs().add(seqPojo);
167 return new com.json.JSONObject(bjsAlignment).toString()
168 .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd");
171 public static String getBioJsTemplateAsString(Object currentObj)
174 InputStreamReader isReader = null;
175 BufferedReader buffReader = null;
176 StringBuilder sb = new StringBuilder();
177 URL url = currentObj.getClass().getResource(
178 "/templates/BioJSTemplate.txt");
183 isReader = new InputStreamReader(url.openStream());
184 buffReader = new BufferedReader(isReader);
186 String lineSeparator = System.getProperty("line.separator");
187 while ((line = buffReader.readLine()) != null)
189 sb.append(line).append(lineSeparator);
192 } catch (Exception ex)
194 ex.printStackTrace();
197 if (isReader != null)
202 if (buffReader != null)
208 return sb.toString();
211 public String getGlobalColorScheme()
213 return globalColorScheme;
216 public void setGlobalColorScheme(String globalColorScheme)
218 this.globalColorScheme = globalColorScheme;