package org.springframework.roo.addon.jpa.identifier; import static org.springframework.roo.model.RooJavaType.ROO_IDENTIFIER; import java.util.List; 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.configurable.ConfigurableMetadataProvider; import org.springframework.roo.addon.jpa.AbstractIdentifierServiceAwareMetadataProvider; import org.springframework.roo.addon.serializable.SerializableMetadataProvider; import org.springframework.roo.classpath.PhysicalTypeIdentifier; import org.springframework.roo.classpath.PhysicalTypeIdentifierNamingUtils; import org.springframework.roo.classpath.PhysicalTypeMetadata; import org.springframework.roo.classpath.itd.ItdTypeDetailsProvidingMetadataItem; import org.springframework.roo.model.JavaType; import org.springframework.roo.project.LogicalPath; import org.springframework.roo.project.ProjectMetadata; import org.springframework.roo.project.ProjectOperations; /** * Implementation of {@link IdentifierMetadataProvider}. * * @author Alan Stewart * @since 1.1 */ @Component(immediate = true) @Service public class IdentifierMetadataProviderImpl extends AbstractIdentifierServiceAwareMetadataProvider implements IdentifierMetadataProvider { @Reference private ConfigurableMetadataProvider configurableMetadataProvider; @Reference private ProjectOperations projectOperations; @Reference private SerializableMetadataProvider serializableMetadataProvider; protected void activate(final ComponentContext context) { metadataDependencyRegistry.registerDependency( PhysicalTypeIdentifier.getMetadataIdentiferType(), getProvidesType()); addMetadataTrigger(ROO_IDENTIFIER); configurableMetadataProvider.addMetadataTrigger(ROO_IDENTIFIER); serializableMetadataProvider.addMetadataTrigger(ROO_IDENTIFIER); } @Override protected String createLocalIdentifier(final JavaType javaType, final LogicalPath path) { return IdentifierMetadata.createIdentifier(javaType, path); } protected void deactivate(final ComponentContext context) { metadataDependencyRegistry.deregisterDependency( PhysicalTypeIdentifier.getMetadataIdentiferType(), getProvidesType()); removeMetadataTrigger(ROO_IDENTIFIER); configurableMetadataProvider.removeMetadataTrigger(ROO_IDENTIFIER); serializableMetadataProvider.removeMetadataTrigger(ROO_IDENTIFIER); } @Override protected String getGovernorPhysicalTypeIdentifier( final String metadataIdentificationString) { final JavaType javaType = IdentifierMetadata .getJavaType(metadataIdentificationString); final LogicalPath path = IdentifierMetadata .getPath(metadataIdentificationString); return PhysicalTypeIdentifier.createIdentifier(javaType, path); } public String getItdUniquenessFilenameSuffix() { return "Identifier"; } @Override protected ItdTypeDetailsProvidingMetadataItem getMetadata( final String metadataIdentificationString, final JavaType aspectName, final PhysicalTypeMetadata governorPhysicalTypeMetadata, final String itdFilename) { final IdentifierAnnotationValues annotationValues = new IdentifierAnnotationValues( governorPhysicalTypeMetadata); if (!annotationValues.isAnnotationFound()) { return null; } // We know governor type details are non-null and can be safely cast final JavaType javaType = IdentifierMetadata .getJavaType(metadataIdentificationString); final List<Identifier> identifierServiceResult = getIdentifiersForType(javaType); final LogicalPath path = PhysicalTypeIdentifierNamingUtils .getPath(metadataIdentificationString); if (projectOperations.isProjectAvailable(path.getModule())) { // If the project itself changes, we want a chance to refresh this // item metadataDependencyRegistry.registerDependency( ProjectMetadata.getProjectIdentifier(path.getModule()), metadataIdentificationString); } return new IdentifierMetadata(metadataIdentificationString, aspectName, governorPhysicalTypeMetadata, annotationValues, identifierServiceResult); } public String getProvidesType() { return IdentifierMetadata.getMetadataIdentifierType(); } }