package jalview.bin; import jalview.analysis.AlignmentUtils; import jalview.datamodel.AlignmentI; import jalview.gui.AlignFrame; import jalview.gui.SplitFrame; import jalview.io.DataSourceType; import jalview.io.FileFormatException; import jalview.io.FileFormatI; import jalview.io.FileLoader; import jalview.io.IdentifyFile; import jalview.structure.StructureSelectionManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JFrame; import javax.swing.JInternalFrame; /** * * early work -- deprecated * * Entry point for Jalview as Javascript. Expects parameter names as for the * JalviewLite applet, formatted as for the Jalview application, for example * *
 *   JalviewJS file /examples/uniref50.fa features /examples/exampleFeatures.txt \
 *       PDBFile "/examples/pdb1.txt seq1"
 * 
* * Note that (unlike the applet) parameter names are case sensitive */ // TODO or format as file=/examples/uniref50.fa (etc)? public class JalviewJS { static { /** * @j2sNative * * thisApplet.__Info.args = * ["file","examples/uniref50.fa","features", * "examples/exampleFeatures.txt", * "props","/Users/gmcarstairs/.jalview_properties"]; */ } private static final String PARAM_FILE = "file"; private static final String PARAM_FILE2 = "file2"; private static final String PARAM_TREE = "tree"; private static final String PARAM_FEATURES = "features"; private static final String PARAM_ANNOTATIONS = "annotations"; private static final String PARAM_SHOW_ANNOTATION = "showAnnotation"; private static final String PARAM_PDBFILE = "PDBFile"; private static final String PARAM_PROPS = "props"; private Map params; private List pdbFileParams; public static void main(String[] args) throws Exception { new JalviewJS().doMain(args); } /** * Parses parameters and shows the frame and any loaded panels * * @throws FileFormatException */ void doMain(String[] args) throws FileFormatException { loadParameters(args); if (getParameter(PARAM_FILE) == null) { usage(); } else { showFrame(); } } /** * Answers the value of the given runtime parameter, or null if not provided * * @param paramName * @return */ private String getParameter(String paramName) { return params.get(paramName); } /** * Prints a chastising, yet helpful, error message on syserr */ private void usage() { System.err.println( "Usage: JalviewJS file [features ]"); System.err.println("See documentation for full parameter list"); } /** * Parses any supplied parameters. Note that (unlike for the applet), * parameter names are case sensitive. * * @param args * * @see http://www.jalview.org/examples/index.html#appletParameters */ void loadParameters(String[] args) { ArgsParser parser = new ArgsParser(args); params = new HashMap<>(); // TODO javascript-friendly source of properties Cache.loadProperties(parser.getValue(PARAM_PROPS)); loadParameter(parser, PARAM_FILE); loadParameter(parser, PARAM_FILE2); loadParameter(parser, PARAM_TREE); loadParameter(parser, PARAM_FEATURES); loadParameter(parser, PARAM_ANNOTATIONS); loadParameter(parser, PARAM_SHOW_ANNOTATION); pdbFileParams = loadPdbParameters(parser); } /** * Reads one command line parameter value and saves it against the parameter * name. Note the saved value is null if the parameter is not present. * * @param parser * @param param */ protected void loadParameter(ArgsParser parser, String param) { params.put(param, parser.getValue(param)); } /** * Reads parameter PDBFile, PDBFile1, PDFile2, ... and saves the value(s) (if * any) * * @param parser * @return */ List loadPdbParameters(ArgsParser parser) { List values = new ArrayList<>(); String value = parser.getValue(PARAM_PDBFILE); if (value != null) { values.add(value); } int i = 1; while (true) { value = parser.getValue(PARAM_PDBFILE + String.valueOf(i)); if (value != null) { values.add(value); } else { break; } } return values; } /** * Constructs and displays a JFrame containing an alignment panel (and any * additional panels depending on parameters supplied) * * @throws FileFormatException */ void showFrame() throws FileFormatException { JFrame frame = new JFrame(getParameter(PARAM_FILE)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* * construct an AlignFrame (optionally with features) */ AlignFrame alignFrame = createAlignFrame(PARAM_FILE); loadFeatures(alignFrame, getParameter(PARAM_FEATURES)); JInternalFrame internalFrame = alignFrame; /* * convert to SplitFrame if a valid file2 is supplied */ AlignFrame alignFrame2 = createAlignFrame(PARAM_FILE2); if (alignFrame2 != null) { SplitFrame splitFrame = loadSplitFrame(alignFrame, alignFrame2); if (splitFrame != null) { internalFrame = splitFrame; } } /* * move AlignFrame (or SplitFrame) menu bar and content pane to our frame * TODO there may be a less obscure way to do this */ frame.setContentPane(internalFrame.getContentPane()); frame.setJMenuBar(internalFrame.getJMenuBar()); // fudge so that dialogs can be opened with this frame as parent // todo JAL-3031 also override Desktop.addInternalFrame etc // Desktop.parent = frame.getContentPane(); frame.pack(); frame.setSize(AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); frame.setVisible(true); } /** * Constructs a SplitFrame if cdna-protein mappings can be made between the * given alignment frames, else returns null. Any mappings made are registered * with StructureSelectionManager to enable broadcast to listeners. * * @param alignFrame * @param alignFrame2 * @return */ protected SplitFrame loadSplitFrame(AlignFrame alignFrame, AlignFrame alignFrame2) { // code borrowed from AlignViewport.openLinkedAlignment AlignmentI al1 = alignFrame.getViewport().getAlignment(); AlignmentI al2 = alignFrame2.getViewport().getAlignment(); boolean al1Nuc = al1.isNucleotide(); if (al1Nuc == al2.isNucleotide()) { System.err.println("Can't make split frame as alignments are both " + (al1Nuc ? "nucleotide" : "protein")); return null; } AlignmentI protein = al1Nuc ? al2 : al1; AlignmentI cdna = al1Nuc ? al1 : al2; boolean mapped = AlignmentUtils.mapProteinAlignmentToCdna(protein, cdna); if (!mapped) { System.err.println("Can't make any mappings for split frame"); return null; } /* * register sequence mappings */ StructureSelectionManager ssm = StructureSelectionManager .getStructureSelectionManager(null); ssm.registerMappings(protein.getCodonFrames()); cdna.alignAs(protein); SplitFrame splitFrame = new SplitFrame( al1Nuc ? alignFrame : alignFrame2, al1Nuc ? alignFrame2 : alignFrame); return splitFrame; } /** * Loads on a features file if one was specified as a parameter * * @param alignFrame * @param featureFile */ protected void loadFeatures(AlignFrame alignFrame, String featureFile) { if (featureFile != null) { // todo extract helper for protocol resolution from JalviewLite DataSourceType sourceType = featureFile.startsWith("http") ? DataSourceType.URL : DataSourceType.RELATIVE_URL; alignFrame.parseFeaturesFile(featureFile, sourceType); } } /** * Constructs and returns the frame containing the alignment and its * annotations. Returns null if the specified parameter value is not set. * * @param fileParam * * @return * @throws FileFormatException */ AlignFrame createAlignFrame(String fileParam) throws FileFormatException { AlignFrame af = null; String file = getParameter(fileParam); if (file != null) { DataSourceType protocol = file.startsWith("http") ? DataSourceType.URL : DataSourceType.RELATIVE_URL; // DataSourceType protocol = AppletFormatAdapter.checkProtocol(file); FileFormatI format = new IdentifyFile().identify(file, protocol); FileLoader fileLoader = new FileLoader(false); af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); } return af; } }