List of usage examples for com.google.gwt.core.ext.typeinfo JParameterizedType getBaseType
JGenericType getBaseType();
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; }