X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FBioJsHTMLOutput.java;h=e8e993b491d0e65e6cf11fcdfcf69d518da80133;hb=67b3acb8df1438ef37a756c04e14f5a3b8406808;hp=068b4b256a343bc3784efbc117cab17fd4ca9c00;hpb=13953b6236c6b5de369e3598358d833e07328508;p=jalview.git diff --git a/src/jalview/io/BioJsHTMLOutput.java b/src/jalview/io/BioJsHTMLOutput.java index 068b4b2..e8e993b 100644 --- a/src/jalview/io/BioJsHTMLOutput.java +++ b/src/jalview/io/BioJsHTMLOutput.java @@ -1,159 +1,134 @@ package jalview.io; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.SequenceFeature; -import jalview.datamodel.SequenceI; -import jalview.gui.AlignViewport; -import jalview.gui.AlignmentPanel; -import jalview.gui.FeatureRenderer; -import jalview.gui.SequenceRenderer; -import jalview.json.binding.v1.BioJsAlignmentPojo; -import jalview.json.binding.v1.BioJsFeaturePojo; -import jalview.json.binding.v1.BioJsSeqPojo; -import jalview.schemes.ColourSchemeProperty; +import jalview.api.AlignmentViewPanel; +import jalview.bin.Cache; +import jalview.datamodel.AlignmentExportData; +import jalview.exceptions.NoFileSelectedException; +import jalview.gui.AlignFrame; +import jalview.json.binding.v1.BioJSReleasePojo; +import jalview.json.binding.v1.BioJSRepositoryPojo; +import jalview.util.BrowserLauncher; import jalview.util.MessageManager; +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 { - private AlignViewport av; + private AlignmentViewPanel ap; - private FeatureRenderer fr; + private static File currentBJSTemplateFile; - public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr, - FeatureRenderer fr1) - { - this.av = ap.av; - this.fr = new FeatureRenderer(ap); - fr.transferSettings(fr1); + private static TreeMap bioJsMSAVersions; + + public static final String DEFAULT_DIR = System.getProperty("user.home") + + File.separatorChar + ".biojs_templates" + File.separatorChar; + + public static final String BJS_TEMPLATES_LOCAL_DIRECTORY = Cache + .getDefault("biojs_template_directory", DEFAULT_DIR); + + public static final String BJS_TEMPLATE_GIT_REPO = Cache + .getDefault( + "biojs_template_git_repo", + "https://raw.githubusercontent.com/tcofoegbu/bjs-template/master/package.json"); - exportAsBioJsHtml(); + public BioJsHTMLOutput(AlignmentViewPanel ap) + { + if (ap != null) + { + this.ap = ap; + } } - private void exportAsBioJsHtml() + public void exportJalviewAlignmentAsBioJsHtmlFile() { try { - JalviewFileChooser jvFileChooser = getJalviewFileChooserOption(); - int fileChooserOpt = jvFileChooser.showSaveDialog(null); - if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) + String outputFile = getOutputFile(); + // String jalviewAlignmentJson = JSONFile.getJSONData(ap); + AlignmentExportData exportData = AlignFrame + .getAlignmentForExport( + JSONFile.FILE_DESC, ap.getAlignViewport()); + if (exportData.getSettings().isCancelled()) { - jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser - .getSelectedFile().getParent()); - String selectedFile = jvFileChooser.getSelectedFile().getPath(); - String generartedBioJs = generateBioJsAlignmentData(av - .getAlignment()); - PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter( - selectedFile)); - out.print(generartedBioJs); - out.close(); - jalview.util.BrowserLauncher.openURL("file:///" + selectedFile); + return; } - } catch (Exception ex) + String jalviewAlignmentJson = new FormatAdapter(ap, + exportData.getSettings()).formatSequences(JSONFile.FILE_DESC, + exportData.getAlignment(), exportData.getOmitHidden(), + exportData.getStartEndPostions(), ap.getAlignViewport() + .getColumnSelection()); + + String bioJSTemplateString = getBioJsTemplateAsString(); + 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(); + BrowserLauncher.openURL("file:///" + outputFile); + } catch (NoFileSelectedException ex) { - ex.printStackTrace(); + // do noting if no file was selected + } catch (Exception e) + { + e.printStackTrace(); } } - private JalviewFileChooser getJalviewFileChooserOption() + public String getOutputFile() throws NoFileSelectedException { - JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[] + String selectedFile = null; + JalviewFileChooser jvFileChooser = new JalviewFileChooser( + Cache.getProperty("LAST_DIRECTORY"), new String[] { "html" }, new String[] { "HTML files" }, "HTML files"); - chooser.setFileView(new JalviewFileView()); + jvFileChooser.setFileView(new JalviewFileView()); - // TODO uncomment when supported by MassageManager - chooser.setDialogTitle(MessageManager + jvFileChooser.setDialogTitle(MessageManager .getString("label.save_as_biojs_html")); - chooser.setDialogTitle("save as BioJs HTML"); - chooser.setToolTipText(MessageManager.getString("action.save")); - - return chooser; - } + jvFileChooser.setDialogTitle("save as BioJs HTML"); + jvFileChooser.setToolTipText(MessageManager.getString("action.save")); - private String generateBioJsAlignmentData(AlignmentI alignment) - throws IOException, JSONException - { - BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo(); - bjsAlignment.setGlobalColorScheme(ColourSchemeProperty.getColourName(av - .getGlobalColourScheme())); - - // av.setGlobalColourScheme(cs); - int count = 0; - for (SequenceI seq : alignment.getSequences()) + int fileChooserOpt = jvFileChooser.showSaveDialog(null); + if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) { - StringBuilder name = new StringBuilder(); - name.append(seq.getName()).append("/").append(seq.getStart()) - .append("-").append(seq.getEnd()); - // BioJsSeqPojo seqPojo = new BioJsSeqPojo(seq.getStart(), seq.getEnd(), - // String.valueOf(++count), - // name.toString(), seq.getSequenceAsString()); - // - 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.getDatasetSequence() - .getSequenceFeatures(); - if (seqFeatures != null) - { - - ArrayList bjsSeqFeatures = new ArrayList(); - for (SequenceFeature sf : seqFeatures) - { - - String featureColour = jalview.util.Format.getHexString(fr - .getColour(sf)); - BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo(); - bjsFeature.setFillColor(featureColour); - bjsFeature.setXstart(sf.getBegin()); - bjsFeature.setXend(sf.getEnd()); - bjsFeature.setText(sf.getType()); - - bjsSeqFeatures.add(bjsFeature); - - } - - seqPojo.setFeatures(bjsSeqFeatures); - } - bjsAlignment.getSeqs().add(seqPojo); + Cache.setProperty("LAST_DIRECTORY", jvFileChooser + .getSelectedFile().getParent()); + selectedFile = jvFileChooser.getSelectedFile().getPath(); } - - String jalviewData = new com.json.JSONObject(bjsAlignment).toString() - .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd"); - // String bioJSTemplate = new String( - // java.nio.file.Files.readAllBytes(java.nio.file.Paths - // .get("resources/templates/BioJSTemplate.txt"))); - String bioJSTemplate = getBioJsTemplateAsString(this); - - return bioJSTemplate.replaceAll("#sequenceData#", jalviewData) - .replaceAll( - "#jalview_logo#", - alignment.getClass() - .getResource("/images/Jalview_Logo.png") - .toString()); + else + { + throw new NoFileSelectedException("No file was selected."); + } + return selectedFile; } - public static String getBioJsTemplateAsString(Object currentObj) + + public static String getBioJsTemplateAsString() throws IOException { InputStreamReader isReader = null; BufferedReader buffReader = null; StringBuilder sb = new StringBuilder(); - URL url = currentObj.getClass().getResource( - "/templates/BioJSTemplate.txt"); + Objects.requireNonNull(getCurrentBJSTemplateFile(), + "BioJsTemplate File not initialized!"); + @SuppressWarnings("deprecation") + URL url = getCurrentBJSTemplateFile().toURL(); if (url != null) { try @@ -183,8 +158,176 @@ public class BioJsHTMLOutput } } } - return sb.toString(); } + public static void refreshBioJSVersionsInfo(String dirName) + throws URISyntaxException + { + 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(); + + for (File file : directory.listFiles()) + { + 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) + { + setCurrentBJSTemplateFile(versionFileMap.lastEntry().getValue()); + } + setBioJsMSAVersions(versionFileMap); + } + + public static void updateBioJS() + { + Thread updateThread = new Thread() + { + 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); + refreshBioJSVersionsInfo(BJS_TEMPLATES_LOCAL_DIRECTORY); + } + } catch (URISyntaxException e) + { + e.printStackTrace(); + } + } + }; + updateThread.start(); + + } + + + public static void syncUpdates(String localDir, BioJSRepositoryPojo repo) + { + 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"; + } + + 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; + } + } + + File file = new File(BJS_TEMPLATES_LOCAL_DIRECTORY + releaseFile); + if (!file.exists()) + { + + 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 (out != null) + { + out.flush(); + out.close(); + } + } + } + } + + } + + public static String getURLContentAsString(String url) + throws OutOfMemoryError + { + StringBuilder responseStrBuilder = null; + InputStream is = null; + try + { + URL resourceUrl = new URL(url); + is = new BufferedInputStream(resourceUrl.openStream()); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + responseStrBuilder = new StringBuilder(); + String lineContent; + + while ((lineContent = br.readLine()) != null) + { + responseStrBuilder.append(lineContent).append("\n"); + } + } catch (OutOfMemoryError er) + { + er.printStackTrace(); + } catch (Exception ex) + { + ex.printStackTrace(); + } finally + { + if (is != null) + { + try + { + is.close(); + } catch (IOException e) + { + e.printStackTrace(); + } + } + } + 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 static void setBioJsMSAVersions( + TreeMap bioJsMSAVersions) + { + BioJsHTMLOutput.bioJsMSAVersions = bioJsMSAVersions; + } + }