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 */
023package com.jcoverage.coverage;
024
025import java.io.File;
026import java.io.FileInputStream;
027import java.io.FileNotFoundException;
028import java.io.FileOutputStream;
029import java.io.IOException;
030import java.io.InputStream;
031import java.io.ObjectInputStream;
032import java.io.ObjectOutputStream;
033
034import java.util.Collections;
035import java.util.HashMap;
036import java.util.Iterator;
037import java.util.Map;
038import java.util.Set;
039
040import org.apache.log4j.Logger;
041
042
043public class InstrumentationPersistence implements HasBeenInstrumented {
044  static final Logger logger=Logger.getLogger(InstrumentationPersistence.class);
045
046  final Map instrumentation=new HashMap();
047
048  protected InstrumentationPersistence() {
049  }
050
051  protected Map loadInstrumentation() {
052    File directory=getDirectory();
053    
054    if(logger.isInfoEnabled()) {
055      logger.info("loading: "+directory+'/'+Instrumentation.FILE_NAME);
056    }
057
058    try {
059      return loadInstrumentation(new FileInputStream(new File(directory,Instrumentation.FILE_NAME)));
060    } catch(FileNotFoundException ex) {
061      logger.info(ex);
062      return Collections.EMPTY_MAP;
063    }
064  }
065
066  protected Map loadInstrumentation(InputStream is) {
067    ObjectInputStream objects=null;
068    try {
069      objects=new ObjectInputStream(is);
070      Map m=(Map)objects.readObject();
071      if(logger.isInfoEnabled()) {
072        logger.info("loaded "+m.size()+" entries.");
073      }
074      return m;
075    } catch(ClassNotFoundException ex) {
076      logger.error(ex);
077      return Collections.EMPTY_MAP;
078    } catch(IOException ex) {
079      logger.error(ex);
080      return Collections.EMPTY_MAP;
081    } finally {
082      if(objects!=null) {
083        try {
084          objects.close();
085        } catch(IOException ex) {
086          if(logger.isDebugEnabled()) {
087            logger.debug(ex);
088          }
089        }
090      }
091
092      if(is!=null) {
093        try {
094          is.close();
095        } catch(IOException ex) {
096          if(logger.isDebugEnabled()) {
097            logger.debug(ex);
098          }
099        }
100      }
101    }
102  }
103
104  protected void merge(Map m) {
105    Iterator i=m.entrySet().iterator();
106    while(i.hasNext()) {
107      Map.Entry entry=(Map.Entry)i.next();
108      if(instrumentation.containsKey(entry.getKey())) {
109        getInstrumentation(entry.getKey()).merge((Instrumentation)entry.getValue());
110      } else {
111        instrumentation.put(entry.getKey(),entry.getValue());
112      }
113    }
114  }
115  
116  private File getDirectory() {
117    if (System.getProperty("com.jcoverage.rawcoverage.dir")!=null) {
118      return new File(System.getProperty("com.jcoverage.rawcoverage.dir"));
119    } else {
120      return new File(System.getProperty("user.dir"));
121    }
122  }
123
124  protected void saveInstrumentation() {
125    File directory=getDirectory();
126    
127    if(logger.isInfoEnabled()) {
128      logger.info("saving: "+directory+'/'+Instrumentation.FILE_NAME);
129    }
130
131    saveInstrumentation(directory);
132  }
133
134  protected void saveInstrumentation(File destDir) {
135    FileOutputStream os=null;
136    ObjectOutputStream objects=null;
137
138    try {
139      os=new FileOutputStream(new File(destDir,Instrumentation.FILE_NAME));
140      objects=new ObjectOutputStream(os);
141      objects.writeObject(instrumentation);
142      if(logger.isInfoEnabled()) {
143        logger.info("saved "+instrumentation.size()+" entries.");
144      }
145    } catch(IOException ex) {
146      logger.error(ex);
147    } finally {
148      if(objects!=null) {
149        try {
150          objects.close();
151        } catch(IOException ex) {
152          if(logger.isDebugEnabled()) {
153            logger.debug(ex);
154          }
155        }
156      }
157
158      if(os!=null) {
159        try {
160          os.close();
161        } catch(IOException ex) {
162          if(logger.isDebugEnabled()) {
163            logger.debug(ex);
164          }
165        }
166      }
167    }
168  }
169
170  protected Instrumentation getInstrumentation(Object key) {
171    return (Instrumentation)instrumentation.get(key);
172  }
173
174  protected Set keySet() {
175    return Collections.unmodifiableSet(instrumentation.keySet());
176  }
177
178}