Modified biojs exporter/importer to preserve SequenceFeatures during a write/read...
[jalview.git] / src / jalview / io / BioJsHTMLOutput.java
1 package jalview.io;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.SequenceFeature;
5 import jalview.datamodel.SequenceI;
6 import jalview.gui.AlignViewport;
7 import jalview.gui.AlignmentPanel;
8 import jalview.gui.FeatureRenderer;
9 import jalview.gui.SequenceRenderer;
10 import jalview.json.binding.v1.BioJsAlignmentPojo;
11 import jalview.json.binding.v1.BioJsFeaturePojo;
12 import jalview.json.binding.v1.BioJsSeqPojo;
13 import jalview.schemes.ColourSchemeProperty;
14 import jalview.util.MessageManager;
15
16 import java.io.BufferedReader;
17 import java.io.IOException;
18 import java.io.InputStreamReader;
19 import java.io.PrintWriter;
20 import java.net.URL;
21 import java.util.ArrayList;
22
23 import com.json.JSONException;
24
25 public class BioJsHTMLOutput
26 {
27   private AlignViewport av;
28
29   private FeatureRenderer fr;
30
31   public BioJsHTMLOutput(AlignmentPanel ap, SequenceRenderer sr,
32           FeatureRenderer fr1)
33   {
34     this.av = ap.av;
35     this.fr = new FeatureRenderer(ap);
36     fr.transferSettings(fr1);
37
38     exportAsBioJsHtml();
39   }
40
41   private void exportAsBioJsHtml()
42   {
43     try
44     {
45       JalviewFileChooser jvFileChooser = getJalviewFileChooserOption();
46       int fileChooserOpt = jvFileChooser.showSaveDialog(null);
47       if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
48       {
49         jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
50                 .getSelectedFile().getParent());
51         String selectedFile = jvFileChooser.getSelectedFile().getPath();
52         String generartedBioJs = generateBioJsAlignmentData(av
53                 .getAlignment());
54         PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
55                 selectedFile));
56         out.print(generartedBioJs);
57         out.close();
58         jalview.util.BrowserLauncher.openURL("file:///" + selectedFile);
59       }
60     } catch (Exception ex)
61     {
62       ex.printStackTrace();
63     }
64   }
65
66   private JalviewFileChooser getJalviewFileChooserOption()
67   {
68     JalviewFileChooser chooser = new JalviewFileChooser(
69             jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
70             { "html" }, new String[]
71             { "HTML files" }, "HTML files");
72     chooser.setFileView(new JalviewFileView());
73
74     // TODO uncomment when supported by MassageManager
75     chooser.setDialogTitle(MessageManager
76             .getString("label.save_as_biojs_html"));
77     chooser.setDialogTitle("save as BioJs HTML");
78     chooser.setToolTipText(MessageManager.getString("action.save"));
79
80     return chooser;
81   }
82
83   private String generateBioJsAlignmentData(AlignmentI alignment)
84           throws IOException, JSONException
85   {
86     BioJsAlignmentPojo bjsAlignment = new BioJsAlignmentPojo();
87     bjsAlignment.setGlobalColorScheme(ColourSchemeProperty.getColourName(av
88             .getGlobalColourScheme()));
89
90     // av.setGlobalColourScheme(cs);
91     int count = 0;
92     for (SequenceI seq : alignment.getSequences())
93     {
94       StringBuilder name = new StringBuilder();
95       name.append(seq.getName()).append("/").append(seq.getStart())
96               .append("-").append(seq.getEnd());
97       // BioJsSeqPojo seqPojo = new BioJsSeqPojo(seq.getStart(), seq.getEnd(),
98       // String.valueOf(++count),
99       // name.toString(), seq.getSequenceAsString());
100       //
101       BioJsSeqPojo seqPojo = new BioJsSeqPojo();
102       seqPojo.setId(String.valueOf(++count));
103       seqPojo.setEnd(seq.getEnd());
104       seqPojo.setStart(seq.getStart());
105       seqPojo.setName(name.toString());
106       seqPojo.setSeq(seq.getSequenceAsString());
107
108       SequenceFeature[] seqFeatures = seq.getDatasetSequence()
109               .getSequenceFeatures();
110       if (seqFeatures != null)
111       {
112
113         ArrayList<BioJsFeaturePojo> bjsSeqFeatures = new ArrayList<BioJsFeaturePojo>();
114         for (SequenceFeature sf : seqFeatures)
115         {
116
117           String featureColour = jalview.util.Format.getHexString(fr
118                   .getColour(sf));
119           BioJsFeaturePojo bjsFeature = new BioJsFeaturePojo();
120           bjsFeature.setFillColor(featureColour);
121           bjsFeature.setXstart(sf.getBegin());
122           bjsFeature.setXend(sf.getEnd());
123           bjsFeature.setText(sf.getType());
124
125           bjsSeqFeatures.add(bjsFeature);
126
127         }
128
129         seqPojo.setFeatures(bjsSeqFeatures);
130       }
131       bjsAlignment.getSeqs().add(seqPojo);
132     }
133
134     String jalviewData = new com.json.JSONObject(bjsAlignment).toString()
135             .replaceAll("xstart", "xStart").replaceAll("xend", "xEnd");
136     // String bioJSTemplate = new String(
137     // java.nio.file.Files.readAllBytes(java.nio.file.Paths
138     // .get("resources/templates/BioJSTemplate.txt")));
139     String bioJSTemplate = getBioJsTemplateAsString(this);
140
141     return bioJSTemplate.replaceAll("#sequenceData#", jalviewData)
142             .replaceAll(
143                     "#jalview_logo#",
144                     alignment.getClass()
145                             .getResource("/images/Jalview_Logo.png")
146                             .toString());
147   }
148
149   public static String getBioJsTemplateAsString(Object currentObj)
150           throws IOException
151   {
152     InputStreamReader isReader = null;
153     BufferedReader buffReader = null;
154     StringBuilder sb = new StringBuilder();
155     URL url = currentObj.getClass().getResource(
156             "/templates/BioJSTemplate.txt");
157     if (url != null)
158     {
159       try
160       {
161         isReader = new InputStreamReader(url.openStream());
162         buffReader = new BufferedReader(isReader);
163         String line;
164         String lineSeparator = System.getProperty("line.separator");
165         while ((line = buffReader.readLine()) != null)
166         {
167           sb.append(line).append(lineSeparator);
168         }
169
170       } catch (Exception ex)
171       {
172         ex.printStackTrace();
173       } finally
174       {
175         if (isReader != null)
176         {
177           isReader.close();
178         }
179
180         if (buffReader != null)
181         {
182           buffReader.close();
183         }
184       }
185     }
186
187     return sb.toString();
188   }
189
190 }