Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java')
-rw-r--r--plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java1276
1 files changed, 0 insertions, 1276 deletions
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java
deleted file mode 100644
index 2e65ba71e..000000000
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java
+++ /dev/null
@@ -1,1276 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
- * 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:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.validation;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IContributor;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.validation.internal.ConfigurationConstants;
-import org.eclipse.wst.validation.internal.ConfigurationManager;
-import org.eclipse.wst.validation.internal.ContentTypeWrapper;
-import org.eclipse.wst.validation.internal.ExtensionConstants;
-import org.eclipse.wst.validation.internal.MarkerManager;
-import org.eclipse.wst.validation.internal.Misc;
-import org.eclipse.wst.validation.internal.NullValidator;
-import org.eclipse.wst.validation.internal.SummaryReporter;
-import org.eclipse.wst.validation.internal.Tracing;
-import org.eclipse.wst.validation.internal.ValManager;
-import org.eclipse.wst.validation.internal.ValMessages;
-import org.eclipse.wst.validation.internal.ValOperation;
-import org.eclipse.wst.validation.internal.ValOperationManager;
-import org.eclipse.wst.validation.internal.ValPrefManagerGlobal;
-import org.eclipse.wst.validation.internal.ValPrefManagerProject;
-import org.eclipse.wst.validation.internal.ValType;
-import org.eclipse.wst.validation.internal.ValidationConfiguration;
-import org.eclipse.wst.validation.internal.ValidatorExtensionReader;
-import org.eclipse.wst.validation.internal.ValidatorMetaData;
-import org.eclipse.wst.validation.internal.core.ValidatorLauncher;
-import org.eclipse.wst.validation.internal.delegates.ValidatorDelegateDescriptor;
-import org.eclipse.wst.validation.internal.delegates.ValidatorDelegatesRegistry;
-import org.eclipse.wst.validation.internal.model.FilterGroup;
-import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
-import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IValidator;
-
-/**
- * Represents a validator. This gets instantiated through one of the validator extension points.
- * <p>
- * <b>This class is not API</b>.
- * </p>
- *
- * @author karasiuk
- *
- */
-public abstract class Validator implements Comparable<Validator> {
- // Remember if you add a new instance variable, make sure that you update the copy and become methods
-
- /**
- * The level of configuration for the validator.
- * <ul>
- * <li>Extension - Defined by an extension point.</li>
- * <li>Global - Defined by a global preference.</li>
- * <li>Project - Defined by a project property.</li>
- * </ul>
- */
- public enum Level {Extension, Global, Project};
-
- protected boolean _buildValidation = true;
-
- /** If this is a delegating validator, then this field holds the validator that will be delegated to. */
- private String _delegatingId;
-
- /**
- * If this validator is also used to control an ISource validator, the id of the ISource validator is
- * registered here.
- */
- private String _sourceId;
-
- protected boolean _manualValidation = true;
-
- /** An optional customized marker id for this validator. */
- private String _markerId;
-
- /**
- * Version of the filter definition. By increasing this number the framework can know that a plug-in has
- * changed it's filters.
- */
- private int _version = 1;
-
- /** Map simple message id's to message settings. */
- private Map<String, MessageSeveritySetting> _messageSettings;
-
- /** The project that you are defined in. This can be null which means that you are a global validator. */
- protected IProject _project;
-
- /** How many times has a global field in this validator been changed since it was created (or copied)? */
- protected transient int _changeCountGlobal;
-
- /** How many times has a message field in this validator been changed since it was created (or copied)? */
- protected transient int _changeCountMessages;
-
- /**
- * Create a new validator based on a abstract validator.
- *
- * @param validator
- * The validator that is being wrapped.
- *
- * @param project
- * The project that you are defined in. This can be null which
- * means that you are a global validator.
- */
- public static Validator create(IConfigurationElement validator, IProject project) {
- V2 v2 = new V2(validator, project);
- return v2;
- }
-
- /**
- * Create a new validator based on validator meta data.
- *
- * @param project
- * The project that you are defined in. This can be null which
- * means that you are a global validator.
- */
- public static Validator create(ValidatorMetaData vmd, ValidationConfiguration config, IProject project){
- V1 v1 = new V1(vmd, config);
- v1._project = project;
- return v1;
- }
-
- /**
- * If you are a version 1 validator, answer yourself as one, otherwise answer null.
- */
- public V1 asV1Validator(){
- return null;
- }
-
- /**
- * If you are a version 2 validator, answer yourself as one, otherwise answer null.
- */
- public V2 asV2Validator() {
- return null;
- }
-
- /**
- * The project is being cleaned, this method gives the validator a chance to do any special cleanup.
- * The default is to do nothing.
- *
- * @param project the project being built.
- * @param monitor the monitor that should be used for reporting progress if the clean takes a long time.
- */
- public void clean(IProject project, IProgressMonitor monitor){
- }
-
- /**
- * Compare yourself based on Validator name.
- */
- public int compareTo(Validator validator) {
- return getName().compareTo(validator.getName());
- }
-
- /** Answer a deep copy of yourself. */
- public Validator copy(){
- return copy(false);
- }
-
- public abstract Validator copy(boolean includeChangeCounts);
-
- /**
- * Update your direct, non transient fields from the fields in v.
- */
- protected void copyLocal(Validator v, boolean includeChangeCounts){
- _buildValidation = v._buildValidation;
- _delegatingId = v._delegatingId;
- _manualValidation = v._manualValidation;
- _markerId = v._markerId;
- _messageSettings = v._messageSettings;
- _project = v._project;
- _sourceId = v._sourceId;
- _version = v._version;
-
- if (includeChangeCounts){
- _changeCountGlobal = v._changeCountGlobal;
- _changeCountMessages = v._changeCountMessages;
- }
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate
- * this resource. This method does not check to see if global validation or
- * project validation has been suspended or not.
- *
- * @param resource
- * The resource to be checked.
- * @param isManual
- * If true then this validator must also be enabled for manual
- * validation.
- * @param isBuild
- * If true then this validator must also be enabled for builder
- * based validation.
- *
- * @return true if the resource should be validated.
- */
- public boolean shouldValidate(IResource resource, boolean isManual, boolean isBuild){
- return shouldValidate(resource, isManual, isBuild, new ContentTypeWrapper());
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate
- * this resource. This method does not check to see if global validation or
- * project validation has been suspended or not.
- *
- * @param resource
- * The resource to be checked.
- * @param isManual
- * If true then this validator must also be enabled for manual
- * validation.
- * @param isBuild
- * If true then this validator must also be enabled for builder
- * based validation.
- * @param contentTypeWrapper
- * For repeated calls on the same resource, it is more efficient
- * to remember the content type.
- * @return true if the resource should be validated.
- * @see Friend#shouldValidate(Validator, IResource, boolean, boolean, ContentTypeWrapper)
- */
- boolean shouldValidate(IResource resource, boolean isManual, boolean isBuild,
- ContentTypeWrapper contentTypeWrapper){
-
- if (isManual && !_manualValidation)return false;
- if (isBuild && !_buildValidation)return false;
-
- return shouldValidate(resource, contentTypeWrapper);
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate
- * this resource. This method does not check to see if global validation or
- * project validation has been suspended or not.
- *
- * @param resource
- * The resource to be checked.
- * @param valType
- * The context to use when performing the check.
- *
- * @return true if the resource should be validated.
- */
- public boolean shouldValidate(IResource resource, ValType valType){
- return shouldValidate(resource, valType, new ContentTypeWrapper());
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate
- * this resource. This method does not check to see if global validation or
- * project validation has been suspended or not.
- *
- * @param resource
- * The resource to be checked.
- * @param valType
- * The context to use when performing the check.
- * @param contentTypeWrapper
- * For repeated calls on the same resource, it is more efficient
- * to remember the content type.
- *
- * @return true if the resource should be validated.
- *
- * @see Friend#shouldValidate(Validator, IResource, ValType, ContentTypeWrapper)
- */
- boolean shouldValidate(IResource resource, ValType valType, ContentTypeWrapper contentTypeWrapper){
- if (Tracing.matchesExtraDetail(getId())){
- Tracing.log("Validator-01: checking if " + getId() + " should validate " + resource); //$NON-NLS-1$ //$NON-NLS-2$
- }
- if (valType == ValType.Manual && !_manualValidation)return false;
- if (valType == ValType.Build && !_buildValidation)return false;
-
- boolean result = shouldValidate(resource, contentTypeWrapper);
- if (Tracing.matchesExtraDetail(getId())){
- Tracing.log("Validator-02: result = " + result); //$NON-NLS-1$
- }
-
- return result;
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate this project. This method
- * does not check to see if global validation or project validation has been suspended or not.
- *
- * @param project the project to be checked
- * @param type The type of validation request
- *
- * @return true if the project should be validated.
- */
- public boolean shouldValidateProject(IProject project, ValType type){
- return shouldValidateProject(project, type == ValType.Manual, type == ValType.Build);
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate this project. This method
- * does not check to see if global validation or project validation has been suspended or not.
- *
- * @param project the project to be checked
- * @param isManual if true then this validator must also be enabled for manual validation.
- * @param isBuild if true then this validator must also be enabled for builder based validation.
- *
- * @return true if the project should be validated.
- */
- public boolean shouldValidateProject(IProject project, boolean isManual, boolean isBuild){
- if (Tracing.matchesExtraDetail(getId())){
- Tracing.log("Validator-03: checking if " + getId() + " should validate " + project); //$NON-NLS-1$ //$NON-NLS-2$
- }
- if (isManual && !_manualValidation)return false;
- if (isBuild && !_buildValidation)return false;
- if (project == null || !project.isOpen())return false;
- boolean result = shouldValidateProject(project);
- if (Tracing.matchesExtraDetail(getId())){
- Tracing.log("Validator-04: result " + result); //$NON-NLS-1$
- }
- return result;
- }
- /**
- * Validate the resource.
- *
- * @param resource the resource to be validated
- * @param kind the kind of resource change, see IResourceDelta for values.
- * @param operation the operation that this validation is running under. This can be null.
- * @param monitor a way to report progress. This can be null.
- *
- * @return the result of doing the validation, it can be, but usually isn't null.
- */
- public abstract ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor);
-
- /**
- * This method will be called before any validation takes place. It allows validators to perform any
- * initialization that they might need.
- *
- * @param project the project that is being validated. For the very first call in the validation phase,
- * this will be null. That is the signal to the validator that a top level validation is starting.
- * Subsequently, the project will be set, as each of the individual projects are validated.
- *
- * @param state a way to pass arbitrary, validator specific, data from one invocation of a validator to
- * the next, during the validation phase.
- *
- * @param monitor the monitor that should be used for reporting progress if the clean takes a long time.
- */
- public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor){
- // subclasses need to override this, if they wish to let their validators know about this event
- }
-
- /**
- * This method will be called when validation is complete. It allows validators to perform any
- * cleanup that they might need to do.
- *
- * @param project the project that was validated. The very last call in the validation will set this to
- * null so that the validator knows that all the projects have now been validated.
- *
- * @param state a way to pass arbitrary, validator specific, data from one invocation of a validator to
- * the next, during the validation phase.
- *
- * @param monitor the monitor that should be used for reporting progress if the clean takes a long time.
- */
- public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor){
- // subclasses need to override this, if they wish to let their validators know about this event
- }
-
- void add(MessageSeveritySetting message){
- // I can't use getMessageSettings() here, as that will put us into an infinite loop
- if (_messageSettings == null){
- _messageSettings = new HashMap<String, MessageSeveritySetting>(10);
- }
- _messageSettings.put(message.getId(), message);
- bumpChangeCountMessages();
- }
-
- public IValidator asIValidator(){
- return null;
- }
-
- protected abstract boolean shouldValidate(IResource resource, ContentTypeWrapper contentTypeWrapper);
- protected abstract boolean shouldValidateProject(IProject project);
-
- public abstract String getId();
-
- public MessageSeveritySetting getMessage(String id){
- return getMessageSettings().get(id);
- }
-
- /**
- * Answer all the message settings that this validator has defined.
- *
- * @return an empty map if the validator did not define any message settings.
- */
- public Map<String, MessageSeveritySetting> getMessageSettings(){
- Map<String, MessageSeveritySetting> settings = _messageSettings;
- if (settings == null){
- settings = new HashMap<String, MessageSeveritySetting>(10);
- init(settings);
- if (ValManager.getDefault().mustUseGlobalValidators(getProject())){
- ValPrefManagerGlobal gp = ValPrefManagerGlobal.getDefault();
- gp.loadMessages(this, settings);
- }
- else {
- ValPrefManagerProject vp = new ValPrefManagerProject(getProject());
- vp.loadMessages(this, settings);
- }
- _messageSettings = settings;
- }
- return settings;
- }
-
- /**
- * Answer a hash code for the configurable fields so that we can quickly determine if two
- * validators are the same.
- */
- public int hashCodeForConfig(){
- int h = 0;
- if (_buildValidation)h += 101;
- if (_delegatingId != null)h += _delegatingId.hashCode();
- if (_manualValidation)h += 201;
- if (_messageSettings != null){
- for (MessageSeveritySetting ms : _messageSettings.values())h += ms.hashCode();
- }
- if (_sourceId != null)h += _sourceId.hashCode();
- h += _version;
- return h;
- }
-
- private void init(Map<String, MessageSeveritySetting> settings) {
- for (MessageSeveritySetting ms : ValidatorExtensionReader.getDefault().addMessages(this)){
- settings.put(ms.getId(), ms);
- }
- }
-
- public abstract String getName();
-
- /**
- * Answer the project that you were enabled on.
- *
- * @return null if you are a global (i.e. workspace level) validator.
- */
- public IProject getProject(){
- return _project;
- }
-
- /**
- * Answer the name of the class that implements the validator.
- */
- public abstract String getValidatorClassname();
-
- /**
- * Is this validator currently enabled for validations that are triggered manually?
- */
- public boolean isManualValidation() {
- return _manualValidation;
- }
-
- /**
- * Set whether this validator should be triggered as part of a manual validation.
- *
- * @param manualValidation
- */
- public void setManualValidation(boolean manualValidation) {
- setManualValidation2(manualValidation);
- }
-
- protected final void setManualValidation2(boolean manualValidation) {
- if (_manualValidation != manualValidation){
- bumpChangeCountGlobal();
- _manualValidation = manualValidation;
- }
- }
-
- /**
- * Is this validator currently enabled for validations that are triggered by builds?
- */
- public boolean isBuildValidation() {
- return _buildValidation;
- }
-
- /**
- * Has the validator changed since it was last created or copied?
- */
- public boolean isChanged(){
- if (_changeCountGlobal > 0 || _changeCountMessages > 0)return true;
- return false;
- }
-
- /**
- * Has the validator's implementation been loaded yet? This is used by some test cases to ensure that
- * plug-ins are not loaded too early.
- */
- abstract boolean isLoaded();
-
-
- /**
- * Set whether this validator should be triggered by the build process.
- *
- * @param buildValidation
- */
- public void setBuildValidation(boolean buildValidation) {
- setBuildValidation2(buildValidation);
- }
-
- protected final void setBuildValidation2(boolean buildValidation) {
- if (_buildValidation != buildValidation){
- bumpChangeCountGlobal();
- _buildValidation = buildValidation;
- }
- }
-
- /**
- * Get the id of the "real" validator, that is the validator that will be called when this delegating
- * validator is asked to validate something. If this isn't a delegating validator answer null.
- */
- public String getDelegatingId() {
- return _delegatingId;
- }
-
- /**
- * Set the id of the "real" validator, that is the validator that will be called when this delegating
- * validator is asked to validate something.
- *
- * @param delegating the id of the validator that is actually going to perform the validation.
- */
- public void setDelegatingId(String delegating) {
- if (!Misc.same(_delegatingId, delegating)){
- _delegatingId = delegating;
- bumpChangeCountGlobal();
- }
- }
-
- public int getVersion() {
- return _version;
- }
-
- public void setVersion(int version) {
- if (_version != version){
- _version = version;
- bumpChangeCountGlobal();
- }
- }
-
- @Override
- public String toString() {
- return getName();
- }
-
-/**
- * A validator that uses version 1 of the validation framework.
- * @author karasiuk
- *
- */
-public static class V1 extends Validator {
- private ValidatorMetaData _vmd;
-
- /**
- * Create a new version 1 validator.
- * @param vmd
- * @param config this is used to set the global enablement options. In some case this can be null.
- */
- public V1(ValidatorMetaData vmd, ValidationConfiguration config){
- _vmd = vmd;
- if (config != null){
- setBuildValidation(config.isBuildEnabled(vmd));
- setManualValidation(config.isManualEnabled(vmd));
- }
- setDelegatingId(ValidatorDelegatesRegistry.getInstance().getDefaultDelegate(_vmd.getValidatorUniqueName()));
- if (_vmd.getMarkerIds() != null && _vmd.getMarkerIds().length > 0)setMarkerId(_vmd.getMarkerIds()[0]);
- resetChangeCounters();
- }
-
- @Override
- public IValidator asIValidator() {
- IValidator v = null;
- try {
- v = _vmd.getValidator();
- }
- catch (InstantiationException e){
- ValidationPlugin.getPlugin().handleException(e);
- return null;
- }
- return v;
- }
-
- public V1 asV1Validator() {
- return this;
- }
-
- @Override
- public void become(Validator val) {
- super.become(val);
- V1 v1 = val.asV1Validator();
- if (v1 == null)throw new IllegalArgumentException("Internal error, the incoming validator must be a v1 validator"); //$NON-NLS-1$
- _vmd = v1._vmd;
- }
-
- public Validator copy(boolean includeChangeCounts) {
- V1 v = new V1Copy(_vmd, null);
- v.copyLocal(this, includeChangeCounts);
-
- return v;
- }
-
- public String getName() {
- return _vmd.getValidatorDisplayName();
- }
-
- public ValidatorMetaData getVmd(){
- return _vmd;
- }
-
- public String getValidatorClassname(){
- String name = ""; //$NON-NLS-1$
- try {
- name = _vmd.getValidator().getClass().getName();
- }
- catch (Exception e){
- // eat it
- }
- return name;
- }
- public String getId() {
- return _vmd.getValidatorUniqueName();
- }
-
- @Override
- boolean isLoaded() {
- return _vmd.isActive();
- }
-
- @Override
- public void setBuildValidation(boolean buildValidation) {
- super.setBuildValidation(buildValidation);
- _vmd.setBuildValidation(buildValidation);
- }
-
- @Override
- public void setManualValidation(boolean manualValidation) {
- super.setManualValidation(manualValidation);
- _vmd.setManualValidation(manualValidation);
- }
-
- @Override
- protected boolean shouldValidate(IResource resource, ContentTypeWrapper contentTypeWrapper) {
- return _vmd.isApplicableTo(resource);
- }
-
- @Override
- protected boolean shouldValidateProject(IProject project) {
- // TODO determine if this can be optimized
- return true;
- }
-
- @Override
- public ValidationResult validate(IResource resource, int kind, ValOperation operation,
- IProgressMonitor monitor) {
-
- if (monitor == null)monitor = new NullProgressMonitor();
-
- ValidationResult vr = new ValidationResult();
- IValidator v = asIValidator();
- if (v == null)return null;
-
- try {
- IProject project = resource.getProject();
- SummaryReporter reporter = new SummaryReporter(project, monitor);
- IWorkbenchContext helper = _vmd.getHelper(project);
- if (helper instanceof WorkbenchContext){
- WorkbenchContext wc = (WorkbenchContext)helper;
- List<String> files = new LinkedList<String>();
- // [213631] The JSP validator expects full paths not relative paths, but the XML validator
- // expects relative paths.
- files.add(wc.getPortableName(resource));
- wc.setValidationFileURIs(files);
- }
- try {
- ValidatorLauncher.getLauncher().start(helper, v, reporter);
- }
- finally {
- helper.cleanup(reporter);
- }
-
- vr.incrementError(reporter.getSeverityHigh());
- vr.incrementWarning(reporter.getSeverityNormal());
- vr.incrementInfo(reporter.getSeverityLow());
-
- }
- catch (Exception e){
- ValidationPlugin.getPlugin().handleException(e);
- }
- return vr;
- }
-
- /*
- * GRK - Because I didn't want to try to make a true copy of the V1 validator, (because I didn't
- * want to copy the vmd object), I came up with this approach to only copy the fields that
- * the preference page was worried about.
- */
- public static class V1Copy extends V1 {
- public V1Copy(ValidatorMetaData vmd, ValidationConfiguration vc){
- super(vmd, vc);
- }
-
- @Override
- public void setManualValidation(boolean bool) {
- setManualValidation2(bool);
- }
-
- @Override
- public void setBuildValidation(boolean bool) {
- setBuildValidation2(bool);
- }
-
- @Override
- public void become(Validator val) {
- super.become(val);
- super.setBuildValidation(val.isBuildValidation());
- super.setManualValidation(val.isManualValidation());
- }
-
- }
-
-}
-
-/**
- * A validator that uses version 2 of the validation framework.
- * @author karasiuk
- *
- */
-public final static class V2 extends Validator implements IAdaptable {
- private AbstractValidator _validator;
-
- private List<FilterGroup> _groups = new LinkedList<FilterGroup>();
- private FilterGroup[] _groupsArray;
-
- /** The full id of the extension. */
- private String _id;
-
- /** Name of the validator. */
- private String _name;
-
- /**
- * We don't want to create the validator too early, as it may trigger new plug-ins to be loaded.
- * We delay that as long as possible, by starting with just the config element.
- */
- private IConfigurationElement _validatorConfigElement;
-
- private String _validatorClassName;
-
- /**
- * An array containing the validator group IDs for which this validator is a member.
- */
- private String[] _validatorGroupIds;
-
- /**
- * If this validator is a delegating validator, then this is the "real" validator (i.e. the one that
- * does the work).
- */
- private AbstractValidator _delegated;
-
- /** How many times has a group field in this validator been changed since it was created (or copied)? */
- protected transient int _changeCountGroups;
-
- private Level _level;
-
- V2(IConfigurationElement configElement, IProject project){
- assert configElement != null;
- _validatorConfigElement = configElement;
- _validatorClassName = configElement.getAttribute(ExtensionConstants.AttribClass);
- _project = project;
-
- IConfigurationElement[] groupReferenceElements = configElement.getChildren(ExtensionConstants.Group.elementGroup);
- List<String> validatorGroupIDs = new ArrayList<String>();
- for (IConfigurationElement groupElement : groupReferenceElements) {
- String id = groupElement.getAttribute(ExtensionConstants.Group.attId);
- if (id != null)validatorGroupIDs.add(id);
- }
- _validatorGroupIds = validatorGroupIDs.toArray(new String[validatorGroupIDs.size()]);
-
- init();
- }
-
- private V2(IProject project, String validatorClassName, AbstractValidator validator){
- assert validator != null;
-
- _project = project;
- _validatorClassName = validatorClassName;
- _validator = validator;
- init();
- }
-
- private void init(){
- try {
- String id = ConfigurationManager.getManager().getConfiguration(_project).getDelegateForTarget(_validatorClassName);
- if (id == null) id = ValidatorDelegatesRegistry.getInstance().getDefaultDelegate(_validatorClassName);
- setDelegatingId(id);
- }
- catch (InvocationTargetException e){
- ValidationPlugin.getPlugin().handleException(e);
- }
- resetChangeCounters();
- }
-
- public synchronized void add(FilterGroup fg) {
- assert fg != null;
- _groupsArray = null;
- _groups.add(fg);
- bumpChangeCountGroups();
- }
-
- @Override
- public IValidator asIValidator() {
- AbstractValidator av = getDelegatedValidator();
- if (av instanceof IValidator)return (IValidator)av;
- return super.asIValidator();
- }
-
- public V2 asV2Validator() {
- return this;
- }
-
- /**
- * Let the validator know that a clean is about to happen.
- *
- * @param project the project that is being cleaned. This can be null which means that the workspace
- * is being cleaned (in which case a separate call will be made for each open project).
- */
- public void clean(IProject project, IProgressMonitor monitor) {
- getDelegatedValidator().clean(project, ValOperationManager.getDefault().getOperation().getState(), monitor);
- }
-
- public Validator copy(boolean includeChangeCounts) {
- V2 v = null;
- if (_validatorConfigElement != null)v = new V2(_validatorConfigElement, _project);
- else v = new V2(_project, _validatorClassName, _validator);
- v.copyLocal(this, includeChangeCounts);
-
- if (includeChangeCounts)v._changeCountGroups = _changeCountGroups;
-
- FilterGroup[] groups = getGroups();
- v._groupsArray = new FilterGroup[groups.length];
- for (int i=0; i<groups.length; i++){
- v._groupsArray[i] = groups[i].copy();
- v._groups.add(v._groupsArray[i]);
- }
-
- v._id = _id;
- v._name = _name;
- v._validatorGroupIds = _validatorGroupIds;
-
- return v;
- }
-
- public int getChangeCountGroups(){
- return _changeCountGroups;
- }
-
- public void bumpChangeCountGroups(){
- _changeCountGroups++;
- }
-
- public Level getLevel() {
- return _level;
- }
-
- public void setLevel(Level level) {
- assert _level == null;
- _level = level;
- }
-
- /**
- * Answer the actual validator that is going to perform the validation. If this is a normal validator this
- * method will simply answer itself. However if this is a delegating validator, then this will answer the
- * "real" validator.
- */
- public AbstractValidator getDelegatedValidator(){
- AbstractValidator delegated = _delegated;
- if (delegated != null)return delegated;
- else if (getDelegatingId() == null)return getValidator();
- try {
- ValidatorDelegateDescriptor vdd = ValidatorDelegatesRegistry.getInstance()
- .getDescriptor(getValidatorClassname(), getDelegatingId());
- if (vdd == null)return getValidator();
- delegated = vdd.getValidator2();
- }
- catch (Exception e){
- ValidationPlugin.getPlugin().handleException(e);
- delegated = new NullValidator();
- }
- delegated.setParent(this);
- _delegated = delegated;
- return delegated;
- }
-
- public String getId() {
- return _id;
- }
-
- /**
- * Answer the validator's filter groups.
- * @return an empty array if the validator does not have any filter groups.
- */
- public synchronized FilterGroup[] getGroups(){
- FilterGroup[] groups = _groupsArray;
- if (groups == null){
- groups = new FilterGroup[_groups.size()];
- _groups.toArray(groups);
- _groupsArray = groups;
- }
- return groups;
- }
-
- public String getName() {
- return _name;
- }
-
- public AbstractValidator getValidator() {
- if (_validator == null){
- try {
- _validator = (AbstractValidator)_validatorConfigElement.createExecutableExtension(ExtensionConstants.AttribClass);
- }
- catch (Exception e){
- ValidationPlugin.getPlugin().handleException(e);
- IContributor contrib = _validatorConfigElement.getContributor();
- String message = NLS.bind(ValMessages.ErrConfig, contrib.getName());
- ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, message);
- _validator = new NullValidator();
- }
- _validator.setParent(this);
- _validatorConfigElement = null;
-
- }
- return _validator;
- }
-
- public String getValidatorClassname(){
- return _validatorClassName;
- }
-
- public String[] getValidatorGroups(){
- return _validatorGroupIds;
- }
-
- @Override
- public int hashCodeForConfig() {
- int h = super.hashCodeForConfig();
- if (_id != null)h += _id.hashCode();
- if (_groups != null){
- for (FilterGroup fg : _groups)h += fg.hashCodeForConfig();
- }
- return h;
- }
-
- @Override
- public boolean isChanged() {
- if (_changeCountGroups > 0)return true;
- return super.isChanged();
- }
-
- @Override
- boolean isLoaded() {
- return _validator != null;
- }
-
- /**
- * Answer true if this validator, based on it's filters, should validate this resource.
- *
- * @return true if the resource should be validated.
- */
- protected boolean shouldValidate(IResource resource, ContentTypeWrapper contentTypeWrapper) {
- FilterGroup[] groups = getGroups();
- IProject project = resource.getProject();
- for (FilterGroup group : groups){
- if (!group.shouldValidate(project, resource, contentTypeWrapper))return false;
- }
- return true;
- }
-
-
- @Override
- public void setDelegatingId(String delegating) {
- super.setDelegatingId(delegating);
- _delegated = null;
- }
-
- public synchronized void setGroups(List<FilterGroup> groups){
- _groups = groups;
- _groupsArray = null;
- bumpChangeCountGroups();
- }
-
- public void setId(String id) {
- if (!Misc.same(_id, id)){
- _id = id;
- bumpChangeCountGlobal();
- }
- }
-
- public void setName(String name) {
- if (!Misc.same(_name, name)){
- _name = name;
- bumpChangeCountGlobal();
- }
- }
-
- @Override
- public ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor) {
- ValidationResult vr = null;
- if (operation == null)operation = new ValOperation();
- if (monitor == null)monitor = new NullProgressMonitor();
- try {
- vr = getDelegatedValidator().validate(resource, kind, operation.getState(), monitor);
- }
- catch (Exception e){
- try {
- String msg = NLS.bind(ValMessages.LogValEnd, getName(), resource.getLocationURI());
- ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, msg);
- }
- catch (Exception e2 ){
- // ignore it
- }
- ValidationPlugin.getPlugin().handleException(e);
- }
-
- if (vr != null){
- if (vr.getValidationException() != null){
- ValidationPlugin.getPlugin().handleException(vr.getValidationException());
- }
- updateResults(vr);
- if (vr.getDependsOn() != null){
- ValidationFramework.getDefault().getDependencyIndex().set(getId(), resource, vr.getDependsOn());
- }
- IResource[] validated = vr.getValidated();
- if (validated != null){
- for (int i=0; i<validated.length; i++){
- operation.addValidated(getId(), validated[i]);
- }
- }
-
- ValidatorMessage[] msgs = vr.getMessages();
-// if (sanityTest(msgs.length, resource)){
- MarkerManager mm = MarkerManager.getDefault();
- for (ValidatorMessage m : msgs){
- mm.createMarker(m, getId());
- }
-// }
-// else {
-// setBuildValidation(false);
-// setManualValidation(false);
-// }
- }
- return vr;
- }
-
- /**
- * Perform a simple sanity test to ensure that the validator is configured correctly.
- * @param numberofMessages number of messages that the validator produced.
- * @return true if the test passed
- */
-// private boolean sanityTest(int numberofMessages, IResource resource) {
-// //FIXME make this more general and configurable
-// if (numberofMessages < 201)return true;
-//
-// String resName = ""; //$NON-NLS-1$
-// if (resource != null)resName = resource.getName();
-// String message = NLS.bind(ValMessages.ConfigError, new Object[]{
-// getName(), getId(), String.valueOf(numberofMessages), resName});
-// ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, message);
-//
-// return false;
-// }
-
- /**
- * If the validator is using a report helper then update it with any of the messages that were
- * added directly to the validation result.
- * @param vr
- */
- private void updateResults(ValidationResult vr) {
- ReporterHelper rh = vr.getReporterHelper();
- if (rh == null)return;
- ClassLoader classloader = getDelegatedValidator().getClass().getClassLoader();
- for (IMessage message : rh.getMessages()){
- Object target = message.getTargetObject();
- if (target != null){
- IResource res = null;
- if (target instanceof IResource)res = (IResource)target;
- if (res == null){
- target = message.getAttribute(IMessage.TargetResource);
- if (target != null && target instanceof IResource)res = (IResource)target;
- }
- if (res != null){
-
- ValidatorMessage vm = ValidatorMessage.create(message.getText(classloader), res);
- if (getMarkerId() != null)vm.setType(getMarkerId());
- vr.add(vm);
- int markerSeverity = IMarker.SEVERITY_INFO;
- int sev = message.getSeverity();
- if ((sev & IMessage.HIGH_SEVERITY) != 0)markerSeverity = IMarker.SEVERITY_ERROR;
- else if ((sev & IMessage.NORMAL_SEVERITY) != 0)markerSeverity = IMarker.SEVERITY_WARNING;
- vm.setAttribute(IMarker.SEVERITY, markerSeverity);
- vm.setAttribute(IMarker.LINE_NUMBER, message.getLineNumber());
- int offset = message.getOffset();
- if (offset != IMessage.OFFSET_UNSET){
- vm.setAttribute(IMarker.CHAR_START, offset);
- int len = message.getLength();
- if (len != IMessage.OFFSET_UNSET){
- vm.setAttribute(IMarker.CHAR_START, offset);
- vm.setAttribute(IMarker.CHAR_END, offset+len);
- }
- }
- String groupName = message.getGroupName();
- if (groupName != null){
- vm.setAttribute(ConfigurationConstants.VALIDATION_MARKER_GROUP, groupName);
- }
-
- copyAttributes(message, vm);
- }
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- private void copyAttributes(IMessage message, ValidatorMessage vm) {
- // I made this a separate method, so that I could localize the suppression of unchecked warnings.
- Map attributes = message.getAttributes();
- if (attributes != null){
- for (Iterator it = attributes.entrySet().iterator(); it.hasNext();){
- Map.Entry me = (Map.Entry)it.next();
- String key = (String)me.getKey();
- vm.setAttribute(key, me.getValue());
- }
- }
- }
-
- @Override
- public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor) {
- getDelegatedValidator().validationStarting(project, state, monitor);
- }
-
- @Override
- public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor) {
- getDelegatedValidator().validationFinishing(project, state, monitor);
- }
-
- @SuppressWarnings("unchecked")
- public Object getAdapter(Class adapter) {
- return Platform.getAdapterManager().getAdapter(this, adapter);
- }
-
- public synchronized void remove(FilterGroup group) {
- _groups.remove(group);
- _groupsArray = null;
- bumpChangeCountGroups();
- }
-
- @Override
- public void resetChangeCounters() {
- super.resetChangeCounters();
- _changeCountGroups = 0;
- }
-
- @Override
- protected boolean shouldValidateProject(IProject project) {
- FilterGroup[] groups = getGroups();
- ContentTypeWrapper ctw = new ContentTypeWrapper();
- for (FilterGroup group : groups){
- if (!group.shouldValidate(project, null, ctw))return false;
- }
- return true;
- }
-
- @Override
- public void become(Validator val) {
- super.become(val);
- V2 v2 = val.asV2Validator();
- if (v2 == null)throw new IllegalArgumentException(ValMessages.Error20);
- _changeCountGroups = v2._changeCountGroups;
- _delegated = v2._delegated;
- _groups = v2._groups;
- _groupsArray = v2._groupsArray;
- _id = v2._id;
- _name = v2._name;
- _validator = v2._validator;
- _validatorConfigElement = v2._validatorConfigElement;
- _validatorClassName = v2._validatorClassName;
- _validatorGroupIds = v2._validatorGroupIds;
- }
-
-}
-
-public String getSourceId() {
- return _sourceId;
-}
-
-public void setSourceId(String sourceId) {
- if (!Misc.same(_sourceId, sourceId)){
- _sourceId = sourceId;
- bumpChangeCountGlobal();
- }
-}
-
-/**
- * Take the instance variables from the incoming validator and set them to yourself.
- * @param validator
- */
-public void become(Validator validator) {
- _buildValidation = validator._buildValidation;
- _delegatingId = validator._delegatingId;
- _manualValidation = validator._manualValidation;
- _markerId = validator._markerId;
- _messageSettings = validator._messageSettings;
- _project = validator._project;
- _sourceId = validator._sourceId;
- _version = validator._version;
- _changeCountGlobal = validator._changeCountGlobal;
- _changeCountMessages = validator._changeCountMessages;
-}
-
-void setMessages(Map<String, MessageSeveritySetting> map) {
- _messageSettings = map;
- bumpChangeCountMessages();
-}
-
-public int getChangeCountGlobal() {
- return _changeCountGlobal;
-}
-
-public int getChangeCountMessages() {
- return _changeCountMessages;
-}
-
-public void bumpChangeCountMessages(){
- _changeCountMessages++;
-}
-
-public void resetChangeCounters() {
- _changeCountGlobal = 0;
- _changeCountMessages = 0;
-}
-
-public void bumpChangeCountGlobal(){
- _changeCountGlobal++;
-}
-
-/**
- * Answer true if you have the same configuration settings as validator.
- * @param validator this can be null.
- */
-public boolean sameConfig(Validator validator) {
- if (validator == null)return false;
- return hashCodeForConfig() == validator.hashCodeForConfig();
-}
-
-public String getMarkerId() {
- return _markerId;
-}
-
-public void setMarkerId(String markerId) {
- _markerId = markerId;
- if (markerId != null)MarkerManager.getDefault().getMarkers().add(markerId);
-}
-
-}

Back to the top