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.io.FileOutputStream;
029 import java.io.IOException;
030 import java.io.InputStream;
031 import java.io.ObjectInputStream;
032 import java.io.ObjectOutputStream;
033
034 import java.util.Collections;
035 import java.util.HashMap;
036 import java.util.Iterator;
037 import java.util.Map;
038 import java.util.Set;
039
040 import org.apache.log4j.Logger;
041
042
043 public 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 }