/*******************************************************************************
* Copyright (c) 2010-2012, Zoltan Ujhelyi, Istvan Rath and Daniel Varro
* 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:
* Zoltan Ujhelyi - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.patternlanguage.annotations;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.incquery.patternlanguage.annotations.impl.ExtensionBasedPatternAnnotationParameter;
import org.eclipse.incquery.patternlanguage.annotations.impl.ExtensionBasedPatternAnnotationValidator;
import org.eclipse.incquery.patternlanguage.patternLanguage.Annotation;
import org.eclipse.incquery.patternlanguage.patternLanguage.AnnotationParameter;
import org.eclipse.incquery.patternlanguage.patternLanguage.PatternLanguageFactory;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class PatternAnnotationProvider {
/**
*
*/
private static final String VALIDATOR_PARAMETER_NAME = "additionalValidator";
@Inject
private Logger log;
@Inject
private Injector injector;
private static final class ExtensionConverter implements
Function<IConfigurationElement, ExtensionBasedPatternAnnotationParameter> {
@Override
public ExtensionBasedPatternAnnotationParameter apply(IConfigurationElement input) {
Preconditions.checkNotNull(input, "input");
final String parameterName = input.getAttribute("name");
final boolean mandatory = Boolean.parseBoolean(input.getAttribute("mandatory"));
final boolean multiple = Boolean.parseBoolean(input.getAttribute("multiple"));
final String deprecatedString = input.getAttribute("deprecated");
final boolean deprecated = Boolean.parseBoolean(deprecatedString);
final String type = input.getAttribute("type");
final String description = input.getAttribute("description");
return new ExtensionBasedPatternAnnotationParameter(parameterName, type, description, multiple, mandatory,
deprecated);
}
}
static final String EXTENSIONID = "org.eclipse.incquery.patternlanguage.annotation";
private Map<String, IPatternAnnotationValidator> annotationValidators;
protected void initializeValidators() {
annotationValidators = new Hashtable<String, IPatternAnnotationValidator>();
final IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSIONID);
for (IConfigurationElement e : config) {
try {
final String annotationName = e.getAttribute("name");
final String description = e.getAttribute("description");
final String deprecatedString = e.getAttribute("deprecated");
final boolean deprecated = Boolean.parseBoolean(deprecatedString);
final IConfigurationElement[] parameters = e.getChildren("annotationparameter");
IPatternAnnotationAdditionalValidator validator = null;
final Iterable<ExtensionBasedPatternAnnotationParameter> parameterIterable = Iterables.transform(
Arrays.asList(parameters), new ExtensionConverter());
if (e.getAttribute(VALIDATOR_PARAMETER_NAME) != null) {
validator = (IPatternAnnotationAdditionalValidator) e
.createExecutableExtension(VALIDATOR_PARAMETER_NAME);
injector.injectMembers(validator);
}
final IPatternAnnotationValidator annotationValidator = new ExtensionBasedPatternAnnotationValidator(
annotationName, description, deprecated, parameterIterable, validator);
annotationValidators.put(annotationName, annotationValidator);
} catch (CoreException ex) {
log.error(
String.format("Error while initializing the validator for annotation %s.",
e.getAttribute("name")), ex);
}
}
}
/**
* Returns a pattern annotation validator for a selected annotation name
*
* @param annotationName
* @return a pattern annotation validator
*/
public IPatternAnnotationValidator getValidator(String annotationName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.get(annotationName);
}
public Annotation getAnnotationObject(String annotationName) {
Annotation annotation = PatternLanguageFactory.eINSTANCE.createAnnotation();
annotation.setName(annotationName);
return annotation;
}
public AnnotationParameter getAnnotationParameter(String annotationName, String parameterName) {
Annotation annotation = getAnnotationObject(annotationName);
return getAnnotationParameter(annotation, parameterName);
}
public AnnotationParameter getAnnotationParameter(Annotation annotation, String parameterName) {
AnnotationParameter parameter = PatternLanguageFactory.eINSTANCE.createAnnotationParameter();
parameter.setName(parameterName);
annotation.getParameters().add(parameter);
return parameter;
}
/**
* Decides whether a validator is defined for the selected annotation name.
*
* @param annotationName
* @return true, if a validator is defined
*/
public boolean hasValidator(String annotationName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.containsKey(annotationName);
}
public Set<String> getAllAnnotationNames() {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.keySet();
}
public Iterable<String> getAnnotationParameters(String annotationName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.get(annotationName).getAllAvailableParameterNames();
}
public String getDescription(Annotation annotation) {
return getDescription(annotation.getName());
}
public String getDescription(String annotationName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.get(annotationName).getDescription();
}
public String getDescription(AnnotationParameter parameter) {
Annotation annotation = (Annotation) parameter.eContainer();
return getDescription(annotation.getName(), parameter.getName());
}
public String getDescription(String annotationName, String parameterName) {
if (annotationValidators == null) {
initializeValidators();
}
if (!annotationValidators.containsKey(annotationName)) {
return "";
}
return annotationValidators.get(annotationName).getDescription(parameterName);
}
public boolean isDeprecated(Annotation annotation) {
return isDeprecated(annotation.getName());
}
public boolean isDeprecated(String annotationName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.containsKey(annotationName)
&& annotationValidators.get(annotationName).isDeprecated();
}
public boolean isDeprecated(AnnotationParameter parameter) {
Annotation annotation = (Annotation) parameter.eContainer();
return isDeprecated(annotation.getName(), parameter.getName());
}
public boolean isDeprecated(String annotationName, String parameterName) {
if (annotationValidators == null) {
initializeValidators();
}
return annotationValidators.containsKey(annotationName)
&& annotationValidators.get(annotationName).isDeprecated(parameterName);
}
}