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: RTCoverageDataPersister.java,v 1.1.2.2 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.emma.IAppConstants;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.DataFactory;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.emma.data.ICoverageData;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.logging.Logger;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2004
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectclass RTCoverageDataPersister
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /*
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Stateless package-private method shared by RT and RTExitHook for coverage
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * data persistence. This method was moved out of RT class after build 4120
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * in order to decrease classloading dependency set for RTExitHook
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * (FR SF978671).
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static void dumpCoverageData (final ICoverageData cdata, final boolean useSnapshot,
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                                  final File outFile, final boolean merge)
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (cdata != null)
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                // use method-scoped loggers everywhere in RT:
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final Logger log = Logger.getLogger ();
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final boolean info = log.atINFO ();
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final long start = info ? System.currentTimeMillis () : 0;
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final ICoverageData cdataView = useSnapshot ? cdata.shallowCopy () : cdata;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    synchronized (Object.class) // fake a JVM-global critical section when multilply loaded RT's write to the same file
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        DataFactory.persist (cdataView, outFile, merge);
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (info)
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final long end = System.currentTimeMillis ();
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    log.info ("runtime coverage data " + (merge ? "merged into" : "written to") + " [" + outFile.getAbsolutePath () + "] {in " + (end - start) + " ms}");
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (Throwable t)
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // log
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            t.printStackTrace ();
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // TODO: do better chaining in JRE 1.4+
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new RuntimeException (IAppConstants.APP_NAME + " failed to dump coverage data: " + t.toString ());
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------