package org.springframework.roo.classpath.operations.jsr303; import static org.springframework.roo.model.JpaJavaType.FETCH_TYPE; import static org.springframework.roo.model.JpaJavaType.JOIN_COLUMN; import static org.springframework.roo.model.JpaJavaType.MANY_TO_MANY; import static org.springframework.roo.model.JpaJavaType.MANY_TO_ONE; import static org.springframework.roo.model.JpaJavaType.ONE_TO_MANY; import static org.springframework.roo.model.JpaJavaType.ONE_TO_ONE; import java.util.ArrayList; import java.util.List; 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.Cardinality; import org.springframework.roo.classpath.operations.Fetch; import org.springframework.roo.model.EnumDetails; import org.springframework.roo.model.JavaSymbolName; import org.springframework.roo.model.JavaType; /** * Properties used by the many-to-one side of a relationship (called a * "reference"). * <p> * For example, an Order-LineItem link would have the LineItem contain a * "reference" back to Order. * <p> * Limited support for collection mapping is provided. This reflects the * pragmatic goals of ROO and the fact a user can edit the generated files by * hand anyway. * <p> * This field is intended for use with JSR 220 and will create a @ManyToOne and @JoinColumn * annotation. * * @author Ben Alex * @since 1.0 */ public class ReferenceField extends FieldDetails { private final Cardinality cardinality; private Fetch fetch; private String joinColumnName; private String referencedColumnName; public ReferenceField(final String physicalTypeIdentifier, final JavaType fieldType, final JavaSymbolName fieldName, final Cardinality cardinality) { super(physicalTypeIdentifier, fieldType, fieldName); this.cardinality = cardinality; } @Override public void decorateAnnotationsList( final List<AnnotationMetadataBuilder> annotations) { super.decorateAnnotationsList(annotations); final List<AnnotationAttributeValue<?>> attributes = new ArrayList<AnnotationAttributeValue<?>>(); if (fetch != null) { JavaSymbolName value = new JavaSymbolName("EAGER"); if (fetch == Fetch.LAZY) { value = new JavaSymbolName("LAZY"); } attributes.add(new EnumAttributeValue(new JavaSymbolName("fetch"), new EnumDetails(FETCH_TYPE, value))); } switch (cardinality) { case ONE_TO_MANY: annotations.add(new AnnotationMetadataBuilder(ONE_TO_MANY, attributes)); break; case MANY_TO_MANY: annotations.add(new AnnotationMetadataBuilder(MANY_TO_MANY, attributes)); break; case ONE_TO_ONE: annotations.add(new AnnotationMetadataBuilder(ONE_TO_ONE, attributes)); break; default: annotations.add(new AnnotationMetadataBuilder(MANY_TO_ONE, attributes)); break; } if (joinColumnName != null) { final List<AnnotationAttributeValue<?>> joinColumnAttrs = new ArrayList<AnnotationAttributeValue<?>>(); joinColumnAttrs.add(new StringAttributeValue(new JavaSymbolName( "name"), joinColumnName)); if (referencedColumnName != null) { joinColumnAttrs.add(new StringAttributeValue( new JavaSymbolName("referencedColumnName"), referencedColumnName)); } annotations.add(new AnnotationMetadataBuilder(JOIN_COLUMN, joinColumnAttrs)); } } public Fetch getFetch() { return fetch; } public String getJoinColumnName() { return joinColumnName; } public String getReferencedColumnName() { return referencedColumnName; } public void setFetch(final Fetch fetch) { this.fetch = fetch; } public void setJoinColumnName(final String joinColumnName) { this.joinColumnName = joinColumnName; } public void setReferencedColumnName(final String referencedColumnName) { this.referencedColumnName = referencedColumnName; } }