/*
* Copyright 2011 ArcBees Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.gwtplatform.dispatch.annotation.processor;
import java.lang.annotation.Annotation;
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.ProcessingEnvironment;
import javax.annotation.processing.RoundEnvironment;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic.Kind;
/**
* <p>
* Abstract processor class for all {@code @GenX} annotations.
* </p>
* <p/>
* Annotate your processor with @{@link SupportedAnnotationTypes} or override
* {@link #getSupportedAnnotationTypes()} to receive elements, that are
* annotated in the current environment with one of the given annotations. You
* can get access these elements using the method
* {@link #process(Element annotatedElement)}.
*/
public abstract class GenProcessor extends AbstractProcessor {
private ProcessingEnvironment environment;
@Override
public synchronized void init(ProcessingEnvironment environment) {
super.init(environment);
this.environment = environment;
}
/**
* Returns the current processing environment.
*
* @return the processing environment.
*/
public ProcessingEnvironment getEnvironment() {
return environment;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latest();
}
@Override
@SuppressWarnings("unchecked")
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
if (!roundEnvironment.processingOver()) {
onProcessingStarted();
for (String supportedAnnotationName : getSupportedAnnotationTypes()) {
printMessage("Searching for " + supportedAnnotationName + " annotations.");
try {
Class<?> supportedAnnotationClass = Class.forName(supportedAnnotationName);
if (supportedAnnotationClass.isAnnotation()) {
for (Element annotatedElement : roundEnvironment.getElementsAnnotatedWith((Class<? extends
Annotation>) supportedAnnotationClass)) {
printMessage("Found " + annotatedElement.toString() + ".");
this.process(annotatedElement);
}
}
} catch (ClassNotFoundException e) {
printError("Annotation not found: " + supportedAnnotationName);
}
}
onProcessingCompleted();
}
return true;
}
/**
* Prints a message.
*
* @param message the message
*/
public void printMessage(String message) {
getEnvironment().getMessager().printMessage(Kind.NOTE, message);
}
/**
* Prints an error.
*
* @param message the error message
*/
public void printError(String message) {
getEnvironment().getMessager().printMessage(Kind.ERROR, message);
}
/**
* Override this function to receive elements which you've declared in
* supported annotations.
*
* @param annotatedElement the annotated element.
*/
public abstract void process(Element annotatedElement);
/**
* Utility method called after processing has started.
*/
public void onProcessingStarted() {
printMessage(getClass().getName() + " started.");
}
/**
* Utility method called after the processing is finished.
*/
public void onProcessingCompleted() {
printMessage(getClass().getName() + " finished.");
}
}