void renderModelBindings() throws Exception {
if (bindings.size() == 0 && allModels.size() == 0)
return;
Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setClassLoaderForTemplateLoading(getClass().getClassLoader(), "/");
Template bindingTemplate = cfg.getTemplate("templates/java/binding.ftl");
for (IntentBinding binding : bindings) {
String name = (binding.getPackageName() != null ? binding.getPackageName() + "." : "")
+ binding.getName() + "Binding";
JavaFileObject file = this.processingEnv.getFiler()
.createSourceFile(name, binding.getElement());
Writer writer = file.openWriter();
try {
Map model = new HashMap<>();
model.put("binding", binding);
model.put("cyto", "true".equals(processingEnv.getOptions().get(UI)));
bindingTemplate.process(model, writer);
writer.flush();
} catch (TemplateException err) {
throw new IOException(err);
}
writer.close();
}
if (allModels.size() > 0) {
Element[] elements = new Element[allModels.size()];
int ix = 0;
for (SimpleModel simpleModel : allModels.values()) {
elements[ix++] = simpleModel.getElement();
if (simpleModel instanceof ArrayModel) {
ArrayModel arrayModel = (ArrayModel) simpleModel;
if (arrayModel.getModel() == null)
((ArrayModel) simpleModel).setModel(allModels.get(arrayModel.getModelId()));
continue;
}
if (simpleModel.getParentId() != null && simpleModel.getParent() == null) {
simpleModel.setParent(allModels.get(simpleModel.getParentId()));
simpleModel.getProperties().addAll(simpleModel.getParent().getProperties());
}
for (Property property : simpleModel.getProperties()) {
if (property.getModelId() != null) {
property.setModel(allModels.get(property.getModelId()));
if (property.getModel() == null)
throw new Exception("Model (" + property.getModelId() + ") not found");
}
}
}
String modelTypes = processingEnv.getOptions().get(MODEL_TYPES);
if (modelTypes != null) {
for (String modelType : modelTypes.split(",")) {
String packageName = processingEnv.getOptions().get(DEFAULT_PACKAGE);
if (packageName == null)
packageName = "nuclei.data";
Context context = new Context(allModels.values(), packageName, null);
context.render(cfg, modelType, processingEnv.getFiler());
}
}
}
}