package org.springframework.roo.addon.web.mvc.controller.finder; import static org.springframework.roo.model.RooJavaType.ROO_WEB_FINDER; import java.util.Set; import java.util.SortedMap; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.osgi.service.component.ComponentContext; import org.springframework.roo.addon.web.mvc.controller.details.FinderMetadataDetails; import org.springframework.roo.addon.web.mvc.controller.details.JavaTypeMetadataDetails; import org.springframework.roo.addon.web.mvc.controller.details.WebMetadataService; import org.springframework.roo.addon.web.mvc.controller.scaffold.WebScaffoldAnnotationValues; import org.springframework.roo.classpath.PhysicalTypeIdentifier; import org.springframework.roo.classpath.PhysicalTypeMetadata; import org.springframework.roo.classpath.customdata.CustomDataKeys; import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails; import org.springframework.roo.classpath.itd.AbstractItdMetadataProvider; import org.springframework.roo.classpath.itd.ItdTypeDetailsProvidingMetadataItem; import org.springframework.roo.classpath.scanner.MemberDetails; import org.springframework.roo.model.JavaType; import org.springframework.roo.project.LogicalPath; /** * Implementation of {@link WebFinderMetadataProvider}. * * @author Stefan Schmidt * @since 1.1.3 */ @Component(immediate = true) @Service public class WebFinderMetadataProviderImpl extends AbstractItdMetadataProvider implements WebFinderMetadataProvider { @Reference private WebMetadataService webMetadataService; protected void activate(final ComponentContext context) { metadataDependencyRegistry.registerDependency( PhysicalTypeIdentifier.getMetadataIdentiferType(), getProvidesType()); addMetadataTrigger(ROO_WEB_FINDER); } @Override protected String createLocalIdentifier(final JavaType javaType, final LogicalPath path) { return WebFinderMetadata.createIdentifier(javaType, path); } protected void deactivate(final ComponentContext context) { metadataDependencyRegistry.deregisterDependency( PhysicalTypeIdentifier.getMetadataIdentiferType(), getProvidesType()); removeMetadataTrigger(ROO_WEB_FINDER); } @Override protected String getGovernorPhysicalTypeIdentifier( final String metadataIdentificationString) { final JavaType javaType = WebFinderMetadata .getJavaType(metadataIdentificationString); final LogicalPath path = WebFinderMetadata .getPath(metadataIdentificationString); return PhysicalTypeIdentifier.createIdentifier(javaType, path); } public String getItdUniquenessFilenameSuffix() { return "Controller_Finder"; } @Override protected ItdTypeDetailsProvidingMetadataItem getMetadata( final String metadataIdentificationString, final JavaType aspectName, final PhysicalTypeMetadata governorPhysicalTypeMetadata, final String itdFilename) { // We need to parse the annotation, which we expect to be present final WebScaffoldAnnotationValues annotationValues = new WebScaffoldAnnotationValues( governorPhysicalTypeMetadata); if (!annotationValues.isAnnotationFound() || !annotationValues.isExposeFinders() || annotationValues.getFormBackingObject() == null || governorPhysicalTypeMetadata.getMemberHoldingTypeDetails() == null) { return null; } // Lookup the form backing object's metadata final JavaType formBackingType = annotationValues .getFormBackingObject(); final ClassOrInterfaceTypeDetails formBackingTypeDetails = typeLocationService .getTypeDetails(formBackingType); if (formBackingTypeDetails == null || !formBackingTypeDetails.getCustomData().keySet() .contains(CustomDataKeys.PERSISTENT_TYPE)) { return null; } // We need to be informed if our dependent metadata changes metadataDependencyRegistry.registerDependency( formBackingTypeDetails.getDeclaredByMetadataId(), metadataIdentificationString); final MemberDetails formBackingObjectMemberDetails = getMemberDetails(formBackingTypeDetails); final Set<FinderMetadataDetails> dynamicFinderMethods = webMetadataService .getDynamicFinderMethodsAndFields(formBackingType, formBackingObjectMemberDetails, metadataIdentificationString); if (dynamicFinderMethods == null) { return null; } final SortedMap<JavaType, JavaTypeMetadataDetails> relatedApplicationTypeMetadata = webMetadataService .getRelatedApplicationTypeMetadata(formBackingType, formBackingObjectMemberDetails, metadataIdentificationString); return new WebFinderMetadata(metadataIdentificationString, aspectName, governorPhysicalTypeMetadata, annotationValues, relatedApplicationTypeMetadata, dynamicFinderMethods); } public String getProvidesType() { return WebFinderMetadata.getMetadataIdentiferType(); } }