package fr.imag.adele.apam.maven.plugin.validation;
import java.util.HashMap;
import java.util.Map;
import fr.imag.adele.apam.declarations.AtomicImplementationDeclaration;
import fr.imag.adele.apam.declarations.ComponentDeclaration;
import fr.imag.adele.apam.declarations.ProviderInstrumentation;
import fr.imag.adele.apam.declarations.RelationDeclaration;
import fr.imag.adele.apam.declarations.RequirerInstrumentation;
import fr.imag.adele.apam.declarations.SpecificationDeclaration;
import fr.imag.adele.apam.declarations.instrumentation.InjectedField;
import fr.imag.adele.apam.declarations.references.resources.ResourceReference;
import fr.imag.adele.apam.declarations.references.resources.UnknownReference;
import fr.imag.adele.apam.declarations.repository.maven.Classpath;
/**
* This validator inherit the common validations , and adds all the validations
* regarding instrumentation declared in {@link AtomicImplementationDeclaration}
*
* @author vega
*
*/
public class AtomicComponentValidator extends ComponentValidator<AtomicImplementationDeclaration> {
public AtomicComponentValidator(ValidationContext context, Classpath classpath) {
super(context, classpath);
}
@Override
protected void validateProvides() {
super.validateProvides();
/*
* Validate the instrumented provided resources are actually declared as provided
*/
ComponentDeclaration effective = getGroup() != null ? getComponent().getEffectiveDeclaration(getGroup()) : getComponent();
for (ProviderInstrumentation instrumentation : getComponent().getProviderInstrumentation()) {
ResourceReference instrumented = instrumentation.getProvidedResource();
checkResourceExists(instrumented);
if ( instrumented != null && ! (instrumented instanceof UnknownReference) && !effective.getProvidedResources().contains(instrumented)) {
error("the return type of the specified method "+quoted(instrumentation.getName())+ " is not one of the provided resources");
}
}
}
@Override
protected void validateRelations() {
super.validateRelations();
/*
* validate fields are not injected several times
*/
Map<InjectedField,RelationDeclaration> injectedFields = new HashMap<InjectedField,RelationDeclaration>();
for (RelationDeclaration relation : getComponent().getRelations()) {
for (RequirerInstrumentation instrumentation : relation.getInstrumentations()) {
if (instrumentation instanceof InjectedField) {
InjectedField injectedField = (InjectedField) instrumentation;
if (injectedFields.containsKey(injectedField)) {
error("invalid relation injection " + relation.getIdentifier() + ", field "+quoted(injectedField.getName())+" is already injected in relation "+quoted(injectedFields.get(injectedField).getIdentifier()));
}
injectedFields.put(injectedField,relation);
}
}
}
}
@Override
protected PropertyValidator createPropertyValidator() {
return new InstrumentedPropertyValidator(this);
}
@Override
protected RelationValidator createRelationValidator() {
return new InstrumentedRelationValidator(this);
}
@Override
protected SpecificationDeclaration getGroup() {
return (SpecificationDeclaration) super.getGroup();
}
}