package jalview.io;
-import static java.nio.file.Files.readAllBytes;
-import static java.nio.file.Paths.get;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceFeature;
import jalview.datamodel.SequenceI;
+import jalview.exceptions.NoFileSelectedException;
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.util.MessageManager;
+import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStreamReader;
import java.io.PrintWriter;
-
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Hashtable;
import com.json.JSONException;
-import com.json.JSONObject;
public class BioJsHTMLOutput
{
private AlignViewport av;
+
private FeatureRenderer fr;
- public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr,
+ private String globalColorScheme;
+
+ private Hashtable displayedFeatures;
+
+ private String jalviewVersion;
+
+ private String webStartLaunchServletUrl = "http://www.jalview.org/services/launchApp";
+
+ public BioJsHTMLOutput(AlignmentPanel ap,
FeatureRenderer fr1)
{
- this.av = ap.av;
- this.fr = new FeatureRenderer(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 = new FeatureRenderer(ap);
fr.transferSettings(fr1);
- exportAsBioJsHtml();
+ displayedFeatures = av.getFeaturesDisplayed();
+
+ exportJalviewAlignmentAsBioJsHtmlFile();
+ }
}
- private void exportAsBioJsHtml()
+ private void exportJalviewAlignmentAsBioJsHtmlFile()
{
try
{
- JalviewFileChooser jvFileChooser = getJalviewFileChooserOption();
- int fileChooserOpt = jvFileChooser.showSaveDialog(null);
- if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
- {
- 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);
- }
- } catch (Exception ex)
+ 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)
{
- ex.printStackTrace();
+ e.printStackTrace();
}
}
- private JalviewFileChooser getJalviewFileChooserOption()
+ public String getOutputFile() throws NoFileSelectedException
{
- JalviewFileChooser chooser = new JalviewFileChooser(
+ 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());
- chooser.setFileView(new JalviewFileView());
// TODO uncomment when supported by MassageManager
- // chooser.setDialogTitle(MessageManager.getString("label.save_as_biojs_html"));
- chooser.setDialogTitle("save as BioJs HTML");
- chooser.setToolTipText(MessageManager.getString("action.save"));
+ jvFileChooser.setDialogTitle(MessageManager
+ .getString("label.save_as_biojs_html"));
+ jvFileChooser.setDialogTitle("save as BioJs HTML");
+ jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
- return chooser;
+ 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;
}
- private String generateBioJsAlignmentData(AlignmentI alignment)
+ public String getJalviewAlignmentAsJsonString(AlignmentI alignment)
throws IOException, JSONException
{
BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo();
+ bjsAlignment.setGlobalColorScheme(getGlobalColorScheme());
+ bjsAlignment.setJalviewVersion(jalviewVersion);
+ bjsAlignment.setWebStartUrl(webStartLaunchServletUrl);
+
int count = 0;
for (SequenceI seq : alignment.getSequences())
{
- bjsAlignment.getSeqs().add(
- new BioJsSeqPojo(String.valueOf(++count), seq.getName(), seq
- .getSequenceAsString()));
+ 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.getDatasetSequence()
+ .getSequenceFeatures();
+ if (seqFeatures != null)
+ {
+ ArrayList<BioJsFeaturePojo> bjsSeqFeatures = new ArrayList<BioJsFeaturePojo>();
+ for (SequenceFeature sf : seqFeatures)
+ {
+ if (displayedFeatures != null
+ && displayedFeatures.get(sf.getType()) != null)
+ {
+ String featureColour = jalview.util.Format.getHexString(fr
+ .getColour(sf));
+ 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);
+ }
+ }
+ seqPojo.setFeatures(bjsSeqFeatures);
+ }
+ bjsAlignment.getSeqs().add(seqPojo);
}
- String seqs = new JSONObject(bjsAlignment).getString("seqs");
- String bioJSTemplate = new String(
- readAllBytes(get("resources/templates/BioJSTemplate.txt")));
+ return new com.json.JSONObject(bjsAlignment).toString()
+ .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd");
+ }
- return bioJSTemplate.replaceAll("#sequenceData#", seqs);
+ 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 static void main(String[] args) throws IOException
+ public String getGlobalColorScheme()
{
- Document doc = Jsoup.parse(new String(
- readAllBytes(get("resources/templates/BioJSTemplate.txt"))));
+ return globalColorScheme;
+ }
- Element content = doc.getElementById("seqData");
- System.out.println(content.val());
+ public void setGlobalColorScheme(String globalColorScheme)
+ {
+ this.globalColorScheme = globalColorScheme;
}
}
-