/******************************************************************************* | |
* Copyright (c) 2009 by SAP AG, Walldorf. | |
* 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: | |
* SAP AG - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jst.ws.jaxws.dom.runtime.validation; | |
import static org.eclipse.jst.ws.jaxws.utils.ContractChecker.nullCheckParam; | |
import java.util.HashSet; | |
import java.util.Set; | |
import org.eclipse.core.resources.IResource; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.validation.IValidationContext; | |
import org.eclipse.emf.validation.model.IConstraintStatus; | |
import org.eclipse.emf.validation.model.ModelConstraint; | |
import org.eclipse.emf.validation.service.IConstraintDescriptor; | |
import org.eclipse.jdt.core.IJavaElement; | |
import org.eclipse.jdt.core.JavaModelException; | |
import org.eclipse.jface.text.BadLocationException; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.annotation.AnnotationAdapterFactory; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.annotation.IAnnotationAdapter; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.util.Dom2ResourceMapper; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.util.Jee5DomUtils; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.util.LocatorExtractor; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.impl.ConstraintStatusExtended; | |
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.impl.ProblemLocation; | |
import org.eclipse.jst.ws.jaxws.utils.annotations.IAnnotation; | |
import org.eclipse.jst.ws.jaxws.utils.annotations.ILocator; | |
import org.eclipse.jst.ws.jaxws.utils.annotations.IParamValuePair; | |
import org.eclipse.jst.ws.jaxws.utils.logging.ILogger; | |
import org.eclipse.jst.ws.jaxws.utils.logging.Logger; | |
/** | |
* Base class to be used by other DOM constraints. Provides useful methods for | |
* creating {@link IConstraintStatus} during validation, extraction of | |
* error location etc. | |
* | |
* @author Georgi Vachkov | |
*/ | |
public abstract class AbstractValidationConstraint extends ModelConstraint | |
{ | |
private ILogger logger; | |
private Jee5DomUtils jee5DomUtil; | |
/** | |
* Constructor | |
* @param descriptor - the {@link IConstraintDescriptor} for the specific constraint | |
* should not be <code>null</code> | |
*/ | |
public AbstractValidationConstraint(IConstraintDescriptor descriptor) { | |
super(descriptor); | |
nullCheckParam(descriptor, "descriptor");//$NON-NLS-1$ | |
logger = new Logger(); | |
jee5DomUtil = Jee5DomUtils.getInstance(); | |
} | |
/** | |
* Abstract method called when the real validation have to take place. Override | |
* this method and implement your validation logic. | |
* @param ctx the validation context | |
* @return the status of your validation | |
* @throws CoreException | |
*/ | |
protected abstract IStatus doValidate(IValidationContext ctx) throws CoreException; | |
public IStatus validate(IValidationContext ctx) | |
{ | |
try { | |
return doValidate(ctx); | |
} catch (CoreException e) { | |
logger().logError(e.getMessage(), e); | |
} | |
return Status.OK_STATUS; | |
} | |
/** | |
* Creates OK status | |
* @param object the validated object | |
* @return {@link IConstraintStatus} instance with severity {@link IStatus#OK} | |
* @throws JavaModelException | |
*/ | |
protected IConstraintStatusExtended createOkStatus(EObject object) throws JavaModelException | |
{ | |
return new ConstraintStatusExtended(this, object, IStatus.OK, 0, "", new HashSet<IProblemLocation>(0));//$NON-NLS-1$ | |
} | |
/** | |
* Creates {@link IConstraintStatus} instance with severity depending on the severity defined by | |
* {@link IConstraintDescriptor#getSeverity()}. | |
* @param object the validated object | |
* @param message the message to be displayed | |
* @param annFQName the fully qualified name on the annotation validated | |
* @param attributeName the name of the attribute validated | |
* @return created object | |
* @throws JavaModelException | |
*/ | |
protected IConstraintStatusExtended createStatus(EObject object, String message, String annFQName, String attributeName) throws JavaModelException | |
{ | |
return createStatus(object, message, getLocator(object, annFQName, attributeName)); | |
} | |
protected IConstraintStatusExtended createStatus(final EObject object, final String message, final IProblemLocation locator) | |
{ | |
final Set<IProblemLocation> problems = new HashSet<IProblemLocation>(1); | |
problems.add(locator); | |
return new ConstraintStatusExtended(this, object, message, problems); | |
} | |
/** | |
* Creates {@link IProblemLocation} instance out of {@link EObject} instance. | |
* Defines which is the {@link IResource} containing this DOM object and tries to | |
* extract {@link ILocator}. | |
* @param eObject | |
* @param annFQName | |
* @param attributeName | |
* @return created location | |
* @throws JavaModelException | |
*/ | |
protected IProblemLocation getLocator(EObject eObject, String annFQName, String attributeName) throws JavaModelException | |
{ | |
final IAnnotationAdapter adapter = (IAnnotationAdapter)AnnotationAdapterFactory.INSTANCE.adapt(eObject, IAnnotationAdapter.class); | |
final IAnnotation<? extends IJavaElement> annotation = annFQName==null ? null : adapter.getAnnotation(annFQName); | |
if (annotation==null) { | |
return new ProblemLocation(findResource(eObject), getLocatorForImplementation(eObject)); | |
} | |
ILocator locator = null; | |
if (attributeName != null) { | |
locator = getLocatorForAttributeValue(annotation, attributeName); | |
} | |
if (locator == null) { | |
locator = annotation.getLocator(); | |
} | |
return new ProblemLocation(annotation.getAppliedElement().getResource(), locator); | |
} | |
protected ILocator getLocatorForAttributeValue(IAnnotation<? extends IJavaElement> annotation, String attributeName) | |
{ | |
for (IParamValuePair pair : annotation.getParamValuePairs()) | |
{ | |
if(pair.getParam().equals(attributeName)) { | |
return pair.getValue().getLocator(); | |
} | |
} | |
return null; | |
} | |
protected ILocator getLocatorForImplementation(final EObject eObject) throws JavaModelException { | |
try { | |
return LocatorExtractor.getInstance().find(eObject); | |
} catch (BadLocationException e) { | |
logger().logError(e.getMessage(), e); | |
} | |
return null; | |
} | |
protected IResource findResource(EObject eObject) throws JavaModelException { | |
return Dom2ResourceMapper.INSTANCE.findResource(eObject); | |
} | |
protected IAnnotation<? extends IJavaElement> findAnnotation(final EObject eObject, final String annFQName) | |
{ | |
final IAnnotationAdapter adapter = (IAnnotationAdapter)AnnotationAdapterFactory.INSTANCE.adapt(eObject, IAnnotationAdapter.class); | |
return adapter.getAnnotation(annFQName); | |
} | |
protected ILogger logger() { | |
return logger; | |
} | |
protected Jee5DomUtils jee5DomUtil() { | |
return jee5DomUtil; | |
} | |
} |