org.hibernate.metamodel.model.domain.internal.PluralAttributeBuilder 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 http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.metamodel.model.domain.internal;
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.Attribute;
import org.hibernate.mapping.Property;
import org.hibernate.metamodel.model.domain.spi.ManagedTypeDescriptor;
import org.hibernate.metamodel.model.domain.spi.SimpleTypeDescriptor;
/**
* A "parameter object" for creating a plural attribute
*/
public class PluralAttributeBuilder {
private final ManagedTypeDescriptor declaringType;
private final SimpleTypeDescriptor valueType;
private Attribute.PersistentAttributeType attributeNature;
private Property property;
private Member member;
private Class collectionClass;
private SimpleTypeDescriptor keyType;
public PluralAttributeBuilder(
ManagedTypeDescriptor ownerType,
SimpleTypeDescriptor elementType,
Class collectionClass,
SimpleTypeDescriptor keyType) {
this.declaringType = ownerType;
this.valueType = elementType;
this.collectionClass = collectionClass;
this.keyType = keyType;
}
public ManagedTypeDescriptor getDeclaringType() {
return declaringType;
}
public Attribute.PersistentAttributeType getAttributeNature() {
return attributeNature;
}
public SimpleTypeDescriptor getKeyType() {
return keyType;
}
public Class getCollectionClass() {
return collectionClass;
}
public SimpleTypeDescriptor getValueType() {
return valueType;
}
public Property getProperty() {
return property;
}
public Member getMember() {
return member;
}
public PluralAttributeBuilder member(Member member) {
this.member = member;
return this;
}
public PluralAttributeBuilder property(Property property) {
this.property = property;
return this;
}
public PluralAttributeBuilder persistentAttributeType(Attribute.PersistentAttributeType attrType) {
this.attributeNature = attrType;
return this;
}
@SuppressWarnings( "unchecked" )
public AbstractPluralAttribute build() {
//apply strict spec rules first
if ( Map.class.equals( collectionClass ) ) {
final PluralAttributeBuilder,E,K> builder = (PluralAttributeBuilder,E,K>) this;
return (AbstractPluralAttribute) new MapAttributeImpl<>(
builder
);
}
else if ( Set.class.equals( collectionClass ) ) {
final PluralAttributeBuilder, E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new SetAttributeImpl<>(
builder
);
}
else if ( List.class.equals( collectionClass ) ) {
final PluralAttributeBuilder, E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new ListAttributeImpl<>(
builder
);
}
else if ( Collection.class.equals( collectionClass ) ) {
final PluralAttributeBuilder,E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new BagAttributeImpl<>(
builder
);
}
//apply loose rules
if ( collectionClass.isArray() ) {
final PluralAttributeBuilder, E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new ListAttributeImpl<>(
builder
);
}
if ( Map.class.isAssignableFrom( collectionClass ) ) {
final PluralAttributeBuilder,E,K> builder = (PluralAttributeBuilder,E,K>) this;
return (AbstractPluralAttribute) new MapAttributeImpl<>(
builder
);
}
else if ( Set.class.isAssignableFrom( collectionClass ) ) {
final PluralAttributeBuilder, E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new SetAttributeImpl<>(
builder
);
}
else if ( List.class.isAssignableFrom( collectionClass ) ) {
final PluralAttributeBuilder, E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new ListAttributeImpl<>(
builder
);
}
else if ( Collection.class.isAssignableFrom( collectionClass ) ) {
final PluralAttributeBuilder,E,?> builder = (PluralAttributeBuilder, E,?>) this;
return (AbstractPluralAttribute) new BagAttributeImpl<>(
builder
);
}
throw new UnsupportedOperationException( "Unknown collection: " + collectionClass );
}
}