package org.odata4j.edm; import org.core4j.Func; import org.odata4j.core.ImmutableList; /** * A CSDL End element (as a child of the Association element) * * <p>An End element (as a child of the Association element) identifies the entity type on one end of * an association and the number of entity type instances that can exist at that end of an association. * Association ends are defined as part of an association; an association must have exactly two association * ends. Entity type instances at one end of an association can be accessed through navigation properties * or foreign keys if they are exposed on an entity type. * * @see <a href="http://msdn.microsoft.com/en-us/library/bb896235.aspx">[msdn] End Element (CSDL)</a> */ public class EdmAssociationEnd extends EdmItem { private final String role; private final Func<EdmEntityType> type; private final EdmMultiplicity multiplicity; private final EdmOnDeleteAction onDeleteAction; private EdmAssociationEnd(String role, Func<EdmEntityType> type, EdmMultiplicity multiplicity, EdmOnDeleteAction onDeleteAction, EdmDocumentation doc, ImmutableList<EdmAnnotation<?>> annots, ImmutableList<EdmAnnotation<?>> annotElements) { super(doc, annots, annotElements); this.role = role; this.type = type; this.multiplicity = multiplicity; this.onDeleteAction = onDeleteAction; } public String getRole() { return role; } public EdmEntityType getType() { return type.apply(); } public EdmMultiplicity getMultiplicity() { return multiplicity; } public EdmOnDeleteAction getOnDeleteAction() { return onDeleteAction; } @Override public String toString() { return String.format("EdmAssociationEnd[%s,%s,%s,%s]", role, type, multiplicity, onDeleteAction); } public static Builder newBuilder() { return new Builder(); } static Builder newBuilder(EdmAssociationEnd associationEnd, BuilderContext context) { return context.newBuilder(associationEnd, new Builder()); } /** Mutable builder for {@link EdmAssociationEnd} objects. */ public static class Builder extends EdmItem.Builder<EdmAssociationEnd, Builder> { private String role; private EdmEntityType.Builder type; private String typeName; private EdmMultiplicity multiplicity; private EdmOnDeleteAction onDeleteAction; @Override Builder newBuilder(EdmAssociationEnd associationEnd, BuilderContext context) { this.role = associationEnd.role; this.type = EdmEntityType.newBuilder(associationEnd.getType(), context); this.multiplicity = associationEnd.multiplicity; this.onDeleteAction = associationEnd.onDeleteAction; return this; } public EdmAssociationEnd build() { return new EdmAssociationEnd(role, type == null ? null : type.builtFunc(), multiplicity, onDeleteAction, getDocumentation(), ImmutableList.copyOf(getAnnotations()), ImmutableList.copyOf(getAnnotationElements())); } public Builder setRole(String role) { this.role = role; return this; } public Builder setType(EdmEntityType.Builder type) { this.type = type; return this; } public Builder setTypeName(String typeName) { this.typeName = typeName; return this; } public Builder setMultiplicity(EdmMultiplicity multiplicity) { this.multiplicity = multiplicity; return this; } public Builder setOnDeleteAction(EdmOnDeleteAction onDeleteAction) { this.onDeleteAction = onDeleteAction; return this; } public EdmEntityType.Builder getType() { return type; } public String getTypeName() { return typeName; } public String getRole() { return role; } } }