1/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2 *
3 * This program and the accompanying materials are made available under
4 * the terms of the Common Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/cpl-v10.html
6 *
7 * $Id: reportCommand.java,v 1.1.1.1.2.1 2004/07/16 23:32:29 vlad_r Exp $
8 */
9package com.vladium.emma.report;
10
11import java.io.IOException;
12
13import com.vladium.util.ClassLoaderResolver;
14import com.vladium.util.Strings;
15import com.vladium.util.args.IOptsParser;
16import com.vladium.util.asserts.$assert;
17import com.vladium.emma.Command;
18import com.vladium.emma.IAppConstants;
19import com.vladium.emma.IAppErrorCodes;
20import com.vladium.emma.EMMARuntimeException;
21
22// ----------------------------------------------------------------------------
23/**
24 * @author Vlad Roubtsov, (C) 2003
25 */
26public
27final class reportCommand extends Command
28{
29    // public: ................................................................
30
31    public reportCommand (final String usageToolName, final String [] args)
32    {
33        super (usageToolName, args);
34    }
35
36    public synchronized void run ()
37    {
38        ClassLoader loader;
39        try
40        {
41            loader = ClassLoaderResolver.getClassLoader ();
42        }
43        catch (Throwable t)
44        {
45            loader = getClass ().getClassLoader ();
46        }
47
48        try
49        {
50            // process 'args':
51            {
52                final IOptsParser parser = getOptParser (loader);
53                final IOptsParser.IOpts parsedopts = parser.parse (m_args);
54
55                // check if usage is requested before checking args parse errors etc:
56                {
57                    final int usageRequestLevel = parsedopts.usageRequestLevel ();
58
59                    if (usageRequestLevel > 0)
60                    {
61                        usageexit (parser, usageRequestLevel, null);
62                        return;
63                    }
64                }
65
66                final IOptsParser.IOpt [] opts = parsedopts.getOpts ();
67
68                if (opts == null) // this means there were args parsing errors
69                {
70                    parsedopts.error (m_out, STDOUT_WIDTH);
71                    usageexit (parser, IOptsParser.SHORT_USAGE, null);
72                    return;
73                }
74
75                // process parsed args:
76
77                try
78                {
79                    for (int o = 0; o < opts.length; ++ o)
80                    {
81                        final IOptsParser.IOpt opt = opts [o];
82                        final String on = opt.getCanonicalName ();
83
84                        if (! processOpt (opt))
85                        {
86                            if ("in".equals (on))
87                            {
88                                m_datapath = getListOptValue (opt, PATH_DELIMITERS, true);
89                            }
90                            else if ("sp".equals (on))
91                            {
92                                m_srcpath = getListOptValue (opt, PATH_DELIMITERS, true);
93                            }
94                            else if ("r".equals (on))
95                            {
96                                m_reportTypes = Strings.merge (opt.getValues (), COMMA_DELIMITERS, true);
97                            }
98                        }
99                    }
100
101                    // user '-props' file property overrides:
102
103                    if (! processFilePropertyOverrides ()) return;
104
105                    // process prefixed opts:
106
107                    processCmdPropertyOverrides (parsedopts);
108                }
109                catch (IOException ioe)
110                {
111                    throw new EMMARuntimeException (IAppErrorCodes.ARGS_IO_FAILURE, ioe);
112                }
113
114                // handle cmd line-level defaults:
115                {
116                }
117            }
118
119            // run the reporter:
120            {
121                final ReportProcessor processor = ReportProcessor.create ();
122                processor.setAppName (IAppConstants.APP_NAME); // for log prefixing
123
124                processor.setDataPath (m_datapath);
125                processor.setSourcePath (m_srcpath);
126                if ($assert.ENABLED) $assert.ASSERT (m_reportTypes != null, "m_reportTypes no set");
127                processor.setReportTypes (m_reportTypes); // no "txt" default for report processor
128                processor.setPropertyOverrides (m_propertyOverrides);
129
130                processor.run ();
131            }
132        }
133        catch (EMMARuntimeException yre)
134        {
135            // TODO: see below
136
137            exit (true, yre.getMessage (), yre, RC_UNEXPECTED); // does not return
138            return;
139        }
140        catch (Throwable t)
141        {
142            // TODO: embed: OS/JVM fingerprint, build #, etc
143            // TODO: save stack trace in a file and prompt user to send it to ...
144
145            exit (true, "unexpected failure: ", t, RC_UNEXPECTED); // does not return
146            return;
147        }
148
149        exit (false, null, null, RC_OK);
150    }
151
152    // protected: .............................................................
153
154
155    protected void initialize ()
156    {
157        super.initialize ();
158    }
159
160    protected String usageArgsMsg ()
161    {
162        return "[options]";
163    }
164
165    // package: ...............................................................
166
167    // private: ...............................................................
168
169
170    private String [] m_datapath; // list of data files, not a real path
171    private String [] m_srcpath;
172    private String [] m_reportTypes;
173
174} // end of class
175// ----------------------------------------------------------------------------