package org.springframework.roo.addon.layers.repository.jpa.addon; import org.springframework.roo.addon.layers.repository.jpa.annotations.RooJpaRepository; import org.springframework.roo.classpath.PhysicalTypeIdentifier; import org.springframework.roo.classpath.PhysicalTypeIdentifierNamingUtils; import org.springframework.roo.classpath.PhysicalTypeMetadata; import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails; import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder; import org.springframework.roo.classpath.itd.AbstractItdTypeDetailsProvidingMetadataItem; import org.springframework.roo.metadata.MetadataIdentificationUtils; import org.springframework.roo.model.JavaType; import org.springframework.roo.model.SpringJavaType; import org.springframework.roo.model.SpringletsJavaType; import org.springframework.roo.project.LogicalPath; /** * = RepositoryJpaConfigurationMetadata * * Metadata for {@link RooJpaRepository}. * * @author Sergio Clares * @since 2.0 */ public class RepositoryJpaConfigurationMetadata extends AbstractItdTypeDetailsProvidingMetadataItem { private static final String PROVIDES_TYPE_STRING = RepositoryJpaConfigurationMetadata.class .getName(); private static final String PROVIDES_TYPE = MetadataIdentificationUtils .create(PROVIDES_TYPE_STRING); public static String createIdentifier(final JavaType javaType, final LogicalPath path) { return PhysicalTypeIdentifierNamingUtils.createIdentifier(PROVIDES_TYPE_STRING, javaType, path); } public static String createIdentifier(ClassOrInterfaceTypeDetails repositoryDetails) { final LogicalPath repositoryLogicalPath = PhysicalTypeIdentifier.getPath(repositoryDetails.getDeclaredByMetadataId()); return createIdentifier(repositoryDetails.getType(), repositoryLogicalPath); } public static JavaType getJavaType(final String metadataIdentificationString) { return PhysicalTypeIdentifierNamingUtils.getJavaType(PROVIDES_TYPE_STRING, metadataIdentificationString); } public static String getMetadataIdentiferType() { return PROVIDES_TYPE; } public static LogicalPath getPath(final String metadataIdentificationString) { return PhysicalTypeIdentifierNamingUtils.getPath(PROVIDES_TYPE_STRING, metadataIdentificationString); } public static boolean isValid(final String metadataIdentificationString) { return PhysicalTypeIdentifierNamingUtils.isValid(PROVIDES_TYPE_STRING, metadataIdentificationString); } /** * Constructor * * @param identifier the identifier for this item of metadata (required) * @param aspectName the Java type of the ITD (required) * @param governorPhysicalTypeMetadata the governor, which is expected to * contain a {@link ClassOrInterfaceTypeDetails} (required) * */ public RepositoryJpaConfigurationMetadata(final String identifier, final JavaType aspectName, final PhysicalTypeMetadata governorPhysicalTypeMetadata, final JavaType applicationMainType, final boolean isSpringletsSecurityEnabled) { super(identifier, aspectName, governorPhysicalTypeMetadata); // Build @Configuration AnnotationMetadataBuilder configurationAnnotationBuilder = new AnnotationMetadataBuilder(SpringJavaType.CONFIGURATION); // Add annotation ensureGovernorIsAnnotated(configurationAnnotationBuilder); // Build @EnableJpaRepositories AnnotationMetadataBuilder enableRepositoriesAnnotationBuilder = new AnnotationMetadataBuilder(SpringJavaType.ENABLE_JPA_REPOSITORIES); // Add default Spring Roo repository class from Springlets to new annotation enableRepositoriesAnnotationBuilder.addClassAttribute("repositoryBaseClass", SpringletsJavaType.SPRINGLETS_DETACHABLE_JPA_REPOSITORY_IMPL); // Add main application configuration class to the annotation enableRepositoriesAnnotationBuilder .addClassAttribute("basePackageClasses", applicationMainType); // Add annnotation ensureGovernorIsAnnotated(enableRepositoriesAnnotationBuilder); // Build @EntityScan if (isSpringletsSecurityEnabled) { AnnotationMetadataBuilder entityScanAnnotationBuilder = new AnnotationMetadataBuilder(SpringJavaType.ENTITY_SCAN); entityScanAnnotationBuilder.addClassAttribute("basePackageClasses", applicationMainType); ensureGovernorIsAnnotated(entityScanAnnotationBuilder); } // Build the ITD itdTypeDetails = builder.build(); } }