summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal
diff options
context:
space:
mode:
authorElliott Baron <ebaron@fedoraproject.org>2009-12-16 16:51:53 -0500
committerElliott Baron <ebaron@fedoraproject.org>2009-12-16 16:51:53 -0500
commitaf92b8417ae76946c7d10772d8848abbe1126209 (patch)
tree4f1f7ab3def1e2e5facd2582645f663aba399fc3 /org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal
parent4baa2f35d979b4e2336431460e313e055661327f (diff)
downloadcodan-af92b8417ae76946c7d10772d8848abbe1126209.tar.gz
codan-af92b8417ae76946c7d10772d8848abbe1126209.tar.xz
codan-af92b8417ae76946c7d10772d8848abbe1126209.zip
Update codan plugins to HEAD.
* org.eclipse.cdt.codan.checkers.ui: Updated. * org.eclipse.cdt.codan.checkers: Updated. * org.eclipse.cdt.codan.core: Updated. * org.eclipse.cdt.codan.ui: Updated.
Diffstat (limited to 'org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal')
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template0
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries5
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template0
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java88
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java33
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java119
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries5
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template0
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java2
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java4
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java105
11 files changed, 334 insertions, 27 deletions
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries
index 74cd7a6..49bf43c 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries
@@ -1,4 +1,5 @@
-/CheckersRegisry.java/1.1/Sat Aug 22 21:16:49 2009//
-/CodanBuilder.java/1.2/Sat Aug 22 21:31:29 2009//
+/CheckersRegisry.java/1.3/Wed Dec 16 21:48:48 2009//
+/CodanBuilder.java/1.3/Wed Dec 16 21:48:48 2009//
+/CodanPreferencesLoader.java/1.1/Wed Sep 23 23:29:36 2009//
/CodeAnlysisNature.java/1.1/Sat Aug 22 21:16:49 2009//
D/model////
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java
index 82ace80..5661622 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java
@@ -16,16 +16,15 @@ import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.cdt.codan.core.CodanCorePlugin;
-import org.eclipse.cdt.codan.core.CodanPreferencesLoader;
import org.eclipse.cdt.codan.core.PreferenceConstants;
import org.eclipse.cdt.codan.core.model.IChecker;
import org.eclipse.cdt.codan.core.model.ICheckersRegistry;
import org.eclipse.cdt.codan.core.model.IProblem;
import org.eclipse.cdt.codan.core.model.IProblemCategory;
import org.eclipse.cdt.codan.core.model.IProblemProfile;
-import org.eclipse.cdt.codan.core.model.ProblemProfile;
import org.eclipse.cdt.codan.internal.core.model.CodanProblem;
import org.eclipse.cdt.codan.internal.core.model.CodanProblemCategory;
+import org.eclipse.cdt.codan.internal.core.model.ProblemProfile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ProjectScope;
@@ -45,6 +44,7 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
private Collection<IChecker> checkers = new ArrayList<IChecker>();
private static CheckersRegisry instance;
private HashMap<Object, IProblemProfile> profiles = new HashMap<Object, IProblemProfile>();
+ private HashMap<IChecker, Collection<IProblem>> problemList = new HashMap<IChecker, Collection<IProblem>>();
private CheckersRegisry() {
instance = this;
@@ -136,7 +136,9 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
}
}
if (!hasRef) {
- addProblem(new CodanProblem(id, name), null);
+ CodanProblem p = new CodanProblem(id, name);
+ addProblem(p, null);
+ addRefProblem(checkerObj, p);
}
}
} catch (Exception e) {
@@ -184,7 +186,9 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
return elementValue;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#iterator()
*/
public Iterator<IChecker> iterator() {
@@ -197,15 +201,23 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
return instance;
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addChecker(org.eclipse.cdt.codan.core.model.IChecker)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addChecker(org.eclipse
+ * .cdt.codan.core.model.IChecker)
*/
public void addChecker(IChecker checker) {
checkers.add(checker);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addProblem(org.eclipse.cdt.codan.core.model.IProblem, java.lang.String)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addProblem(org.eclipse
+ * .cdt.codan.core.model.IProblem, java.lang.String)
*/
public void addProblem(IProblem p, String category) {
IProblemCategory cat = getDefaultProfile().findCategory(category);
@@ -214,8 +226,12 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
((ProblemProfile) getDefaultProfile()).addProblem(p, cat);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addCategory(org.eclipse.cdt.codan.core.model.IProblemCategory, java.lang.String)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addCategory(org.eclipse
+ * .cdt.codan.core.model.IProblemCategory, java.lang.String)
*/
public void addCategory(IProblemCategory p, String category) {
IProblemCategory cat = getDefaultProfile().findCategory(category);
@@ -224,21 +240,46 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
((ProblemProfile) getDefaultProfile()).addCategory(p, cat);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addRefProblem(org.eclipse.cdt.codan.core.model.IChecker, org.eclipse.cdt.codan.core.model.IProblem)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addRefProblem(org.
+ * eclipse.cdt.codan.core.model.IChecker,
+ * org.eclipse.cdt.codan.core.model.IProblem)
*/
public void addRefProblem(IChecker c, IProblem p) {
+ Collection<IProblem> plist = problemList.get(c);
+ if (plist == null) {
+ plist = new ArrayList<IProblem>();
+ problemList.put(c, plist);
+ }
+ plist.add(p);
+ }
+
+ /**
+ * Returns list of problems registered for given checker
+ * @return collection of problems or null
+ */
+ public Collection<IProblem> getRefProblems(IChecker checker) {
+ return problemList.get(checker);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getDefaultProfile()
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getDefaultProfile()
*/
public IProblemProfile getDefaultProfile() {
return profiles.get(DEFAULT);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getWorkspaceProfile()
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getWorkspaceProfile()
*/
public IProblemProfile getWorkspaceProfile() {
IProblemProfile wp = profiles.get(ResourcesPlugin.getWorkspace());
@@ -262,8 +303,12 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
profiles.put(element, profile);
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfile(org.eclipse.core.resources.IResource)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfile
+ * (org.eclipse.core.resources.IResource)
*/
public IProblemProfile getResourceProfile(IResource element) {
IProblemProfile prof = profiles.get(element);
@@ -296,8 +341,11 @@ public class CheckersRegisry implements Iterable<IChecker>, ICheckersRegistry {
return prof;
}
- /* (non-Javadoc)
- * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfileWorkingCopy(org.eclipse.core.resources.IResource)
+ /*
+ * (non-Javadoc)
+ *
+ * @seeorg.eclipse.cdt.codan.core.model.ICheckersRegistry#
+ * getResourceProfileWorkingCopy(org.eclipse.core.resources.IResource)
*/
public IProblemProfile getResourceProfileWorkingCopy(IResource element) {
if (element instanceof IProject) {
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
index 7d58351..56916b8 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
@@ -12,6 +12,8 @@ package org.eclipse.cdt.codan.internal.core;
import java.io.File;
import java.net.URI;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.codan.core.CodanCorePlugin;
@@ -20,6 +22,8 @@ import org.eclipse.cdt.codan.core.model.ICAstChecker;
import org.eclipse.cdt.codan.core.model.IChecker;
import org.eclipse.cdt.codan.core.model.ICodanAstReconciler;
import org.eclipse.cdt.codan.core.model.ICodanBuilder;
+import org.eclipse.cdt.codan.core.model.IProblem;
+import org.eclipse.cdt.codan.core.model.IProblemProfile;
import org.eclipse.cdt.codan.core.model.IProblemReporter;
import org.eclipse.cdt.codan.internal.core.model.CodanMarkerProblemReporter;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@@ -122,6 +126,8 @@ public class CodanBuilder extends IncrementalProjectBuilder implements
boolean run = false;
if (checker.enabledInContext(resource))
run = true;
+ if (areProblemsForCheckerEnabled(checker, resource))
+ run = true;
if (run)
checker.processResource(resource);
} catch (Throwable e) {
@@ -161,6 +167,9 @@ public class CodanBuilder extends IncrementalProjectBuilder implements
boolean run = false;
if (checker.enabledInContext(resource))
run = true;
+ if (areProblemsForCheckerEnabled(checker, resource)) {
+ run = true;
+ }
if (run && checker instanceof ICAstChecker
&& checker.runInEditor())
((ICAstChecker) checker).processAst(ast);
@@ -171,6 +180,30 @@ public class CodanBuilder extends IncrementalProjectBuilder implements
}
}
+ /**
+ * @param checker
+ * @param resource
+ * @return
+ */
+ private boolean areProblemsForCheckerEnabled(IChecker checker,
+ IResource resource) {
+ IProblemProfile resourceProfile = CheckersRegisry.getInstance()
+ .getResourceProfile(resource);
+ Collection<IProblem> refProblems = CheckersRegisry.getInstance()
+ .getRefProblems(checker);
+ for (Iterator iterator = refProblems.iterator(); iterator.hasNext();) {
+ IProblem p = (IProblem) iterator.next();
+ // we need to check problem enablement in particular profile
+ IProblem problem = resourceProfile.findProblem(p.getId());
+ if (problem == null)
+ throw new IllegalArgumentException("Id is not registered");
+ if (problem.isEnabled())
+ return true;
+ }
+ // no problem is enabled for this checker, skip the checker
+ return false;
+ }
+
protected void fullBuild(final IProgressMonitor monitor)
throws CoreException {
try {
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java
new file mode 100644
index 0000000..bafff9a
--- /dev/null
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Alena Laskavaia
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alena Laskavaia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.core;
+
+import org.eclipse.cdt.codan.core.model.CodanSeverity;
+import org.eclipse.cdt.codan.core.model.IProblem;
+import org.eclipse.cdt.codan.core.model.IProblemProfile;
+import org.eclipse.cdt.codan.internal.core.model.CodanProblem;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+
+/**
+ * @author Alena
+ *
+ */
+public class CodanPreferencesLoader {
+ private IProblemProfile baseModel;
+
+ /**
+ * @param workspaceProfile
+ */
+ public CodanPreferencesLoader(IProblemProfile profile) {
+ setInput(profile);
+ }
+
+ /**
+ *
+ */
+ public CodanPreferencesLoader() {
+ }
+
+ public void setInput(Object model) {
+ baseModel = (IProblemProfile) model;
+ }
+
+ /**
+ * @return
+ */
+ public IProblem[] getProblems() {
+ IProblem[] problems = baseModel.getProblems();
+ return problems;
+ }
+
+ /**
+ * @param id
+ * @param s
+ */
+ public void setProperty(String id, String s) {
+ IProblem prob = baseModel.findProblem(id);
+ if (!(prob instanceof CodanProblem))
+ return;
+ String sevs = s;
+ boolean enabled = true;
+ if (sevs.startsWith("-")) {
+ sevs = sevs.substring(1);
+ enabled = false;
+ }
+ ((CodanProblem) prob).setEnabled(enabled);
+ CodanSeverity sev;
+ try {
+ sev = CodanSeverity.valueOf(sevs);
+ } catch (RuntimeException e) {
+ sev = CodanSeverity.Warning;
+ }
+ ((CodanProblem) prob).setSeverity(sev);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return getInput().toString();
+ }
+
+ /**
+ * @return
+ */
+ public IProblemProfile getInput() {
+ return baseModel;
+ }
+
+ /**
+ * @param id
+ * @return
+ */
+ public String getProperty(String id) {
+ IProblem prob = baseModel.findProblem(id);
+ if (!(prob instanceof CodanProblem))
+ return null;
+ String enabled = prob.isEnabled() ? "" : "-";
+ String severity = prob.getSeverity().toString();
+ String res = enabled + severity;
+ return res;
+ }
+
+ /**
+ * @param storePreferences
+ */
+ public void load(IEclipsePreferences storePreferences) {
+ IProblem[] probs = getProblems();
+ for (int i = 0; i < probs.length; i++) {
+ String id = probs[i].getId();
+ String s = storePreferences.get(id, null);
+ if (s != null) {
+ setProperty(id, s);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries
index cf1f6cc..5f7a029 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries
@@ -1,4 +1,5 @@
-/CodanMarkerProblemReporter.java/1.1/Sat Aug 22 21:16:48 2009//
+/CodanMarkerProblemReporter.java/1.2/Wed Dec 16 21:48:48 2009//
/CodanProblem.java/1.1/Sat Aug 22 21:16:48 2009//
-/CodanProblemCategory.java/1.1/Sat Aug 22 21:16:48 2009//
+/CodanProblemCategory.java/1.2/Wed Dec 16 21:48:48 2009//
+/ProblemProfile.java/1.1/Wed Sep 23 23:29:36 2009//
D
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java
index ebf00c9..a4599c5 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java
@@ -23,7 +23,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
public class CodanMarkerProblemReporter implements IProblemReporter {
- public static final String GENERIC_CODE_ANALYSIS_MARKER_TYPE = "org.eclipse.cdt.codan.core.codanProblem";
+
/*
* (non-Javadoc)
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java
index 289e0fd..fc63480 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java
@@ -40,8 +40,8 @@ public class CodanProblemCategory implements IProblemCategory, Cloneable {
return name;
}
- public Object[] getChildren() {
- return list.toArray();
+ public IProblemElement[] getChildren() {
+ return (IProblemElement[]) list.toArray(new IProblemElement[list.size()]);
}
public void addChild(IProblemElement p) {
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java
new file mode 100644
index 0000000..d2330f1
--- /dev/null
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Alena Laskavaia
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Alena Laskavaia - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.core.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.cdt.codan.core.model.IProblem;
+import org.eclipse.cdt.codan.core.model.IProblemCategory;
+import org.eclipse.cdt.codan.core.model.IProblemProfile;
+
+/**
+ * @author Alena
+ *
+ */
+public class ProblemProfile implements IProblemProfile, Cloneable {
+ private IProblemCategory rootCategory = new CodanProblemCategory("root",
+ "root");
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.cdt.codan.core.model.IProblemProfile#getProblem(java.lang
+ * .String)
+ */
+ public IProblem findProblem(String id) {
+ return getRoot().findProblem(id);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.cdt.codan.core.model.IProblemProfile#getProblems()
+ */
+ public IProblem[] getProblems() {
+ Collection<IProblem> problems = new ArrayList<IProblem>();
+ collectProblems(getRoot(), problems);
+ return problems.toArray(new IProblem[problems.size()]);
+ }
+
+ /**
+ * @param root
+ * @param problems
+ */
+ protected void collectProblems(IProblemCategory parent,
+ Collection<IProblem> problems) {
+ Object[] children = parent.getChildren();
+ for (Object object : children) {
+ if (object instanceof IProblemCategory) {
+ IProblemCategory cat = (IProblemCategory) object;
+ collectProblems(cat, problems);
+ } else if (object instanceof IProblem) {
+ problems.add((IProblem) object);
+ }
+ }
+ }
+
+ public IProblemCategory getRoot() {
+ return rootCategory;
+ }
+
+ public void addProblem(IProblem p, IProblemCategory cat) {
+ if (cat == null)
+ cat = getRoot();
+ ((CodanProblemCategory) cat).addChild(p);
+ }
+
+ public IProblemCategory findCategory(String id) {
+ return getRoot().findCategory(id);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#clone()
+ */
+ @Override
+ public Object clone() {
+ try {
+ ProblemProfile clone = (ProblemProfile) super.clone();
+ clone.rootCategory = (IProblemCategory) ((CodanProblemCategory) this.rootCategory)
+ .clone();
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ return this;
+ }
+ }
+
+ /**
+ * @param p
+ * @param cat
+ */
+ public void addCategory(IProblemCategory category, IProblemCategory parent) {
+ ((CodanProblemCategory) parent).addChild(category);
+ }
+}