Can run headless=true
[jalview.git] / src / jalview / bin / Jalview.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.bin;\r
20 \r
21 import jalview.gui.*;\r
22 \r
23 import org.apache.log4j.*;\r
24 \r
25 import javax.swing.*;\r
26 \r
27 import java.util.Vector;\r
28 import jalview.datamodel.Alignment;\r
29 import jalview.io.FormatAdapter;\r
30 import jalview.datamodel.SequenceI;\r
31 \r
32 \r
33 /**\r
34  * Main class for Jalview Application\r
35  * <br>\r
36  * <br>start with java -Djava.ext.dirs=$PATH_TO_LIB$ jalview.bin.Jalview\r
37  *\r
38  * @author $author$\r
39  * @version $Revision$\r
40  */\r
41 public class Jalview\r
42 {\r
43     /**\r
44      * Initialises the Apache Axis logger\r
45      */\r
46     private static void initLogger()\r
47     {\r
48         Logger laxis = Logger.getLogger("org.apache.axis");\r
49         Logger lcastor = Logger.getLogger("org.exolab.castor");\r
50 \r
51         if (Cache.getProperty("logs.Axis.Level") == null)\r
52         {\r
53             Cache.setProperty("logs.Axis.Level", Level.INFO.toString());\r
54         }\r
55 \r
56         if (Cache.getProperty("logs.Castor.Level") == null)\r
57         {\r
58             Cache.setProperty("logs.Castor.Level", Level.INFO.toString());\r
59         }\r
60 \r
61         laxis.setLevel(Level.toLevel(Cache.getProperty("logs.Axis.Level")));\r
62         lcastor.setLevel(Level.toLevel(Cache.getProperty("logs.Castor.Level")));\r
63 \r
64         ConsoleAppender ap = new ConsoleAppender(new SimpleLayout(),\r
65                 "System.err");\r
66         ap.setName("JalviewLogger");\r
67         laxis.addAppender(ap);\r
68         lcastor.addAppender(ap);\r
69     }\r
70 \r
71     /**\r
72      * main class for Jalview application\r
73      *\r
74      * @param args open <em>filename</em>\r
75      */\r
76     public static void main(String[] args)\r
77     {\r
78       ArgsParser aparser = new ArgsParser(args);\r
79       boolean headless = false;\r
80 \r
81       if( aparser.contains("help") || aparser.contains("h") )\r
82       {\r
83         System.out.println("Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"\r
84                            +"-nodisplay\tRun Jalview without User Interface.\n"\r
85                            +"-props FILE\tUse the given Jalview properties file instead of users default.\n"\r
86                            +"-groups FILE\tUse the given file to mark groups on the alignment. \nGroups file is in the following tab delimited format\n"\r
87                            +"TEXT<tab>SEQUENCE_ID<tab>SEQUENCE_INDEX<tab>START_RESIDUE<tab>END_RESIDUE<tab>COLOUR\n"\r
88                            +"SequenceID is used in preference to SequenceIndex if both are provided.\n"\r
89                            +"Enter ID_NOT_SPECIFIED for SEQUENCE_ID or -1 for SEQUENCE_INDEX if unknown.\n"\r
90                            +"COLOUR can be hexadecimal RGB or 'red', 'blue' etc.\n\n"\r
91                            +"-fasta FILE\tCreate alignment file FILE in Fasta format.\n"\r
92                            +"-clustal FILE\tCreate alignment file FILE in Clustal format.\n"\r
93                            +"-pfam FILE\tCreate alignment file FILE in PFAM format.\n"\r
94                            +"-msf FILE\tCreate alignment file FILE in MSF format.\n"\r
95                            +"-pileup FILE\tCreate alignment file FILE in Pileup format\n"\r
96                            +"-pir FILE\tCreate alignment file FILE in PIR format.\n"\r
97                            +"-blc FILE\tCreate alignment file FILE in BLC format.\n"\r
98                            +"-jalview FILE\tCreate alignment file FILE in Jalview format.\n"\r
99                            +"-png FILE\tCreate PNG image FILE from alignment.\n"\r
100                            +"-imgMap FILE\tCreate HTML file FILE with image map of PNG image.\n"\r
101                            +"-eps FILE\tCreate EPS file FILE from alignment.");\r
102         System.exit(0);\r
103           }\r
104 \r
105 \r
106      if (aparser.contains("nodisplay"))\r
107       System.setProperty("java.awt.headless", "true");\r
108 \r
109     if(   System.getProperty("java.awt.headless") != null\r
110           && System.getProperty("java.awt.headless").equals("true"))\r
111       {\r
112         headless = true;\r
113       }\r
114 \r
115 \r
116         Cache.loadProperties(aparser.getValue("props"));\r
117         jalview.gui.Preferences.initPreferences();\r
118         try\r
119         {\r
120           initLogger();\r
121         }\r
122         catch (Exception e)\r
123         {\r
124           System.err.println("Problems initializing the log4j system\n");\r
125         }\r
126 \r
127 \r
128         Desktop desktop = null;\r
129         if( !headless )\r
130         {\r
131           try\r
132           {\r
133             UIManager.setLookAndFeel(\r
134                 //  "javax.swing.plaf.metal.MetalLookAndFeel"\r
135                 //  "javax.swing.plaf.multi.MultiLookAndFeel"\r
136                 UIManager.getSystemLookAndFeelClassName());\r
137           }\r
138           catch (Exception ex)\r
139           {\r
140           }\r
141 \r
142           desktop = new Desktop();\r
143           desktop.setVisible(true);\r
144         }\r
145 \r
146 \r
147          String file = null, protocol = null, format = null, groups=null;\r
148          jalview.io.FileLoader fileLoader = new jalview.io.FileLoader();\r
149 \r
150           file = aparser.getValue("open");\r
151 \r
152           if (file == null && desktop==null)\r
153           {\r
154             System.out.println("No files to open!");\r
155             System.exit(1);\r
156           }\r
157 \r
158           if(file!=null)\r
159           {\r
160 \r
161             if (!file.startsWith("http://"))\r
162             {\r
163               if (! (new java.io.File(file)).exists())\r
164               {\r
165                 System.out.println("Can't find " + file);\r
166                 System.exit(1);\r
167               }\r
168             }\r
169 \r
170             protocol = "File";\r
171 \r
172             if (file.indexOf("http:") > -1)\r
173             {\r
174               protocol = "URL";\r
175             }\r
176 \r
177             if (file.endsWith(".jar"))\r
178               format = "Jalview";\r
179             else\r
180               format = jalview.io.IdentifyFile.Identify(file, protocol);\r
181 \r
182             System.out.println("Opening: " + format + " file " + file);\r
183 \r
184             AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format);\r
185 \r
186             groups = aparser.getValue("groups");\r
187             if (groups != null)\r
188             {\r
189               af.parseGroupsFile(groups);\r
190             }\r
191 \r
192             String imageName = "unnamed.png";\r
193             while (aparser.getSize() > 1)\r
194             {\r
195               format = aparser.nextValue();\r
196               file = aparser.nextValue();\r
197 \r
198               if (format.equalsIgnoreCase("png"))\r
199               {\r
200                 af.createPNG(new java.io.File(file));\r
201                 imageName = (new java.io.File(file)).getName();\r
202                 System.out.println("Creating PNG image: " + file);\r
203                 continue;\r
204               }\r
205               else if (format.equalsIgnoreCase("imgMap"))\r
206               {\r
207                 af.createImageMap(new java.io.File(file), imageName);\r
208                 System.out.println("Creating image map: " + file);\r
209                 continue;\r
210               }\r
211               else if (format.equalsIgnoreCase("eps"))\r
212               {\r
213                 System.out.println("Creating EPS file: " + file);\r
214                 af.createEPS(new java.io.File(file));\r
215                 continue;\r
216               }\r
217 \r
218               if (af.saveAlignment(file, format))\r
219                 System.out.println("Written alignment in " + format +\r
220                                    " format to " + file);\r
221               else\r
222                 System.out.println("Error writing file " + file + " in " + format +\r
223                                    " format!!");\r
224 \r
225             }\r
226 \r
227             while (aparser.getSize() > 0)\r
228             {\r
229               System.out.println("Unknown arg: " + aparser.nextValue());\r
230             }\r
231           }\r
232 \r
233         // We'll only open the default file if the desktop is visible.\r
234         //////////////////////\r
235           if (\r
236               !headless &&\r
237               jalview.gui.Preferences.showStartupFile &&\r
238               jalview.gui.Preferences.startupFile != null)\r
239           {\r
240 \r
241             file = jalview.gui.Preferences.startupFile;\r
242             protocol = "File";\r
243 \r
244             if (file.indexOf("http:") > -1)\r
245             {\r
246               protocol = "URL";\r
247             }\r
248 \r
249             if (file.endsWith(".jar"))\r
250             {\r
251               Jalview2XML.LoadJalviewAlign(file);\r
252             }\r
253             else\r
254             {\r
255               format = jalview.io.IdentifyFile.Identify(file, protocol);\r
256               desktop.LoadFile(file, protocol, format);\r
257             }\r
258           }\r
259 \r
260 \r
261           if (desktop==null)\r
262             System.exit(0);\r
263     }\r
264 }\r
265 \r
266  class ArgsParser\r
267  {\r
268    Vector vargs = null;\r
269    public ArgsParser(String [] args)\r
270    {\r
271      vargs = new Vector();\r
272      for (int i = 0; i < args.length; i++)\r
273      {\r
274        String arg = args[i].trim();\r
275        if (arg.charAt(0) == '-')\r
276          arg = arg.substring(1);\r
277        vargs.addElement(arg);\r
278      }\r
279    }\r
280 \r
281    public String getValue(String arg)\r
282    {\r
283      int index = vargs.indexOf(arg);\r
284      String ret = null;\r
285      if (index != -1)\r
286      {\r
287        ret = vargs.elementAt(index + 1).toString();\r
288        vargs.removeElementAt(index);\r
289        vargs.removeElementAt(index);\r
290      }\r
291      return ret;\r
292    }\r
293 \r
294    public boolean contains(String arg)\r
295    {\r
296      if(vargs.contains(arg))\r
297      {\r
298        vargs.removeElement(arg);\r
299        return true;\r
300      }\r
301      else\r
302        return false;\r
303    }\r
304 \r
305    public String nextValue()\r
306    {\r
307      return  vargs.remove(0).toString();\r
308    }\r
309 \r
310    public int getSize()\r
311    {\r
312      return vargs.size();\r
313    }\r
314 \r
315  }\r