/*
* 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.bin;
import jalview.api.AlignCalcWorkerI;
import jalview.api.AlignFrameI;
import jalview.api.AlignViewportI;
import jalview.api.JalviewApp;
import jalview.api.StructureSelectionManagerProvider;
import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
import jalview.datamodel.ColumnSelection;
import jalview.datamodel.HiddenColumns;
import jalview.datamodel.PDBEntry;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.ext.so.SequenceOntology;
import jalview.gui.AlignFrame;
import jalview.gui.AlignViewport;
import jalview.gui.AlignmentPanel;
import jalview.gui.CalculationChooser;
import jalview.gui.Desktop;
import jalview.gui.Preferences;
import jalview.gui.PromptUserConfig;
import jalview.gui.StructureViewer;
import jalview.io.AppletFormatAdapter;
import jalview.io.BioJsHTMLOutput;
import jalview.io.DataSourceType;
import jalview.io.FileFormat;
import jalview.io.FileFormatException;
import jalview.io.FileFormatI;
import jalview.io.FileFormats;
import jalview.io.FileLoader;
import jalview.io.HtmlSvgOutput;
import jalview.io.IdentifyFile;
import jalview.io.NewickFile;
import jalview.io.gff.SequenceOntologyFactory;
import jalview.javascript.JSFunctionExec;
import jalview.javascript.MouseOverStructureListener;
import jalview.renderer.seqfeatures.FeatureRenderer;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.ColourSchemeProperty;
import jalview.structure.SelectionSource;
import jalview.structure.VamsasSource;
import jalview.util.MessageManager;
import jalview.util.Platform;
import jalview.ws.jws2.Jws2Discoverer;
import java.applet.AppletContext;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Policy;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import netscape.javascript.JSObject;
/**
* Main class for Jalview Application
*
* start with: java -classpath "$PATH_TO_LIB$/*:$PATH_TO_CLASSES$" \
* jalview.bin.Jalview
*
* or on Windows: java -classpath "$PATH_TO_LIB$/*;$PATH_TO_CLASSES$" \
* jalview.bin.Jalview jalview.bin.Jalview
*
* (ensure -classpath arg is quoted to avoid shell expansion of '*' and do not
* embellish '*' to e.g. '*.jar')
*
* @author $author$
* @version $Revision$
*/
public class Jalview implements ApplicationSingletonI, JalviewJSApi
{
public static Jalview getInstance()
{
return (Jalview) ApplicationSingletonProvider
.getInstance(Jalview.class);
}
private Jalview()
{
}
static
{
Platform.getURLCommandArguments();
}
private boolean headless;
public static boolean isHeadlessMode()
{
return getInstance().headless;
}
private Desktop desktop;
private AlignFrame currentAlignFrame;
public boolean isJavaAppletTag;
public String appletResourcePath;
JalviewAppLoader appLoader;
protected JSFunctionExec jsFunctionExec;
private boolean noCalculation, noMenuBar, noStatus;
private boolean noAnnotation;
public boolean getStartCalculations()
{
return !noCalculation;
}
public boolean getAllowMenuBar()
{
return !noMenuBar;
}
public boolean getShowStatus()
{
return !noStatus;
}
public boolean getShowAnnotation()
{
return !noAnnotation;
}
public static AlignFrame getCurrentAlignFrame()
{
return getInstance().currentAlignFrame;
}
public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
{
getInstance().currentAlignFrame = currentAlignFrame;
}
static
{
if (!Platform.isJS())
/**
* Java only
*
* @j2sIgnore
*/
{
// grab all the rights we can for the JVM
Policy.setPolicy(new Policy()
{
@Override
public PermissionCollection getPermissions(CodeSource codesource)
{
Permissions perms = new Permissions();
perms.add(new AllPermission());
return (perms);
}
@Override
public void refresh()
{
}
});
}
}
/**
* keep track of feature fetching tasks.
*
* @author JimP
*
*/
class FeatureFetcher
{
/*
* TODO: generalise to track all jalview events to orchestrate batch
* processing events.
*/
private int queued = 0;
private int running = 0;
public FeatureFetcher()
{
}
public void addFetcher(final AlignFrame af,
final Vector dasSources)
{
final long id = System.currentTimeMillis();
queued++;
final FeatureFetcher us = this;
new Thread(new Runnable()
{
@Override
public void run()
{
synchronized (us)
{
queued--;
running++;
}
af.setProgressBar(MessageManager
.getString("status.das_features_being_retrived"), id);
af.featureSettings_actionPerformed(null);
af.setProgressBar(null, id);
synchronized (us)
{
running--;
}
}
}).start();
}
public synchronized boolean allFinished()
{
return queued == 0 && running == 0;
}
}
/**
* main class for Jalview application
*
* @param args
* open filename
*/
public static void main(String[] args)
{
// Platform.startJavaLogging();
getInstance().doMain(args);
}
@SuppressWarnings("unused")
/**
* @param args
*/
void doMain(String[] args)
{
boolean isJS = Platform.isJS();
if (isJS)
{
Platform.setAppClass(this);
}
else
{
System.setSecurityManager(null);
}
System.out
.println("Java version: " + System.getProperty("java.version"));
System.out.println(System.getProperty("os.arch") + " "
+ System.getProperty("os.name") + " "
+ System.getProperty("os.version"));
ArgsParser aparser = new ArgsParser(args);
String usrPropsFile = aparser.getValue(ArgsParser.PROPS);
Cache.loadProperties(usrPropsFile);
if (isJS)
{
isJavaAppletTag = aparser.isApplet();
if (isJavaAppletTag)
{
Preferences.setAppletDefaults();
Cache.loadProperties(usrPropsFile); // again, because we
// might be changing defaults here?
}
System.out.println(
"