Skip to content

Commit

Permalink
Work on Instantiator in preparation for composite-user-type work
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Jun 24, 2021
1 parent 69dc854 commit a6dc84e
Show file tree
Hide file tree
Showing 26 changed files with 526 additions and 274 deletions.
Expand Up @@ -15,7 +15,6 @@
import org.hibernate.AssertionFailure;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
import org.hibernate.boot.AttributeConverterInfo;
import org.hibernate.boot.CacheRegionDefinition;
import org.hibernate.boot.archive.scan.internal.StandardScanOptions;
import org.hibernate.boot.archive.scan.spi.ScanEnvironment;
Expand All @@ -35,7 +34,7 @@
import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.jpa.internal.MutableJpaComplianceImpl;
import org.hibernate.jpa.spi.MutableJpaCompliance;
import org.hibernate.metamodel.internal.StandardManagedTypeRepresentationResolver;
import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard;
import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver;
import org.hibernate.query.sqm.function.SqmFunctionDescriptor;
import org.hibernate.type.spi.TypeConfiguration;
Expand Down Expand Up @@ -109,7 +108,7 @@ public BootstrapContextImpl(
configService.getSettings().get( AvailableSettings.SCANNER_ARCHIVE_INTERPRETER )
);

this.representationStrategySelector = StandardManagedTypeRepresentationResolver.INSTANCE;
this.representationStrategySelector = ManagedTypeRepresentationResolverStandard.INSTANCE;

this.typeConfiguration = new TypeConfiguration();
}
Expand Down
Expand Up @@ -23,7 +23,7 @@
import org.hibernate.cfg.MetadataSourceType;
import org.hibernate.collection.internal.StandardCollectionSemanticsResolver;
import org.hibernate.collection.spi.CollectionSemanticsResolver;
import org.hibernate.metamodel.internal.StandardManagedTypeRepresentationResolver;
import org.hibernate.metamodel.internal.ManagedTypeRepresentationResolverStandard;
import org.hibernate.metamodel.spi.ManagedTypeRepresentationResolver;

import org.jboss.jandex.IndexView;
Expand Down Expand Up @@ -53,7 +53,7 @@ public interface MetadataBuildingOptions {

default ManagedTypeRepresentationResolver getManagedTypeRepresentationResolver() {
// for now always return the standard one
return StandardManagedTypeRepresentationResolver.INSTANCE;
return ManagedTypeRepresentationResolverStandard.INSTANCE;
}

default CollectionSemanticsResolver getPersistentCollectionRepresentationResolver() {
Expand Down
@@ -0,0 +1,64 @@
/*
* 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.internal;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.spi.Instantiator;

/**
* Base support for dynamic-map instantiators
*
* @author Steve Ebersole
*/
public abstract class AbstractDynamicMapInstantiator implements Instantiator {
public static final String TYPE_KEY = "$type$";

private final String roleName;

public AbstractDynamicMapInstantiator(String roleName) {
if ( roleName == null ) {
throw new IllegalArgumentException( "`roleName` passed to dynamic-map instantiator cannot be null" );
}
this.roleName = roleName;
}

public String getRoleName() {
return roleName;
}

@Override
public boolean isInstance(Object object, SessionFactoryImplementor sessionFactory) {
if ( object instanceof Map ) {
//noinspection rawtypes
final String type = (String) ( (Map) object ).get( TYPE_KEY );
return isSameRole( type );
}

// todo (6.0) : should this be an exception instead?
return false;
}

protected boolean isSameRole(String type) {
return roleName.equals( type );
}

@Override
public boolean isSameClass(Object object, SessionFactoryImplementor sessionFactory) {
return isInstance( object, sessionFactory );
}

@SuppressWarnings("rawtypes")
protected Map generateDataMap() {
final Map map = new HashMap();
//noinspection unchecked
map.put( TYPE_KEY, roleName );
return map;
}
}
Expand Up @@ -12,30 +12,32 @@
import org.hibernate.engine.spi.PersistentAttributeInterceptor;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.spi.EntityInstantiator;
import org.hibernate.tuple.entity.EntityMetamodel;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;

/**
* Base support for instantiating entity values as POJO representation
*
* @author Steve Ebersole
*/
public class PojoEntityInstantiatorImpl<J> extends PojoInstantiatorImpl<J> {

public abstract class AbstractEntityInstantiatorPojo extends AbstractPojoInstantiator implements EntityInstantiator {
private final EntityMetamodel entityMetamodel;
private final Class proxyInterface;
private final Class<?> proxyInterface;
private final boolean applyBytecodeInterception;

public PojoEntityInstantiatorImpl(
public AbstractEntityInstantiatorPojo(
EntityMetamodel entityMetamodel,
PersistentClass persistentClass,
JavaTypeDescriptor javaTypeDescriptor) {
super( javaTypeDescriptor );
this.entityMetamodel = entityMetamodel;
JavaTypeDescriptor<?> javaTypeDescriptor) {
super( javaTypeDescriptor.getJavaTypeClass() );

this.entityMetamodel = entityMetamodel;
this.proxyInterface = persistentClass.getProxyInterface();

this.applyBytecodeInterception = PersistentAttributeInterceptable.class.isAssignableFrom( persistentClass.getMappedClass() );
}

@Override
protected Object applyInterception(Object entity) {
if ( !applyBytecodeInterception ) {
return entity;
Expand All @@ -59,5 +61,4 @@ public boolean isInstance(Object object, SessionFactoryImplementor sessionFactor
//this one needed only for guessEntityMode()
( proxyInterface!=null && proxyInterface.isInstance(object) );
}

}
Expand Up @@ -11,18 +11,20 @@
import org.hibernate.metamodel.spi.Instantiator;

/**
* Base support for POJO-based instantiation
*
* @author Steve Ebersole
*/
public abstract class AbstractPojoInstantiator implements Instantiator {
private final Class mappedPojoClass;
private final Class<?> mappedPojoClass;
private final boolean isAbstract;

public AbstractPojoInstantiator(Class mappedPojoClass) {
public AbstractPojoInstantiator(Class<?> mappedPojoClass) {
this.mappedPojoClass = mappedPojoClass;
this.isAbstract = ReflectHelper.isAbstractClass( mappedPojoClass );
}

public Class getMappedPojoClass() {
public Class<?> getMappedPojoClass() {
return mappedPojoClass;
}

Expand Down

This file was deleted.

@@ -0,0 +1,31 @@
/*
* 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.internal;

import java.util.function.Supplier;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.mapping.Component;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;

/**
* Support for instantiating embeddables as dynamic-map representation
*
* @author Steve Ebersole
*/
public class EmbeddableInstantiatorDynamicMap
extends AbstractDynamicMapInstantiator
implements EmbeddableInstantiator {
public EmbeddableInstantiatorDynamicMap(Component bootDescriptor) {
super( bootDescriptor.getRoleName() );
}

@Override
public Object instantiate(Supplier<Object[]> valuesAccess, SessionFactoryImplementor sessionFactory) {
return generateDataMap();
}
}
@@ -0,0 +1,37 @@
/*
* 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.internal;

import java.util.function.Supplier;

import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.metamodel.spi.EmbeddableInstantiator;
import org.hibernate.type.descriptor.java.JavaTypeDescriptor;

import static org.hibernate.bytecode.spi.ReflectionOptimizer.InstantiationOptimizer;

/**
* Support for instantiating embeddables as POJO representation
* using bytecode optimizer
*
* @author Steve Ebersole
*/
public class EmbeddableInstantiatorPojoOptimized extends AbstractPojoInstantiator implements EmbeddableInstantiator {
private final InstantiationOptimizer instantiationOptimizer;

public EmbeddableInstantiatorPojoOptimized(
JavaTypeDescriptor<?> javaTypeDescriptor,
InstantiationOptimizer instantiationOptimizer) {
super( javaTypeDescriptor.getJavaTypeClass() );
this.instantiationOptimizer = instantiationOptimizer;
}

@Override
public Object instantiate(Supplier<Object[]> valuesAccess, SessionFactoryImplementor sessionFactory) {
return instantiationOptimizer.newInstance();
}
}

0 comments on commit a6dc84e

Please sign in to comment.