001 /** 002 * www.jcoverage.com 003 * Copyright (C)2003 jcoverage ltd. 004 * 005 * This file is part of jcoverage. 006 * 007 * jcoverage is free software; you can redistribute it and/or modify 008 * it under the terms of the GNU General Public License as published 009 * by the Free Software Foundation; either version 2 of the License, 010 * or (at your option) any later version. 011 * 012 * jcoverage is distributed in the hope that it will be useful, but 013 * WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * General Public License for more details. 016 * 017 * You should have received a copy of the GNU General Public License 018 * along with jcoverage; if not, write to the Free Software 019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 020 * USA 021 * 022 */ 023 package com.jcoverage.coverage; 024 025 import java.io.File; 026 import java.io.FileInputStream; 027 import java.io.FileNotFoundException; 028 import java.util.Map; 029 import java.util.Timer; 030 031 import org.apache.log4j.Logger; 032 033 034 public class InstrumentationFactory extends InstrumentationPersistence implements Runnable,HasBeenInstrumented { 035 036 static final Logger logger=Logger.getLogger(InstrumentationFactory.class); 037 static final InstrumentationFactory instrumentationFactory=new InstrumentationFactory(); 038 039 Timer timer=new Timer(true); 040 041 private InstrumentationFactory() { 042 merge(loadInstrumentation()); 043 044 if(logger.isInfoEnabled()) { 045 logger.info("loaded: "+keySet().size()+" items."); 046 } 047 048 if(getInstrumentationInterval()>0) { 049 timer.schedule(new SaveInstrumentationTask(this),getInstrumentationInterval(),getInstrumentationInterval()); 050 } 051 052 Runtime.getRuntime().addShutdownHook(new Thread(this)); 053 } 054 055 int getInstrumentationInterval() { 056 return Integer.getInteger("com.jcoverage.instrumentation.interval",0).intValue()*1000; 057 } 058 059 public void run() { 060 if(logger.isInfoEnabled()) { 061 logger.info("shutdown hook started"); 062 } 063 064 saveInstrumentation(); 065 066 if(logger.isInfoEnabled()) { 067 logger.info("saved: "+keySet().size()+" items."); 068 } 069 070 if(logger.isInfoEnabled()) { 071 logger.info("shutdown hook has finished"); 072 } 073 } 074 075 public static InstrumentationFactory getInstance() { 076 return instrumentationFactory; 077 } 078 079 public Instrumentation newInstrumentation(Class cl) { 080 if(logger.isDebugEnabled()) { 081 logger.debug("cl: "+cl.getName()); 082 } 083 084 return newInstrumentation(cl.getName()); 085 } 086 087 public Instrumentation newInstrumentation(String className) { 088 if(logger.isDebugEnabled()) { 089 logger.debug("className: "+className); 090 } 091 092 if(!instrumentation.containsKey(className)) { 093 instrumentation.put(className,new InstrumentationImpl()); 094 } 095 return (Instrumentation)instrumentation.get(className); 096 } 097 }