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