3 import jalview.exceptions.NoFileSelectedException;
4 import jalview.gui.AlignViewport;
5 import jalview.gui.AlignmentPanel;
6 import jalview.gui.FeatureRenderer;
7 import jalview.json.binding.v1.BioJSReleasePojo;
8 import jalview.json.binding.v1.BioJSRepositoryPojo;
9 import jalview.util.MessageManager;
11 import java.io.BufferedInputStream;
12 import java.io.BufferedReader;
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.io.InputStreamReader;
17 import java.io.PrintWriter;
18 import java.net.URISyntaxException;
20 import java.util.Objects;
21 import java.util.TreeMap;
24 public class BioJsHTMLOutput
26 private AlignViewport av;
28 private static File currentBJSTemplateFile;
30 private static TreeMap<String, File> bioJsMSAVersions;
32 public static final String BJS_TEMPLATES_LOCAL_DIRECTORY = jalview.bin.Cache
33 .getDefault("biojs_template_directory", "/biojs_templates/");
35 public static final String BJS_TEMPLATE_GIT_REPO = jalview.bin.Cache
37 "biojs_template_git_repo",
38 "https://raw.githubusercontent.com/tcofoegbu/bjs-template/master/package.json");
40 public BioJsHTMLOutput(AlignmentPanel ap,
46 av.setFeatureRenderer(new FeatureRenderer(ap));
50 public void exportJalviewAlignmentAsBioJsHtmlFile()
54 String outputFile = getOutputFile();
55 String jalviewAlignmentJson = JSONFile.getJSONData(av);
56 String bioJSTemplateString = getBioJsTemplateAsString();
57 String generatedBioJsWithJalviewAlignmentAsJson = bioJSTemplateString
59 "#sequenceData#", jalviewAlignmentJson)
62 PrintWriter out = new java.io.PrintWriter(new java.io.FileWriter(
64 out.print(generatedBioJsWithJalviewAlignmentAsJson);
67 jalview.util.BrowserLauncher.openURL("file:///" + outputFile);
68 } catch (NoFileSelectedException ex)
70 // do noting if no file was selected
77 public String getOutputFile() throws NoFileSelectedException
79 String selectedFile = null;
80 JalviewFileChooser jvFileChooser = new JalviewFileChooser(
81 jalview.bin.Cache.getProperty("LAST_DIRECTORY"), new String[]
82 { "html" }, new String[]
83 { "HTML files" }, "HTML files");
84 jvFileChooser.setFileView(new JalviewFileView());
86 // TODO uncomment when supported by MassageManager
87 jvFileChooser.setDialogTitle(MessageManager
88 .getString("label.save_as_biojs_html"));
89 jvFileChooser.setDialogTitle("save as BioJs HTML");
90 jvFileChooser.setToolTipText(MessageManager.getString("action.save"));
92 int fileChooserOpt = jvFileChooser.showSaveDialog(null);
93 if (fileChooserOpt == JalviewFileChooser.APPROVE_OPTION)
95 jalview.bin.Cache.setProperty("LAST_DIRECTORY", jvFileChooser
96 .getSelectedFile().getParent());
97 selectedFile = jvFileChooser.getSelectedFile().getPath();
101 throw new NoFileSelectedException("No file was selected.");
107 public static String getBioJsTemplateAsString()
110 InputStreamReader isReader = null;
111 BufferedReader buffReader = null;
112 StringBuilder sb = new StringBuilder();
113 Objects.requireNonNull(getCurrentBJSTemplateFile(),
114 "BioJsTemplate File not initialized!");
115 @SuppressWarnings("deprecation")
116 URL url = getCurrentBJSTemplateFile().toURL();
121 isReader = new InputStreamReader(url.openStream());
122 buffReader = new BufferedReader(isReader);
124 String lineSeparator = System.getProperty("line.separator");
125 while ((line = buffReader.readLine()) != null)
127 sb.append(line).append(lineSeparator);
130 } catch (Exception ex)
132 ex.printStackTrace();
135 if (isReader != null)
140 if (buffReader != null)
146 return sb.toString();
149 public void refreshBioJSVersionsInfo(String dirName)
150 throws URISyntaxException
152 URL url = getClass().getResource(dirName);
153 File directory = new File(url.toURI());
154 Objects.requireNonNull(dirName, "dirName MUST not be null!");
155 Objects.requireNonNull(directory, "directory MUST not be null!");
156 TreeMap<String, File> versionFileMap = new TreeMap<String, File>();
158 for (File file : directory.listFiles())
162 String fileName = file.getName().substring(0,
163 file.getName().lastIndexOf("."));
164 String fileMeta[] = fileName.split("_");
165 if (fileMeta.length > 2)
167 setCurrentBJSTemplateFile(file);
168 versionFileMap.put(fileMeta[2], file);
170 else if (fileMeta.length > 1)
172 versionFileMap.put(fileMeta[1], file);
176 if (getCurrentBJSTemplateFile() == null && versionFileMap.size() > 0)
178 setCurrentBJSTemplateFile(versionFileMap.lastEntry().getValue());
180 setBioJsMSAVersions(versionFileMap);
183 public void updateBioJS()
187 String gitRepoPkgJson = getURLContentAsString(BJS_TEMPLATE_GIT_REPO);
188 BioJSRepositoryPojo release = new BioJSRepositoryPojo(gitRepoPkgJson);
189 syncUpdates(BJS_TEMPLATES_LOCAL_DIRECTORY, release);
190 refreshBioJSVersionsInfo(BJS_TEMPLATES_LOCAL_DIRECTORY);
191 } catch (URISyntaxException e)
198 public void syncUpdates(String localDir, BioJSRepositoryPojo repo)
199 throws URISyntaxException
201 for (BioJSReleasePojo bjsRelease : repo.getReleases())
203 String releaseUrl = bjsRelease.getUrl();
204 String releaseVersion = bjsRelease.getVersion();
205 String releaseFile = "BioJsMSA_" + releaseVersion + ".txt";
206 if (releaseVersion.equals(repo.getLatestReleaseVersion()))
208 releaseFile = "Latest_BioJsMSA_" + releaseVersion + ".txt";
211 URL url = getClass().getResource(
212 BJS_TEMPLATES_LOCAL_DIRECTORY + releaseFile);
215 String path = getClass().getResource(BJS_TEMPLATES_LOCAL_DIRECTORY)
217 System.out.println("------> " + path);
218 file = new File(path + releaseFile);
222 file = new File(url.toURI());
227 PrintWriter out = null;
230 out = new java.io.PrintWriter(new java.io.FileWriter(file));
231 out.print(getURLContentAsString(releaseUrl));
232 } catch (IOException e)
248 public static String getURLContentAsString(String url)
249 throws OutOfMemoryError
251 StringBuilder responseStrBuilder = null;
252 InputStream is = null;
255 URL resourceUrl = new URL(url);
256 is = new BufferedInputStream(resourceUrl.openStream());
257 BufferedReader br = new BufferedReader(new InputStreamReader(is));
258 responseStrBuilder = new StringBuilder();
261 while ((lineContent = br.readLine()) != null)
263 responseStrBuilder.append(lineContent).append("\n");
265 } catch (OutOfMemoryError er)
267 er.printStackTrace();
268 } catch (Exception ex)
270 ex.printStackTrace();
278 } catch (IOException e)
284 return responseStrBuilder == null ? null : responseStrBuilder
288 public static File getCurrentBJSTemplateFile()
290 return currentBJSTemplateFile;
293 public static void setCurrentBJSTemplateFile(File currentBJSTemplateFile)
295 BioJsHTMLOutput.currentBJSTemplateFile = currentBJSTemplateFile;
298 public static TreeMap<String, File> getBioJsMSAVersions()
300 return bioJsMSAVersions;
303 public static void setBioJsMSAVersions(
304 TreeMap<String, File> bioJsMSAVersions)
306 BioJsHTMLOutput.bioJsMSAVersions = bioJsMSAVersions;