/*
* 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.AlignExportSettingsI;
import jalview.bin.Cache;
import jalview.datamodel.AlignExportSettingsAdapter;
import jalview.datamodel.AlignmentExportData;
import jalview.gui.AlignmentPanel;
import jalview.gui.IProgressIndicator;
import jalview.util.MessageManager;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Objects;
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
{
System.out.println(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)
{
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;
}
new Thread(this).start();
}
/**
* Answers a short description of the image format suitable for display in
* messages
*
* @return
*/
protected final String getDescription()
{
return description;
}
}