summaryrefslogtreecommitdiff
path: root/plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java')
-rw-r--r--plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java197
1 files changed, 197 insertions, 0 deletions
diff --git a/plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java b/plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java
new file mode 100644
index 000000000000..ad48a4272e64
--- /dev/null
+++ b/plugins/coverage-common/src/com/intellij/coverage/CoverageSuitesBundle.java
@@ -0,0 +1,197 @@
+package com.intellij.coverage;
+
+import com.intellij.execution.configurations.ModuleBasedConfiguration;
+import com.intellij.execution.configurations.RunConfigurationBase;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootModificationTracker;
+import com.intellij.openapi.util.Comparing;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.GlobalSearchScopesCore;
+import com.intellij.psi.util.CachedValue;
+import com.intellij.psi.util.CachedValueProvider;
+import com.intellij.psi.util.CachedValuesManager;
+import com.intellij.reference.SoftReference;
+import com.intellij.rt.coverage.data.ProjectData;
+import com.intellij.util.ArrayUtilRt;
+import com.intellij.util.Function;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * User: anna
+ * Date: 12/14/10
+ */
+public class CoverageSuitesBundle {
+ private CoverageSuite[] mySuites;
+ private CoverageEngine myEngine;
+
+ private Set<Module> myProcessedModules;
+
+ private CachedValue<GlobalSearchScope> myCachedValue;
+
+ private SoftReference<ProjectData> myData = new SoftReference<ProjectData>(null);
+ private static final Logger LOG = Logger.getInstance("#" + CoverageSuitesBundle.class.getName());
+
+ public CoverageSuitesBundle(CoverageSuite suite) {
+ this(new CoverageSuite[]{suite});
+ }
+
+ public CoverageSuitesBundle(CoverageSuite[] suites) {
+ mySuites = suites;
+ LOG.assertTrue(mySuites.length > 0);
+ myEngine = mySuites[0].getCoverageEngine();
+ for (CoverageSuite suite : suites) {
+ final CoverageEngine engine = suite.getCoverageEngine();
+ LOG.assertTrue(Comparing.equal(engine, myEngine));
+ }
+ }
+
+
+ public boolean isValid() {
+ for (CoverageSuite suite : mySuites) {
+ if (!suite.isValid()) return false;
+ }
+ return true;
+ }
+
+
+ public long getLastCoverageTimeStamp() {
+ long max = 0;
+ for (CoverageSuite suite : mySuites) {
+ max = Math.max(max, suite.getLastCoverageTimeStamp());
+ }
+ return max;
+ }
+
+ public boolean isCoverageByTestApplicable() {
+ for (CoverageSuite suite : mySuites) {
+ if (suite.isCoverageByTestApplicable()) return true;
+ }
+ return false;
+ }
+
+ public boolean isCoverageByTestEnabled() {
+ for (CoverageSuite suite : mySuites) {
+ if (suite.isCoverageByTestEnabled()) return true;
+ }
+ return false;
+ }
+
+ @Nullable
+ public ProjectData getCoverageData() {
+ final ProjectData projectData = myData.get();
+ if (projectData != null) return projectData;
+ ProjectData data = new ProjectData();
+ for (CoverageSuite suite : mySuites) {
+ final ProjectData coverageData = suite.getCoverageData(null);
+ if (coverageData != null) {
+ data.merge(coverageData);
+ }
+ }
+ myData = new SoftReference<ProjectData>(data);
+ return data;
+ }
+
+ public boolean isTrackTestFolders() {
+ for (CoverageSuite suite : mySuites) {
+ if (suite.isTrackTestFolders()) return true;
+ }
+ return false;
+ }
+
+ public boolean isTracingEnabled() {
+ for (CoverageSuite suite : mySuites) {
+ if (suite.isTracingEnabled()) return true;
+ }
+ return false;
+ }
+
+ @NotNull
+ public CoverageEngine getCoverageEngine() {
+ return myEngine;
+ }
+
+ public CoverageAnnotator getAnnotator(Project project) {
+ return myEngine.getCoverageAnnotator(project);
+ }
+
+ public CoverageSuite[] getSuites() {
+ return mySuites;
+ }
+
+ public boolean contains(CoverageSuite suite) {
+ return ArrayUtilRt.find(mySuites, suite) > -1;
+ }
+
+ public void setCoverageData(ProjectData projectData) {
+ myData = new SoftReference<ProjectData>(projectData);
+ }
+
+ public void restoreCoverageData() {
+ myData = new SoftReference<ProjectData>(null);
+ }
+
+ public String getPresentableName() {
+ return StringUtil.join(mySuites, new Function<CoverageSuite, String>() {
+ @Override
+ public String fun(CoverageSuite coverageSuite) {
+ return coverageSuite.getPresentableName();
+ }
+ }, ", ");
+ }
+
+ public boolean isModuleChecked(final Module module) {
+ return myProcessedModules != null && myProcessedModules.contains(module);
+ }
+
+ public void checkModule(final Module module) {
+ if (myProcessedModules == null) {
+ myProcessedModules = new HashSet<Module>();
+ }
+ myProcessedModules.add(module);
+ }
+
+ @Nullable
+ public RunConfigurationBase getRunConfiguration() {
+ for (CoverageSuite suite : mySuites) {
+ if (suite instanceof BaseCoverageSuite) {
+ final RunConfigurationBase configuration = ((BaseCoverageSuite)suite).getConfiguration();
+ if (configuration != null) {
+ return configuration;
+ }
+ }
+ }
+ return null;
+ }
+
+ public GlobalSearchScope getSearchScope(final Project project) {
+ if (myCachedValue == null) {
+ myCachedValue = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<GlobalSearchScope>() {
+ @Nullable
+ @Override
+ public Result<GlobalSearchScope> compute() {
+ return new Result<GlobalSearchScope>(getSearchScopeInner(project), ProjectRootModificationTracker.getInstance(project));
+ }
+ }, false);
+ }
+ return myCachedValue.getValue();
+
+ }
+
+ private GlobalSearchScope getSearchScopeInner(Project project) {
+ final RunConfigurationBase configuration = getRunConfiguration();
+ if (configuration instanceof ModuleBasedConfiguration) {
+ final Module module = ((ModuleBasedConfiguration)configuration).getConfigurationModule().getModule();
+ if (module != null) {
+ return GlobalSearchScope.moduleRuntimeScope(module, isTrackTestFolders());
+ }
+ }
+ return isTrackTestFolders() ? GlobalSearchScope.projectScope(project) : GlobalSearchScopesCore.projectProductionScope(project);
+ }
+}