private boolean generateOperation()

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;
    }