blob: 70bc7355e6b45600b641498809e63d7e08194930 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 BEA Systems, Inc.
* 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:
* tyeung@bea.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.apt.tests.external.annotations.batch;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import com.sun.mirror.apt.AnnotationProcessor;
import com.sun.mirror.apt.AnnotationProcessorEnvironment;
import com.sun.mirror.apt.AnnotationProcessorFactory;
import com.sun.mirror.declaration.AnnotationTypeDeclaration;
public class BatchGenAnnotationFactory implements AnnotationProcessorFactory {
private static int ROUND = 0;
private static final List<String> SUPPORTED_TYPES =
Collections.singletonList(BatchGen.class.getName());
public AnnotationProcessor getProcessorFor(
Set<AnnotationTypeDeclaration> decls,
AnnotationProcessorEnvironment env) {
if( ROUND == 0 ){
ROUND ++;
return new BatchGen0AnnotationProcessor(env);
}
else if( ROUND == 1){
ROUND ++;
if( !decls.isEmpty() )
env.getMessager().printError("Expecting empty set but got " + decls );
return new BatchGen1AnnotationProcessor(env);
}
else if( ROUND == 2 ){ // NO-OP
env.getMessager().printError("Called the third time.");
return null;
}
// This is to make sure we aren't bouncing the class loader without a full build.
else
env.getMessager().printError("Calling BatchGenAnnotionFactory too many times. Round=" + ROUND );
return null;
}
public Collection<String> supportedAnnotationTypes() {
return SUPPORTED_TYPES;
}
public Collection<String> supportedOptions() {
return Collections.emptyList();
}
static class BatchGen0AnnotationProcessor implements AnnotationProcessor {
final AnnotationProcessorEnvironment _env;
BatchGen0AnnotationProcessor(AnnotationProcessorEnvironment env){
_env = env;
}
public void process() {
// a generated file will cause BatchGenAnnotationFactory to be
// called again.
try{
final PrintWriter writer = _env.getFiler().createSourceFile("gen.Class0");
writer.print("package gen;\n");
writer.print("public class Class0{}");
writer.close();
}
catch(IOException e){
_env.getMessager().printError(e.getMessage());
}
}
}
static class BatchGen1AnnotationProcessor implements AnnotationProcessor {
final AnnotationProcessorEnvironment _env;
BatchGen1AnnotationProcessor(AnnotationProcessorEnvironment env){
_env = env;
}
public void process(){
try{
final PrintWriter writer = _env.getFiler().createSourceFile("gen.Class1");
writer.print("package gen;\n");
writer.print("public class Class1{}");
writer.close();
}
catch(IOException e){
_env.getMessager().printError(e.getMessage());
}
}
}
}