org.hibernate.metamodel.internal.PluralAttributeImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
Hibernate's core ORM functionality
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or .
*/
package org.hibernate.metamodel.internal;
import java.io.Serializable;
import java.lang.reflect.Member;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.metamodel.CollectionAttribute;
import javax.persistence.metamodel.ListAttribute;
import javax.persistence.metamodel.MapAttribute;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SetAttribute;
import javax.persistence.metamodel.Type;
import org.hibernate.mapping.Property;
/**
* @author Emmanuel Bernard
* @author Steve Ebersole
*/
public abstract class PluralAttributeImpl
extends AbstractAttribute
implements PluralAttribute, Serializable {
private final Type elementType;
private PluralAttributeImpl(Builder builder) {
super(
builder.property.getName(),
builder.collectionClass,
builder.type,
builder.member,
builder.persistentAttributeType
);
this.elementType = builder.attributeType;
}
public static class Builder {
private final Type attributeType;
private final AbstractManagedType type;
private Member member;
private PersistentAttributeType persistentAttributeType;
private Property property;
private Class collectionClass;
private Type keyType;
private Builder(AbstractManagedType ownerType, Type attrType, Class collectionClass, Type keyType) {
this.type = ownerType;
this.attributeType = attrType;
this.collectionClass = collectionClass;
this.keyType = keyType;
}
public Builder member(Member member) {
this.member = member;
return this;
}
public Builder property(Property property) {
this.property = property;
return this;
}
public Builder persistentAttributeType(PersistentAttributeType attrType) {
this.persistentAttributeType = attrType;
return this;
}
@SuppressWarnings( "unchecked" )
public PluralAttributeImpl build() {
//apply strict spec rules first
if ( Map.class.equals( collectionClass ) ) {
final Builder,E,K> builder = (Builder,E,K>) this;
return ( PluralAttributeImpl ) new MapAttributeImpl(
builder
);
}
else if ( Set.class.equals( collectionClass ) ) {
final Builder, E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new SetAttributeImpl(
builder
);
}
else if ( List.class.equals( collectionClass ) ) {
final Builder, E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new ListAttributeImpl(
builder
);
}
else if ( Collection.class.equals( collectionClass ) ) {
final Builder,E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new CollectionAttributeImpl(
builder
);
}
//apply loose rules
if ( collectionClass.isArray() ) {
final Builder, E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new ListAttributeImpl(
builder
);
}
if ( Map.class.isAssignableFrom( collectionClass ) ) {
final Builder,E,K> builder = (Builder,E,K>) this;
return ( PluralAttributeImpl ) new MapAttributeImpl(
builder
);
}
else if ( Set.class.isAssignableFrom( collectionClass ) ) {
final Builder, E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new SetAttributeImpl(
builder
);
}
else if ( List.class.isAssignableFrom( collectionClass ) ) {
final Builder, E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new ListAttributeImpl(
builder
);
}
else if ( Collection.class.isAssignableFrom( collectionClass ) ) {
final Builder,E,?> builder = (Builder, E,?>) this;
return ( PluralAttributeImpl ) new CollectionAttributeImpl(
builder
);
}
throw new UnsupportedOperationException( "Unkown collection: " + collectionClass );
}
}
public static Builder create(
AbstractManagedType ownerType,
Type attrType,
Class collectionClass,
Type keyType) {
return new Builder(ownerType, attrType, collectionClass, keyType);
}
@Override
public Type getElementType() {
return elementType;
}
@Override
public boolean isAssociation() {
return getPersistentAttributeType() == PersistentAttributeType.ONE_TO_MANY
|| getPersistentAttributeType() == PersistentAttributeType.MANY_TO_MANY;
}
@Override
public boolean isCollection() {
return true;
}
@Override
public BindableType getBindableType() {
return BindableType.PLURAL_ATTRIBUTE;
}
@Override
public Class getBindableJavaType() {
return elementType.getJavaType();
}
static class SetAttributeImpl extends PluralAttributeImpl,E> implements SetAttribute {
SetAttributeImpl(Builder,E,?> xceBuilder) {
super( xceBuilder );
}
@Override
public CollectionType getCollectionType() {
return CollectionType.SET;
}
}
static class CollectionAttributeImpl extends PluralAttributeImpl,E> implements CollectionAttribute {
CollectionAttributeImpl(Builder,E,?> xceBuilder) {
super( xceBuilder );
}
@Override
public CollectionType getCollectionType() {
return CollectionType.COLLECTION;
}
}
static class ListAttributeImpl extends PluralAttributeImpl,E> implements ListAttribute {
ListAttributeImpl(Builder,E,?> xceBuilder) {
super( xceBuilder );
}
@Override
public CollectionType getCollectionType() {
return CollectionType.LIST;
}
}
static class MapAttributeImpl extends PluralAttributeImpl,V> implements MapAttribute {
private final Type keyType;
MapAttributeImpl(Builder,V,K> xceBuilder) {
super( xceBuilder );
this.keyType = xceBuilder.keyType;
}
@Override
public CollectionType getCollectionType() {
return CollectionType.MAP;
}
@Override
public Class getKeyJavaType() {
return keyType.getJavaType();
}
@Override
public Type getKeyType() {
return keyType;
}
}
}