/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.coverage.standalone;
import java.io.*;
import java.lang.management.*;
import java.lang.reflect.*;
import javax.annotation.*;
import javax.management.*;
import mockit.coverage.*;
public final class CoverageControl extends StandardMBean implements CoverageControlMBean
{
public static void create()
{
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
try {
CoverageControl mxBean = new CoverageControl();
mbeanServer.registerMBean(mxBean, new ObjectName("JMockit Coverage:type=CoverageControl"));
}
catch (JMException e) {
throw new RuntimeException(e);
}
}
public CoverageControl() throws NotCompliantMBeanException
{
super(CoverageControlMBean.class);
}
@Nonnull @Override
protected String getDescription(MBeanInfo info)
{
return CoverageControlMBean.class.getAnnotation(Description.class).value();
}
@Nonnull @Override
protected String getParameterName(MBeanOperationInfo op, MBeanParameterInfo param, int sequence)
{
return "resetState";
}
@Override
protected String getDescription(@Nonnull MBeanAttributeInfo info) { return getDescription("get" + info.getName()); }
@Nonnull
private static String getDescription(@Nonnull String methodName)
{
return getMethod(methodName).getAnnotation(Description.class).value();
}
@Nonnull
private static Method getMethod(@Nonnull String methodName)
{
for (Method method : CoverageControlMBean.class.getDeclaredMethods()) {
if (method.getName().equals(methodName)) {
return method;
}
}
throw new IllegalStateException("Required method not found in class CoverageControlMBean: " + methodName);
}
@Override
protected String getDescription(@Nonnull MBeanOperationInfo info) { return getDescription(info.getName()); }
@Override
protected String getDescription(@Nonnull MBeanOperationInfo op, MBeanParameterInfo param, int sequence)
{
Method method = getMethod(op.getName());
Description desc = (Description) method.getParameterAnnotations()[sequence][0];
return desc.value();
}
@Override
protected int getImpact(MBeanOperationInfo info) { return MBeanOperationInfo.ACTION; }
@Nonnull @Override
public String getOutput() { return getProperty("output", "html").replace("-nocp", ""); }
@Override
public void setOutput(@Nonnull String output)
{
String validValues = "html serial serial-append html,serial html,serial-append serial,html serial-append,html";
output = validateNewPropertyValue("Output", validValues, output);
modifyConfigurationProperty("output", "html".equals(output) ? "html-nocp" : output);
}
@Nonnull
private static String validateNewPropertyValue(
@Nonnull String propertyName, @Nonnull String validValues, @Nonnull String newValue)
{
String valueWithNoSpaces = newValue.replace(" ", "");
if (validValues.contains(valueWithNoSpaces)) {
return valueWithNoSpaces;
}
throw new IllegalArgumentException("Invalid value for \"" + propertyName + "\" property: " + newValue);
}
@Nonnull @Override
public String getWorkingDir() { return new File(".").getAbsoluteFile().getParent(); }
@Nonnull @Override
public String getOutputDir() { return getProperty("outputDir"); }
@Override
public void setOutputDir(@Nonnull String outputDir) { modifyConfigurationProperty("outputDir", outputDir); }
@Nonnull @Override
public String getSrcDirs() { return getProperty("srcDirs"); }
@Override
public void setSrcDirs(@Nonnull String srcDirs) { modifyConfigurationProperty("srcDirs", srcDirs); }
@Nonnull @Override
public String getClasses() { return getProperty("classes"); }
@Override
public void setClasses(@Nonnull String classes) { modifyConfigurationProperty("classes", classes); }
@Nonnull @Override
public String getExcludes() { return getProperty("excludes"); }
@Override
public void setExcludes(@Nonnull String excludes) { modifyConfigurationProperty("excludes", excludes); }
@Nonnull @Override
public String getMetrics() { return getProperty("metrics", "line"); }
@Override
public void setMetrics(@Nonnull String metrics)
{
if (metrics.isEmpty()) {
throw new IllegalArgumentException("Please select a valid value for the \"Metrics\" property");
}
metrics = validateNewPropertyValue("Metrics", "all line path line,path", metrics);
modifyConfigurationProperty("metrics", metrics);
}
@Nonnull
private static String getProperty(@Nonnull String property) { return getProperty(property, ""); }
@Nonnull
private static String getProperty(@Nonnull String property, @Nonnull String defaultValue)
{
return Configuration.getProperty(propertyNameSuffix(property), defaultValue);
}
@Nonnull
private static String propertyNameSuffix(@Nonnull String name)
{
return Character.toLowerCase(name.charAt(0)) + name.substring(1);
}
private void modifyConfigurationProperty(@Nonnull String name, @Nonnull String value)
{
setConfigurationProperty(name, value);
CodeCoverage.resetConfiguration();
}
private static void setConfigurationProperty(@Nonnull String name, @Nonnull String value)
{
Configuration.setProperty(propertyNameSuffix(name), value);
}
@Override
public void generateOutput(boolean resetState)
{
CodeCoverage.generateOutput(resetState);
}
}