package org.springframework.roo.addon.jpa.addon.audit; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.Validate; import org.springframework.roo.addon.jpa.annotations.audit.RooJpaAudit; import org.springframework.roo.classpath.PhysicalTypeIdentifierNamingUtils; import org.springframework.roo.classpath.PhysicalTypeMetadata; import org.springframework.roo.classpath.details.FieldMetadata; 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.JpaJavaType; import org.springframework.roo.model.SpringJavaType; import org.springframework.roo.project.LogicalPath; /** * Metadata for {@link RooJpaAudit}. * <p> * * @author Sergio Clares * @since 2.0 */ public class JpaAuditMetadata extends AbstractItdTypeDetailsProvidingMetadataItem { private static final String PROVIDES_TYPE_STRING = JpaAuditMetadata.class.getName(); private static final String PROVIDES_TYPE = MetadataIdentificationUtils .create(PROVIDES_TYPE_STRING); private List<FieldMetadata> auditFields = new ArrayList<FieldMetadata>(); public static String createIdentifier(final JavaType javaType, final LogicalPath path) { return PhysicalTypeIdentifierNamingUtils.createIdentifier(PROVIDES_TYPE_STRING, javaType, path); } 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 * @param aspectName * @param governorPhysicalTypeMetadata */ public JpaAuditMetadata(final String identifier, final JavaType aspectName, final PhysicalTypeMetadata governorPhysicalTypeMetadata, List<FieldMetadata> auditFields) { super(identifier, aspectName, governorPhysicalTypeMetadata); Validate .isTrue( isValid(identifier), "Metadata identification string '%s' does not appear to be a valid physical type identifier", identifier); // Saving audit fields to provide them to other components // that invoke this Metadata this.auditFields = auditFields; // Add @EntityListeners annotation ensureGovernorIsAnnotated(getEntityListenersAnnotation()); // Build ITD itdTypeDetails = builder.build(); } /** * Returns the list of audit fields * * @return */ public List<FieldMetadata> getAuditFields() { return auditFields; } /** * Builds @EntityListeners annotation * * @return AnnotationMetadataBuilder with the prepared annotation */ private AnnotationMetadataBuilder getEntityListenersAnnotation() { AnnotationMetadataBuilder annotation = new AnnotationMetadataBuilder(JpaJavaType.ENTITY_LISTENERS); annotation.addClassAttribute("value", SpringJavaType.AUDITING_ENTITY_LISTENER); return annotation; } }