package org.springframework.roo.classpath.details; import static org.springframework.roo.model.JpaJavaType.COLUMN; import static org.springframework.roo.model.Jsr303JavaType.NOT_NULL; import static org.springframework.roo.model.Jsr303JavaType.NULL; import static org.springframework.roo.model.SpringJavaType.VALUE; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.springframework.roo.classpath.PhysicalTypeIdentifier; import org.springframework.roo.classpath.details.annotations.AnnotationAttributeValue; import org.springframework.roo.classpath.details.annotations.AnnotationMetadataBuilder; import org.springframework.roo.classpath.details.annotations.BooleanAttributeValue; import org.springframework.roo.classpath.details.annotations.StringAttributeValue; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; /** * Base class containing common JSR 303 and JSR 220 properties that can be * auto-generated. * * @author Ben Alex * @since 1.0 */ public class FieldDetails { /** The JPA @Column value */ private String column; /** Any JavaDoc comments (reserved for future expansion) */ protected String comment; /** The name of the field to be added */ private final JavaSymbolName fieldName; /** The type of field to be added */ private final JavaType fieldType; /** Whether the JSR 303 @NotNull annotation will be added */ private boolean notNull; /** Whether the JSR 303 @Null annotation will be added */ private boolean nullRequired; /** The type that will receive the field */ private final String physicalTypeIdentifier; /** Whether unique = true is added to the @Column annotation */ private boolean unique; /** The Spring @Value value **/ private String value; /** Field Modifiers (e.g. private, transient) */ private int modifiers; /** Contains field annotations */ private List<AnnotationMetadataBuilder> annotations; /** * Constructor * * @param physicalTypeIdentifier * @param fieldType * @param fieldName */ public FieldDetails(final String physicalTypeIdentifier, final JavaType fieldType, final JavaSymbolName fieldName) { Validate.isTrue(PhysicalTypeIdentifier.isValid(physicalTypeIdentifier), "Destination physical type identifier is invalid"); Validate.notNull(fieldType, "Field type required"); Validate.notNull(fieldName, "Field name required"); this.physicalTypeIdentifier = physicalTypeIdentifier; this.fieldType = fieldType; this.fieldName = fieldName; } public void decorateAnnotationsList(final List<AnnotationMetadataBuilder> annotations) { Validate.notNull(annotations); if (notNull) { annotations.add(new AnnotationMetadataBuilder(NOT_NULL)); } if (nullRequired) { annotations.add(new AnnotationMetadataBuilder(NULL)); } AnnotationMetadataBuilder columnBuilder = null; if (column != null) { final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>(); attrs.add(new StringAttributeValue(new JavaSymbolName("name"), column)); columnBuilder = new AnnotationMetadataBuilder(COLUMN, attrs); } if (unique) { if (columnBuilder != null) { columnBuilder.addBooleanAttribute("unique", true); } else { final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>(); attrs.add(new BooleanAttributeValue(new JavaSymbolName("unique"), true)); columnBuilder = new AnnotationMetadataBuilder(COLUMN, attrs); } } if (value != null) { final List<AnnotationAttributeValue<?>> attrs = new ArrayList<AnnotationAttributeValue<?>>(); attrs.add(new StringAttributeValue(new JavaSymbolName("value"), value)); annotations.add(new AnnotationMetadataBuilder(VALUE, attrs)); } if (fieldName.getSymbolName().equals("created")) { if (columnBuilder == null) { columnBuilder = new AnnotationMetadataBuilder(COLUMN); } columnBuilder.addBooleanAttribute("updatable", false); } if (columnBuilder != null) { annotations.add(columnBuilder); } } public String getColumn() { return column; } public String getComment() { return comment; } public JavaSymbolName getFieldName() { return fieldName; } public JavaType getFieldType() { return fieldType; } public String getPhysicalTypeIdentifier() { return physicalTypeIdentifier; } public String getValue() { return value; } public boolean isNotNull() { return notNull; } public boolean isNullRequired() { return nullRequired; } public boolean isUnique() { return unique; } public int getModifiers() { return modifiers; } public List<AnnotationMetadataBuilder> getAnnotations() { return annotations; } public List<AnnotationMetadataBuilder> getInitedAnnotations() { if (annotations == null) { annotations = new ArrayList<AnnotationMetadataBuilder>(); } return annotations; } public void setColumn(final String column) { this.column = column; } public void setComment(final String comment) { if (StringUtils.isNotBlank(comment)) { this.comment = comment; } } public void setNotNull(final boolean notNull) { this.notNull = notNull; } public void setNullRequired(final boolean nullRequired) { this.nullRequired = nullRequired; } public void setUnique(final boolean unique) { this.unique = unique; } public void setValue(final String value) { this.value = value; } public void setModifiers(int modifiers) { this.modifiers = modifiers; } public void setAnnotations(List<AnnotationMetadataBuilder> annotations) { this.annotations = annotations; } public void addAnnotations(List<AnnotationMetadataBuilder> annotations) { if (annotations == null || annotations.isEmpty()) { return; } // Initialize annotations if needed if (this.annotations == null) { this.annotations = new ArrayList<AnnotationMetadataBuilder>(); } this.annotations.addAll(annotations); } }