package org.springframework.roo.classpath.operations.jsr303; import static org.springframework.roo.model.JpaJavaType.TEMPORAL; import static org.springframework.roo.model.JpaJavaType.TEMPORAL_TYPE; import static org.springframework.roo.model.Jsr303JavaType.FUTURE; import static org.springframework.roo.model.Jsr303JavaType.PAST; import static org.springframework.roo.model.SpringJavaType.DATE_TIME_FORMAT; import java.util.ArrayList; import java.util.List; import org.springframework.roo.classpath.details.FieldDetails; import org.springframework.roo.classpath.details.annotations.AnnotationAttributeValue; import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder; import org.springframework.roo.classpath.details.annotations.EnumAttributeValue; import org.springframework.roo.classpath.details.annotations.StringAttributeValue; import org.springframework.roo.classpath.operations.DateTime; import org.springframework.roo.model.EnumDetails; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; /** * This field can optionally provide the mandatory JSR 220 temporal annotation. * * @author Ben Alex * @since 1.0 */ public class DateField extends FieldDetails { private DateTime dateFormat; /** Whether the JSR 303 @Future annotation will be added */ private boolean future; /** Whether the JSR 303 @Past annotation will be added */ private boolean past; /** * Custom date formatting through a DateTime pattern such as yyyy/mm/dd * h:mm:ss a. */ private String pattern; /** Whether the JSR 220 @Temporal annotation will be added */ private DateFieldPersistenceType persistenceType; private DateTime timeFormat; public DateField(final String physicalTypeIdentifier, final JavaType fieldType, final JavaSymbolName fieldName) { super(physicalTypeIdentifier, fieldType, fieldName); } @Override public void decorateAnnotationsList(final List<AnnotationMetadataBuilder> annotations) { super.decorateAnnotationsList(annotations); if (past) { annotations.add(new AnnotationMetadataBuilder(PAST)); } if (future) { annotations.add(new AnnotationMetadataBuilder(FUTURE)); } if (persistenceType != null) { // Add JSR 220 @Temporal annotation String value = null; if (persistenceType == DateFieldPersistenceType.JPA_DATE) { value = "DATE"; } else if (persistenceType == DateFieldPersistenceType.JPA_TIME) { value = "TIME"; } else if (persistenceType == DateFieldPersistenceType.JPA_TIMESTAMP) { value = "TIMESTAMP"; } final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>(); attrs.add(new EnumAttributeValue(new JavaSymbolName("value"), new EnumDetails(TEMPORAL_TYPE, new JavaSymbolName(value)))); annotations.add(new AnnotationMetadataBuilder(TEMPORAL, attrs)); } // Only add a DateTimeFormat annotation if class is not a DTO final List<AnnotationAttributeValue<?>> attributes = new ArrayList<AnnotationAttributeValue<?>>(); if (pattern != null) { attributes.add(new StringAttributeValue(new JavaSymbolName("pattern"), pattern)); } else { final String dateStyle = null != dateFormat ? String.valueOf(dateFormat.getShortKey()) : "M"; final String timeStyle = null != timeFormat ? String.valueOf(timeFormat.getShortKey()) : "-"; attributes.add(new StringAttributeValue(new JavaSymbolName("style"), dateStyle + timeStyle)); } annotations.add(new AnnotationMetadataBuilder(DATE_TIME_FORMAT, attributes)); } public DateTime getDateFormat() { return dateFormat; } public String getPattern() { return pattern; } public DateFieldPersistenceType getPersistenceType() { return persistenceType; } public DateTime getTimeFormat() { return timeFormat; } public boolean isFuture() { return future; } public boolean isPast() { return past; } public void setDateFormat(final DateTime dateFormat) { this.dateFormat = dateFormat; } public void setFuture(final boolean future) { this.future = future; } public void setPast(final boolean past) { this.past = past; } public void setPattern(final String pattern) { this.pattern = pattern; } public void setPersistenceType(final DateFieldPersistenceType persistenceType) { this.persistenceType = persistenceType; } public void setTimeFormat(final DateTime timeFormat) { this.timeFormat = timeFormat; } }