All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.metamodel.model.domain.internal.PluralAttributeBuilder Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * 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( "Unkown collection: " + collectionClass );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy