@Override protected ClassSourceFileComposerFactory createComposerFactory() { String parameters = ""; if (source instanceof JGenericType) { JGenericType gtype = (JGenericType) source; StringBuilder builder = new StringBuilder(); builder.append("<"); boolean first = true; for (JTypeParameter arg : gtype.getTypeParameters()) { if (!first) builder.append(","); builder.append(arg.getName()); builder.append(" extends "); builder.append(arg.getFirstBound().getParameterizedQualifiedSourceName()); first = false; } builder.append(">"); parameters = builder.toString(); } ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(packageName, shortName + parameters); composerFactory.addImplementedInterface(source.getParameterizedQualifiedSourceName()); composerFactory.addImplementedInterface(RestServiceProxy.class.getName()); return composerFactory; }
/** * Returns <code>true</code> if the type arguments of the rhs parameterized type are assignable to * the type arguments of the lhs parameterized type. */ private static boolean areTypeArgumentsAssignable( JParameterizedType lhsType, JParameterizedType rhsType) { // areClassTypesAssignable should prevent us from getting here if the types // are referentially equal. assert (lhsType != rhsType); assert (lhsType.getBaseType() == rhsType.getBaseType()); JClassType[] lhsTypeArgs = lhsType.getTypeArgs(); JClassType[] rhsTypeArgs = rhsType.getTypeArgs(); JGenericType lhsBaseType = lhsType.getBaseType(); // Compare at least as many formal type parameters as are declared on the // generic base type. gwt.typeArgs could cause more types to be included. JTypeParameter[] lhsTypeParams = lhsBaseType.getTypeParameters(); for (int i = 0; i < lhsTypeParams.length; ++i) { if (!doesTypeArgumentContain(lhsTypeArgs[i], rhsTypeArgs[i])) { return false; } } return true; }