001 /*
002 * Cobertura - http://cobertura.sourceforge.net/
003 *
004 * Copyright (C) 2003 jcoverage ltd.
005 * Copyright (C) 2005 Mark Doliner
006 * Copyright (C) 2007 Joakim Erdfelt
007 *
008 * Cobertura is free software; you can redistribute it and/or modify
009 * it under the terms of the GNU General Public License as published
010 * by the Free Software Foundation; either version 2 of the License,
011 * or (at your option) any later version.
012 *
013 * Cobertura is distributed in the hope that it will be useful, but
014 * WITHOUT ANY WARRANTY; without even the implied warranty of
015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016 * General Public License for more details.
017 *
018 * You should have received a copy of the GNU General Public License
019 * along with Cobertura; if not, write to the Free Software
020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
021 * USA
022 */
023
024 package net.sourceforge.cobertura.coveragedata;
025
026 import net.sourceforge.cobertura.util.ConfigurationUtil;
027
028 import java.io.File;
029 import java.io.FileInputStream;
030 import java.io.FileOutputStream;
031 import java.io.IOException;
032 import java.io.InputStream;
033 import java.io.ObjectInputStream;
034 import java.io.ObjectOutputStream;
035 import java.io.OutputStream;
036
037 /**
038 * This contains methods used for reading and writing the
039 * "cobertura.ser" file.
040 */
041 public abstract class CoverageDataFileHandler implements HasBeenInstrumented
042 {
043 private static File defaultFile = null;
044
045 public static File getDefaultDataFile()
046 {
047 // return cached defaultFile
048 if (defaultFile != null)
049 {
050 return defaultFile;
051 }
052
053 // load and cache datafile configuration
054 ConfigurationUtil config = new ConfigurationUtil();
055 defaultFile = new File(config.getDatafile());
056
057 return defaultFile;
058 }
059
060 public static ProjectData loadCoverageData(File dataFile)
061 {
062 InputStream is = null;
063
064 //System.out.println("Cobertura: Loading coverage data from " + dataFile.getAbsolutePath());
065 try
066 {
067 is = new FileInputStream(dataFile);
068 return loadCoverageData(is);
069 }
070 catch (IOException e)
071 {
072 System.err.println("Cobertura: Error reading file "
073 + dataFile.getAbsolutePath() + ": "
074 + e.getLocalizedMessage());
075 return null;
076 }
077 finally
078 {
079 if (is != null)
080 try
081 {
082 is.close();
083 }
084 catch (IOException e)
085 {
086 System.err.println("Cobertura: Error closing file "
087 + dataFile.getAbsolutePath() + ": "
088 + e.getLocalizedMessage());
089 }
090 }
091 }
092
093 private static ProjectData loadCoverageData(InputStream dataFile) throws IOException
094 {
095 ObjectInputStream objects = null;
096
097 try
098 {
099 objects = new ObjectInputStream(dataFile);
100 ProjectData projectData = (ProjectData)objects.readObject();
101 System.out.println("Cobertura: Loaded information on "
102 + projectData.getNumberOfClasses() + " classes.");
103 return projectData;
104 }
105 catch (IOException e) {
106 throw e;
107 }
108 catch (Exception e)
109 {
110 System.err.println("Cobertura: Error reading from object stream.");
111 e.printStackTrace();
112 return null;
113 }
114 finally
115 {
116 if (objects != null)
117 {
118 try
119 {
120 objects.close();
121 }
122 catch (IOException e)
123 {
124 System.err
125 .println("Cobertura: Error closing object stream.");
126 e.printStackTrace();
127 }
128 }
129 }
130 }
131
132 public static void saveCoverageData(ProjectData projectData,
133 File dataFile)
134 {
135 FileOutputStream os = null;
136
137 //System.out.println("Cobertura: Saving coverage data to " + dataFile.getAbsolutePath());
138 try
139 {
140 File dataDir = dataFile.getParentFile();
141 if( (dataDir != null) && !dataDir.exists() )
142 {
143 dataDir.mkdirs();
144 }
145 os = new FileOutputStream(dataFile);
146 saveCoverageData(projectData, os);
147 }
148 catch (IOException e)
149 {
150 System.err.println("Cobertura: Error writing file "
151 + dataFile.getAbsolutePath());
152 e.printStackTrace();
153 }
154 finally
155 {
156 if (os != null)
157 {
158 try
159 {
160 os.close();
161 }
162 catch (IOException e)
163 {
164 System.err.println("Cobertura: Error closing file "
165 + dataFile.getAbsolutePath());
166 e.printStackTrace();
167 }
168 }
169 }
170 }
171
172 private static void saveCoverageData(ProjectData projectData,
173 OutputStream dataFile)
174 {
175 ObjectOutputStream objects = null;
176
177 try
178 {
179 objects = new ObjectOutputStream(dataFile);
180 objects.writeObject(projectData);
181 System.out.println("Cobertura: Saved information on " + projectData.getNumberOfClasses() + " classes.");
182 }
183 catch (IOException e)
184 {
185 System.err.println("Cobertura: Error writing to object stream.");
186 e.printStackTrace();
187 }
188 finally
189 {
190 if (objects != null)
191 {
192 try
193 {
194 objects.close();
195 }
196 catch (IOException e)
197 {
198 System.err
199 .println("Cobertura: Error closing object stream.");
200 e.printStackTrace();
201 }
202 }
203 }
204 }
205
206 }