package net.unit8.waitt.feature.coverage;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
import java.util.logging.Logger;
import net.unit8.waitt.api.ServerMonitor;
import net.unit8.waitt.api.ClassLoaderFactory;
import net.unit8.waitt.api.ConfigurableFeature;
import net.unit8.waitt.api.EmbeddedServer;
import net.unit8.waitt.api.configuration.WebappConfiguration;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
/**
* @author kawasima
*/
public class CoverageMonitor implements ServerMonitor,ConfigurableFeature {
private static final Logger LOG = Logger.getLogger(CoverageMonitor.class.getName());
private final CoverageMonitorConfiguration config;
ExecutorService executorService;
public CoverageMonitor() {
Logger logger = Logger.getLogger(CoverageDataFileHandler.class.getName());
logger.setUseParentHandlers(false);
config = new CoverageMonitorConfiguration();
}
@Override
public void config(WebappConfiguration webappConfig) {
config.setSourceDirectory(webappConfig.getSourceDirectory());
config.setTargetPackages(webappConfig.getPackages());
}
@Override
public void init(EmbeddedServer server) {
final ClassRealm coverageRealm = (ClassRealm) this.getClass().getClassLoader();
server.setClassLoaderFactory(new ClassLoaderFactory() {
@Override
public ClassLoader create(ClassLoader parent) {
coverageRealm.setParentClassLoader(parent);
CoberturaClassLoader ccl = CoberturaClassLoader.create(coverageRealm);
ccl.setTargetPackages(config.getTargetPackages());
return ccl;
}
});
}
@Override
public void start(EmbeddedServer server) {
File reportDirectory = new File("target/coverage");
if (!reportDirectory.exists()) {
reportDirectory.mkdirs();
}
config.setCoverageReportDirectory(reportDirectory);
server.addContext("/_coverage", reportDirectory.getAbsolutePath(), getClass().getClassLoader());
executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
while(true) {
try {
CoberturaClassLoader loader = CoberturaClassLoader.getInstance();
LOG.info("Start reporting Coverage report");
executorService.execute(new ReportGenerator(loader, config));
break;
} catch (IllegalStateException e) {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException ex) {
break;
}
}
}
}
});
}
@Override
public void stop() {
executorService.shutdown();
}
}