blob: 2b612f988049ba62ed9acf9ab3ad5fecf7fbee36 [file] [log] [blame]
package com.intellij.coverage;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.rt.coverage.data.ProjectData;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.lang.ref.SoftReference;
/**
* @author ven
*/
public abstract class BaseCoverageSuite implements CoverageSuite, JDOMExternalizable {
private static final Logger LOG = Logger.getInstance(BaseCoverageSuite.class.getName());
@NonNls
private static final String FILE_PATH = "FILE_PATH";
@NonNls
private static final String SOURCE_PROVIDER = "SOURCE_PROVIDER";
@NonNls
private static final String MODIFIED_STAMP = "MODIFIED";
@NonNls
private static final String NAME_ATTRIBUTE = "NAME";
@NonNls
private static final String COVERAGE_RUNNER = "RUNNER";
@NonNls
private static final String COVERAGE_BY_TEST_ENABLED_ATTRIBUTE_NAME = "COVERAGE_BY_TEST_ENABLED";
@NonNls
private static final String TRACING_ENABLED_ATTRIBUTE_NAME = "COVERAGE_TRACING_ENABLED";
private SoftReference<ProjectData> myCoverageData = new SoftReference<ProjectData>(null);
private String myName;
private long myLastCoverageTimeStamp;
private boolean myCoverageByTestEnabled;
private CoverageRunner myRunner;
private CoverageFileProvider myCoverageDataFileProvider;
private boolean myTrackTestFolders;
private boolean myTracingEnabled;
private Project myProject;
private RunConfigurationBase myConfiguration;
protected BaseCoverageSuite() {
}
public BaseCoverageSuite(final String name,
@Nullable final CoverageFileProvider fileProvider,
final long lastCoverageTimeStamp,
final boolean coverageByTestEnabled,
final boolean tracingEnabled,
final boolean trackTestFolders,
final CoverageRunner coverageRunner) {
this(name, fileProvider, lastCoverageTimeStamp, coverageByTestEnabled, tracingEnabled, trackTestFolders, coverageRunner, null);
}
public BaseCoverageSuite(final String name,
@Nullable final CoverageFileProvider fileProvider,
final long lastCoverageTimeStamp,
final boolean coverageByTestEnabled,
final boolean tracingEnabled,
final boolean trackTestFolders,
final CoverageRunner coverageRunner,
Project project) {
myCoverageDataFileProvider = fileProvider;
myName = name;
myLastCoverageTimeStamp = lastCoverageTimeStamp;
myCoverageByTestEnabled = coverageByTestEnabled;
myTrackTestFolders = trackTestFolders;
myTracingEnabled = tracingEnabled;
myRunner = coverageRunner;
myProject = project;
}
@Nullable
public static CoverageRunner readRunnerAttribute(Element element) {
final String runner = element.getAttributeValue(COVERAGE_RUNNER);
if (runner != null) {
for (CoverageRunner coverageRunner : Extensions.getExtensions(CoverageRunner.EP_NAME)) {
if (Comparing.strEqual(coverageRunner.getId(), runner)) {
return coverageRunner;
}
}
}
return null;
}
public static CoverageFileProvider readDataFileProviderAttribute(Element element) {
final String sourceProvider = element.getAttributeValue(SOURCE_PROVIDER);
final String relativePath = FileUtil.toSystemDependentName(element.getAttributeValue(FILE_PATH));
final File file = new File(relativePath);
return new DefaultCoverageFileProvider(file.exists() ? file
: new File(PathManager.getSystemPath(), relativePath),
sourceProvider != null ? sourceProvider
: DefaultCoverageFileProvider.class.getName());
}
public boolean isValid() {
return myCoverageDataFileProvider.isValid();
}
@NotNull
public String getCoverageDataFileName() {
return myCoverageDataFileProvider.getCoverageDataFilePath();
}
public
@NotNull
CoverageFileProvider getCoverageDataFileProvider() {
return myCoverageDataFileProvider;
}
public String getPresentableName() {
return myName;
}
public long getLastCoverageTimeStamp() {
return myLastCoverageTimeStamp;
}
public boolean isTrackTestFolders() {
return myTrackTestFolders;
}
public boolean isTracingEnabled() {
return myTracingEnabled;
}
public void readExternal(Element element) throws InvalidDataException {
myCoverageDataFileProvider = readDataFileProviderAttribute(element);
// name
myName = element.getAttributeValue(NAME_ATTRIBUTE);
if (myName == null) myName = generateName();
// tc
myLastCoverageTimeStamp = Long.parseLong(element.getAttributeValue(MODIFIED_STAMP));
// runner
myRunner = readRunnerAttribute(element);
// coverage per test
final String collectedLineInfo = element.getAttributeValue(COVERAGE_BY_TEST_ENABLED_ATTRIBUTE_NAME);
myCoverageByTestEnabled = collectedLineInfo != null && Boolean.valueOf(collectedLineInfo).booleanValue();
// tracing
final String tracingEnabled = element.getAttributeValue(TRACING_ENABLED_ATTRIBUTE_NAME);
myTracingEnabled = tracingEnabled != null && Boolean.valueOf(tracingEnabled).booleanValue();
}
public void writeExternal(final Element element) throws WriteExternalException {
final String fileName =
FileUtil.getRelativePath(new File(PathManager.getSystemPath()), new File(myCoverageDataFileProvider.getCoverageDataFilePath()));
element.setAttribute(FILE_PATH, fileName != null ? FileUtil.toSystemIndependentName(fileName) : myCoverageDataFileProvider.getCoverageDataFilePath());
element.setAttribute(NAME_ATTRIBUTE, myName);
element.setAttribute(MODIFIED_STAMP, String.valueOf(myLastCoverageTimeStamp));
element.setAttribute(SOURCE_PROVIDER, myCoverageDataFileProvider instanceof DefaultCoverageFileProvider
? ((DefaultCoverageFileProvider)myCoverageDataFileProvider).getSourceProvider()
: myCoverageDataFileProvider.getClass().getName());
// runner
if (getRunner() != null) {
element.setAttribute(COVERAGE_RUNNER, myRunner.getId());
}
// cover by test
element.setAttribute(COVERAGE_BY_TEST_ENABLED_ATTRIBUTE_NAME, String.valueOf(myCoverageByTestEnabled));
// tracing
element.setAttribute(TRACING_ENABLED_ATTRIBUTE_NAME, String.valueOf(myTracingEnabled));
}
public void setCoverageData(final ProjectData projectData) {
myCoverageData = new SoftReference<ProjectData>(projectData);
}
public ProjectData getCoverageData() {
return myCoverageData.get();
}
public void restoreCoverageData() {
setCoverageData(loadProjectInfo());
}
public boolean isCoverageByTestApplicable() {
return getRunner().isCoverageByTestApplicable();
}
public boolean isCoverageByTestEnabled() {
return myCoverageByTestEnabled;
}
@Nullable
public ProjectData getCoverageData(final CoverageDataManager coverageDataManager) {
final ProjectData data = getCoverageData();
if (data != null) {
return data;
}
ProjectData map = loadProjectInfo();
setCoverageData(map);
return map;
}
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final String thisName = myCoverageDataFileProvider.getCoverageDataFilePath();
final String thatName = ((BaseCoverageSuite)o).myCoverageDataFileProvider.getCoverageDataFilePath();
return thisName.equals(thatName);
}
public int hashCode() {
return myCoverageDataFileProvider.getCoverageDataFilePath().hashCode();
}
@Nullable
protected ProjectData loadProjectInfo() {
String sessionDataFileName = getCoverageDataFileName();
File sessionDataFile = new File(sessionDataFileName);
if (!sessionDataFile.exists()) {
if (LOG.isDebugEnabled()) {
LOG.debug("Nonexistent file given +" + sessionDataFileName);
}
return null;
}
return myRunner.loadCoverageData(sessionDataFile, this);
}
public CoverageRunner getRunner() {
return myRunner;
}
protected void setRunner(CoverageRunner runner) {
myRunner = runner;
}
private String generateName() {
String text = myCoverageDataFileProvider.getCoverageDataFilePath();
int i = text.lastIndexOf(File.separatorChar);
if (i >= 0) text = text.substring(i + 1);
i = text.lastIndexOf('.');
if (i >= 0) text = text.substring(0, i);
return text;
}
public Project getProject() {
return myProject;
}
public void setConfiguration(RunConfigurationBase configuration) {
myConfiguration = configuration;
}
@Nullable
public RunConfigurationBase getConfiguration() {
return myConfiguration;
}
}