package com.google.inject.blender;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.String;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.tools.JavaFileObject;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
/**
* Generates a AnnotationDatabase implementation for RoboGuice.
* @author Mike Burton
* @author SNI TODO use javawriter
*/
public class AnnotationDatabaseGenerator {
private String templatePath;
private String packageName;
private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToFieldSet;
private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToMethodSet;
private HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToConstructorSet;
private HashSet<String> classesContainingInjectionPointsSet;
private HashSet<String> bindableClasses;
public void generateAnnotationDatabase(JavaFileObject jfo) throws IOException {
Properties props = new Properties();
props.put("resource.loader", "class");
props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init(props);
VelocityContext context = createVelocityContext();
Template template = null;
PrintWriter w = null;
try {
template = Velocity.getTemplate(templatePath);
w = new PrintWriter(jfo.openWriter());
template.merge(context, w);
} catch (Exception ex) {
ex.printStackTrace();
throw new IOException("Impossible to generate annotation database.", ex);
} finally {
if( w != null ) {
try {
w.close();
} catch( Exception ex ) {
ex.printStackTrace();
throw new IOException("Impossible to close annotation database.", ex);
}
}
}
}
protected VelocityContext createVelocityContext() {
VelocityContext context = new VelocityContext();
context.put("packageName", packageName);
context.put("mapAnnotationToMapClassWithInjectionNameToFieldSet", mapAnnotationToMapClassWithInjectionNameToFieldSet);
context.put("mapAnnotationToMapClassWithInjectionNameToMethodSet", mapAnnotationToMapClassWithInjectionNameToMethodSet);
context.put("mapAnnotationToMapClassWithInjectionNameToConstructorSet", mapAnnotationToMapClassWithInjectionNameToConstructorSet);
context.put("classesContainingInjectionPointsSet", classesContainingInjectionPointsSet);
context.put("injectedClasses", bindableClasses);
return context;
}
public String getTemplatePath() {
return templatePath;
}
public void setTemplatePath(String templatePath) {
this.templatePath = templatePath;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassWithInjectionNameToFieldSet() {
return mapAnnotationToMapClassWithInjectionNameToFieldSet;
}
public void setMapAnnotationToMapClassWithInjectionNameToFieldSet(HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToFieldSet) {
this.mapAnnotationToMapClassWithInjectionNameToFieldSet = mapAnnotationToMapClassWithInjectionNameToFieldSet;
}
public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassWithInjectionNameToMethodSet() {
return mapAnnotationToMapClassWithInjectionNameToMethodSet;
}
public void setMapAnnotationToMapClassWithInjectionNameToMethodSet(HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToMethodSet) {
this.mapAnnotationToMapClassWithInjectionNameToMethodSet = mapAnnotationToMapClassWithInjectionNameToMethodSet;
}
public HashMap<String, Map<String, Set<String>>> getMapAnnotationToMapClassWithInjectionNameToConstructorSet() {
return mapAnnotationToMapClassWithInjectionNameToConstructorSet;
}
public void setMapAnnotationToMapClassWithInjectionNameToConstructorSet(HashMap<String, Map<String, Set<String>>> mapAnnotationToMapClassWithInjectionNameToConstructorSet) {
this.mapAnnotationToMapClassWithInjectionNameToConstructorSet = mapAnnotationToMapClassWithInjectionNameToConstructorSet;
}
public HashSet<String> getClassesContainingInjectionPointsSet() {
return classesContainingInjectionPointsSet;
}
public void setClassesContainingInjectionPointsSet(HashSet<String> classesContainingInjectionPointsSet) {
this.classesContainingInjectionPointsSet = classesContainingInjectionPointsSet;
}
public HashSet<String> getBindableClasses() {
return bindableClasses;
}
public void setBindableClasses(HashSet<String> bindableClasses) {
this.bindableClasses = bindableClasses;
}
}