blob: c6206941609aa072263a9fdf3c4ffdf2654fd029 [file] [log] [blame]
/**
* Copyright (c) 2017 Eclipse contributors 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
*/
package org.eclipse.emf.ecore;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.ecore.util.BasicEAnnotationValidator;
import org.eclipse.emf.ecore.util.EObjectValidator;
/**
* An annotation validity checker for a specific {@link EAnnotation#getSource() annotation source}.
* <p>
* Implementations of EAnnotationValidator should extend {@link org.eclipse.emf.ecore.util.BasicEAnnotationValidator BasicEAnnotationValidator}
* or one of its derived classes
* because methods may be added to this API.
* </p>
*
* @since 2.14
* @see BasicEAnnotationValidator
*
* @noimplement Do not implement this interface directly; instead extend {@link BasicEAnnotationValidator} or one of its subclasses.
*/
public interface EAnnotationValidator
{
/**
* An <code>EAnnotationValidator</code> wrapper used by the {@link EAnnotationValidator.Registry}.
*/
interface Descriptor
{
/**
* Returns the annotation validator.
* @return the annotation validator.
*/
EAnnotationValidator getEAnnotationValidator();
}
/**
* A map from {@link EAnnotation#getSource() annotation source} to {@link EAnnotationValidator} or to {@link Descriptor}.
*/
interface Registry extends Map<String, Object>
{
/**
* Looks up the annotation source in the map.
*/
EAnnotationValidator getEAnnotationValidator(String annotationSource);
/**
* The global instance of an annotation validator registry.
*/
Registry INSTANCE = new Impl();
class Impl extends HashMap<String, Object> implements Registry
{
private static final long serialVersionUID = 1L;
@Override
public Object get(Object key)
{
Object eAnnotationValidator = super.get(key);
if (eAnnotationValidator instanceof EAnnotationValidator.Descriptor)
{
EAnnotationValidator.Descriptor eAnnotationValidatorDescriptor = (EAnnotationValidator.Descriptor)eAnnotationValidator;
eAnnotationValidator = eAnnotationValidatorDescriptor.getEAnnotationValidator();
put((String)key, eAnnotationValidator);
return eAnnotationValidator;
}
else
{
return eAnnotationValidator;
}
}
public EAnnotationValidator getEAnnotationValidator(String annotationSource)
{
return (EAnnotationValidator)get(annotationSource);
}
}
}
/**
* Returns the {@link EAnnotation#getSource() annotation source} of the annotations validated by this annotation validator.
* @return the annotation source.
*/
String getAnnotationSource();
/**
* Returns whether this annotation with this annotation validator's {@link EAnnotation#getSource() annotation source} is valid at its {@link EAnnotation#getEModelElement() current location}.
* @param eAnnotation the annotation in question.
* @return whether this annotation with this annotation validator's annotation source is valid at its current location.
*/
boolean isValidLocation(EAnnotation eAnnotation);
/**
* Returns whether this annotation is valid.
* @param eAnnotation the annotation in question.
* @param diagnostics a place to accumulate diagnostics; if it's <code>null</code>, no diagnostics should be produced.
* @param context a place to cache information, if it's <code>null</code>, no cache is supported.
* @return whether this annotation is valid.
*
* @see EObjectValidator#validate(EObject, DiagnosticChain, Map)
*/
boolean validate(EAnnotation eAnnotation, DiagnosticChain diagnostics, Map<Object, Object> context);
}