package jalview.io; import jalview.api.FeaturesDisplayedI; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.exceptions.NoFileSelectedException; import jalview.gui.AlignmentPanel; import jalview.gui.FeatureRenderer; import jalview.json.binding.v1.AlignmentPojo; import jalview.json.binding.v1.SequenceFeaturesPojo; import jalview.json.binding.v1.SequencePojo; import jalview.schemes.ColourSchemeProperty; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import java.awt.Color; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.util.ArrayList; import com.json.JSONException; public class BioJsHTMLOutput { private AlignmentViewport av; private jalview.api.FeatureRenderer fr; private String globalColorScheme; private FeaturesDisplayedI displayedFeatures; private String jalviewVersion; private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp"; public BioJsHTMLOutput(AlignmentPanel ap, FeatureRenderer fr1) { jalviewVersion = jalview.bin.Cache.getProperty("VERSION"); webStartLaunchServletUrl = jalview.bin.Cache.getDefault( "www.jalview.org", "http://www.jalview.org") + "/services/launchApp"; if (ap != null) { this.av = ap.av; this.globalColorScheme = ColourSchemeProperty.getColourName(av .getGlobalColourScheme()); this.fr = ap.cloneFeatureRenderer(); displayedFeatures = av.getFeaturesDisplayed(); } } private void exportJalviewAlignmentAsBioJsHtmlFile() { try { String outputFile = getOutputFile(); String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av .getAlignment()); String bioJSTemplateString = getBioJsTemplateAsString(this); String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString .replaceAll( "#sequenceData#", jalviewAlignmentJson) .toString(); PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter( outputFile)); out.print(generatedBioJsWithJalviewAlignmentAsJson); out.flush(); out.close(); jalview.util.BrowserLauncher.openURL("file:///" + outputFile); } catch (NoFileSelectedException ex) { // do noting if no file was selected } catch (Exception e) { e.printStackTrace(); } } public String getOutputFile() throws NoFileSelectedException { String selectedFile = null; JalviewFileChooser jvFileChooser = new JalviewFileChooser( jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[] { "html" }, new String[] { "HTML files" }, "HTML files"); jvFileChooser.setFileView(new JalviewFileView()); // TODO uncomment when supported by MassageManager jvFileChooser.setDialogTitle(MessageManager .getString("label.save_as_biojs_html")); jvFileChooser.setDialogTitle("save as BioJs HTML"); jvFileChooser.setToolTipText(MessageManager.getString("action.save")); int fileChooserOpt = jvFileChooser.showSaveDialog(null); if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) { jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser .getSelectedFile().getParent()); selectedFile = jvFileChooser.getSelectedFile().getPath(); } else { throw new NoFileSelectedException("No file was selected."); } return selectedFile; } public String getJalviewAlignmentAsJsonString(AlignmentI alignment) throws IOException, JSONException { AlignmentPojo bjsAlignment = new AlignmentPojo(); // bjsAlignment.setGlobalColorScheme(getGlobalColorScheme()); // bjsAlignment.setJalviewVersion(jalviewVersion); // bjsAlignment.setWebStartUrl(webStartLaunchServletUrl); int count = 0; for (SequenceI seq : alignment.getSequences()) { StringBuilder name = new StringBuilder(); name.append(seq.getName()).append("/").append(seq.getStart()) .append("-").append(seq.getEnd()); SequencePojo seqPojo = new SequencePojo(); seqPojo.setId(String.valueOf(++count)); seqPojo.setEnd(seq.getEnd()); seqPojo.setStart(seq.getStart()); seqPojo.setName(name.toString()); seqPojo.setSeq(seq.getSequenceAsString()); SequenceFeature[] seqFeatures = seq.getSequenceFeatures(); if (seqFeatures != null) { ArrayList bjsSeqFeatures = new ArrayList(); for (SequenceFeature sf : seqFeatures) { if (displayedFeatures != null && displayedFeatures.isVisible(sf.getType())) { // TODO: translate graduated/complex colourschemes to biojs model String featureColour = jalview.util.Format.getHexString(fr .findFeatureColour(Color.white, seq, seq.findIndex(sf.getBegin()))); // SequenceFeaturesPojo bjsFeature = new SequenceFeaturesPojo(); // bjsFeature.setFillColor(featureColour); // bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1); // bjsFeature.setXend(seq.findIndex(sf.getEnd())); // bjsFeature.setType(sf.getType()); // bjsSeqFeatures.add(bjsFeature); } } // seqPojo.setFeatures(bjsSeqFeatures); } bjsAlignment.getSeqs().add(seqPojo); } return new com.json.JSONObject(bjsAlignment).toString() .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd"); } public static String getBioJsTemplateAsString(Object currentObj) throws IOException { InputStreamReader isReader = null; BufferedReader buffReader = null; StringBuilder sb = new StringBuilder(); URL url = currentObj.getClass().getResource( "/templates/BioJSTemplate.txt"); if (url != null) { try { isReader = new InputStreamReader(url.openStream()); buffReader = new BufferedReader(isReader); String line; String lineSeparator = System.getProperty("line.separator"); while ((line = buffReader.readLine()) != null) { sb.append(line).append(lineSeparator); } } catch (Exception ex) { ex.printStackTrace(); } finally { if (isReader != null) { isReader.close(); } if (buffReader != null) { buffReader.close(); } } } return sb.toString(); } public String getGlobalColorScheme() { return globalColorScheme; } public void setGlobalColorScheme(String globalColorScheme) { this.globalColorScheme = globalColorScheme; } }