All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.wst.validation.internal.delegates.DelegatingValidator Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2006, 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.internal.delegates;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.wst.validation.AbstractValidator;
import org.eclipse.wst.validation.ValidationResult;
import org.eclipse.wst.validation.ValidationState;
import org.eclipse.wst.validation.internal.ConfigurationManager;
import org.eclipse.wst.validation.internal.ProjectConfiguration;
import org.eclipse.wst.validation.internal.ResourceConstants;
import org.eclipse.wst.validation.internal.ResourceHandler;
import org.eclipse.wst.validation.internal.ValidationRegistryReader;
import org.eclipse.wst.validation.internal.ValidatorMetaData;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IProjectValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;
import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;

/**
 * This class is to be used as a base class by clients who want to provide
 * alternate validator implementations for a given validator type.
 * 
 * It locates the currently configured delegate for this validator and calls its
 * validate method.
 * 
 * @see IValidator
 * @see IDelegatingValidator
 * 
 * 

* Note: This class/interface is part of an interim API that is still * under development and expected to change significantly before reaching * stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this * API will almost certainly be broken (repeatedly) as the API evolves. *

*/ public class DelegatingValidator extends AbstractValidator implements IDelegatingValidator { public DelegatingValidator() { } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IValidator#cleanup(org.eclipse.wst.validation.internal.provisional.core.IReporter) */ public void cleanup(IReporter reporter) { // [Issue] This method does not get passed the validation context. How are // going to know the delegate in order to invoke its cleanup method? } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IValidator#validate(org.eclipse.wst.validation.internal.provisional.core.IValidationContext, * org.eclipse.wst.validation.internal.provisional.core.IReporter) */ public void validate(IValidationContext helper, IReporter reporter) throws ValidationException { validateInJob(helper, reporter); } /** * Wraps the original reporter instance to make it look like this validator is * the one generating messages. This is needed because the framework ignores * messages coming from the delegate validator because it is not registered * with the validation framework. */ private class DelegatingReporter implements IReporter { /** * The reporter passed originally to the delegating validator by the * framework. */ IReporter delegatingReporter; /** * The delegating validator. */ IValidator delegatingValidator; /** * Constructor. * * @param validator * the original validator. * @param reporter * the reporter originally passed to the delegating validator. */ DelegatingReporter(IValidator validator, IReporter reporter) { delegatingReporter = reporter; delegatingValidator = validator; } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#addMessage(org.eclipse.wst.validation.internal.provisional.core.IValidator, * org.eclipse.wst.validation.internal.provisional.core.IMessage) */ public void addMessage(IValidator origin, IMessage message) { delegatingReporter.addMessage(delegatingValidator, message); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#displaySubtask(org.eclipse.wst.validation.internal.provisional.core.IValidator, * org.eclipse.wst.validation.internal.provisional.core.IMessage) */ public void displaySubtask(IValidator validator, IMessage message) { delegatingReporter.displaySubtask(delegatingValidator, message); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#getMessages() */ public List getMessages() { return delegatingReporter.getMessages(); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#isCancelled() */ public boolean isCancelled() { return delegatingReporter.isCancelled(); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#removeAllMessages(org.eclipse.wst.validation.internal.provisional.core.IValidator) */ public void removeAllMessages(IValidator origin) { delegatingReporter.removeAllMessages(delegatingValidator); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#removeAllMessages(org.eclipse.wst.validation.internal.provisional.core.IValidator, * java.lang.Object) */ public void removeAllMessages(IValidator origin, Object object) { delegatingReporter.removeAllMessages(delegatingValidator, object); } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IReporter#removeMessageSubset(org.eclipse.wst.validation.internal.provisional.core.IValidator, * java.lang.Object, java.lang.String) */ public void removeMessageSubset(IValidator validator, Object obj, String groupName) { delegatingReporter.removeMessageSubset(delegatingValidator, obj, groupName); } } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IValidatorJob#validateInJob(org.eclipse.wst.validation.internal.provisional.core.IValidationContext, * org.eclipse.wst.validation.internal.provisional.core.IReporter) */ public IStatus validateInJob(IValidationContext helper, IReporter reporter) throws ValidationException { ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(this); String validatorName = vmd.getValidatorDisplayName(); // We need to ensure that the context is an IProjectValidationContext. The // limitation of using an IValidationContext is that it does not readily // provide the project the validator is being invoked upon. if (!(helper instanceof IProjectValidationContext)) { throw new ValidationException(new LocalizedMessage(IMessage.HIGH_SEVERITY, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_WRONG_CONTEXT_FOR_DELEGATE, new String[] { validatorName }))); } IProjectValidationContext projectContext = (IProjectValidationContext) helper; IProject project = projectContext.getProject(); ValidatorDelegateDescriptor delegateDescriptor = null; try { ProjectConfiguration projectConfig = ConfigurationManager.getManager().getProjectConfiguration(project); delegateDescriptor = projectConfig.getDelegateDescriptor(vmd); } catch (InvocationTargetException e) { // Already dealt with by the framework. } finally { if (delegateDescriptor == null) { throw new ValidationException(new LocalizedMessage(IMessage.HIGH_SEVERITY, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_NO_DELEGATE, new String[] { vmd.getValidatorDisplayName() }))); } } IValidatorJob delegate = (IValidatorJob)delegateDescriptor.getValidator(); // We need to make it look like this validator is the one generating // messages so we wrap the reporter and use this validator as the source. // The validation framework does not recognize our validators because they // are not registered directly with the framework. // We could make them work like the aggregated validators but that would // create problems with markers not being cleaned up if someone switches // validators. // TODO : Maybe we could clear all the markers generated by a delegate when // the user chooses a different delegate implementation? DelegatingReporter delegatingReporter = new DelegatingReporter(this, reporter); IStatus status = delegate.validateInJob(helper, delegatingReporter); return status; } /* * (non-Javadoc) * * @see org.eclipse.wst.validation.internal.provisional.core.IValidatorJob#getSchedulingRule(org.eclipse.wst.validation.internal.provisional.core.IValidationContext) */ public ISchedulingRule getSchedulingRule(IValidationContext helper) { return null; } @Override public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) { return null; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy