1 8 package com.mountainminds.eclemma.internal.core; 9 10 import java.io.File ; 11 import java.io.IOException ; 12 import java.util.ArrayList ; 13 import java.util.List ; 14 import java.util.Properties ; 15 16 import org.eclipse.core.runtime.CoreException; 17 import org.eclipse.core.runtime.IPath; 18 import org.eclipse.core.runtime.IProgressMonitor; 19 import org.eclipse.core.runtime.SubProgressMonitor; 20 import org.eclipse.osgi.util.NLS; 21 22 import com.mountainminds.eclemma.core.EclEmmaStatus; 23 import com.mountainminds.eclemma.core.ICoverageSession; 24 import com.mountainminds.eclemma.core.IInstrumentation; 25 import com.mountainminds.eclemma.core.ISessionExporter; 26 import com.mountainminds.eclemma.core.ISourceLocation; 27 import com.vladium.emma.data.DataFactory; 28 import com.vladium.emma.data.ICoverageData; 29 import com.vladium.emma.data.IMergeable; 30 import com.vladium.emma.data.IMetaData; 31 import com.vladium.emma.data.ISessionData; 32 import com.vladium.emma.data.SessionData; 33 import com.vladium.emma.report.IReportProperties; 34 import com.vladium.emma.report.ReportProcessor; 35 36 42 public class SessionExporter implements ISessionExporter { 43 44 private static final String PROP_OUT_FILE = IReportProperties.PREFIX + IReportProperties.OUT_FILE; 45 46 private final ICoverageSession session; 47 private int format; 48 private String destination; 49 private Properties options; 50 51 public SessionExporter(ICoverageSession session) { 52 this.session = session; 53 } 54 55 public void setFormat(int format) { 56 this.format = format; 57 } 58 59 public void setDestination(String filename) { 60 this.destination = filename; 61 } 62 63 public void setReportOptions(Properties options) { 64 this.options = options; 65 } 66 67 public void export(IProgressMonitor monitor) throws CoreException { 68 if (format == EMMA_FORMAT) { 69 createSessionFile(monitor); 70 } else { 71 createReport(monitor); 72 } 73 } 74 75 private void createReport(IProgressMonitor monitor) throws CoreException { 76 IInstrumentation[] instrs = session.getInstrumentations(); 77 IPath[] coveragefiles = session.getCoverageDataFiles(); 78 monitor.beginTask(NLS.bind(CoreMessages.ExportingSession_task, session.getDescription()), 79 instrs.length + coveragefiles.length + 1); 80 List datapath = new ArrayList (); 81 List sourcepath = new ArrayList (); 82 for (int i = 0; i < instrs.length; i++) { 83 if (instrs[i].getMetaDataFile().toFile().exists()) { 84 datapath.add(instrs[i].getMetaDataFile().toOSString()); 85 if (format == HTML_FORMAT) { 86 ISourceLocation[] srcs = instrs[i].getClassFiles().getSourceLocations(); 87 IProgressMonitor srcmonitor = new SubProgressMonitor(monitor, 1); 88 srcmonitor.beginTask("", srcs.length); for (int j = 0; j < srcs.length; j++) { 90 srcs[j].extract(new SubProgressMonitor(srcmonitor, 1)); 91 sourcepath.add(srcs[j].getPath().toOSString()); 92 } 93 srcmonitor.done(); 94 } else { 95 monitor.worked(1); 96 } 97 } else { 98 monitor.worked(1); 99 } 100 } 101 for (int i = 0; i < coveragefiles.length; i++) { 102 datapath.add(coveragefiles[i].toOSString()); 103 monitor.worked(1); 104 } 105 ReportProcessor processor = ReportProcessor.create(); 106 processor.setDataPath((String []) datapath.toArray(new String [0])); 107 processor.setSourcePath((String []) sourcepath.toArray(new String [0])); 108 processor.setReportTypes(new String [] { DEFAULT_EXTENSIONS[format] }); 109 Properties props = new Properties (options); 110 props.setProperty(PROP_OUT_FILE, destination); 111 processor.setPropertyOverrides(props); 112 processor.run(); 113 monitor.done(); 114 } 115 116 private void createSessionFile(IProgressMonitor monitor) throws CoreException { 117 IInstrumentation[] instrs = session.getInstrumentations(); 118 IPath[] coveragefiles = session.getCoverageDataFiles(); 119 monitor.beginTask(NLS.bind(CoreMessages.ExportingSession_task, session.getDescription()), 120 instrs.length + coveragefiles.length + 1); 121 IMergeable metadata = null; 122 for (int i = 0; i < instrs.length; i++) { 123 metadata = loadDataFile(metadata, DataFactory.TYPE_METADATA, instrs[i].getMetaDataFile()); 124 monitor.worked(1); 125 } 126 IMergeable coveragedata = null; 127 for (int i = 0; i < coveragefiles.length; i++) { 128 coveragedata = loadDataFile(coveragedata, DataFactory.TYPE_COVERAGEDATA, coveragefiles[i]); 129 monitor.worked(1); 130 } 131 ISessionData sessiondata = new SessionData((IMetaData) metadata, (ICoverageData) coveragedata); 132 try { 133 DataFactory.persist(sessiondata, new File (destination), false); 134 } catch (IOException e) { 135 throw new CoreException(EclEmmaStatus.COVERAGEDATA_FILE_READ_ERROR 136 .getStatus(destination, e)); 137 } 138 monitor.done(); 139 } 140 141 private IMergeable loadDataFile(IMergeable data, int type, IPath path) 142 throws CoreException { 143 try { 144 File f = path.toFile(); 145 if (f.exists()) { 146 IMergeable newdata = DataFactory.load(f)[type]; 147 data = data == null ? newdata : data.merge(newdata); 148 } 149 return data; 150 } catch (IOException e) { 151 if (type == DataFactory.TYPE_COVERAGEDATA) { 152 throw new CoreException(EclEmmaStatus.COVERAGEDATA_FILE_READ_ERROR 153 .getStatus(path, e)); 154 } else { 155 throw new CoreException(EclEmmaStatus.METADATA_FILE_READ_ERROR 156 .getStatus(path, e)); 157 } 158 } 159 } 160 161 } 162 | Popular Tags |