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: mergeCommand.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.data;
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.args.IOptsParser;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.Command;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppConstants;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppErrorCodes;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMARuntimeException;
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class mergeCommand extends Command
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public mergeCommand (final String usageToolName, final String [] args)
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super (usageToolName, args);
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public synchronized void run ()
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ClassLoader loader;
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            loader = ClassLoaderResolver.getClassLoader ();
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (Throwable t)
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            loader = getClass ().getClassLoader ();
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // process 'args':
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final IOptsParser parser = getOptParser (loader);
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final IOptsParser.IOpts parsedopts = parser.parse (m_args);
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // check if usage is requested before checking args parse errors etc:
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final int usageRequestLevel = parsedopts.usageRequestLevel ();
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (usageRequestLevel > 0)
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        usageexit (parser, usageRequestLevel, null);
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        return;
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final IOptsParser.IOpt [] opts = parsedopts.getOpts ();
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (opts == null) // this means there were args parsing errors
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    parsedopts.error (m_out, STDOUT_WIDTH);
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    usageexit (parser, IOptsParser.SHORT_USAGE, null);
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    return;
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // process parsed args:
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                try
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    for (int o = 0; o < opts.length; ++ o)
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final IOptsParser.IOpt opt = opts [o];
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        final String on = opt.getCanonicalName ();
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        if (! processOpt (opt))
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        {
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            if ("in".equals (on))
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            {
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                m_datapath = getListOptValue (opt, PATH_DELIMITERS, true);
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            }
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            else if ("out".equals (on))
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            {
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                m_outFileName = opt.getFirstValue ();
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                            }
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        }
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // user '-props' file property overrides:
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (! processFilePropertyOverrides ()) return;
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    // process prefixed opts:
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    processCmdPropertyOverrides (parsedopts);
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                catch (IOException ioe)
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    throw new EMMARuntimeException (IAppErrorCodes.ARGS_IO_FAILURE, ioe);
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // handle cmd line-level defaults:
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // run the reporter:
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final MergeProcessor processor = MergeProcessor.create ();
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                processor.setAppName (IAppConstants.APP_NAME); // for log prefixing
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                processor.setDataPath (m_datapath);
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                processor.setSessionOutFile (m_outFileName);
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                processor.setPropertyOverrides (m_propertyOverrides);
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                processor.run ();
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (EMMARuntimeException yre)
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: see below
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            exit (true, yre.getMessage (), yre, RC_UNEXPECTED); // does not return
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return;
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (Throwable t)
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: embed: OS/JVM fingerprint, build #, etc
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: save stack trace in a file and prompt user to send it to ...
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            exit (true, "unexpected failure: ", t, RC_UNEXPECTED); // does not return
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return;
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        exit (false, null, null, RC_OK);
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected void initialize ()
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        super.initialize ();
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected String usageArgsMsg ()
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return "[options]";
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private String [] m_datapath; // list of data files, not a real path
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private String m_outFileName;
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------