@Override
public String generate(TreeLogger logger, GeneratorContext context, String typeName) throws UnableToCompleteException {
TypeOracle oracle = context.getTypeOracle();
JClassType toGenerate = oracle.findType(typeName).isInterface();
if (toGenerate == null) {
logger.log(Type.ERROR, typeName + " is not an interface");
throw new UnableToCompleteException();
}
PropertyName annotation = toGenerate.getAnnotation(PropertyName.class);
if (annotation == null) {
logger.log(Type.ERROR, "Cannot generate with a @PropertyName anntation on the type");
throw new UnableToCompleteException();
}
String propertyName = annotation.value();
SelectionProperty property;
String value;
try {
property = context.getPropertyOracle().getSelectionProperty(logger, propertyName);
value = property.getCurrentValue();
} catch (BadPropertyValueException e) {
logger.log(Type.ERROR, "Error occured loading property: ", e);
throw new UnableToCompleteException();
}
String packageName = toGenerate.getPackage().getName();
String simpleSourceName = toGenerate.getName().replace('.', '_') + "_" + value;
PrintWriter pw = context.tryCreate(logger, packageName, simpleSourceName);
if (pw == null) {
return packageName + "." + simpleSourceName;
}
ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(packageName, simpleSourceName);
factory.addImplementedInterface(typeName);
SourceWriter sw = factory.createSourceWriter(context, pw);
for (JMethod method : toGenerate.getMethods()) {
if (method.getReturnType().isPrimitive() != JPrimitiveType.BOOLEAN
&& !method.getReturnType().isClass().getQualifiedSourceName().equals(
Name.getSourceNameForClass(Boolean.class))) {
logger.log(Type.ERROR, "Methods must return boolean or Boolean");
throw new UnableToCompleteException();