final List<MemberHoldingTypeDetails> extendsTypes,
final String moduleName) {
try {
// A type may consist of a concrete type which depend on
final List<ClassOrInterfaceTypeDetails> types = new ArrayList<ClassOrInterfaceTypeDetails>();
final ClassOrInterfaceTypeDetailsBuilder templateClassBuilder = new ClassOrInterfaceTypeDetailsBuilder(
templateClass);
if (destType.isCreateAbstract()) {
final ClassOrInterfaceTypeDetailsBuilder abstractClassBuilder = createAbstractBuilder(
templateClassBuilder, extendsTypes, moduleName);
final ArrayList<FieldMetadataBuilder> fieldsToRemove = new ArrayList<FieldMetadataBuilder>();
for (final JavaSymbolName fieldName : destType
.getWatchedFieldNames()) {
for (final FieldMetadataBuilder fieldBuilder : templateClassBuilder
.getDeclaredFields()) {
if (fieldBuilder.getFieldName().equals(fieldName)) {
final FieldMetadataBuilder abstractFieldBuilder = new FieldMetadataBuilder(
abstractClassBuilder
.getDeclaredByMetadataId(),
fieldBuilder.build());
abstractClassBuilder
.addField(convertModifier(abstractFieldBuilder));
fieldsToRemove.add(fieldBuilder);
break;
}
}
}
templateClassBuilder.getDeclaredFields().removeAll(
fieldsToRemove);
final List<MethodMetadataBuilder> methodsToRemove = new ArrayList<MethodMetadataBuilder>();
for (final JavaSymbolName methodName : destType
.getWatchedMethods().keySet()) {
for (final MethodMetadataBuilder methodBuilder : templateClassBuilder
.getDeclaredMethods()) {
final List<JavaType> params = new ArrayList<JavaType>();
for (final AnnotatedJavaType param : methodBuilder
.getParameterTypes()) {
params.add(new JavaType(param.getJavaType()
.getFullyQualifiedTypeName()));
}
if (methodBuilder.getMethodName().equals(methodName)) {
if (destType.getWatchedMethods().get(methodName)
.containsAll(params)) {
final MethodMetadataBuilder abstractMethodBuilder = new MethodMetadataBuilder(
abstractClassBuilder
.getDeclaredByMetadataId(),
methodBuilder.build());
abstractClassBuilder
.addMethod(convertModifier(abstractMethodBuilder));
methodsToRemove.add(methodBuilder);
break;
}
}
}
}
templateClassBuilder.removeAll(methodsToRemove);
for (final JavaType innerTypeName : destType
.getWatchedInnerTypes()) {
for (final ClassOrInterfaceTypeDetailsBuilder innerTypeBuilder : templateClassBuilder
.getDeclaredInnerTypes()) {
if (innerTypeBuilder.getName().getSimpleTypeName()
.equals(innerTypeName.getSimpleTypeName())) {
final ClassOrInterfaceTypeDetailsBuilder builder = new ClassOrInterfaceTypeDetailsBuilder(
abstractClassBuilder
.getDeclaredByMetadataId(),
innerTypeBuilder.build());
builder.setName(new JavaType(
innerTypeBuilder.getName()
.getSimpleTypeName() + "_Roo_Gwt",
0, DataType.TYPE, null, innerTypeBuilder
.getName().getParameters()));
templateClassBuilder.getDeclaredInnerTypes()
.remove(innerTypeBuilder);
if (innerTypeBuilder.getPhysicalTypeCategory()
.equals(PhysicalTypeCategory.INTERFACE)) {
final ClassOrInterfaceTypeDetailsBuilder interfaceInnerTypeBuilder = new ClassOrInterfaceTypeDetailsBuilder(
innerTypeBuilder.build());
abstractClassBuilder.addInnerType(builder);
templateClassBuilder.getDeclaredInnerTypes()
.remove(innerTypeBuilder);
interfaceInnerTypeBuilder
.clearDeclaredMethods();
interfaceInnerTypeBuilder
.getDeclaredInnerTypes().clear();
interfaceInnerTypeBuilder.getExtendsTypes()
.clear();
interfaceInnerTypeBuilder
.getExtendsTypes()
.add(new JavaType(
builder.getName()
.getSimpleTypeName(),
0,