| /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under |
| * the terms of the Common Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * $Id: RTCoverageDataPersister.java,v 1.1.2.2 2004/07/16 23:32:03 vlad_r Exp $ |
| */ |
| package com.vladium.emma.rt; |
| |
| import java.io.File; |
| |
| import com.vladium.emma.IAppConstants; |
| import com.vladium.emma.data.DataFactory; |
| import com.vladium.emma.data.ICoverageData; |
| import com.vladium.logging.Logger; |
| |
| // ---------------------------------------------------------------------------- |
| /** |
| * @author Vlad Roubtsov, (C) 2004 |
| */ |
| abstract |
| class RTCoverageDataPersister |
| { |
| // public: ................................................................ |
| |
| // protected: ............................................................. |
| |
| // package: ............................................................... |
| |
| /* |
| * Stateless package-private method shared by RT and RTExitHook for coverage |
| * data persistence. This method was moved out of RT class after build 4120 |
| * in order to decrease classloading dependency set for RTExitHook |
| * (FR SF978671). |
| */ |
| static void dumpCoverageData (final ICoverageData cdata, final boolean useSnapshot, |
| final File outFile, final boolean merge) |
| { |
| try |
| { |
| if (cdata != null) |
| { |
| // use method-scoped loggers everywhere in RT: |
| final Logger log = Logger.getLogger (); |
| final boolean info = log.atINFO (); |
| |
| final long start = info ? System.currentTimeMillis () : 0; |
| { |
| final ICoverageData cdataView = useSnapshot ? cdata.shallowCopy () : cdata; |
| |
| synchronized (Object.class) // fake a JVM-global critical section when multilply loaded RT's write to the same file |
| { |
| DataFactory.persist (cdataView, outFile, merge); |
| } |
| } |
| if (info) |
| { |
| final long end = System.currentTimeMillis (); |
| |
| log.info ("runtime coverage data " + (merge ? "merged into" : "written to") + " [" + outFile.getAbsolutePath () + "] {in " + (end - start) + " ms}"); |
| } |
| } |
| } |
| catch (Throwable t) |
| { |
| // log |
| t.printStackTrace (); |
| |
| // TODO: do better chaining in JRE 1.4+ |
| throw new RuntimeException (IAppConstants.APP_NAME + " failed to dump coverage data: " + t.toString ()); |
| } |
| } |
| |
| // private: ............................................................... |
| |
| } // end of class |
| // ---------------------------------------------------------------------------- |