Hi all,
I'm trying to register a MemberDetailsDecorator implementation that modifies the implementation of some integration tests generated by Automated Integration Testing Addon.
As far as I understand about MemberDetailsDecorator and based on org.springframework.roo.classpath.customdata.tagge rs.CustomDataKeyDecorator, I can program a class implementing MemberDetailsDecorator Iterface and there do my personalizations in decorate(..) method. That is what I did in following code:
MemberDetailsDecorator JavaDoc says that all registered Decorators are invoked, in fact my Decorator is invoked but the modification of the method body I'm trying to do is not being persisted in the IntegationTests ITD.Code:package org.gvnix.myaddon.roo.addon; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.classpath.customdata.tagkeys.MethodMetadataCustomDataKey; import org.springframework.roo.classpath.details.MemberFindingUtils; import org.springframework.roo.classpath.details.MemberHoldingTypeDetails; import org.springframework.roo.classpath.details.MethodMetadata; import org.springframework.roo.classpath.details.MethodMetadataBuilder; import org.springframework.roo.classpath.details.annotations.AnnotatedJavaType; import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder; import org.springframework.roo.classpath.itd.InvocableMemberBodyBuilder; import org.springframework.roo.classpath.scanner.MemberDetails; import org.springframework.roo.classpath.scanner.MemberDetailsBuilder; import org.springframework.roo.classpath.scanner.MemberDetailsDecorator; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; @Component @Service public class IntegrationTestsMemberDetailsDecorator implements MemberDetailsDecorator { public MemberDetails decorate(String requestingClass, MemberDetails memberDetails) { MemberDetailsBuilder memberDetailsBuilder = new MemberDetailsBuilder( memberDetails); if (requestingClass .equalsIgnoreCase("org.springframework.roo.classpath.TypeLocationServiceImpl")) { for (MemberHoldingTypeDetails memberHoldingTypeDetails : memberDetails .getDetails()) { MethodMetadata testFlushMethodMetadata = MemberFindingUtils .getMethod(memberHoldingTypeDetails, new JavaSymbolName("testFlush"), null); // MethodMetadata testMergeMethodMetadata = MemberFindingUtils // .getMethod(memberHoldingTypeDetails, // new JavaSymbolName("testMerge"), null); // System.out.println("** ".concat(requestingClass).concat( // " **************** ") // + testFlushMethodMetadata); if (testFlushMethodMetadata != null) { memberDetailsBuilder .tag(testFlushMethodMetadata, new MethodMetadataCustomDataKey( "TEST_FLUSH_METHOD"), getFlushMethodTest(testFlushMethodMetadata)); } } } return memberDetailsBuilder.build(); } private MethodMetadata getFlushMethodTest(MethodMetadata existing) { // Prepare method signature JavaSymbolName methodName = existing.getMethodName(); List<JavaType> parameters = new ArrayList<JavaType>(); List<AnnotationMetadataBuilder> annotations = new ArrayList<AnnotationMetadataBuilder>(); annotations.add(new AnnotationMetadataBuilder(existing.getAnnotations() .get(0))); InvocableMemberBodyBuilder bodyBuilder = new InvocableMemberBodyBuilder(); bodyBuilder.appendFormalLine("return;"); MethodMetadataBuilder methodBuilder = new MethodMetadataBuilder( existing.getDeclaredByMetadataId(), Modifier.PUBLIC, methodName, JavaType.VOID_PRIMITIVE, AnnotatedJavaType.convertFromJavaTypes(parameters), new ArrayList<JavaSymbolName>(), bodyBuilder); methodBuilder.setAnnotations(annotations); MethodMetadata method = methodBuilder.build(); return method; } }
I'm misundertanding something? Do I need to invoke the MemberDetailsBuilder.build() in any other place?
Regards.


Reply With Quote
