Example usage for com.google.gwt.core.ext.typeinfo JParameterizedType getBaseType

List of usage examples for com.google.gwt.core.ext.typeinfo JParameterizedType getBaseType

Introduction

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

Prototype

JGenericType getBaseType();

Source Link

Usage

From source file:com.github.nmorel.gwtjackson.rebind.AbstractCreator.java

License:Apache License

/**
 * Build a {@link JSerializerType} that instantiate a {@link JsonSerializer} for the given type. If the type is a bean,
 * the implementation of {@link AbstractBeanJsonSerializer} will be created.
 *
 * @param type type//from w  w w .jav a 2s.  c  o m
 * @param subtype true if the serializer is for a subtype
 *
 * @return the {@link JSerializerType}. Examples:
 * <ul>
 * <li>ctx.getIntegerSerializer()</li>
 * <li>new org.PersonBeanJsonSerializer()</li>
 * </ul>
 */
protected final JSerializerType getJsonSerializerFromType(JType type, boolean subtype)
        throws UnableToCompleteException, UnsupportedTypeException {

    JSerializerType.Builder builder = new JSerializerType.Builder().type(type);
    if (null != type.isWildcard()) {
        // For wildcard type, we use the base type to find the serializer.
        type = type.isWildcard().getBaseType();
    }

    if (null != type.isRawType()) {
        // For raw type, we use the base type to find the serializer.
        type = type.isRawType().getBaseType();
    }

    JTypeParameter typeParameter = type.isTypeParameter();
    if (null != typeParameter) {
        // It's a type parameter like T in 'MyClass<T>'
        if (!subtype || typeParameter.getDeclaringClass() == getMapperInfo().get().getType()) {
            // The serializer is created for the main type so we use the serializer field declared for this type.
            return builder.instance(CodeBlock.builder()
                    .add(String.format(TYPE_PARAMETER_SERIALIZER_FIELD_NAME, typeParameter.getOrdinal()))
                    .add(".json()").build()).build();
        } else {
            // There is no declared serializer so we use the base type to find a serializer.
            type = typeParameter.getBaseType();
        }
    }

    Optional<MapperInstance> configuredSerializer = configuration.getSerializer(type);
    if (configuredSerializer.isPresent()) {
        // The type is configured in AbstractConfiguration.
        if (null != type.isParameterized() || null != type.isGenericType()) {
            JClassType[] typeArgs;
            if (null != type.isGenericType()) {
                typeArgs = type.isGenericType().asParameterizedByWildcards().getTypeArgs();
            } else {
                typeArgs = type.isParameterized().getTypeArgs();
            }

            ImmutableList.Builder<JSerializerType> parametersSerializerBuilder = ImmutableList.builder();
            for (int i = 0; i < typeArgs.length; i++) {
                JSerializerType parameterSerializerType;
                if (configuredSerializer.get().getParameters().length <= i) {
                    break;
                }
                if (MapperType.KEY_SERIALIZER == configuredSerializer.get().getParameters()[i]) {
                    parameterSerializerType = getKeySerializerFromType(typeArgs[i]);
                } else {
                    parameterSerializerType = getJsonSerializerFromType(typeArgs[i], subtype);
                }
                parametersSerializerBuilder.add(parameterSerializerType);
            }
            ImmutableList<JSerializerType> parametersSerializer = parametersSerializerBuilder.build();
            builder.parameters(parametersSerializer);
            builder.instance(
                    methodCallCodeWithJMapperTypeParameters(configuredSerializer.get(), parametersSerializer));

        } else {
            // The serializer has no parameters.
            builder.instance(methodCallCode(configuredSerializer.get()));
        }
        return builder.build();
    }

    if (typeOracle.isJavaScriptObject(type)) {
        // It's a JSO and the user didn't give a custom serializer. We use the default one.
        configuredSerializer = configuration.getSerializer(typeOracle.getJavaScriptObject());
        return builder.instance(methodCallCode(configuredSerializer.get())).build();
    }

    if (typeOracle.isEnum(type) || typeOracle.isEnumSupertype(type)) {
        configuredSerializer = configuration.getSerializer(typeOracle.getEnum());
        return builder.instance(methodCallCode(configuredSerializer.get())).build();
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        Class arraySerializer;
        if (arrayType.getRank() == 1) {
            // One dimension array
            arraySerializer = ArrayJsonSerializer.class;
        } else if (arrayType.getRank() == 2) {
            // Two dimension array
            arraySerializer = Array2dJsonSerializer.class;
        } else if (arrayType.getRank() == 3) {
            // Three dimension array
            arraySerializer = Array3dJsonSerializer.class;
        } else {
            // More dimensions are not supported
            String message = "Arrays with 4 or more dimensions are not supported";
            logger.log(TreeLogger.Type.WARN, message);
            throw new UnsupportedTypeException(message);
        }
        JSerializerType parameterSerializerType = getJsonSerializerFromType(arrayType.getLeafType(), subtype);
        builder.parameters(ImmutableList.of(parameterSerializerType));
        builder.instance(CodeBlock.builder()
                .add("$T.newInstance($L)", arraySerializer, parameterSerializerType.getInstance()).build());
        return builder.build();
    }

    if (null != type.isAnnotation()) {
        String message = "Annotations are not supported";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    JClassType classType = type.isClassOrInterface();
    if (null != classType) {
        // The type is a class or interface and has no default serializer. We generate one.
        JClassType baseClassType = classType;
        JParameterizedType parameterizedType = classType.isParameterized();
        if (null != parameterizedType) {
            // It's a bean with generics, we create a serializer based on generic type.
            baseClassType = parameterizedType.getBaseType();
        }

        BeanJsonSerializerCreator beanJsonSerializerCreator = new BeanJsonSerializerCreator(
                logger.branch(Type.DEBUG, "Creating serializer for " + baseClassType.getQualifiedSourceName()),
                context, configuration, typeOracle, baseClassType);
        BeanJsonMapperInfo mapperInfo = beanJsonSerializerCreator.create();

        // Generics and parameterized types serializers have no default constructor. They need serializers for each parameter.
        ImmutableList<? extends JType> typeParameters = getTypeParameters(classType, subtype);
        ImmutableList.Builder<JParameterizedSerializer> parametersSerializerBuilder = ImmutableList.builder();
        ImmutableList.Builder<JSerializerType> parametersJsonSerializerBuilder = ImmutableList.builder();
        for (JType argType : typeParameters) {
            JSerializerType jsonSerializer = getJsonSerializerFromType(argType, subtype);
            parametersSerializerBuilder.add(new JParameterizedSerializer(
                    getKeySerializerFromType(argType, subtype, true), jsonSerializer));
            parametersJsonSerializerBuilder.add(jsonSerializer);
        }

        builder.parameters(parametersJsonSerializerBuilder.build());
        builder.beanMapper(true);
        builder.instance(constructorCallCode(
                ClassName.get(mapperInfo.getPackageName(), mapperInfo.getSimpleSerializerClassName()),
                parametersSerializerBuilder.build()));
        return builder.build();
    }

    String message = "Type '" + type.getQualifiedSourceName() + "' is not supported";
    logger.log(TreeLogger.Type.WARN, message);
    throw new UnsupportedTypeException(message);
}

From source file:com.github.nmorel.gwtjackson.rebind.AbstractCreator.java

License:Apache License

/**
 * Build a {@link JDeserializerType} that instantiate a {@link JsonSerializer} for the given type. If the type is a bean,
 * the implementation of {@link AbstractBeanJsonSerializer} will be created.
 *
 * @param type type//from ww w  . j  a v a  2 s.co m
 * @param subtype true if the deserializer is for a subtype
 *
 * @return the {@link JDeserializerType}. Examples:
 * <ul>
 * <li>ctx.getIntegerDeserializer()</li>
 * <li>new org .PersonBeanJsonDeserializer()</li>
 * </ul>
 */
protected final JDeserializerType getJsonDeserializerFromType(JType type, boolean subtype)
        throws UnableToCompleteException, UnsupportedTypeException {
    JDeserializerType.Builder builder = new JDeserializerType.Builder().type(type);
    if (null != type.isWildcard()) {
        // For wildcard type, we use the base type to find the deserializer.
        type = type.isWildcard().getBaseType();
    }

    if (null != type.isRawType()) {
        // For raw type, we use the base type to find the deserializer.
        type = type.isRawType().getBaseType();
    }

    JTypeParameter typeParameter = type.isTypeParameter();
    if (null != typeParameter) {
        // It's a type parameter like T in 'MyClass<T>'
        if (!subtype || typeParameter.getDeclaringClass() == getMapperInfo().get().getType()) {
            // The deserializer is created for the main type so we use the deserializer field declared for this type.
            return builder.instance(CodeBlock.builder()
                    .add(String.format(TYPE_PARAMETER_DESERIALIZER_FIELD_NAME, typeParameter.getOrdinal()))
                    .add(".json()").build()).build();
        } else {
            // There is no declared deserializer so we use the base type to find a deserializer.
            type = typeParameter.getBaseType();
        }
    }

    if (typeOracle.isEnumSupertype(type)) {
        String message = "Type java.lang.Enum is not supported by deserialization";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    Optional<MapperInstance> configuredDeserializer = configuration.getDeserializer(type);
    if (configuredDeserializer.isPresent()) {
        // The type is configured in AbstractConfiguration.
        if (null != type.isParameterized() || null != type.isGenericType()) {
            JClassType[] typeArgs;
            if (null != type.isGenericType()) {
                typeArgs = type.isGenericType().asParameterizedByWildcards().getTypeArgs();
            } else {
                typeArgs = type.isParameterized().getTypeArgs();
            }

            ImmutableList.Builder<JDeserializerType> parametersDeserializerBuilder = ImmutableList.builder();
            for (int i = 0; i < typeArgs.length; i++) {
                JDeserializerType parameterDeserializerType;
                if (MapperType.KEY_DESERIALIZER == configuredDeserializer.get().getParameters()[i]) {
                    parameterDeserializerType = getKeyDeserializerFromType(typeArgs[i]);
                } else {
                    parameterDeserializerType = getJsonDeserializerFromType(typeArgs[i], subtype);
                }
                parametersDeserializerBuilder.add(parameterDeserializerType);
            }
            ImmutableList<JDeserializerType> parametersDeserializer = parametersDeserializerBuilder.build();
            builder.parameters(parametersDeserializer);
            builder.instance(methodCallCodeWithJMapperTypeParameters(configuredDeserializer.get(),
                    parametersDeserializer));

        } else {
            // The deserializer has no parameters.
            builder.instance(methodCallCode(configuredDeserializer.get()));
        }
        return builder.build();
    }

    if (typeOracle.isJavaScriptObject(type)) {
        // It's a JSO and the user didn't give a custom deserializer. We use the default one.
        configuredDeserializer = configuration.getDeserializer(typeOracle.getJavaScriptObject());
        return builder.instance(methodCallCode(configuredDeserializer.get())).build();
    }

    if (typeOracle.isEnum(type)) {
        configuredDeserializer = configuration.getDeserializer(typeOracle.getEnum());
        return builder
                .instance(
                        methodCallCodeWithClassParameters(configuredDeserializer.get(), ImmutableList.of(type)))
                .build();
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        TypeSpec arrayCreator;
        Class<?> arrayDeserializer;
        JType leafType = arrayType.getLeafType();
        int arrayRank = arrayType.getRank();

        if (arrayRank < 10) {
            arrayCreator = ArrayCreator.build(arrayType, arrayRank, leafType);
            arrayDeserializer = ArrayJsonDeserializer.class;

        } else {
            // More dimensions are not supported
            String message = "Arrays with 4 or more dimensions are not supported";
            logger.log(TreeLogger.Type.WARN, message);
            throw new UnsupportedTypeException(message);
        }

        JDeserializerType parameterDeserializerType = getJsonDeserializerFromType(leafType, subtype);
        builder.parameters(ImmutableList.of(parameterDeserializerType));
        builder.instance(CodeBlock.builder().add("$T.newInstance($L, $L)", arrayDeserializer,
                parameterDeserializerType.getInstance(), arrayCreator).build());
        return builder.build();
    }

    if (null != type.isAnnotation()) {
        String message = "Annotations are not supported";
        logger.log(TreeLogger.Type.WARN, message);
        throw new UnsupportedTypeException(message);
    }

    JClassType classType = type.isClassOrInterface();
    if (null != classType) {
        // The type is a class or interface and has no default deserializer. We generate one.
        JClassType baseClassType = classType;
        JParameterizedType parameterizedType = classType.isParameterized();
        if (null != parameterizedType) {
            // It's a bean with generics, we create a deserializer based on generic type.
            baseClassType = parameterizedType.getBaseType();
        }

        BeanJsonDeserializerCreator beanJsonDeserializerCreator = new BeanJsonDeserializerCreator(
                logger.branch(Type.DEBUG,
                        "Creating deserializer for " + baseClassType.getQualifiedSourceName()),
                context, configuration, typeOracle, baseClassType);
        BeanJsonMapperInfo mapperInfo = beanJsonDeserializerCreator.create();

        // Generics and parameterized types deserializers have no default constructor. They need deserializers for each parameter.
        ImmutableList<? extends JType> typeParameters = getTypeParameters(classType, subtype);
        ImmutableList.Builder<JParameterizedDeserializer> parametersDeserializerBuilder = ImmutableList
                .builder();
        ImmutableList.Builder<JDeserializerType> parametersJsonDeserializerBuilder = ImmutableList.builder();
        for (JType argType : typeParameters) {
            JDeserializerType jsonDeserializer = getJsonDeserializerFromType(argType, subtype);
            parametersDeserializerBuilder.add(new JParameterizedDeserializer(
                    getKeyDeserializerFromType(argType, subtype, true), jsonDeserializer));
            parametersJsonDeserializerBuilder.add(jsonDeserializer);
        }

        builder.parameters(parametersJsonDeserializerBuilder.build());
        builder.beanMapper(true);
        builder.instance(constructorCallCode(
                ClassName.get(mapperInfo.getPackageName(), mapperInfo.getSimpleDeserializerClassName()),
                parametersDeserializerBuilder.build()));
        return builder.build();
    }

    String message = "Type '" + type.getQualifiedSourceName() + "' is not supported";
    logger.log(TreeLogger.Type.WARN, message);
    throw new UnsupportedTypeException(message);
}

From source file:com.github.nmorel.gwtjackson.rebind.JacksonTypeOracle.java

License:Apache License

public JType replaceType(TreeLogger logger, JType type, Annotation deserializeAs)
        throws UnableToCompleteException {
    JClassType classType = type.isClassOrInterface();
    if (null == classType) {
        return type;
    }//w w  w .j a va2s.  co m

    Optional<JClassType> typeAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "as");
    Optional<JClassType> keyAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "keyAs");
    Optional<JClassType> contentAs = getClassFromJsonDeserializeAnnotation(logger, deserializeAs, "contentAs");

    if (!typeAs.isPresent() && !keyAs.isPresent() && !contentAs.isPresent()) {
        return type;
    }

    JArrayType arrayType = type.isArray();
    if (null != arrayType) {
        if (contentAs.isPresent()) {
            return typeOracle.getArrayType(contentAs.get());
        } else if (typeAs.isPresent()) {
            return typeOracle.getArrayType(typeAs.get());
        } else {
            return classType;
        }
    }

    JParameterizedType parameterizedType = type.isParameterized();
    if (null != parameterizedType) {
        JGenericType genericType;
        if (typeAs.isPresent()) {
            genericType = typeAs.get().isGenericType();
        } else {
            genericType = parameterizedType.getBaseType();
        }

        if (!keyAs.isPresent() && !contentAs.isPresent()) {
            return typeOracle.getParameterizedType(genericType, parameterizedType.getTypeArgs());
        } else if (contentAs.isPresent() && isIterable(parameterizedType)) {
            return typeOracle.getParameterizedType(genericType, new JClassType[] { contentAs.get() });
        } else if (isMap(parameterizedType)) {
            JClassType key;
            if (keyAs.isPresent()) {
                key = keyAs.get();
            } else {
                key = parameterizedType.getTypeArgs()[0];
            }

            JClassType content;
            if (contentAs.isPresent()) {
                content = contentAs.get();
            } else {
                content = parameterizedType.getTypeArgs()[1];
            }

            return typeOracle.getParameterizedType(genericType, new JClassType[] { key, content });
        }
    }

    if (typeAs.isPresent()) {
        return typeAs.get();
    }

    return type;
}

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

License:Apache License

/**
 * Examines a type to see if it can be transported.
 *///from   w w  w.j  a va2  s  .  co  m
private boolean validateTransportableType(RequestMethod.Builder methodBuilder, JType type,
        boolean requireObject) throws UnableToCompleteException {
    JClassType transportedClass = type.isClassOrInterface();
    if (transportedClass == null) {
        if (requireObject) {
            poison("The type %s cannot be transported by RequestFactory as" + " a return type",
                    type.getQualifiedSourceName());
            return false;
        } else {
            // Primitives always ok
            return true;
        }
    }

    if (ModelUtils.isValueType(oracle, transportedClass) || splittableType.equals(transportedClass)) {
        // Simple values, like Integer and String
        methodBuilder.setValueType(true);
    } else if (entityProxyInterface.isAssignableFrom(transportedClass)
            || valueProxyInterface.isAssignableFrom(transportedClass)) {
        // EntityProxy and ValueProxy return types
        methodBuilder.setEntityType(getEntityProxyType(transportedClass));
    } else if (collectionInterface.isAssignableFrom(transportedClass)) {
        // Only allow certain collections for now
        JParameterizedType parameterized = transportedClass.isParameterized();
        if (parameterized == null) {
            poison("Requests that return collections of List or Set must be parameterized");
            return false;
        }
        if (listInterface.equals(parameterized.getBaseType())) {
            methodBuilder.setCollectionType(CollectionType.LIST);
        } else if (setInterface.equals(parameterized.getBaseType())) {
            methodBuilder.setCollectionType(CollectionType.SET);
        } else {
            poison("Requests that return collections may be declared with" + " %s or %s only",
                    listInterface.getQualifiedSourceName(), setInterface.getQualifiedSourceName());
            return false;
        }
        // Also record the element type in the method builder
        JClassType elementType = ModelUtils.findParameterizationOf(collectionInterface, transportedClass)[0];
        methodBuilder.setCollectionElementType(elementType);
        validateTransportableType(methodBuilder, elementType, requireObject);
    } else if (mapInterface.isAssignableFrom(transportedClass)) {
        JParameterizedType parameterized = transportedClass.isParameterized();
        if (parameterized == null) {
            poison("Requests that return Maps must be parameterized");
            return false;
        }
        if (mapInterface.equals(parameterized.getBaseType())) {
            methodBuilder.setCollectionType(CollectionType.MAP);
        } else {
            poison("Requests that return maps may be declared with" + " %s only",
                    mapInterface.getQualifiedSourceName());
            return false;
        }
        // Also record the element type in the method builder
        JClassType[] params = ModelUtils.findParameterizationOf(mapInterface, transportedClass);
        JClassType keyType = params[0];
        JClassType valueType = params[1];
        methodBuilder.setMapKeyType(keyType);
        methodBuilder.setMapValueType(valueType);
        validateTransportableType(methodBuilder, keyType, requireObject);
        validateTransportableType(methodBuilder, valueType, requireObject);
    } else {
        // Unknown type, fail
        poison("Invalid Request parameterization %s", transportedClass.getQualifiedSourceName());
        return false;
    }
    methodBuilder.setDataType(transportedClass);
    return true;
}

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

License:Apache License

private void printViewFieldBindings(SourceWriter writer, JClassType presenterType, String viewTypeName,
        HashMap<String, JType> validBindingFieldsType, ArrayList<JField> fields)
        throws UnableToCompleteException {

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

    JClassType viewAccesorType = getType(ViewAccesor.class.getCanonicalName());

    ArrayList<JField> superFields = new ArrayList<JField>();
    collectAllFields(presenterType.getSuperclass(), superFields);

    JClassType elementDomType = getType(com.guit.client.dom.Element.class.getCanonicalName());

    for (JField f : fields) {
        if (f.isAnnotationPresent(ViewField.class)) {
            // Check for repetided fields
            if (f.getType().isClassOrInterface().isAssignableTo(elementDomType)) {
                if (superFields.contains(f)) {

                }/*from   w w  w. j  av  a  2s .  c  o m*/
            }

            String name = f.getName();
            ViewField viewField = f.getAnnotation(ViewField.class);
            String viewName = viewField.name();
            if (viewName.isEmpty()) {
                viewName = name;
            }
            if (!validBindingFields.contains(viewName)) {
                error("The field '%s' do not exists. Found: %s.%s", viewName,
                        presenterType.getQualifiedSourceName(), name);
            }

            JClassType type = f.getType().isClassOrInterface();
            // if (type.isInterface() == null && !viewField.provided()) {
            // error("A ViewField must be an interface. Found: %s.%s", presenterType
            // .getQualifiedSourceName(), name);
            // }

            if (type.isAssignableTo(viewAccesorType)) {
                writer.println("{");
                writer.indent();
                if (!type.isAnnotationPresent(Implementation.class)) {
                    writer.println(type.getQualifiedSourceName() + " accesor = "
                            + GinOracle.getProvidedInstance(type.getQualifiedSourceName()) + ".get();");
                } else {

                    JClassType implementation = getType(
                            type.getAnnotation(Implementation.class).value().getCanonicalName());

                    // If they are parameterized look for the base type
                    JParameterizedType implementationParameterized = implementation.isParameterized();
                    if (implementationParameterized != null) {
                        implementation = implementationParameterized.getBaseType();
                    }
                    JParameterizedType typeParameterized = type.isParameterized();
                    if (typeParameterized != null) {
                        type = typeParameterized.getBaseType();
                    }

                    // Verify that they are assignable
                    if (!implementation.isAssignableTo(type)) {
                        error("An implementation of a ViewAccesor must implement the ViewAccesor interface. Found: %s",
                                implementation.getQualifiedSourceName());
                    }
                    writer.println(type.getQualifiedSourceName() + " accesor = new "
                            + implementation.getQualifiedSourceName() + "();");
                }

                writer.println("accesor.setTarget(view." + viewName + ");");
                writer.println("presenter." + name + " = accesor;");
                writer.outdent();
                writer.print("}");
                writer.println();
            } else if (type == null
                    || type.isAssignableFrom(validBindingFieldsType.get(viewName).isClassOrInterface())
                    || type.getQualifiedSourceName().startsWith("elemental.")) {
                String qualifiedSourceName = f.getType().getQualifiedSourceName();
                writer.println("presenter." + name + " = (" + qualifiedSourceName + ") view." + viewName + ";");
                writer.println();
            } else {
                // Interface emulation (without exceptions)
                writer.println(
                        "presenter." + name + " = new " + type.getParameterizedQualifiedSourceName() + "() {");
                writer.indent();

                ArrayList<JMethod> methods = new ArrayList<JMethod>();
                findAllMethods(type, methods);
                for (JMethod m : methods) {
                    writer.print(m.getReadableDeclaration(false, true, true, true, true));
                    writer.println("{");
                    writer.indent();

                    // Find the parameters
                    StringBuilder callParameters = new StringBuilder();
                    for (JParameter p : m.getParameters()) {
                        if (callParameters.length() > 0) {
                            callParameters.append(", ");
                        }
                        if (p.isAnnotationPresent(ImplicitCast.class)) {
                            callParameters.append("(");
                            callParameters
                                    .append(p.getAnnotation(ImplicitCast.class).value().getCanonicalName());
                            callParameters.append(") ");
                        }
                        callParameters.append(p.getName());
                    }

                    JType returnType = m.getReturnType();
                    if (!returnType.equals(JPrimitiveType.VOID)) {
                        writer.print("return ");

                        // Implicit cast
                        writer.print("(" + returnType.getParameterizedQualifiedSourceName() + ")");
                    }

                    writer.indent();
                    writer.println(createdClassName + ".this.view." + viewName + "." + m.getName() + "("
                            + callParameters.toString() + ");");
                    writer.outdent();

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

                // Get .equals working on emulated interfaces for
                // event.getSource() comparations
                writer.println("@Override");
                writer.println("public boolean equals(Object obj) {");
                writer.indent();
                writer.println("return view." + viewName + ".equals(obj);");
                writer.outdent();
                writer.println("}");
                writer.println();

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

From source file:com.smartgwt.rebind.BeanValueTypeFactoryGenerator.java

License:Open Source License

public String generate(TreeLogger logger, GeneratorContext context, String typeName)
        throws UnableToCompleteException {
    TypeOracle typeOracle = context.getTypeOracle();
    JClassType metaFactoryType = typeOracle.findType(typeName);

    final String genPackageName = metaFactoryType.getPackage().getName();
    final String genClassName = metaFactoryType.getSimpleSourceName() + "Impl";

    ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(genPackageName, genClassName);
    composer.addImplementedInterface(typeName);
    composer.addImport(com.smartgwt.client.bean.BeanValueType.class.getCanonicalName());
    composer.addImport("com.smartgwt.client.bean.types.*");

    PrintWriter printWriter = context.tryCreate(logger, genPackageName, genClassName);
    if (printWriter != null) {
        SourceWriter sourceWriter = composer.createSourceWriter(context, printWriter);
        sourceWriter.println("// This class lovingly generated by "
                + BeanValueTypeFactoryGenerator.class.getCanonicalName() + "\n");

        StringBuilder functions = new StringBuilder();

        // Our constructor ... will be called by GWT.create()
        sourceWriter.println(genClassName + " () {");
        sourceWriter.indent();/* w  w w  . j a v a 2  s  .  c o  m*/

        JClassType beanValueTypeClass = typeOracle
                .findType(com.smartgwt.client.bean.BeanValueType.class.getCanonicalName()).isClass();

        // Iterate over the methods defined on the interface
        for (JMethod method : metaFactoryType.getMethods()) {
            if (method.getParameters().length != 0) {
                logger.log(Type.ERROR, typeName + "::" + method.getName() + " should have no parameters.");
                throw new UnableToCompleteException();
            }

            JParameterizedType returnType = method.getReturnType().isParameterized();
            if (returnType == null) {
                logger.log(Type.ERROR,
                        typeName + "::" + method.getName() + " has a non-parameterized return type.");
                throw new UnableToCompleteException();
            }

            if (returnType.getBaseType() != beanValueTypeClass) {
                logger.log(Type.ERROR, typeName + "::" + method.getName()
                        + " does not have BeanValueType<> as its return type.");
                throw new UnableToCompleteException();
            }

            JClassType[] typeArgs = returnType.getTypeArgs();
            if (typeArgs.length != 1) {
                logger.log(Type.ERROR, typeName + "::" + method.getName()
                        + " should have a return type with one parameterized type.");
                throw new UnableToCompleteException();
            }

            BeanValueType beanValueType = new BeanValueType(typeArgs[0], typeOracle);

            // Write the function to register the value type. Note that a side-effect
            // is that the factory for the value type is actually generated!
            beanValueType.writeRegisterValueType(sourceWriter, logger, context);

            // And we'll need to generate the function!
            functions.append("\n\n@Override public BeanValueType<" + beanValueType.getQualifiedTypeName() + "> "
                    + method.getName() + "() {\n  " + "return (BeanValueType<"
                    + beanValueType.getQualifiedTypeName() + ">) BeanValueType.getBeanValueType("
                    + beanValueType.getQualifiedValueTypeLiteral() + ");\n}");
        }

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

        sourceWriter.println(functions.toString());
        sourceWriter.commit(logger);
    }

    return composer.getCreatedClassName();
}

From source file:com.smartgwt.rebind.MetaBeanFactoryGenerator.java

License:Open Source License

public String generate(TreeLogger logger, GeneratorContext context, String typeName)
        throws UnableToCompleteException {
    TypeOracle typeOracle = context.getTypeOracle();
    JClassType metaFactoryType = typeOracle.findType(typeName);

    final String genPackageName = getFactoryPackage(metaFactoryType);
    final String genClassName = getSimpleFactoryName(metaFactoryType);

    ClassSourceFileComposerFactory composer = new ClassSourceFileComposerFactory(genPackageName, genClassName);
    composer.addImplementedInterface(typeName);
    composer.addImport(com.smartgwt.client.bean.BeanFactory.class.getCanonicalName());

    PrintWriter printWriter = context.tryCreate(logger, genPackageName, genClassName);
    if (printWriter != null) {
        SourceWriter sourceWriter = composer.createSourceWriter(context, printWriter);
        sourceWriter.println("// This class lovingly generated by "
                + MetaBeanFactoryGenerator.class.getCanonicalName() + "\n");

        StringBuilder functions = new StringBuilder();

        // Our constructor ... will be called by GWT.create()
        sourceWriter.println(genClassName + " () {");
        sourceWriter.indent();/*from  w  w w  . j a v a 2s.c om*/

        JClassType beanFactoryType = typeOracle.findType(BeanFactory.class.getCanonicalName()).isClass();
        JClassType baseWidgetType = typeOracle.findType(BaseWidget.class.getCanonicalName()).isClass();
        JClassType dataClassType = typeOracle.findType(DataClass.class.getCanonicalName()).isClass();

        // Iterate over the methods defined on the interface
        for (JMethod method : metaFactoryType.getMethods()) {
            if (method.getParameters().length != 0) {
                logger.log(Type.ERROR, typeName + "::" + method.getName() + " should have no parameters.");
                throw new UnableToCompleteException();
            }

            JParameterizedType returnType = method.getReturnType().isParameterized();
            if (returnType == null) {
                logger.log(Type.ERROR,
                        typeName + "::" + method.getName() + " has a non-parameterized return type.");
                throw new UnableToCompleteException();
            }

            if (returnType.getBaseType() != beanFactoryType) {
                logger.log(Type.ERROR, typeName + "::" + method.getName()
                        + " does not have BeanFactory<> as its return type.");
                throw new UnableToCompleteException();
            }

            JClassType[] typeArgs = returnType.getTypeArgs();
            if (typeArgs.length != 1) {
                logger.log(Type.ERROR, typeName + "::" + method.getName()
                        + " should have a return type with one parameterized type.");
                throw new UnableToCompleteException();
            }

            JClassType beanClassType = typeArgs[0];
            if (!baseWidgetType.isAssignableFrom(beanClassType)
                    && !dataClassType.isAssignableFrom(beanClassType)) {
                logger.log(Type.ERROR, typeName + "::" + method.getName()
                        + ": for now, factories can only be created for Canvas or DataClass and subclasses.");
                throw new UnableToCompleteException();
            }

            BeanClass beanClass = new BeanClass(beanClassType);
            beanClass.generateFactory(logger, context);

            // We have to instantiate the factory to register it in the BeanFactory static API
            sourceWriter.println(beanClass.getQualifiedFactoryName() + ".create(false);");

            // And we'll need to generate the function!
            functions.append("\n\n@Override public BeanFactory<" + beanClassType.getQualifiedSourceName() + "> "
                    + method.getName() + "() {\n  " + "return (BeanFactory<"
                    + beanClassType.getQualifiedSourceName() + ">) BeanFactory.getFactory("
                    + beanClassType.getQualifiedSourceName() + ".class);\n}");
        }

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

        sourceWriter.println(functions.toString());
        sourceWriter.commit(logger);
    }

    return composer.getCreatedClassName();
}

From source file:com.tyf.gwtphp.rebind.TypeUtil.java

License:Open Source License

/**
 * Returns the special binary name of a type. This type name corresponds the one
 * used in the GWT-PHP RPC library. This method also puts all other types referenced
 * into the given set./*from ww w .  j a v  a  2s .  co  m*/
 * 
 * E.g. HashMap<String, Integer> actually contains three types, all of which will be 
 * discovered and their names combined to get the final PHP RPC type name.
 * 
 * @param type
 *            TypeOracle type to get the name for
 * @param typeSet 
 *            A Set to receive classes discovered during type name parsing
 * @return binary name for a type
 */
public static String getPHPRpcTypeName(JType type, Set<JType> typeSet) {
    JPrimitiveType primitiveType = type.isPrimitive();
    if (primitiveType != null) {
        return primitiveType.getJNISignature();
    }

    JArrayType arrayType = type.isArray();
    if (arrayType != null) {
        JType component = arrayType.getComponentType();
        if (component.isClassOrInterface() != null) {
            return "[L" + getPHPRpcTypeName(arrayType.getComponentType(), typeSet) + ";";
        } else {
            return "[" + getPHPRpcTypeName(arrayType.getComponentType(), typeSet);
        }
    }

    JParameterizedType parameterizedType = type.isParameterized();
    if (parameterizedType != null) {
        String base = getPHPRpcTypeName(parameterizedType.getBaseType(), typeSet);
        StringBuilder sb = new StringBuilder(base);
        sb.append('<');
        JClassType[] args = parameterizedType.getTypeArgs();
        for (int i = 0; i < args.length; i++) {
            sb.append(getPHPRpcTypeName(args[i], typeSet));
            if (i != args.length - 1)
                sb.append(',');
        }
        sb.append('>');
        return sb.toString();
    }

    JClassType classType = type.isClassOrInterface();
    assert (classType != null);

    JClassType enclosingType = classType.getEnclosingType();
    if (enclosingType != null) {
        return getPHPRpcTypeName(enclosingType, typeSet) + "$" + classType.getSimpleSourceName();
    }

    typeSet.add(classType);
    return classType.getQualifiedSourceName();
}

From source file:com.tyf.gwtphp.rebind.TypeUtil.java

License:Open Source License

/**
 * Recursively generate the type signature. Handles array and generics
 * cases.//from w ww.  java2  s .com
 */
public static String getCRC(JType type) throws ClassNotFoundException {
    JPrimitiveType primitiveType = type.isPrimitive();
    if (primitiveType != null) {
        Class<?> clazz = PrimitiveTypes.getClass(primitiveType.getSimpleSourceName());
        return SerializabilityUtil.getSerializationSignature(clazz, policy);
    }

    JArrayType arrayType = type.isArray();
    if (arrayType != null) {
        JType component = arrayType.getComponentType();
        String parentCRC = SerializabilityUtil
                .getSerializationSignature(Class.forName(SerializationUtils.getRpcTypeName(type)), policy);
        if (component.isClassOrInterface() != null) {
            return parentCRC + "[L" + getCRC(arrayType.getComponentType()) + ";";
        } else {
            return parentCRC + "[" + getCRC(arrayType.getComponentType());
        }
    }

    JParameterizedType parameterizedType = type.isParameterized();
    if (parameterizedType != null) {
        String base = getCRC(parameterizedType.getBaseType());
        StringBuilder sb = new StringBuilder(base);
        sb.append('<');
        JClassType[] args = parameterizedType.getTypeArgs();
        for (int i = 0; i < args.length; i++) {
            sb.append(getCRC(args[i]));
            if (i != args.length - 1)
                sb.append(',');
        }
        sb.append('>');
        return sb.toString();
    }

    JClassType classType = type.isClassOrInterface();
    assert (classType != null);

    JClassType enclosingType = classType.getEnclosingType();
    if (enclosingType != null) {
        return getCRC(enclosingType) + "$" + SerializabilityUtil
                .getSerializationSignature(Class.forName(classType.getQualifiedSourceName()), policy);
    }

    return SerializabilityUtil.getSerializationSignature(Class.forName(type.getQualifiedSourceName()), policy);
}

From source file:fr.onevu.gwt.uibinder.rebind.HandlerEvaluator.java

License:Apache License

private JClassType tryEnhancingTypeInfo(String objectName, JClassType objectType) {
    OwnerField uiField = ownerClass.getUiField(objectName);
    if (uiField != null) {
        JParameterizedType pType = uiField.getRawType().isParameterized();
        if (pType != null) {
            // Even field is parameterized, it might be a super class. In that case,
            // if we use the field
            // type then we might miss some add handlers methods from the objectType
            // itself; something
            // we don't want to happen!
            if (pType.getBaseType().equals(objectType)) {
                // Now we proved type from UiField is more specific, let's use that
                // one
                return pType;
            }//from ww w.j a v a  2s .c  o m
        }
    }
    return objectType;
}