X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FBioJsHTMLOutput.java;h=c88d8ebe4252a9a8079f5f2137adb0e8178f1491;hb=57738a1f3c19b1c3a00bd3ac5108f8cd0af32f99;hp=2001338ce0bc244cf88df9d18b4cd602df2b5ced;hpb=b13f521553582ef2fbfd7815ae25e23284babdea;p=jalview.git diff --git a/src/jalview/io/BioJsHTMLOutput.java b/src/jalview/io/BioJsHTMLOutput.java index 2001338..c88d8eb 100644 --- a/src/jalview/io/BioJsHTMLOutput.java +++ b/src/jalview/io/BioJsHTMLOutput.java @@ -1,221 +1,279 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ 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.AlignViewport; +import jalview.bin.Cache; import jalview.gui.AlignmentPanel; -import jalview.gui.FeatureRenderer; -import jalview.json.binding.v1.BioJsAlignmentPojo; -import jalview.json.binding.v1.BioJsFeaturePojo; -import jalview.json.binding.v1.BioJsSeqPojo; -import jalview.schemes.ColourSchemeProperty; +import jalview.gui.OOMWarning; +import jalview.json.binding.biojs.BioJSReleasePojo; +import jalview.json.binding.biojs.BioJSRepositoryPojo; import jalview.util.MessageManager; -import java.awt.Color; +import java.io.BufferedInputStream; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.net.URISyntaxException; import java.net.URL; -import java.util.ArrayList; +import java.util.Objects; +import java.util.TreeMap; -import com.json.JSONException; - -public class BioJsHTMLOutput +public class BioJsHTMLOutput extends HTMLOutput { - private AlignViewport av; - - private jalview.api.FeatureRenderer fr; + private static File currentBJSTemplateFile; - private String globalColorScheme; + private static TreeMap bioJsMSAVersions; - private FeaturesDisplayedI displayedFeatures; + public static final String DEFAULT_DIR = System.getProperty("user.home") + + File.separatorChar + ".biojs_templates" + File.separatorChar; - private String jalviewVersion; + public static final String BJS_TEMPLATES_LOCAL_DIRECTORY = Cache + .getDefault("biojs_template_directory", DEFAULT_DIR); - private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp"; + public static final String BJS_TEMPLATE_GIT_REPO = Cache.getDefault( + "biojs_template_git_repo", + "https://raw.githubusercontent.com/jalview/exporter-templates/master/biojs/package.json"); - public BioJsHTMLOutput(AlignmentPanel ap, - FeatureRenderer fr1) + public BioJsHTMLOutput(AlignmentPanel ap) { - - 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(); - } + super(ap, "BioJS MSA"); } - private void exportJalviewAlignmentAsBioJsHtmlFile() + public static void refreshVersionInfo(String dirName) + throws URISyntaxException { - try - { - String outputFile = getOutputFile(); - String jalviewAlignmentJson = getJalviewAlignmentAsJsonString(av - .getAlignment()); - String bioJSTemplateString = getBioJsTemplateAsString(this); - String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString - .replaceAll( -"#sequenceData#", jalviewAlignmentJson) - .toString(); + File directory = new File(BJS_TEMPLATES_LOCAL_DIRECTORY); + Objects.requireNonNull(dirName, "dirName MUST not be null!"); + Objects.requireNonNull(directory, "directory MUST not be null!"); + TreeMap versionFileMap = new TreeMap(); - 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) + for (File file : directory.listFiles()) { - // do noting if no file was selected - } catch (Exception e) + if (file.isFile()) + { + String fileName = file.getName().substring(0, + file.getName().lastIndexOf(".")); + String fileMeta[] = fileName.split("_"); + if (fileMeta.length > 2) + { + setCurrentBJSTemplateFile(file); + versionFileMap.put(fileMeta[2], file); + } + else if (fileMeta.length > 1) + { + versionFileMap.put(fileMeta[1], file); + } + } + } + if (getCurrentBJSTemplateFile() == null && versionFileMap.size() > 0) { - e.printStackTrace(); + setCurrentBJSTemplateFile(versionFileMap.lastEntry().getValue()); } + setBioJsMSAVersions(versionFileMap); } - public String getOutputFile() throws NoFileSelectedException + public static void updateBioJS() { - 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) + Thread updateThread = new Thread() { - jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser - .getSelectedFile().getParent()); - selectedFile = jvFileChooser.getSelectedFile().getPath(); - } - else - { - throw new NoFileSelectedException("No file was selected."); - } + @Override + public void run() + { + try + { + String gitRepoPkgJson = getURLContentAsString( + BJS_TEMPLATE_GIT_REPO); + if (gitRepoPkgJson != null) + { + BioJSRepositoryPojo release = new BioJSRepositoryPojo( + gitRepoPkgJson); + syncUpdates(BJS_TEMPLATES_LOCAL_DIRECTORY, release); + refreshVersionInfo(BJS_TEMPLATES_LOCAL_DIRECTORY); + } + } catch (URISyntaxException e) + { + e.printStackTrace(); + } + } + }; + updateThread.start(); - return selectedFile; } - public String getJalviewAlignmentAsJsonString(AlignmentI alignment) - throws IOException, JSONException + public static void syncUpdates(String localDir, BioJSRepositoryPojo repo) { - BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo(); + for (BioJSReleasePojo bjsRelease : repo.getReleases()) + { + String releaseUrl = bjsRelease.getUrl(); + String releaseVersion = bjsRelease.getVersion(); + String releaseFile = "BioJsMSA_" + releaseVersion + ".txt"; + if (releaseVersion.equals(repo.getLatestReleaseVersion())) + { + releaseFile = "Latest_BioJsMSA_" + releaseVersion + ".txt"; + } - bjsAlignment.setGlobalColorScheme(getGlobalColorScheme()); - bjsAlignment.setJalviewVersion(jalviewVersion); - bjsAlignment.setWebStartUrl(webStartLaunchServletUrl); + File biojsDirectory = new File(BJS_TEMPLATES_LOCAL_DIRECTORY); + if (!biojsDirectory.exists()) + { + if (!biojsDirectory.mkdirs()) + { + System.out.println("Couldn't create local directory : " + + BJS_TEMPLATES_LOCAL_DIRECTORY); + return; + } + } - int count = 0; - for (SequenceI seq : alignment.getSequences()) - { - StringBuilder name = new StringBuilder(); - name.append(seq.getName()).append("/").append(seq.getStart()) - .append("-").append(seq.getEnd()); - - BioJsSeqPojo seqPojo = new BioJsSeqPojo(); - 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) + File file = new File(BJS_TEMPLATES_LOCAL_DIRECTORY + releaseFile); + if (!file.exists()) { - ArrayList bjsSeqFeatures = new ArrayList(); - for (SequenceFeature sf : seqFeatures) + + PrintWriter out = null; + try + { + out = new java.io.PrintWriter(new java.io.FileWriter(file)); + out.print(getURLContentAsString(releaseUrl)); + } catch (IOException e) + { + e.printStackTrace(); + } finally { - if (displayedFeatures != null - && displayedFeatures.isVisible(sf.getType())) + if (out != null) { - - // TODO: translate graduated/complex colourschemes to biojs model - String featureColour = jalview.util.Format.getHexString(fr - .findFeatureColour(Color.white, seq, - seq.findIndex(sf.getBegin()))); - BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo(); - bjsFeature.setFillColor(featureColour); - bjsFeature.setXstart(seq.findIndex(sf.getBegin()) - 1); - bjsFeature.setXend(seq.findIndex(sf.getEnd())); - bjsFeature.setText(sf.getType()); - bjsSeqFeatures.add(bjsFeature); + out.flush(); + out.close(); } } - 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 + public static String getURLContentAsString(String url) + throws OutOfMemoryError { - InputStreamReader isReader = null; - BufferedReader buffReader = null; - StringBuilder sb = new StringBuilder(); - URL url = currentObj.getClass().getResource( - "/templates/BioJSTemplate.txt"); - if (url != null) + StringBuilder responseStrBuilder = null; + InputStream is = null; + try { - 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); - } + URL resourceUrl = new URL(url); + is = new BufferedInputStream(resourceUrl.openStream()); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + responseStrBuilder = new StringBuilder(); + String lineContent; - } catch (Exception ex) + while ((lineContent = br.readLine()) != null) { - ex.printStackTrace(); - } finally + responseStrBuilder.append(lineContent).append("\n"); + } + } catch (OutOfMemoryError er) + { + er.printStackTrace(); + } catch (Exception ex) + { + ex.printStackTrace(); + } finally + { + if (is != null) { - if (isReader != null) + try { - isReader.close(); - } - - if (buffReader != null) + is.close(); + } catch (IOException e) { - buffReader.close(); + e.printStackTrace(); } } } - return sb.toString(); + return responseStrBuilder == null ? null + : responseStrBuilder.toString(); + } + + public static File getCurrentBJSTemplateFile() + { + return currentBJSTemplateFile; + } + + public static void setCurrentBJSTemplateFile(File currentBJSTemplateFile) + { + BioJsHTMLOutput.currentBJSTemplateFile = currentBJSTemplateFile; + } + + public static TreeMap getBioJsMSAVersions() + { + return bioJsMSAVersions; } - public String getGlobalColorScheme() + public static void setBioJsMSAVersions( + TreeMap bioJsMSAVersions) { - return globalColorScheme; + BioJsHTMLOutput.bioJsMSAVersions = bioJsMSAVersions; } - public void setGlobalColorScheme(String globalColorScheme) + @Override + public boolean isEmbedData() { - this.globalColorScheme = globalColorScheme; + return true; + } + + @Override + public boolean isLaunchInBrowserAfterExport() + { + return true; + } + + @Override + public void run() + { + try + { + String bioJSON = getBioJSONData(); + String bioJSTemplateString = HTMLOutput + .readFileAsString(getCurrentBJSTemplateFile()); + String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString + .replaceAll("#sequenceData#", bioJSON).toString(); + + PrintWriter out = new java.io.PrintWriter( + new java.io.FileWriter(generatedFile)); + out.print(generatedBioJsWithJalviewAlignmentAsJson); + out.flush(); + out.close(); + setProgressMessage(MessageManager + .formatMessage("status.export_complete", getDescription())); + exportCompleted(); + + } catch (OutOfMemoryError err) + { + System.out.println("########################\n" + "OUT OF MEMORY " + + generatedFile + "\n" + "########################"); + new OOMWarning("Creating Image for " + generatedFile, err); + } catch (Exception e) + { + setProgressMessage(MessageManager + .formatMessage("info.error_creating_file", getDescription())); + e.printStackTrace(); + } + } }