org.richfaces.cdk.apt.CdkProcessorImpl Maven / Gradle / Ivy
The newest version!
/*
* $Id$
*
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.richfaces.cdk.apt;
import java.util.Collections;
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.TypeElement;
import org.richfaces.cdk.CdkException;
import org.richfaces.cdk.Logger;
import org.richfaces.cdk.ModelValidator;
import org.richfaces.cdk.TimeMeasure;
import org.richfaces.cdk.model.ComponentLibrary;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
*
* Base class for all CDK Annotation processors. That class provides access to current CDK context and utility methods for Java
* source models.
*
*
* @author [email protected]
*
*/
public class CdkProcessorImpl extends AbstractProcessor implements CdkProcessor {
private static final Set PROCESSED_ANNOTATION = Collections.singleton("*");
public static final String CACHE_EAGERLY_OPTION = "libraryCachingEagerly";
@Inject
private SourceUtilsProvider sourceUtilsProducer;
@Inject
private LibraryCompiler compiler;
@Inject
private LibraryGenerator generator;
@Inject
private ModelValidator validator;
@Inject
private ComponentLibrary library;
@Inject(optional = true)
@Named(CACHE_EAGERLY_OPTION)
private boolean cachingEagerly = false;
@Inject
private Logger log;
private boolean firstRound = true;
private TimeMeasure time;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
sourceUtilsProducer.setProcessingEnv(processingEnv);
}
@Override
public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (time == null) {
time = new TimeMeasure("java source processing", log).info(true);
}
if (!roundEnv.processingOver()) {
if (firstRound) {
firstRound = false;
compiler.beforeJavaSourceProcessing();
time.start();
}
compiler.processJavaSource(processingEnv, roundEnv);
} else {
time.stop();
compiler.afterJavaSourceProcessing();
continueAfterJavaSourceProcessing();
}
return false;
}
@Override
public void continueAfterJavaSourceProcessing() {
try {
processNonJavaSources();
completeLibrary();
} catch (CdkException e) {
sendError(e);
}
if (!library.hasChanged() && cachingEagerly) {
log.info("[caching eagerly - not continuing to verification and generation phase]");
return;
}
try {
verify();
} catch (CdkException e) {
sendError(e);
}
if (0 == log.getErrorCount()) {
generate();
}
}
private void processNonJavaSources() {
time = new TimeMeasure("non-java source processing", log).info(true).start();
compiler.processNonJavaSources();
time.stop();
}
private void completeLibrary() {
time = new TimeMeasure("library completion", log).info(true).start();
compiler.completeLibrary();
time.stop();
}
private void verify() {
time = new TimeMeasure("library verification", log).info(true).start();
validator.verify(library);
time.stop();
}
private void generate() {
time = new TimeMeasure("library generation", log).info(true).start();
generator.generate();
time.stop();
}
@Override
public Set getSupportedAnnotationTypes() {
return PROCESSED_ANNOTATION;
}
@Override
public SourceVersion getSupportedSourceVersion() {
// CDK supports Java 8+ source code.
return SourceVersion.RELEASE_8;
}
private void sendError(CdkException e) {
processingEnv.getMessager().printMessage(javax.tools.Diagnostic.Kind.ERROR, e.getMessage());
}
}