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: RT.java,v 1.2.2.3 2004/07/16 23:32:03 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.rt;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.File;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.logging.Logger;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.IProperties;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.Property;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.exit.ExitHookManager;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.IAppConstants;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.EMMAProperties;
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.ICoverageData;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.DataFactory;
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 Projectabstract class RT implements IAppConstants
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static synchronized ICoverageData reset (final boolean createCoverageData, final boolean createExitHook)
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // reload the app properties [needs to be done to accomodate classloader rearrangements]:
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // avoid the call context tricks at runtime in case security causes problems,
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // use an explicit caller parameter for getAppProperties():
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ClassLoader loader = RT.class.getClassLoader ();
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (loader == null) loader = ClassLoader.getSystemClassLoader ();
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        IProperties appProperties = null;
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            appProperties = EMMAProperties.getAppProperties (loader);
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (Throwable t)
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: handle better
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            t.printStackTrace (System.out);
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        s_appProperties = appProperties;
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (EXIT_HOOK_MANAGER != null)
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // disable/remove the current hook, if any:
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (s_exitHook != null)
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                 // note: no attempt is made to execute the existing hook, so its coverage
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                 // data may be simply discarded
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                EXIT_HOOK_MANAGER.removeExitHook (s_exitHook);
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                s_exitHook = null;
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ICoverageData cdata = s_cdata; // no sync accessor needed
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (createCoverageData)
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            cdata = DataFactory.newCoverageData ();
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s_cdata = cdata;
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            s_cdata = null;
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (EXIT_HOOK_MANAGER != null)
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (createExitHook && (cdata != null))
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final Runnable exitHook = new RTExitHook (RT.class, cdata, getCoverageOutFile (), getCoverageOutMerge ());
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // FR SF978671: fault all classes that we might need to do coverage
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // data dumping (this forces classdefs to be loaded into classloader
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // class cache and allows output file writing to succeed even if
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // the RT classloader is some component loader (e.g, in a J2EE container)
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // that gets invalidated by the time the exit hook thread is run:
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                RTExitHook.createClassLoaderClosure ();
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (EXIT_HOOK_MANAGER.addExitHook (exitHook))
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    s_exitHook = exitHook;
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // else TODO: log/warn
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return cdata;
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static void r (final boolean [][] coverage, final String classVMName, final long stamp)
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // note that we use class names, not the actual Class objects, as the keys here. This
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // is not the best possible solution because it is not capable of supporting
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // multiply (re)loaded classes within the same app, but the rest of the toolkit
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // isn't designed to support this anyway. Furthermore, this does not interfere
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // with class unloading.
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final ICoverageData cdata = getCoverageData (); // need to use accessor for JMM reasons
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // ['cdata' can be null if a previous call to dumpCoverageData() disabled data collection]
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (cdata != null)
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            synchronized (cdata.lock ())
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // TODO: could something useful be communicated back to the class
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // by returning something here [e.g., unique class ID (solves the
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // issues of class name collisions and class reloading) or RT.class
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // (to prevent RT reloading)]
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                cdata.addClass (coverage, classVMName, stamp);
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static synchronized ICoverageData getCoverageData ()
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s_cdata;
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static synchronized IProperties getAppProperties ()
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return s_appProperties;
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /**
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Public API for forcing coverage data dump.
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param outFile
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param merge
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param stopDataCollection
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static synchronized void dumpCoverageData (File outFile, final boolean merge, final boolean stopDataCollection)
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (DEBUG) System.out.println ("RT::dumpCoverageData() DUMPING " + RT.class.getClassLoader ());
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        outFile = outFile != null ? outFile : getCoverageOutFile ();
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ICoverageData cdata = s_cdata; // no need to use accessor
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (stopDataCollection) s_cdata = null; // TODO: log this NOTE: this does not really stop data collection, merely prevents new class registration
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        RTCoverageDataPersister.dumpCoverageData (cdata, ! stopDataCollection, outFile, merge);
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public static synchronized void dumpCoverageData (File outFile, final boolean stopDataCollection)
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        outFile = outFile != null ? outFile : getCoverageOutFile ();
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ICoverageData cdata = s_cdata; // no need to use accessor
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (stopDataCollection) s_cdata = null; // TODO: log this NOTE: this does not really stop data collection, merely prevents new class registration
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        RTCoverageDataPersister.dumpCoverageData (cdata, ! stopDataCollection, outFile, getCoverageOutMerge ());
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private RT () {} // prevent subclassing
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static File getCoverageOutFile ()
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final IProperties appProperties = getAppProperties (); // sync accessor
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (appProperties != null)
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String property = appProperties.getProperty (EMMAProperties.PROPERTY_COVERAGE_DATA_OUT_FILE,
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                               EMMAProperties.DEFAULT_COVERAGE_DATA_OUT_FILE);
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return new File (property);
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new File (EMMAProperties.DEFAULT_COVERAGE_DATA_OUT_FILE);
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static boolean getCoverageOutMerge ()
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final IProperties appProperties = getAppProperties (); // sync accessor
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (appProperties != null)
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // [Boolean.toString (boolean) is J2SDK 1.4+]
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String property = appProperties.getProperty (EMMAProperties.PROPERTY_COVERAGE_DATA_OUT_MERGE,
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                                               EMMAProperties.DEFAULT_COVERAGE_DATA_OUT_MERGE.toString ());
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return Property.toBoolean (property);
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return EMMAProperties.DEFAULT_COVERAGE_DATA_OUT_MERGE.booleanValue ();
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static ICoverageData s_cdata;
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static Runnable s_exitHook;
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static IProperties s_appProperties; // TODO: this is better of as java.util.Properties
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final ExitHookManager EXIT_HOOK_MANAGER; // set in <clinit>
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private static final boolean DEBUG = false;
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (DEBUG) System.out.println ("RT[" + System.identityHashCode (RT.class) + "]::<clinit>: loaded by " + RT.class.getClassLoader ());
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ExitHookManager temp = null;
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            temp = ExitHookManager.getSingleton ();
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (Throwable t)
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: handle better
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            t.printStackTrace (System.out);
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        EXIT_HOOK_MANAGER = temp;
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (RTSettings.isStandaloneMode ())
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (DEBUG) System.out.println ("RT::<clinit>: STANDALONE MODE");
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // load app props, create coverage data, and register an exit hook for it:
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            reset (true, true);
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // use method-scoped loggers in RT:
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Logger log = Logger.getLogger ();
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (log.atINFO ())
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                log.info ("collecting runtime coverage data ...");
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // load app props only:
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            reset (false, false);
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------