summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java')
-rw-r--r--org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java145
1 files changed, 145 insertions, 0 deletions
diff --git a/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java
new file mode 100644
index 0000000..690f87b
--- /dev/null
+++ b/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/CodanProblemMarkerResolutionGenerator.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Andrew Gvozdev
+ * 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:
+ * Andrew Gvozdev - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.codan.internal.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.codan.ui.AbstarctCodanCMarkerResolution;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IMarkerResolutionGenerator;
+
+public class CodanProblemMarkerResolutionGenerator implements
+ IMarkerResolutionGenerator {
+ private static final String EXTENSION_POINT_NAME = "codanMarkerResolution"; //$NON-NLS-1$
+ private static Map<String, Collection<ConditionalResolution>> resolutions = new HashMap<String, Collection<ConditionalResolution>>();
+ private static boolean resolutionsLoaded = false;
+
+ static class ConditionalResolution {
+ IMarkerResolution res;
+ String messagePattern;
+
+ public ConditionalResolution(IMarkerResolution res2,
+ String messagePattern2) {
+ res = res2;
+ messagePattern = messagePattern2;
+ }
+ }
+
+ public IMarkerResolution[] getResolutions(IMarker marker) {
+ if (resolutionsLoaded == false) {
+ readExtensions();
+ }
+ String id = marker.getAttribute(IMarker.PROBLEM, null);
+ if (id == null)
+ return new IMarkerResolution[0];
+ String message = marker.getAttribute(IMarker.MESSAGE, ""); //$NON-NLS-1$
+ Collection<ConditionalResolution> collection = resolutions.get(id);
+ if (collection != null) {
+ ArrayList<IMarkerResolution> list = new ArrayList<IMarkerResolution>();
+ for (Iterator<ConditionalResolution> iterator = collection
+ .iterator(); iterator.hasNext();) {
+ ConditionalResolution res = iterator.next();
+ if (res.messagePattern != null) {
+ if (!message.matches(res.messagePattern))
+ continue;
+ }
+ if (res.res instanceof AbstarctCodanCMarkerResolution) {
+ if (!((AbstarctCodanCMarkerResolution)res.res).isApplicable(marker))
+ continue;
+ }
+ list.add(res.res);
+ }
+ if (list.size() > 0)
+ return list.toArray(new IMarkerResolution[list.size()]);
+ }
+ return new IMarkerResolution[0];
+ }
+
+ private static synchronized void readExtensions() {
+ IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(
+ CodanUIActivator.PLUGIN_ID, EXTENSION_POINT_NAME);
+ if (ep == null)
+ return;
+ try {
+ IConfigurationElement[] elements = ep.getConfigurationElements();
+ // process categories
+ for (int i = 0; i < elements.length; i++) {
+ IConfigurationElement configurationElement = elements[i];
+ processResolution(configurationElement);
+ }
+ } finally {
+ resolutionsLoaded = true;
+ }
+ }
+
+ /**
+ * @param configurationElement
+ */
+ private static void processResolution(
+ IConfigurationElement configurationElement) {
+ if (configurationElement.getName().equals("resolution")) { //$NON-NLS-1$
+ String id = configurationElement.getAttribute("problemId"); //$NON-NLS-1$
+ if (id == null) {
+ CodanUIActivator.log("Extension for " + EXTENSION_POINT_NAME //$NON-NLS-1$
+ + " problemId is not defined"); //$NON-NLS-1$
+ return;
+ }
+ IMarkerResolution res;
+ try {
+ res = (IMarkerResolution) configurationElement
+ .createExecutableExtension("class");//$NON-NLS-1$
+ } catch (CoreException e) {
+ CodanUIActivator.log(e);
+ return;
+ }
+ String messagePattern = configurationElement
+ .getAttribute("messagePattern"); //$NON-NLS-1$
+ if (messagePattern != null) {
+ try {
+ Pattern.compile(messagePattern);
+ } catch (Exception e) {
+ // bad pattern log and ignore
+ CodanUIActivator.log("Extension for " //$NON-NLS-1$
+ + EXTENSION_POINT_NAME
+ + " messagePattern is invalid: " + e.getMessage()); //$NON-NLS-1$
+ return;
+ }
+ }
+ ConditionalResolution co = new ConditionalResolution(res,
+ messagePattern);
+ addResolution(id, co);
+ }
+ }
+
+ public static void addResolution(String id, IMarkerResolution res,
+ String messagePattern) {
+ addResolution(id, new ConditionalResolution(res, messagePattern));
+ }
+
+ private static void addResolution(String id, ConditionalResolution res) {
+ Collection<ConditionalResolution> collection = resolutions.get(id);
+ if (collection == null) {
+ collection = new ArrayList<ConditionalResolution>();
+ resolutions.put(id, collection);
+ }
+ collection.add(res);
+ }
+} \ No newline at end of file