org.hibernate.query.criteria.internal.path.AbstractPathImpl 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.query.criteria.internal.path;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.MapAttribute;
import javax.persistence.metamodel.PluralAttribute;
import javax.persistence.metamodel.SingularAttribute;
import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
import org.hibernate.query.criteria.internal.ParameterRegistry;
import org.hibernate.query.criteria.internal.PathImplementor;
import org.hibernate.query.criteria.internal.PathSource;
import org.hibernate.query.criteria.internal.compile.RenderingContext;
import org.hibernate.query.criteria.internal.expression.ExpressionImpl;
import org.hibernate.query.criteria.internal.expression.PathTypeExpression;
/**
* Convenience base class for various {@link Path} implementations.
*
* @author Steve Ebersole
*/
public abstract class AbstractPathImpl
extends ExpressionImpl
implements Path, PathImplementor, Serializable {
private final PathSource pathSource;
private final Expression> typeExpression;
private Map attributePathRegistry;
/**
* Constructs a basic path instance.
*
* @param criteriaBuilder The criteria builder
* @param javaType The java type of this path
* @param pathSource The source (or origin) from which this path originates
*/
@SuppressWarnings({ "unchecked" })
public AbstractPathImpl(
CriteriaBuilderImpl criteriaBuilder,
Class javaType,
PathSource pathSource) {
super( criteriaBuilder, javaType );
this.pathSource = pathSource;
this.typeExpression = new PathTypeExpression( criteriaBuilder(), getJavaType(), this );
}
public PathSource getPathSource() {
return pathSource;
}
@Override
public PathSource getParentPath() {
return getPathSource();
}
@Override
@SuppressWarnings({ "unchecked" })
public Expression> type() {
return typeExpression;
}
@Override
public String getPathIdentifier() {
return getPathSource().getPathIdentifier() + "." + getAttribute().getName();
}
protected abstract boolean canBeDereferenced();
protected final RuntimeException illegalDereference() {
return new IllegalStateException(
String.format(
"Illegal attempt to dereference path source [%s] of basic type",
getPathIdentifier()
)
);
// String message = "Illegal attempt to dereference path source [";
// if ( source != null ) {
// message += " [" + getPathIdentifier() + "]";
// }
// return new IllegalArgumentException(message);
}
protected final RuntimeException unknownAttribute(String attributeName) {
String message = "Unable to resolve attribute [" + attributeName + "] against path";
PathSource source = getPathSource();
if ( source != null ) {
message += " [" + source.getPathIdentifier() + "]";
}
return new IllegalArgumentException(message);
}
protected final Path resolveCachedAttributePath(String attributeName) {
return attributePathRegistry == null
? null
: attributePathRegistry.get( attributeName );
}
protected final void registerAttributePath(String attributeName, Path path) {
if ( attributePathRegistry == null ) {
attributePathRegistry = new HashMap();
}
attributePathRegistry.put( attributeName, path );
}
@Override
@SuppressWarnings({ "unchecked" })
public Path get(SingularAttribute attribute) {
if ( ! canBeDereferenced() ) {
throw illegalDereference();
}
SingularAttributePath path = (SingularAttributePath) resolveCachedAttributePath( attribute.getName() );
if ( path == null ) {
path = new SingularAttributePath(
criteriaBuilder(),
attribute.getJavaType(),
getPathSourceForSubPaths(),
attribute
);
registerAttributePath( attribute.getName(), path );
}
return path;
}
protected PathSource getPathSourceForSubPaths() {
return this;
}
@Override
@SuppressWarnings({ "unchecked" })
public > Expression get(PluralAttribute attribute) {
if ( ! canBeDereferenced() ) {
throw illegalDereference();
}
PluralAttributePath path = (PluralAttributePath) resolveCachedAttributePath( attribute.getName() );
if ( path == null ) {
path = new PluralAttributePath( criteriaBuilder(), this, attribute );
registerAttributePath( attribute.getName(), path );
}
return path;
}
@Override
@SuppressWarnings({ "unchecked" })
public > Expression get(MapAttribute attribute) {
if ( ! canBeDereferenced() ) {
throw illegalDereference();
}
PluralAttributePath path = (PluralAttributePath) resolveCachedAttributePath( attribute.getName() );
if ( path == null ) {
path = new PluralAttributePath( criteriaBuilder(), this, attribute );
registerAttributePath( attribute.getName(), path );
}
return path;
}
@Override
@SuppressWarnings({ "unchecked" })
public Path get(String attributeName) {
if ( ! canBeDereferenced() ) {
throw illegalDereference();
}
final Attribute attribute = locateAttribute( attributeName );
if ( attribute.isCollection() ) {
final PluralAttribute pluralAttribute = (PluralAttribute) attribute;
if ( PluralAttribute.CollectionType.MAP.equals( pluralAttribute.getCollectionType() ) ) {
return (PluralAttributePath) this.