/* * 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 java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.util.Objects; import jalview.api.AlignExportSettingsI; import jalview.bin.Cache; import jalview.bin.Jalview; import jalview.datamodel.AlignExportSettingsAdapter; import jalview.datamodel.AlignmentExportData; import jalview.gui.AlignmentPanel; import jalview.gui.IProgressIndicator; import jalview.io.exceptions.ImageOutputException; import jalview.util.MessageManager; public abstract class HTMLOutput implements Runnable { protected AlignmentPanel ap; /* * key for progress or status messages */ protected long pSessionId; /* * (optional) place to write progress messages to */ protected IProgressIndicator pIndicator; protected File generatedFile; String _bioJson = null; private String description; /** * Constructor given an alignment panel (which should not be null) * * @param ap * @param desc */ public HTMLOutput(AlignmentPanel ap, String desc) { this.ap = ap; this.pIndicator = ap.alignFrame; this.description = desc; this.pSessionId = System.currentTimeMillis(); } /** * Gets the BioJSON data as a string, with lazy evaluation (first time called * only). If the output format is configured not to embed BioJSON, returns * null. * * @return */ public String getBioJSONData() { if (!isEmbedData()) { return null; } if (_bioJson == null) { AlignExportSettingsI options = new AlignExportSettingsAdapter(true); AlignmentExportData exportData = ap.getAlignViewport() .getAlignExportData(options); _bioJson = new FormatAdapter(ap, options).formatSequences( FileFormat.Json, exportData.getAlignment(), exportData.getOmitHidden(), exportData.getStartEndPostions(), ap.getAlignViewport().getAlignment().getHiddenColumns()); } return _bioJson; } /** * Read a template file content as string * * @param file * - the file to be read * @return File content as String * @throws IOException */ public static String readFileAsString(File file) throws IOException { InputStreamReader isReader = null; BufferedReader buffReader = null; StringBuilder sb = new StringBuilder(); Objects.requireNonNull(file, "File must not be null!"); @SuppressWarnings("deprecation") URL url = file.toURL(); 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 static String getImageMapHTML() { return new String("\n" + "\n" + "\n" + "\n" + "\n" + "
\n" + "\n"); } /** * Prompts the user to choose an output file and returns the file path, or * null on Cancel * * @return */ public String getOutputFile() { String selectedFile = null; // TODO: JAL-3048 generate html rendered view (requires SvgGraphics and/or // Jalview HTML rendering system- probably not required for Jalview-JS) JalviewFileChooser jvFileChooser = new JalviewFileChooser("html", "HTML files"); jvFileChooser.setFileView(new JalviewFileView()); jvFileChooser .setDialogTitle(MessageManager.getString("label.save_as_html")); jvFileChooser.setToolTipText(MessageManager.getString("action.save")); int fileChooserOpt = jvFileChooser.showSaveDialog(null); if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION) { Cache.setProperty("LAST_DIRECTORY", jvFileChooser.getSelectedFile().getParent()); selectedFile = jvFileChooser.getSelectedFile().getPath(); } return selectedFile; } protected void setProgressMessage(String message) { if (pIndicator != null && !isHeadless()) { pIndicator.setProgressBar(message, pSessionId); } else { jalview.bin.Console.outPrintln(message); } } /** * Answers true if HTML export is invoke in headless mode or false otherwise * * @return */ protected boolean isHeadless() { return System.getProperty("java.awt.headless") != null && System.getProperty("java.awt.headless").equals("true"); } /** * This method provides implementation of consistent behaviour which should * occur after a HTML file export. It MUST be called at the end of the * exportHTML() method implementation. */ protected void exportCompleted() { if (isLaunchInBrowserAfterExport() && !isHeadless()) { /* try { */ jalview.util.BrowserLauncher.openURL("file:///" + getExportedFile()); /* } catch (IOException e) { e.printStackTrace(); } */ } } /** * if this answers true then BioJSON data will be embedded to the exported * HTML file otherwise it won't be embedded. * * @return */ public abstract boolean isEmbedData(); /** * if this answers true then the generated HTML file is opened for viewing in * a browser after its generation otherwise it won't be opened in a browser * * @return */ public abstract boolean isLaunchInBrowserAfterExport(); /** * handle to the generated HTML file * * @return */ public File getExportedFile() { return generatedFile; } public void exportHTML(String outputFile) throws ImageOutputException { exportHTML(outputFile, null); } public void exportHTML(String outputFile, String renderer) throws ImageOutputException { setProgressMessage(MessageManager.formatMessage( "status.exporting_alignment_as_x_file", getDescription())); try { if (outputFile == null) { /* * prompt for output file */ outputFile = getOutputFile(); if (outputFile == null) { setProgressMessage(MessageManager.formatMessage( "status.cancelled_image_export_operation", getDescription())); return; } } generatedFile = new File(outputFile); } catch (Exception e) { setProgressMessage(MessageManager .formatMessage("info.error_creating_file", getDescription())); e.printStackTrace(); return; } if (Jalview.isHeadlessMode()) { this.run(renderer); } else { new Thread(this).start(); } } /** * Answers a short description of the image format suitable for display in * messages * * @return */ protected final String getDescription() { return description; } // used to pass an option such as render to run public abstract void run(String string) throws ImageOutputException; }