summaryrefslogtreecommitdiff
path: root/src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java')
-rw-r--r--src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java b/src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java
new file mode 100644
index 0000000..2c77930
--- /dev/null
+++ b/src/plugins/preflighting.core/src/com/motorolamobility/preflighting/core/internal/checker/CheckerExtensionReader.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.motorolamobility.preflighting.core.internal.checker;
+
+import static com.motorolamobility.preflighting.core.logging.PreflightingLogger.error;
+import static com.motorolamobility.preflighting.core.logging.PreflightingLogger.warn;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.InvalidRegistryObjectException;
+import org.eclipse.core.runtime.Platform;
+
+import com.motorolamobility.preflighting.core.PreflightingCorePlugin;
+import com.motorolamobility.preflighting.core.checker.Checker;
+import com.motorolamobility.preflighting.core.checker.CheckerExtension;
+import com.motorolamobility.preflighting.core.checker.IChecker;
+import com.motorolamobility.preflighting.core.checker.condition.ICondition;
+import com.motorolamobility.preflighting.core.checker.parameter.CheckerParameter;
+import com.motorolamobility.preflighting.core.checker.parameter.ICheckerParameter;
+import com.motorolamobility.preflighting.core.exception.PreflightingExtensionPointException;
+import com.motorolamobility.preflighting.core.i18n.PreflightingCoreNLS;
+import com.motorolamobility.preflighting.core.internal.checkerparameter.CheckerParameterElement;
+import com.motorolamobility.preflighting.core.internal.conditions.ConditionElement;
+import com.motorolamobility.preflighting.core.validation.ParameterType;
+import com.motorolamobility.preflighting.core.validation.ValidationResultData.SEVERITY;
+
+public abstract class CheckerExtensionReader
+{
+ /**
+ * Load existing checkers, mapped by checker id (value used to call the checker
+ * on command line).
+ * The map is sorted alphabetically by checker id.
+ *
+ * @param checkersMap The map of checkers to be populated
+ *
+ * @throws PreflightingExtensionPointException If an error with this extension point is found,
+ * the exception is thrown to warn the framework that this functionality is broken
+ */
+ public static void loadCheckers(TreeMap<String, CheckerExtension> checkersMap)
+ throws PreflightingExtensionPointException
+ {
+ checkersMap.clear();
+
+ IExtensionRegistry extReg = Platform.getExtensionRegistry();
+ IExtensionPoint extPoint =
+ extReg.getExtensionPoint(CheckerExtension.CHECKER_EXTENSION_POINT_ID);
+ // it should not be null, but check to prevent errors
+ if (extPoint != null)
+ {
+ try
+ {
+ IExtension[] extensions = extPoint.getExtensions();
+ for (IExtension aExtension : extensions)
+ {
+ IConfigurationElement[] configElements = aExtension.getConfigurationElements();
+ for (IConfigurationElement aConfig : configElements)
+ {
+ if (aConfig.getName().equals(
+ CheckerExtension.CHECKER_EXTENSION_POINT_ELEMENT_CHECKER))
+ {
+ try
+ {
+ String id =
+ aConfig.getAttribute(CheckerExtension.CHECKER_EXTENSION_POINT_ATTRIBUTE_ID);
+ String name =
+ aConfig.getAttribute(CheckerExtension.CHECKER_EXTENSION_POINT_ATTRIBUTE_NAME);
+ String description =
+ aConfig.getAttribute(CheckerExtension.CHECKER_EXTENSION_POINT_ATTRIBUTE_DESCRIPTION);
+
+ String checkerClassName =
+ aConfig.getAttribute(CheckerExtension.CHECKER_EXTENSION_POINT_ATTRIBUTE_CLASS);
+ IChecker checker = null;
+ if (checkerClassName != null)
+ {
+ checker =
+ (IChecker) aConfig
+ .createExecutableExtension(CheckerExtension.CHECKER_EXTENSION_POINT_ATTRIBUTE_CLASS);
+ }
+ else
+ {
+ checker = new Checker();
+ }
+ checker.setId(id);
+ checker.setEnabled(true);
+ CheckerExtension checkerExtension =
+ new CheckerExtension(id, name, description, checker);
+
+ loadConditions(checkerExtension, aConfig);
+
+ loadParameters(checkerExtension, aConfig);
+
+ checkersMap.put(id, checkerExtension);
+ }
+ catch (CoreException ce)
+ {
+ warn(CheckerExtensionReader.class,
+ "Error reading checker extension of id " //$NON-NLS-1$
+ + aExtension.getUniqueIdentifier()
+ + ": invalid checker or condition class", ce);
+ }
+ catch (Exception e)
+ {
+ warn(CheckerExtensionReader.class,
+ "Error reading checker extension of id " //$NON-NLS-1$
+ + aExtension.getUniqueIdentifier(), e);
+ }
+ }
+ }
+ }
+ }
+ catch (InvalidRegistryObjectException e)
+ {
+ error(CheckerExtensionReader.class,
+ "Unexpected error with the checker extension point", e); //$NON-NLS-1$
+ throw new PreflightingExtensionPointException(
+ PreflightingCoreNLS.CheckerExtensionReader_UnexpectedErrorCheckerExtensionPoint,
+ e);
+ }
+ }
+ else
+ {
+ error(CheckerExtensionReader.class, "Checker extension point not found"); //$NON-NLS-1$
+ throw new PreflightingExtensionPointException(
+ PreflightingCoreNLS.CheckerExtensionReader_CheckerExtensionPointNotFound);
+ }
+ }
+
+ /*
+ * Load all children elements from a given checker element.
+ * Currently only conditions are supported.
+ */
+ private static void loadConditions(CheckerExtension checkerExtension,
+ IConfigurationElement checkerElement) throws CoreException
+ {
+ IConfigurationElement[] childrenElements = checkerElement.getChildren();
+ if (childrenElements.length > 0)
+ {
+ List<ConditionElement> conditionsList =
+ new ArrayList<ConditionElement>(childrenElements.length);
+ HashMap<String, ICondition> checkerConditions =
+ new HashMap<String, ICondition>(childrenElements.length);
+ for (IConfigurationElement childElement : childrenElements)
+ {
+ if (childElement.getName().equals(ConditionElement.CHECKER_CONDITION_ELEMENT_NAME)) //Condition found, load it!
+ {
+ String conditionId =
+ childElement
+ .getAttribute(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_ID);
+ String conditionName =
+ childElement
+ .getAttribute(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_NAME);
+ String conditionDesc =
+ childElement
+ .getAttribute(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_DESCRIPTION);
+ String defaultSeverityLevel =
+ childElement
+ .getAttribute(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_DEFAULT_SEVERITY);
+ String markerType =
+ childElement
+ .getAttribute(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_MARKER_TYPE);
+ ICondition condition =
+ (ICondition) childElement
+ .createExecutableExtension(ConditionElement.CHECKER_CONDITION_ATTRIBUTE_CLASS);
+ condition.setId(conditionId);
+ condition.setName(conditionName);
+ condition.setDescription(conditionDesc);
+ condition.setSeverityLevel(SEVERITY.valueOf(defaultSeverityLevel));
+ condition.setChecker(checkerExtension.getChecker());
+ condition.setMarkerType(markerType);
+ PreflightingCorePlugin.addAvailableMarker(markerType);
+
+ ConditionElement conditionElement =
+ new ConditionElement(conditionId, conditionName, conditionDesc,
+ defaultSeverityLevel, condition);
+ conditionsList.add(conditionElement);
+ checkerConditions.put(conditionId, condition);
+ }
+ }
+ checkerExtension.getChecker().setConditions(checkerConditions);
+ checkerExtension.setConditions(conditionsList
+ .toArray(new ConditionElement[conditionsList.size()]));
+ }
+ }
+
+ /**
+ * Load the list of {@link CheckerParameterElement} objects into the {@link ConditionElement} parameter,
+ * This list comes from the defined extension-points.
+ *
+ * @param checkerExtension {@link CheckerExtension} where the {@link CheckerParameterElement} objects
+ * will be added.
+ * @param conditionConfigurationElement Configuration element. This element is responsible to fetch the
+ * data from the defined extension-points.
+ */
+ private static void loadParameters(CheckerExtension checkerExtension,
+ IConfigurationElement conditionConfigurationElement)
+ {
+ IConfigurationElement[] childrenElements = conditionConfigurationElement.getChildren();
+ if (childrenElements.length > 0)
+ {
+ List<CheckerParameterElement> parameterElementList =
+ new ArrayList<CheckerParameterElement>(childrenElements.length);
+ Map<String, ICheckerParameter> parameters = new HashMap<String, ICheckerParameter>();
+ for (IConfigurationElement childElement : childrenElements)
+ {
+ if (childElement.getName().equals(
+ CheckerParameterElement.CHECKER_PARAMETER_ELEMENT_NAME)) //Condition found, load it!
+ {
+ String parameterId =
+ childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_ID);
+ String parameterName =
+ childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_NAME);
+ String parameterDescription =
+ childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_DESCRIPTION);
+ String parameterValueDescription =
+ childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_VALUE_DESCRIPTION);
+ String parameterTypeString =
+ childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_TYPE);
+ boolean parameterIsMandatory =
+ Boolean.parseBoolean(childElement
+ .getAttribute(CheckerParameterElement.CHECKER_PARAMETER_ATTRIBUTE_IS_MANDATORY));
+
+ ParameterType parameterType = null;
+ if (parameterTypeString.equals("BOOLEAN"))
+ {
+ parameterType = ParameterType.BOOLEAN;
+ }
+ else if (parameterTypeString.equals("INTEGER"))
+ {
+ parameterType = ParameterType.INTEGER;
+ }
+ else
+ {
+ parameterType = ParameterType.STRING;
+ }
+
+ ICheckerParameter parameter =
+ new CheckerParameter(parameterId, parameterName, parameterDescription,
+ parameterValueDescription, parameterType, parameterIsMandatory);
+
+ CheckerParameterElement parameterElement =
+ new CheckerParameterElement(parameterId, parameterName,
+ parameterDescription, parameterValueDescription,
+ parameterTypeString, parameterIsMandatory);
+
+ parameters.put(parameterId, parameter);
+ parameterElementList.add(parameterElement);
+ }
+ }
+ checkerExtension.getChecker().setParameters(parameters);
+ checkerExtension.setConditionParameters(parameterElementList
+ .toArray(new CheckerParameterElement[parameterElementList.size()]));
+ }
+ }
+}