Example usage for com.google.gwt.core.ext.typeinfo JTypeParameter isAnnotationPresent

List of usage examples for com.google.gwt.core.ext.typeinfo JTypeParameter isAnnotationPresent

Introduction

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

Prototype

boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);

Source Link

Document

Returns true if this item has an annotation of the specified type.

Usage

From source file:com.google.web.bindery.requestfactory.gwt.rebind.RequestFactoryGenerator.java

License:Apache License

private void writeContextImplementations() {
    for (ContextMethod method : model.getMethods()) {
        PrintWriter pw = context.tryCreate(logger, method.getPackageName(), method.getSimpleSourceName());
        if (pw == null) {
            // Already generated
            continue;
        }//from   ww w.  ja  va 2  s  .  c  o m

        ClassSourceFileComposerFactory factory = new ClassSourceFileComposerFactory(method.getPackageName(),
                method.getSimpleSourceName());
        factory.setSuperclass(AbstractRequestContext.class.getCanonicalName());
        factory.addImplementedInterface(method.getImplementedInterfaceQualifiedSourceName());
        SourceWriter sw = factory.createSourceWriter(context, pw);

        // Constructor that accepts the parent RequestFactory
        sw.println("public %s(%s requestFactory) {super(requestFactory, %s.%s);}", method.getSimpleSourceName(),
                AbstractRequestFactory.class.getCanonicalName(), Dialect.class.getCanonicalName(),
                method.getDialect().name());

        Set<EntityProxyModel> models = findReferencedEntities(method);
        Set<JEnumType> extraEnumTypes = findExtraEnums(method);
        writeAutoBeanFactory(sw, models, extraEnumTypes);

        // Write each Request method
        for (RequestMethod request : method.getRequestMethods()) {
            JMethod jmethod = request.getDeclarationMethod();
            String operation = request.getOperation();

            // foo, bar, baz
            StringBuilder parameterArray = new StringBuilder();
            // final Foo foo, final Bar bar, final Baz baz
            StringBuilder parameterDeclaration = new StringBuilder();
            // <P extends Blah>
            StringBuilder typeParameterDeclaration = new StringBuilder();

            if (request.isInstance()) {
                // Leave a spot for the using() method to fill in later
                parameterArray.append(",null");
            }
            for (JTypeParameter param : jmethod.getTypeParameters()) {
                typeParameterDeclaration.append(",").append(param.getQualifiedSourceName());
            }
            for (JParameter param : jmethod.getParameters()) {
                parameterArray.append(",").append(param.getName());
                parameterDeclaration.append(",final ")
                        .append(param.getType().getParameterizedQualifiedSourceName()).append(" ")
                        .append(param.getName());
            }
            if (parameterArray.length() > 0) {
                parameterArray.deleteCharAt(0);
            }
            if (parameterDeclaration.length() > 0) {
                parameterDeclaration.deleteCharAt(0);
            }
            if (typeParameterDeclaration.length() > 0) {
                typeParameterDeclaration.deleteCharAt(0).insert(0, "<").append(">");
            }

            // public Request<Foo> doFoo(final Foo foo) {
            sw.println("public %s %s %s(%s) {", typeParameterDeclaration,
                    jmethod.getReturnType().getParameterizedQualifiedSourceName(), jmethod.getName(),
                    parameterDeclaration);
            sw.indent();
            // The implements clause covers InstanceRequest
            // class X extends AbstractRequest<Return> implements Request<Return> {
            sw.println("class X extends %s<%s> implements %s {", AbstractRequest.class.getCanonicalName(),
                    request.getDataType().getParameterizedQualifiedSourceName(),
                    jmethod.getReturnType().getParameterizedQualifiedSourceName());
            sw.indent();

            // public X() { super(FooRequestContext.this); }
            sw.println("public X() { super(%s.this);}", method.getSimpleSourceName());

            // This could also be gotten rid of by having only Request /
            // InstanceRequest
            sw.println("@Override public X with(String... paths) {super.with(paths); return this;}");

            // makeRequestData()
            sw.println("@Override protected %s makeRequestData() {", RequestData.class.getCanonicalName());
            String elementType = request.isCollectionType()
                    ? request.getCollectionElementType().getQualifiedSourceName() + ".class"
                    : "null";
            String returnTypeBaseQualifiedName = ModelUtils.ensureBaseType(request.getDataType())
                    .getQualifiedSourceName();
            // return new RequestData("ABC123", {parameters}, propertyRefs,
            // List.class, FooProxy.class);
            sw.indentln("return new %s(\"%s\", new Object[] {%s}, propertyRefs, %s.class, %s);",
                    RequestData.class.getCanonicalName(), operation, parameterArray,
                    returnTypeBaseQualifiedName, elementType);
            sw.println("}");

            /*
             * Only support extra properties in JSON-RPC payloads. Could add this to
             * standard requests to provide out-of-band data.
             */
            if (method.getDialect().equals(Dialect.JSON_RPC)) {
                for (JMethod setter : request.getExtraSetters()) {
                    PropertyName propertyNameAnnotation = setter.getAnnotation(PropertyName.class);
                    String propertyName = propertyNameAnnotation == null ? JBeanMethod.SET.inferName(setter)
                            : propertyNameAnnotation.value();
                    String maybeReturn = JBeanMethod.SET_BUILDER.matches(setter) ? "return this;" : "";
                    sw.println("%s { getRequestData().setNamedParameter(\"%s\", %s); %s}",
                            setter.getReadableDeclaration(false, false, false, false, true), propertyName,
                            setter.getParameters()[0].getName(), maybeReturn);
                }
            }

            // end class X{}
            sw.outdent();
            sw.println("}");

            // Instantiate, enqueue, and return
            sw.println("X x = new X();");

            if (request.getApiVersion() != null) {
                sw.println("x.getRequestData().setApiVersion(\"%s\");",
                        Generator.escape(request.getApiVersion()));
            }

            // JSON-RPC payloads send their parameters in a by-name fashion
            if (method.getDialect().equals(Dialect.JSON_RPC)) {
                for (JParameter param : jmethod.getParameters()) {
                    PropertyName annotation = param.getAnnotation(PropertyName.class);
                    String propertyName = annotation == null ? param.getName() : annotation.value();
                    boolean isContent = param.isAnnotationPresent(JsonRpcContent.class);
                    if (isContent) {
                        sw.println("x.getRequestData().setRequestContent(%s);", param.getName());
                    } else {
                        sw.println("x.getRequestData().setNamedParameter(\"%s\", %s);", propertyName,
                                param.getName());
                    }
                }
            }

            // See comment in AbstractRequest.using(EntityProxy)
            if (!request.isInstance()) {
                sw.println("addInvocation(x);");
            }
            sw.println("return x;");
            sw.outdent();
            sw.println("}");
        }

        sw.commit(logger);
    }
}