Example usage for com.google.gwt.core.ext.typeinfo JClassType getField

List of usage examples for com.google.gwt.core.ext.typeinfo JClassType getField

Introduction

In this page you can find the example usage for com.google.gwt.core.ext.typeinfo JClassType getField.

Prototype

JField getField(String name);

Source Link

Usage

From source file:com.guit.rebind.binder.GuitBinderGenerator.java

License:Apache License

@Override
protected void generate(SourceWriter writer) throws UnableToCompleteException {
    // Do we need to check this?
    JClassType presenterType = baseClass.getImplementedInterfaces()[0].isParameterized().getTypeArgs()[0];

    // Presenter or controller
    boolean isPresenter = checkIsPresenter(presenterType);

    hasNativeEventType = hasNativeEventType == null ? getType(HasNativeEvent.class.getCanonicalName())
            : hasNativeEventType;/*from w ww.  j  ava2  s .  co m*/

    // If it is a parameterized type we need to find the base type to get
    // the right method names
    while (presenterType.isParameterized() != null || presenterType.isRawType() != null) {
        if (presenterType.isParameterized() != null) {
            presenterType = presenterType.isParameterized().getBaseType();
        } else {
            presenterType = presenterType.isRawType().getBaseType();
        }
    }

    checkForRepetition(presenterType);

    writer.println(bindingsDeclaration);
    writer.println(eventBusbindingsDeclaration);

    String viewTypeName = null;
    HashMap<String, JType> validBindingFieldsTypes = null;
    if (isPresenter) {
        viewTypeName = guitViewGenerator.generate(logger, context, presenterType.getQualifiedSourceName());
        writer.println(viewTypeName + " view;");

        // Field -> Type (for validation purpose)
        validBindingFieldsTypes = getValidGuitViewBindingFields(presenterType);

        // View pool
        writer.println("private static " + ViewPool.class.getCanonicalName() + " pool = new "
                + ViewPool.class.getCanonicalName() + "();");
    }

    // If is an editor generate the driver
    boolean isGwtEditor = presenterType.isAnnotationPresent(GwtEditor.class);
    GwtEditor editor = null;
    Class<?> editorDriver = null;
    if (isGwtEditor) {
        editor = presenterType.getAnnotation(GwtEditor.class);
        editorDriver = editor.base();
        writer.println("public static interface Driver extends " + editorDriver.getCanonicalName() + "<"
                + editor.pojo().getCanonicalName() + "," + viewTypeName + "> {}");
    }

    writer.println(presenterType.getQualifiedSourceName() + " presenter;");

    writer.println(EventBus.class.getCanonicalName() + " eventBus;");

    writer.println("boolean isBinded = false;");

    /*
     * Event bus binder.
     */
    writer.println("public void bind(final " + presenterType.getQualifiedSourceName() + " presenter, final "
            + EventBus.class.getCanonicalName() + " eventBus) {");
    writer.indent();

    writer.println("this.presenter = presenter;");
    writer.println("this.eventBus = eventBus != null ? eventBus : " + GuitEntryPoint.class.getCanonicalName()
            + ".getEventBus();");
    printEventBusBindingMethods(writer, presenterType);

    writer.outdent();
    writer.println("}");

    /*
     * View binder.
     */
    writer.println("public " + View.class.getCanonicalName() + " getView() {");
    writer.indent();

    if (isPresenter) {
        // If already binded return the view
        writer.println("if (isBinded) {");
        writer.println("    return view;");
        writer.println("}");

        // Find a view from the pool or create a new one
        writer.println("if (pool.isEmpty()) {");
        writer.println("view = (" + viewTypeName + ") new " + viewTypeName + "();");

        ArrayList<JField> fields = new ArrayList<JField>();
        collectAllFields(presenterType, fields);

        // Provided fields
        printProvidedFields(presenterType, validBindingFieldsTypes, writer, false, fields);

        writer.println("view.bind();");
        writer.println("} else {");
        writer.println("view = (" + viewTypeName + ") pool.pop();");

        // Provided fields
        printProvidedFields(presenterType, validBindingFieldsTypes, writer, true, fields);

        writer.println("}");

        printViewFieldBindings(writer, presenterType, viewTypeName, validBindingFieldsTypes, fields);
        printViewBindingMethods(writer, presenterType, viewTypeName, validBindingFieldsTypes);

        // Initializers
        printPresentersInitilizersCalls(writer, presenterType);

        writer.println("isBinded = true;");

        // GwtEditor
        if (isGwtEditor) {
            writer.println("Driver driver = GWT.create(Driver.class);");

            if (editorDriver.equals(RequestFactoryEditorDriver.class)) {
                JField factoryField = presenterType.getField("factory");
                if (factoryField == null
                        || !factoryField.getType().isClassOrInterface()
                                .isAssignableTo(getType(RequestFactory.class.getCanonicalName()))
                        || factoryField.isPrivate()) {
                    error("The presenter does not have a non-private factory field of the type RequestFactory. Found: "
                            + presenterType.getQualifiedSourceName() + ".factory");
                }
                writer.println("driver.initialize(eventBus, presenter.factory, view);");
            } else {
                writer.println("driver.initialize(view);");
            }

            writer.println("presenter.driver = driver;");
        }

        // Return the view or null
        writer.println("return view;");
    } else {
        writer.println("return null;");
    }

    writer.outdent();
    writer.println("}");

    /*
     * Unbind
     */
    writer.println("public void releaseView() {");
    writer.indent();

    if (isPresenter) {
        writer.println("for (" + handlerRegistrationName + " b : bindings) {b.removeHandler();}");
        writer.println("bindings.clear();");
        if (isPresenter) {
            // Recycle the view
            writer.println("if (view != null) {");
            writer.indent();
            writer.println("pool.push(view);");
            writer.println("view = null;");
            writer.outdent();
            writer.println("}");
        }
        writer.println("isBinded = false;");
    }
    writer.outdent();
    writer.println("}");

    /*
     * Destroy.
     */
    writer.println("public void destroy() {");
    writer.indent();
    writer.println("for (" + handlerRegistrationName + " b : eventBusBindings) {b.removeHandler();}");
    if (isPresenter) {
        writer.println("releaseView();");
    }
    writer.println("bindings = null;");
    writer.println("eventBusBindings = null;");
    writer.println("presenter = null;");
    writer.println("eventBus = null;");
    writer.outdent();
    writer.println("}");
}

From source file:com.guit.rebind.binder.GuitBinderGenerator.java

License:Apache License

/**
 * Finds the valid methods and check all the conventions.
 *///from ww w.java 2  s.  co  m
protected void printEventBusBindingMethods(SourceWriter writer, JClassType presenterType)
        throws UnableToCompleteException {
    JPackage contextEventsPackage = getPackage(presenterType.getPackage().getName() + ".event");
    for (JMethod m : presenterType.getMethods()) {
        if (m.isAnnotationPresent(EventBusHandler.class)) {

            EventBusHandler eventBusHandler = m.getAnnotation(EventBusHandler.class);

            String name = m.getName();
            String presenterName = presenterType.getQualifiedSourceName();

            validateHandler(m, name, presenterName);

            // Find the event type
            JParameter[] parameters = m.getParameters();

            if (!name.startsWith("$") && !name.startsWith("eventBus$")) {
                error("Bad method name: %s on class: %s, the method should start with '$' or 'eventBus$'", name,
                        presenterName);
            }

            // Clean the name
            if (name.startsWith("$")) {
                name = name.substring(1); // Cut off the $
            } else {
                name = name.substring(9); // Cut off the eventBus$
            }

            JClassType eventType = getType(eventBusHandler.value().getCanonicalName());
            if (eventType.equals(gwtEventType)) {
                eventType = getEventByName(name, contextEventsPackage);
                if (eventType == null) {
                    error("There is no context, dom or shared event with the name '%s'. Binding method: '%s' in class: '%s'",
                            name, m.getName(), presenterType.getQualifiedSourceName());
                }
            }

            StringBuilder bindingParameters = new StringBuilder();
            ArrayList<String> parameterStrings = new ArrayList<String>();
            for (JParameter p : parameters) {
                String parameter = p.getName();

                if (bindingParameters.length() > 0) {
                    bindingParameters.append(", ");
                }

                int initlenght = bindingParameters.length();

                // Implicit cast
                bindingParameters
                        .append("(" + p.getType().getErasedType().getParameterizedQualifiedSourceName() + ")");

                String getter = "get";

                // Check if it is a boolean then the getter is 'is' not
                // 'get'
                JPrimitiveType parameterTypeIsPrimitive = p.getType().isPrimitive();
                if (parameterTypeIsPrimitive != null
                        && parameterTypeIsPrimitive.equals(JPrimitiveType.BOOLEAN)) {
                    getter = "is";
                }

                // Event getter binding
                if (parameter.indexOf("$") == -1) {
                    // Event binding
                    bindingParameters.append("event.");
                    bindingParameters.append(getter);
                    bindingParameters.append(capitalize(parameter));
                    bindingParameters.append("()");
                } else {
                    // Event binding nested binding
                    String[] parameterParts = parameter.split("[$]");

                    bindingParameters.append("event");
                    for (int n = 0; n < parameterParts.length - 1; n++) {
                        bindingParameters.append(".get");
                        bindingParameters.append(capitalize(parameterParts[n]));
                        bindingParameters.append("()");
                    }

                    bindingParameters.append(".");
                    bindingParameters.append(getter);
                    bindingParameters.append(capitalize(parameterParts[parameterParts.length - 1]));
                    bindingParameters.append("()");
                }

                parameterStrings.add(bindingParameters.substring(initlenght, bindingParameters.length()));
            }

            // Find the event name
            String simpleName = eventType.getSimpleSourceName();
            if (!simpleName.endsWith("Event")) {
                error("The event %s does not use the event convention. It should end with 'Event'",
                        eventType.getQualifiedSourceName());
            }
            String eventName = eventClassNameToEventName(simpleName);

            // Check that the name of the event correspond to the method
            // name convention
            if (!eventName.equals(name)) {
                error("The method %s on class %s does not use the event bus handler method convention. "
                        + "It should start with '$' or 'eventBus$' "
                        + "and end with the event name. i.e ValueChangeEvent -> $valueChange. Solve it renaming it to '$%s'",
                        m.getName(), presenterName, eventName);
            }

            // Get event handler name
            JClassType handlerType = getHandlerForEvent(eventType);
            if (handlerType == null) {
                error("Parameter '%s' is not an event (subclass of GwtEvent).", eventType.getName());
            }

            // Retrieves the single method (usually 'onSomething') related
            // to all
            // handlers. Ex: onClick in ClickHandler, onBlur in BlurHandler
            // ...
            JMethod[] methods = handlerType.getMethods();
            if (methods.length != 1) {
                error("'%s' has more than one method defined.", handlerType.getName());
            }

            // 'onSomething' method
            JMethod handlerOnMethod = methods[0];

            // Checks if the method has an Event as parameter. Ex:
            // ClickEvent in onClick, BlurEvent in onBlur ...
            parameters = handlerOnMethod.getParameters();
            if (parameters.length != 1) {
                error("Method '%s' needs '%s' as parameter", handlerOnMethod.getName(), eventType.getName());
            }

            writer.println("eventBusBindings.add(eventBus.addHandler(");

            writer.println(eventType.getQualifiedSourceName() + ".");

            // getType or TYPE ?
            JField typeField = eventType.getField("TYPE");
            if (typeField != null && typeField.isStatic() && typeField.isPublic()) {
                writer.println("TYPE");
            } else {
                writer.println("getType()");
            }
            writer.println(", ");

            writer.println("new " + handlerType.getQualifiedSourceName() + "() {");
            writer.indent();
            writer.println("public void " + handlerOnMethod.getName() + "(final "
                    + eventType.getQualifiedSourceName() + " event) {");
            writer.indent();

            // Process contributors
            String bindingParametersString = bindingParameters.toString();
            BinderContextImpl binderContext = processMethodContributors(presenterType, null, null, null, m,
                    eventType, parameterStrings.toArray(new String[parameterStrings.size()]));

            StringSourceWriter handlerWriter = new StringSourceWriter();

            handlerWriter
                    .println("if (" + LogConfiguration.class.getCanonicalName() + ".loggingIsEnabled()) {");
            handlerWriter.println(Logger.class.getCanonicalName() + ".getLogger(\"Binder\").info(\""
                    + binderContext.getLog() + "\");");
            handlerWriter.println("}");

            handlerWriter.println("presenter." + m.getName() + "(" + bindingParametersString + ");");

            writer.println(binderContext.build(handlerWriter));

            writer.outdent();
            writer.println("}");
            writer.outdent();
            writer.println("}));");
        }
    }
}

From source file:com.guit.rebind.binder.GuitBinderGenerator.java

License:Apache License

private void printViewBindingMethods(SourceWriter writer, JClassType presenterType, String viewTypeName,
        HashMap<String, JType> validBindingFieldsTypes) throws UnableToCompleteException {

    Set<String> validBindingFields = validBindingFieldsTypes.keySet();

    JPackage contextEventsPackage = getPackage(presenterType.getPackage().getName() + ".event");

    ArrayList<JMethod> methods = new ArrayList<JMethod>();
    findAllMethods(presenterType, methods);

    for (JMethod m : methods) {
        String name = m.getName();
        if (m.isAnnotationPresent(ViewHandler.class)) {
            validateHandler(m, name, presenterType.getQualifiedSourceName());

            String eventName;/*w  w  w.  j a  v  a2 s .  com*/
            ViewHandler viewHandlerAnnotation = m.getAnnotation(ViewHandler.class);
            JClassType eventType = getType(viewHandlerAnnotation.event().getCanonicalName());

            boolean fieldsAreElements = false;
            Set<String> bindingFields = null;
            boolean addHandlerToView = false;
            if (viewHandlerAnnotation.fields().length == 0) {
                if (name.startsWith("$")) {
                    // Direct view binding
                    eventName = name.substring(1);

                    addHandlerToView = true;
                } else {
                    // View fields binding
                    String[] nameParts = name.split("[$]");

                    // Check the name format
                    if (nameParts.length < 2) {
                        error("The method %s on the class %s have a bad binding format. It should be: "
                                + "'{viewField}${eventName}' or for binding multiple fields: '{viewField1}${viewField2}${eventName}'",
                                name, presenterType.getQualifiedSourceName());
                    }

                    // Check that the binding fields are valid
                    bindingFields = new HashSet<String>();
                    for (int n = 0; n < nameParts.length - 1; n++) {
                        if (!validBindingFields.contains(nameParts[n])) {
                            error("The field %s on the class %s is not a valid binding field. It must be public or protected and not static",
                                    nameParts[n], presenterType);
                        }
                        bindingFields.add(nameParts[n]);
                    }

                    eventName = nameParts[nameParts.length - 1]; // last
                    // token
                }

                // Check the event type and name convention
                if (eventType.equals(gwtEventType)) {
                    eventType = getEventByName(eventName, contextEventsPackage);
                    if (eventType == null) {
                        error("There is no context, dom or shared event with the name '%s'. Binding method: '%s' in class: '%s'",
                                eventName, name, presenterType.getQualifiedSourceName());
                    }
                } else {
                    // Check that the method name correspond to the event
                    // type
                    String eventNameToEventClassName = eventNameToEventClassName(eventName);
                    if (!eventNameToEventClassName.equals(eventType.getSimpleSourceName())) {
                        error("The method '%s' in the class '%s' have a typo in the name. The last token should be : ..$%s() {.. ",
                                name, presenterType.getQualifiedSourceName(), eventName);
                    }
                }
            } else {
                String[] fields = viewHandlerAnnotation.fields();
                bindingFields = new HashSet<String>();
                for (String f : fields) {
                    if (f.isEmpty()) {
                        addHandlerToView = true;
                    } else {
                        if (!validBindingFields.contains(f)) {
                            error("The field %s on the class %s is not a valid binding field. It must be public or protected and not static",
                                    f, presenterType);
                        }
                        bindingFields.add(f);
                    }
                }

                if (eventType.equals(gwtEventType)) {
                    error("When using ViewFields you must specify the event class in the Handler annotation. Found: %s.%s",
                            presenterType.getQualifiedSourceName(), name);
                }

                eventName = eventClassNameToEventName(eventType.getSimpleSourceName());
            }

            // If any field is an element all of them should be otherwise none
            // of them
            int widgetCount = 0;
            JClassType widgetJType = getType(Widget.class.getCanonicalName());
            JClassType isWidgetJType = getType(IsWidget.class.getCanonicalName());
            for (String f : bindingFields) {
                JClassType classOrInterface = validBindingFieldsTypes.get(f).isClassOrInterface();
                if (classOrInterface.isAssignableTo(widgetJType)
                        || classOrInterface.isAssignableTo(isWidgetJType)) {
                    widgetCount++;
                }
            }

            if (widgetCount != bindingFields.size() && widgetCount != 0) {
                error("Not all fields on the class %s.%s are either all elements or all widgets. You cannot bind elements and widgets on the same handler",
                        presenterType, name);
            }
            fieldsAreElements = widgetCount == 0;

            /**
             * Find parameters bindings. The binding can be with the event(cannot have anidation of
             * getters):'getter'->'getGetter()' or with the view:'$getter'->'view.getGetter()' or with a
             * view field '{viewField$getter}'->'view.viewField.getGetter();', this last two ones will
             * support anidation: '{viewField$getter$another}'->'view.viewField.getGetter().getAnother (
             * ) ; '
             **/
            StringBuilder bindingParameters = new StringBuilder();
            JParameter[] parameters = m.getParameters();
            ArrayList<String> parameterStrings = new ArrayList<String>();
            for (JParameter p : parameters) {
                String parameter = p.getName();
                JType parameterType = p.getType();
                if (bindingParameters.length() > 0) {
                    bindingParameters.append(", ");
                }

                int initlenght = bindingParameters.length();

                // Implicit cast
                bindingParameters.append(
                        "(" + parameterType.getErasedType().getParameterizedQualifiedSourceName() + ")");

                String getter = "get";

                // Check if it is a boolean then the getter is 'is' not
                // 'get'
                JPrimitiveType parameterTypeIsPrimitive = parameterType.isPrimitive();
                if (parameterTypeIsPrimitive != null
                        && parameterTypeIsPrimitive.equals(JPrimitiveType.BOOLEAN)) {
                    getter = "is";
                }

                if (p.getName().equals("event")) {
                    bindingParameters.append("event");
                } else if (p.isAnnotationPresent(Attribute.class)) {
                    // Only valid for domEvents
                    if (!eventType.isAssignableTo(hasNativeEventType)) {
                        error("Attributes binding are only valid for DomEvents. Found: %s.%s in parameter: %s",
                                presenterType.getQualifiedSourceName(), name, parameter);
                    }

                    String parameterTypeQualifiedSourceName = parameterType.getQualifiedSourceName();
                    boolean isString = parameterTypeQualifiedSourceName.equals(STRINGCANONICALNAME);
                    if (!isString) {
                        bindingParameters.append(parameterTypeQualifiedSourceName + ".valueOf(");
                    }
                    bindingParameters.append("((" + Element.class.getCanonicalName()
                            + ")event.getNativeEvent().getEventTarget().cast()).getAttribute(\"" + parameter
                            + "\")");
                    if (!isString) {
                        bindingParameters.append(")");
                    }
                } else if (parameter.indexOf("$") == -1) {
                    // Event binding
                    bindingParameters.append("event.");
                    bindingParameters.append(getter);
                    bindingParameters.append(capitalize(parameter));
                    bindingParameters.append("()");
                } else {
                    // Event binding nested binding
                    String[] parameterParts = parameter.split("[$]");

                    bindingParameters.append("event");
                    for (int n = 0; n < parameterParts.length - 1; n++) {
                        bindingParameters.append(".get");
                        bindingParameters.append(capitalize(parameterParts[n]));
                        bindingParameters.append("()");
                    }

                    bindingParameters.append(".");
                    bindingParameters.append(getter);
                    bindingParameters.append(capitalize(parameterParts[parameterParts.length - 1]));
                    bindingParameters.append("()");
                }

                parameterStrings.add(bindingParameters.substring(initlenght, bindingParameters.length()));
            }

            // Get event handler name
            JClassType handlerType = getHandlerForEvent(eventType);
            if (handlerType == null) {
                error("Parameter '%s' is not an event (subclass of GwtEvent).", eventType.getName());
            }

            // Retrieves the single method (usually 'onSomething') related
            // to all
            // handlers. Ex: onClick in ClickHandler, onBlur in BlurHandler
            // ...
            JMethod[] handlerMethods = handlerType.getMethods();
            if (handlerMethods.length != 1) {
                error("'%s' has more than one method defined.", handlerType.getName());
            }

            // 'onSomething' method
            JMethod handlerOnMethod = handlerMethods[0];

            String methodName = name;
            String handlerTypeName = handlerType.getQualifiedSourceName();

            GwtPresenter presenterAnnotation = presenterType.getAnnotation(GwtPresenter.class);
            boolean isElemental = presenterAnnotation != null && presenterAnnotation.elemental();

            // Write handler
            SourceWriter eventHandlerWriter = new StringSourceWriter();
            if (!fieldsAreElements) {
                eventHandlerWriter.println("new " + handlerTypeName + "() {");
                eventHandlerWriter.indent();
                eventHandlerWriter.println("public void " + handlerOnMethod.getName() + "(final "
                        + eventType.getQualifiedSourceName() + " event) {");
                eventHandlerWriter.indent();
            } else if (isElemental) {
                eventHandlerWriter.println("new elemental.events.EventListener() {");
                eventHandlerWriter.println("  @Override");
                eventHandlerWriter.println("  public void handleEvent(elemental.events.Event event) {");
            } else {
                eventHandlerWriter
                        .println("new " + com.guit.client.dom.EventHandler.class.getCanonicalName() + "() {");
                eventHandlerWriter.indent();
                eventHandlerWriter
                        .println("public void onEvent(" + Event.class.getCanonicalName() + " event_) {");
                eventHandlerWriter.println("  " + EventImpl.class.getCanonicalName() + " event = ("
                        + EventImpl.class.getCanonicalName() + ") event_;");
                eventHandlerWriter.indent();
            }

            String bindingParametersString = bindingParameters.toString();

            // Process contributors
            BinderContextImpl binderContext = processMethodContributors(presenterType, null, null, viewTypeName,
                    m, eventType, parameterStrings.toArray(new String[parameterStrings.size()]));

            StringSourceWriter handlerWriter = new StringSourceWriter();

            handlerWriter
                    .println("if (" + LogConfiguration.class.getCanonicalName() + ".loggingIsEnabled()) {");
            handlerWriter.println(Logger.class.getCanonicalName() + ".getLogger(\"Binder\").info(\""
                    + binderContext.getLog() + "\");");
            handlerWriter.println("}");

            handlerWriter.print("presenter." + methodName + "(");
            handlerWriter.print(bindingParametersString);
            handlerWriter.println(");");

            eventHandlerWriter.println(binderContext.build(handlerWriter));

            eventHandlerWriter.outdent();
            eventHandlerWriter.println("}");
            eventHandlerWriter.outdent();
            eventHandlerWriter.print("}");

            if (fieldsAreElements) {
                if (bindingFields != null) {
                    writer.print("final "
                            + (isElemental ? EventListener.class.getCanonicalName()
                                    : com.guit.client.dom.EventHandler.class.getCanonicalName())
                            + " " + methodName + "$" + eventName + " =");
                    writer.print(eventHandlerWriter.toString());
                    writer.println(";");

                    for (String f : bindingFields) {
                        String eventNameLower = eventName.toLowerCase();
                        boolean isTouchStart = eventNameLower.equals("touchstart");
                        boolean isTouchEnd = eventNameLower.equals("touchend");
                        if (isTouchStart || isTouchEnd) {
                            writer.println("if (com.google.gwt.event.dom.client.TouchEvent.isSupported()) {");
                        }
                        if (isElemental) {
                            writer.println("presenter." + f + ".setOn" + eventNameLower + "(" + methodName + "$"
                                    + eventName + ");");
                        } else {
                            writer.println("bindings.add(new " + ElementImpl.class.getCanonicalName() + "(view."
                                    + f + ")." + eventNameLower + "(" + methodName + "$" + eventName + "));");
                        }
                        if (isTouchStart || isTouchEnd) {
                            writer.println("} else {");

                            if (isElemental) {
                                writer.println("presenter." + f + ".setOnmouse" + (isTouchStart ? "down" : "up")
                                        + "(" + methodName + "$" + eventName + ");");
                            } else {
                                writer.println("bindings.add(new " + ElementImpl.class.getCanonicalName()
                                        + "(view." + f + ")." + (isTouchStart ? "mousedown" : "mouseup") + "("
                                        + methodName + "$" + eventName + "));");
                            }

                            writer.print("}");
                        }
                    }
                }
            } else if (viewHandlerAnnotation.force()) {
                String addMethodName = "addDomHandler";
                String eventTypeGetter = eventType.getQualifiedSourceName() + ".";
                JField typeField = eventType.getField("TYPE");
                if (typeField != null && typeField.isStatic() && typeField.isPublic()) {
                    eventTypeGetter += "TYPE";
                } else {
                    eventTypeGetter += "getType()";
                }
                if (bindingFields != null) {
                    writer.print("final " + handlerTypeName + " " + methodName + " =");
                    writer.print(eventHandlerWriter.toString());
                    writer.println(";");

                    for (String f : bindingFields) {
                        writer.println("bindings.add(view." + f + "." + addMethodName + "(" + methodName + ", "
                                + eventTypeGetter + "));");
                    }
                }

                if (addHandlerToView) {
                    writer.print("bindings.add(view." + addMethodName + "(" + eventHandlerWriter.toString()
                            + ", " + eventTypeGetter + "));");
                }
            } else {
                String addMethodName = "add" + eventName.substring(0, 1).toUpperCase() + eventName.substring(1)
                        + "Handler";
                if (bindingFields != null) {
                    writer.print("final " + handlerTypeName + " " + methodName + " =");
                    writer.print(eventHandlerWriter.toString());
                    writer.println(";");

                    for (String f : bindingFields) {

                        // Small patch for touch events
                        if (addMethodName.equals("addTouchStartHandler") && parameters.length == 0) {
                            writer.println("if (!com.google.gwt.event.dom.client.TouchEvent.isSupported()) {");
                            writer.println("bindings.add(view." + f + ".addMouseDownHandler(new "
                                    + MouseDownHandler.class.getCanonicalName() + "(){public void onMouseDown("
                                    + MouseDownEvent.class.getCanonicalName() + " event){presenter."
                                    + methodName + "();} }" + "));");
                            writer.println("}");
                        }

                        if (addMethodName.equals("addTouchEndHandler") && parameters.length == 0) {
                            writer.println("if (!com.google.gwt.event.dom.client.TouchEvent.isSupported()) {");
                            writer.println("bindings.add(view." + f + ".addMouseUpHandler(new "
                                    + MouseUpHandler.class.getCanonicalName() + "(){public void onMouseUp("
                                    + MouseUpEvent.class.getCanonicalName() + " event){presenter." + methodName
                                    + "();} }" + "));");
                            writer.println("}");
                        }
                        writer.println(
                                "bindings.add(view." + f + "." + addMethodName + "(" + methodName + "));");
                    }
                }

                if (addHandlerToView) {
                    writer.print(
                            "bindings.add(view." + addMethodName + "(" + eventHandlerWriter.toString() + "));");
                }
            }
        } else {
            for (Annotation a : m.getAnnotations()) {
                Class<? extends Annotation> annotationType = a.annotationType();
                if (annotationType.isAnnotationPresent(Plugin.class)) {
                    String[] nameParts = name.split("[$]");

                    // Check that the binding fields are valid
                    StringBuilder fields = new StringBuilder();
                    for (int n = 0; n < nameParts.length - 1; n++) {
                        if (!validBindingFields.contains(nameParts[n])) {
                            error("The field %s on the class %s is not a valid binding field. It must be public or protected and not static",
                                    nameParts[n], presenterType);
                        }
                        if (fields.length() > 0) {
                            fields.append(",");
                        }
                        fields.append("view." + nameParts[n]);
                    }

                    Class<?> handler = annotationType.getAnnotation(Plugin.class).value();
                    writer.println("new " + handler.getCanonicalName()
                            + "().install(new com.google.gwt.user.client.Command() {");
                    writer.println("@Override");
                    writer.println("public void execute() {");
                    writer.println("  presenter." + m.getName() + "();");
                    writer.println("}");
                    writer.println("}, new Object[]{");
                    writer.println(fields.toString() + "});");
                }
            }
        }
    }
}

From source file:org.cruxframework.crux.core.utils.JClassUtils.java

License:Apache License

/**
 * @param clazz/*  w  ww.  j ava  2  s.com*/
 * @param name
 * @return
 */
public static JField getDeclaredField(JClassType clazz, String name) throws NoSuchFieldException {
    JField field = clazz.getField(name);
    if (field == null) {
        if (clazz.getSuperclass() == null) {
            throw new NoSuchFieldException(name);
        }
        field = getDeclaredField(clazz.getSuperclass(), name);
    }

    return field;
}

From source file:org.jboss.errai.ioc.rebind.ioc.codegen.meta.impl.gwt.GWTClass.java

License:Apache License

@Override
public MetaField getField(String name) {
    JClassType type = getEnclosedMetaObject().isClassOrInterface();
    if (type == null) {
        return null;
    }//from  w  ww  .  j  ava  2s  . c o  m

    JField field = type.getField(name);

    if (field == null) {
        throw new RuntimeException("no such field: " + field);
    }

    return new GWTField(field);
}

From source file:org.jboss.errai.widgets.rebind.WidgetMappingsGenerator.java

License:Apache License

private void generateExtensions(GeneratorContext context, TreeLogger logger, SourceWriter sourceWriter) {
    // start constructor source generation
    sourceWriter.println("public " + className + "() { ");
    sourceWriter.println("}");

    sourceWriter.println("public void mapAll(final " + strTargetType + " widget) { ");
    sourceWriter.outdent();//from w  ww .j a v  a2 s  . com

    try {
        JClassType widgetMapper = typeOracle.getType(CollectionWidgetMapper.class.getName());

        for (JField currField : targetClass.getFields()) {
            if (currField.isAnnotationPresent(WidgetMapper.class)
                    && widgetMapper.isAssignableFrom(currField.getType().isClassOrInterface())) {
                WidgetMapper mf = currField.getAnnotation(WidgetMapper.class);

                JField widgetField = targetClass.getField(mf.value());
                String varName = widgetField.getName() + "Mapper";

                JClassType binderField = currField.getType().isClassOrInterface();
                JParameterizedType pType = binderField.isParameterized();

                if (pType == null) {
                    RuntimeException e = new RuntimeException(
                            "Field '" + currField.getName() + "' must be parameterized");
                    logger.log(TreeLogger.Type.ERROR, e.getMessage(), e);
                    throw e;
                }

                // The last type arg shall always be our domain object type per this spec.
                JClassType jEntityTarget = pType.getTypeArgs()[pType.getTypeArgs().length - 1];
                String strTypeParms = generateTypeParmString(pType);

                List<JField> fieldsToMap = new LinkedList<JField>();

                /**
                 * If an EntityFields annotatio is present, then we discriminate on those fields.  Otherwise
                 * we capture all fields by default.
                 */
                if (currField.isAnnotationPresent(EntityFields.class)) {
                    EntityFields ef = currField.getAnnotation(EntityFields.class);
                    for (String fieldName : ef.value()) {
                        JField fld = jEntityTarget.getField(fieldName);
                        if (fld == null) {
                            RuntimeException e = new RuntimeException("no such field in entity class '"
                                    + jEntityTarget.getName() + "': " + fieldName);
                            logger.log(TreeLogger.Type.ERROR, e.getMessage(), e);
                            throw e;
                        }

                        fieldsToMap.add(jEntityTarget.getField(fieldName));
                    }
                } else {
                    for (JField fld : jEntityTarget.getFields()) {
                        if (fld.getEnclosingType().equals(jEntityTarget)) {
                            fieldsToMap.add(fld);
                        }
                    }
                }

                List<String> generatedInitializations = new LinkedList<String>();
                List<String> generatedBindings = new LinkedList<String>();

                FieldMapperGenerator g = getFieldMapper(widgetField.getType().getQualifiedSourceName());

                generatedInitializations.add(
                        g.init(typeOracle, widgetField, jEntityTarget, currField, null, varName, fieldsToMap));

                if (g == null) {
                    throw new RuntimeException(
                            "Cannot generateGetField mapper for widget: " + jEntityTarget.getName());
                }

                for (JField fld : fieldsToMap) {
                    String fieldName = fld.getName();

                    JField targetField = jEntityTarget.getField(fieldName);
                    if (targetField == null) {
                        throw new RuntimeException(
                                "The field '" + fieldName + "' does not correspond with a field in the class: "
                                        + jEntityTarget.getQualifiedSourceName());
                    }

                    generatedBindings.add(g.generateFieldMapperGenerator(typeOracle, widgetField, jEntityTarget,
                            null, targetField));
                }

                Map<String, Object> vars = new HashMap<String, Object>();
                vars.put("typeOracle", typeOracle);
                vars.put("variableName", varName);
                vars.put("strTypeParms", strTypeParms);
                vars.put("targetWidget", widgetField.getType().getQualifiedSourceName());
                vars.put("targetType", jEntityTarget.getQualifiedSourceName());
                vars.put("initializers", generatedInitializations);
                vars.put("bindings", generatedBindings);
                vars.put("targetFieldName", widgetField.getName());

                String s = (String) TemplateRuntime.execute(mappingsGen, vars);
                sourceWriter.print(s);

                s = "widget." + currField.getName() + " = " + varName + ";";

                sourceWriter.println(s);

            } else if (currField.isAnnotationPresent(EntityMapped.class)) {
                EntityMapped entityMappedA = currField.getAnnotation(EntityMapped.class);

                JClassType entityType = currField.getType().isClassOrInterface();
                String varName = currField.getName() + "Mapper";

                String entityFieldName = currField.getName();
                String toEntityField;

                Map<String, List<JField>> toBeMapped = new HashMap<String, List<JField>>();

                for (JField fld : targetClass.getFields()) {
                    if (fld.isAnnotationPresent(MapField.class)) {
                        MapField mapFieldA = fld.getAnnotation(MapField.class);
                        toEntityField = "".equals(mapFieldA.value()) ? entityFieldName : mapFieldA.value();

                        if (!toBeMapped.containsKey(toEntityField)) {
                            toBeMapped.put(toEntityField, new LinkedList<JField>());
                        }

                        toBeMapped.get(toEntityField).add(fld);
                    }
                }

                /**
                 * Generate the field mappings.
                 */
                for (Map.Entry<String, List<JField>> entry : toBeMapped.entrySet()) {
                    List<String> generatedInitializations = new LinkedList<String>();
                    List<String> generatedBindings = new LinkedList<String>();
                    ArrayList<String[]> fieldIndexPositions = new ArrayList<String[]>();

                    for (JField fld : entry.getValue()) {
                        JClassType classType = fld.getType().isClassOrInterface();

                        String fieldName = fld.getAnnotation(MapField.class).value();
                        if ("".equals(fieldName)) {
                            fieldName = fld.getName();
                        }

                        JField targetField = entityType.getField(fieldName);
                        if (targetField == null) {
                            throw new RuntimeException("The field '" + fieldName
                                    + "' does not correspond with a field in the class: "
                                    + entityType.getQualifiedSourceName());
                        }

                        JClassType targetFieldType = targetField.getType().isClassOrInterface();

                        FieldMapperGenerator g = getFieldMapper(classType.getQualifiedSourceName());

                        if (g == null) {
                            throw new RuntimeException(
                                    "Cannot generateGetField mapper for widget: " + classType.getName());
                        }

                        generatedInitializations
                                .add(g.init(typeOracle, fld, entityType, targetField, currField, null, null));

                        generatedBindings.add(g.generateFieldMapperGenerator(typeOracle, fld, entityType,
                                targetField, currField));

                        if (getType(typeOracle, Widget.class).isAssignableFrom(classType)) {
                            fieldIndexPositions
                                    .add(new String[] { fieldName, g.generateValueExtractorStatement(typeOracle,
                                            fld, entityType, targetField, currField) });
                        }
                    }

                    Map<String, Object> vars = new HashMap<String, Object>();
                    vars.put("typeOracle", typeOracle);
                    vars.put("variableName", varName);
                    vars.put("initializers", generatedInitializations);
                    vars.put("targetFieldName", entityFieldName);
                    vars.put("bindings", generatedBindings);
                    vars.put("fieldIndexPositions", fieldIndexPositions);
                    vars.put("entityFieldName", entityFieldName);

                    String s = (String) TemplateRuntime.execute(entityMappingGen, vars);

                    sourceWriter.print(s);
                }
            } else if (currField.isAnnotationPresent(AddAllTo.class)) {
                String copyToField = currField.getAnnotation(AddAllTo.class).value();
                String copyFromField = currField.getName();

                Map<String, Object> vars = new HashMap<String, Object>();
                vars.put("copyToField", copyToField);
                vars.put("copyFromField", copyFromField);

                String s = (String) TemplateRuntime.execute(addAllToGen, vars);

                sourceWriter.print(s);
            }
        }
    } catch (Exception e) {
        logger.log(TreeLogger.Type.ERROR, "failed to map field (does not exist)", e);
        e.printStackTrace();
    }

    // end constructor source generation
    sourceWriter.outdent();
    sourceWriter.println("}");
}

From source file:org.pentaho.mantle.rebind.CommandExecGenerator.java

License:Open Source License

private void generateMethods(SourceWriter sourceWriter) {
    sourceWriter.println();//from   w  w  w.  jav  a  2s  .  co  m
    sourceWriter.println(
            "public native String getParameterString(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Integer getParameterInteger(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Boolean getParameterBoolean(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println("public native Float getParameterFloat(final String paramName,"
            + "final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println("public native Double getParameterDouble(final String paramName, "
            + "final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Long getParameterLong(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println("public native Short getParameterShort(final String paramName,"
            + "final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter
            .println("public void execute(final String commandName, final JavaScriptObject parameterMap) { ");
    sourceWriter.indent();

    try {
        // find Command implementors
        ArrayList<JClassType> implementingTypes = new ArrayList<JClassType>();
        JPackage pack = typeOracle.getPackage(CommandExec.class.getPackage().getName());
        JClassType commandSourceType = typeOracle.getType(Command.class.getName());

        for (JClassType type : pack.getTypes()) {
            if (type.isAssignableTo(commandSourceType)) {
                implementingTypes.add(type);
            }
        }

        sourceWriter.println("if(false){}"); // placeholder
        for (JClassType implementingType : implementingTypes) {
            if (implementingType.isAbstract()) {
                continue;
            }
            sourceWriter.println(
                    "else if(commandName.equals(\"" + implementingType.getSimpleSourceName() + "\")){");
            sourceWriter.indent();
            sourceWriter.println(
                    implementingType.getName() + " command = new " + implementingType.getName() + "();");
            for (JMethod eventMethod : implementingType.getMethods()) {
                if (eventMethod.isPublic() && !eventMethod.isStatic() && eventMethod.isConstructor() == null
                        && eventMethod.getName().startsWith("set")) {
                    String propertyName = eventMethod.getName().substring(3);
                    propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);
                    String simpleType = implementingType.getField(propertyName).getType().getSimpleSourceName();
                    if ("string".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterString(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("integer".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterInteger(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("float".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterFloat(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("double".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterDouble(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("long".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterLong(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("short".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterShort(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("boolean".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("command." + eventMethod.getName() + "(getParameterBoolean(\""
                                + propertyName + "\", parameterMap));");
                    }
                }
            }

            sourceWriter.println("command.execute();");
            sourceWriter.outdent();
            sourceWriter.println("}");
        }

    } catch (Exception e) {
        // record to logger that Map generation threw an exception
        logger.log(TreeLogger.ERROR, "Error generating BindingContext!!!", e);
    }
    sourceWriter.outdent();
    sourceWriter.println("}");
}

From source file:org.pentaho.mantle.rebind.EventBusUtilGenerator.java

License:Open Source License

private void generateMethods(SourceWriter sourceWriter) {

    sourceWriter.println(//from  www  . j ava2  s . co  m
            "public native void invokeEventBusJSO(final JavaScriptObject jso, final String parameterJSON)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    // unfortunately, we can obtain pairs like {"a":"undefined"} or even {"a":undefined}
    // the latter will crash the procedure, so let's try to clean up the string
    // by removing pairs with 'undefined'
    sourceWriter.println("var tmp = parameterJSON"
            // replace ("a":undefined) and ("a":"undefined") with empty space
            + ".replace(/\\\"[\\w]+\\\"\\:[ ]*(\\\")?undefined(\\\")?(,)?/g, '')"
            // remove doubled commas
            + ".replace(/,[ ]*,/, ',')"
            // remove leading and trailing commas
            + ".replace(/\\{[ ]*,/, '{')" + ".replace(/,[ ]*\\}/, '}');");
    sourceWriter.println("var p = JSON.parse(tmp);");
    sourceWriter.println("jso.call(this, p)");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native String getParameterString(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Integer getParameterInteger(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Boolean getParameterBoolean(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println("public native Float getParameterFloat(final String paramName, "
            + "final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Double getParameterDouble(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println(
            "public native Long getParameterLong(final String paramName, final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    sourceWriter.println();
    sourceWriter.println("public native Short getParameterShort(final String paramName, "
            + "final JavaScriptObject parameterMap)");
    sourceWriter.println("/*-{");
    sourceWriter.indent();
    sourceWriter.println("return parameterMap[paramName];");
    sourceWriter.outdent();
    sourceWriter.println("}-*/;");

    // *********************
    // FIRE EVENT
    // *********************
    sourceWriter.println();
    sourceWriter
            .println("public void fireEvent(final String eventType, final JavaScriptObject parameterMap) { ");
    sourceWriter.indent();
    try {
        // find Command implementors
        ArrayList<JClassType> implementingTypes = new ArrayList<JClassType>();
        JPackage pack = typeOracle.getPackage(EventBusUtil.class.getPackage().getName());
        JClassType eventSourceType = typeOracle.getType(GwtEvent.class.getName());

        for (JClassType type : pack.getTypes()) {
            if (type.isAssignableTo(eventSourceType)) {
                implementingTypes.add(type);
            }
        }

        sourceWriter.println("if(false){}"); // placeholder
        for (JClassType implementingType : implementingTypes) {
            sourceWriter
                    .println("else if(eventType.equals(\"" + implementingType.getSimpleSourceName() + "\")){");
            sourceWriter.indent();
            sourceWriter
                    .println(implementingType.getName() + " event = new " + implementingType.getName() + "();");
            for (JMethod eventMethod : implementingType.getMethods()) {
                if (eventMethod.isPublic() && !eventMethod.isStatic() && eventMethod.isConstructor() == null
                        && eventMethod.getName().startsWith("set")) {
                    String propertyName = eventMethod.getName().substring(3);
                    propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);
                    String simpleType = implementingType.getField(propertyName).getType().getSimpleSourceName();
                    if ("string".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterString(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("integer".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterInteger(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("float".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterFloat(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("double".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterDouble(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("long".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterLong(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("short".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterShort(\""
                                + propertyName + "\", parameterMap));");
                    } else if ("boolean".equalsIgnoreCase(simpleType)) {
                        sourceWriter.println("event." + eventMethod.getName() + "(getParameterBoolean(\""
                                + propertyName + "\", parameterMap));");
                    }
                }
            }

            sourceWriter.println("EVENT_BUS.fireEvent(event);");
            sourceWriter.outdent();
            sourceWriter.println("}");
        }

    } catch (Exception e) {
        // record to logger that Map generation threw an exception
        logger.log(TreeLogger.ERROR, "Error generating BindingContext!!!", e);
    }
    sourceWriter.outdent();
    sourceWriter.println("}");

    // *********************
    // ADD HANDLER
    // *********************
    sourceWriter.println();
    sourceWriter.println(
            "public HandlerRegistration addHandler(final String eventType, final JavaScriptObject handler) { ");
    sourceWriter.indent();
    try {
        // find Command implementors
        JPackage pack = typeOracle.getPackage(EventBusUtil.class.getPackage().getName());
        JClassType eventSourceType = typeOracle.getType(GwtEvent.class.getName());

        sourceWriter.println("if(false){return null;}"); // placeholder
        for (JClassType type : pack.getTypes()) {
            if (type.isAssignableTo(eventSourceType)) {
                addHandlerElseCondition(sourceWriter, type);
            }
        }
    } catch (Exception e) {
        // record to logger that Map generation threw an exception
        logger.log(TreeLogger.ERROR, "Error generating BindingContext!!!", e);
    }

    sourceWriter.indent();
    sourceWriter.println("return null;");

    sourceWriter.outdent();
    sourceWriter.println("}");
}

From source file:org.pentaho.mantle.rebind.EventBusUtilGenerator.java

License:Open Source License

String addHandlerParamJson(JClassType type) {
    StringBuilder json = new StringBuilder(128);
    json.append('"').append('{');
    JMethod[] methods = type.getMethods();
    for (JMethod eventMethod : methods) {

        if (eventMethod.isPublic() && !eventMethod.isStatic() && (eventMethod.isConstructor() == null)
                && !"void".equalsIgnoreCase(eventMethod.getReturnType().getSimpleSourceName())
                && !eventMethod.getName().equals("getAssociatedType")) {
            // let's add the property to JSON object
            String propertyName = StringUtils.uncapitalize(eventMethod.getName().substring(3));
            String simpleType = type.getField(propertyName).getType().getSimpleSourceName();
            if ("string".equalsIgnoreCase(simpleType)) {
                json.append(//from  ww  w .j av  a 2s.co m
                        "\\\"" + propertyName + "\\\":\\\"\" + event." + eventMethod.getName() + "() + \"\\\"");
            } else {
                json.append("\\\"" + propertyName + "\\\":\" + event." + eventMethod.getName() + "() + \"");
            }
            json.append(',');
        }
    }

    int lastIndex = json.lastIndexOf(",");
    if (lastIndex == -1) {
        json.append('}');
    } else {
        json.setCharAt(lastIndex, '}');
    }
    return json.append('"').toString();
}