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

org.hibernate.metamodel.internal.PluralAttributeImpl 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 .
 */
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;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy