in json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java [1135:1227]
private boolean generateOperation(Element clazz,
StringWriter body, String className,
List<? extends Element> enclosedElements,
List<Object> functions
) {
final Types tu = processingEnv.getTypeUtils();
boolean instance = clazz.getAnnotation(Model.class).instance();
for (Element m : enclosedElements) {
if (m.getKind() != ElementKind.METHOD) {
continue;
}
ExecutableElement e = (ExecutableElement)m;
ModelOperation mO = e.getAnnotation(ModelOperation.class);
if (mO == null) {
continue;
}
if (!instance && !e.getModifiers().contains(Modifier.STATIC)) {
error("@ModelOperation method needs to be static", e);
return false;
}
if (e.getModifiers().contains(Modifier.PRIVATE)) {
error("@ModelOperation method cannot be private", e);
return false;
}
if (e.getReturnType().getKind() != TypeKind.VOID) {
error("@ModelOperation method should return void", e);
return false;
}
List<String> args = new ArrayList<String>();
{
body.append(" /** @see " + clazz.getSimpleName() + "#" + m.getSimpleName() + " */\n");
body.append(" public void ").append(m.getSimpleName()).append("(");
String sep = "";
boolean checkFirst = true;
for (VariableElement ve : e.getParameters()) {
final TypeMirror type = ve.asType();
CharSequence simpleName;
if (type.getKind() == TypeKind.DECLARED) {
simpleName = ((DeclaredType)type).asElement().getSimpleName();
} else {
simpleName = type.toString();
}
if (checkFirst && simpleName.toString().equals(className)) {
checkFirst = false;
} else {
if (checkFirst) {
error("First parameter of @ModelOperation method must be " + className, m);
return false;
}
if (ve.asType().getKind() == TypeKind.ARRAY) {
args.add("(Object) " + ve.getSimpleName().toString());
} else {
args.add(ve.getSimpleName().toString());
}
body.append(sep).append("final ");
body.append(ve.asType().toString()).append(" ");
body.append(ve.toString());
sep = ", ";
}
}
body.append(") {\n");
int idx = functions.size() / 2;
functions.add(m.getSimpleName().toString());
body.append(" proto.runInBrowser(" + idx);
for (String s : args) {
body.append(", ").append(s);
}
body.append(");\n");
body.append(" }\n");
StringBuilder call = new StringBuilder();
call.append("{ Object[] arr = (Object[])data; ");
call.append(inPckName(clazz, true)).append(".").append(m.getSimpleName()).append("(");
int i = 0;
for (VariableElement ve : e.getParameters()) {
if (i++ == 0) {
call.append("model");
continue;
}
String type = ve.asType().toString();
String boxedType = findBoxedType(type);
if (boxedType != null) {
type = boxedType;
}
call.append(", ").append("(").append(type).append(")arr[").append(i - 2).append("]");
}
call.append("); }");
functions.add(call.toString());
}
}
return true;
}