Skip to content

Commit

Permalink
General refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
sebersole committed Oct 27, 2023
1 parent 89a2a01 commit 25dc1c9
Show file tree
Hide file tree
Showing 67 changed files with 1,958 additions and 1,391 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,36 @@ public static <E> List<E> join(List<E> first, List<E> second) {
}
return joined;
}

public static <E> List<E> join(Collection<E> first, Collection<E> second) {
final int totalCount = ( first == null ? 0 : first.size() )
+ ( second == null ? 0 : second.size() );
if ( totalCount == 0 ) {
return Collections.emptyList();
}
final ArrayList<E> joined = new ArrayList<>( totalCount );
if ( first != null ) {
joined.addAll( first );
}
if ( second != null ) {
joined.addAll( second );
}
return joined;
}

public static <E> List<E> mutableJoin(Collection<E> first, Collection<E> second) {
final int totalCount = ( first == null ? 0 : first.size() )
+ ( second == null ? 0 : second.size() );
if ( totalCount == 0 ) {
return new ArrayList<>();
}
final ArrayList<E> joined = new ArrayList<>( totalCount );
if ( first != null ) {
joined.addAll( first );
}
if ( second != null ) {
joined.addAll( second );
}
return joined;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.hibernate.models.orm.spi.EntityHierarchy;
import org.hibernate.models.orm.spi.EntityTypeMetadata;
import org.hibernate.models.orm.spi.OrmModelBuildingContext;
import org.hibernate.models.orm.spi.ProcessResult;
import org.hibernate.models.orm.spi.CategorizedDomainModel;
import org.hibernate.models.source.spi.AnnotationUsage;
import org.hibernate.models.source.spi.MemberDetails;

Expand All @@ -32,9 +32,9 @@
*/
public class HierarchyAttributeProcessor {
public static List<HierarchyAttributeDescriptor> preBindHierarchyAttributes(
ProcessResult processResult,
CategorizedDomainModel categorizedDomainModel,
OrmModelBuildingContext modelBuildingContext) {
final Set<EntityHierarchy> entityHierarchies = processResult.getEntityHierarchies();
final Set<EntityHierarchy> entityHierarchies = categorizedDomainModel.getEntityHierarchies();
final List<HierarchyAttributeDescriptor> hierarchyIdMembers = CollectionHelper.arrayList( entityHierarchies.size() );

for ( EntityHierarchy hierarchy : entityHierarchies ) {
Expand Down Expand Up @@ -76,6 +76,9 @@ public static class HierarchyAttributeDescriptor {
private AttributeMetadata versionAttribute;
private AttributeMetadata tenantIdAttribute;

// todo : row-id?
// todo : others?

public HierarchyAttributeDescriptor(EntityHierarchy entityHierarchy) {
this.entityHierarchy = entityHierarchy;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.models.orm.bind.spi;

import org.hibernate.models.orm.spi.OrmModelBuildingContext;

/**
* Contextual information used while {@linkplain BindingCoordinator binding}
* {@linkplain org.hibernate.boot.model.process.spi.ManagedResources managed-resources} into
* into Hibernate's {@linkplain org.hibernate.mapping boot-time model}.
*
* @author Steve Ebersole
*/
public interface BindingContext extends OrmModelBuildingContext {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.models.orm.bind.spi;

/**
* Responsible for processing {@linkplain org.hibernate.boot.model.process.spi.ManagedResources managed-resources}
* and binding them into Hibernate's {@linkplain org.hibernate.mapping boot-time model}.
*
* @author Steve Ebersole
*/
public class BindingCoordinator {
// /**
// * Main entry point into this binding coordination
// *
// * @param managedResources The managed-resources to be processed
// * @param options Options for the binding
// * @param bindingContext Access to needed information and delegates
// */
// public static void coordinateBinding(
// ManagedResources managedResources,
// BindingOptions options,
// ClassInclusion classInclusions,
// PackageInclusion packageInclusions,
// BindingContext bindingContext) {
//// Processor.process( managedResources, bindingContext, options );
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,47 @@

import org.hibernate.models.orm.spi.EntityHierarchy;
import org.hibernate.models.orm.spi.GlobalRegistrations;
import org.hibernate.models.orm.spi.ProcessResult;
import org.hibernate.models.orm.spi.CategorizedDomainModel;
import org.hibernate.models.source.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.source.spi.ClassDetails;
import org.hibernate.models.source.spi.ClassDetailsRegistry;

/**
* @author Steve Ebersole
*/
public class ProcessResultImpl implements ProcessResult {
public class CategorizedDomainModelImpl implements CategorizedDomainModel {
private final ClassDetailsRegistry classDetailsRegistry;
private final AnnotationDescriptorRegistry annotationDescriptorRegistry;
private final Set<EntityHierarchy> entityHierarchies;
private final Map<String, ClassDetails> mappedSuperclasses;
private final Map<String, ClassDetails> embeddables;
private final GlobalRegistrations globalRegistrations;

public ProcessResultImpl(
public CategorizedDomainModelImpl(
ClassDetailsRegistry classDetailsRegistry,
AnnotationDescriptorRegistry annotationDescriptorRegistry,
Set<EntityHierarchy> entityHierarchies,
Map<String, ClassDetails> mappedSuperclasses,
Map<String, ClassDetails> embeddables,
GlobalRegistrations globalRegistrations) {
this.classDetailsRegistry = classDetailsRegistry;
this.annotationDescriptorRegistry = annotationDescriptorRegistry;
this.entityHierarchies = entityHierarchies;
this.mappedSuperclasses = mappedSuperclasses;
this.embeddables = embeddables;
this.globalRegistrations = globalRegistrations;
}

@Override
public ClassDetailsRegistry getClassDetailsRegistry() {
return classDetailsRegistry;
}

@Override
public AnnotationDescriptorRegistry getAnnotationDescriptorRegistry() {
return annotationDescriptorRegistry;
}

@Override
public Set<EntityHierarchy> getEntityHierarchies() {
return entityHierarchies;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.models.orm.internal;

import java.net.URL;

import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.models.spi.ClassLoading;

/**
* Adapts {@linkplain ClassLoaderService} to the {@linkplain ClassLoading} contract
*
* @author Steve Ebersole
*/
public class ClassLoaderServiceLoading implements ClassLoading {
private final ClassLoaderService classLoaderService;

public ClassLoaderServiceLoading(ClassLoaderService classLoaderService) {
this.classLoaderService = classLoaderService;
}

@Override
public <T> Class<T> classForName(String name) {
return classLoaderService.classForName( name );
}

@Override
public Package packageForName(String name) {
return classLoaderService.packageForNameOrNull( name );
}

@Override
public URL locateResource(String resourceName) {
return classLoaderService.locateResource( resourceName );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,59 @@
*/
package org.hibernate.models.orm.internal;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenersImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitDefaultsImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitMetadataImpl;
import org.hibernate.models.orm.spi.ProcessResult;
import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.models.orm.spi.CategorizedDomainModel;
import org.hibernate.models.orm.spi.EntityHierarchy;
import org.hibernate.models.source.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.source.spi.ClassDetails;
import org.hibernate.models.source.spi.ClassDetailsRegistry;
import org.hibernate.models.source.spi.PackageDetails;
import org.hibernate.models.source.spi.SourceModelBuildingContext;

import static java.util.Collections.emptyMap;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Entity;
import jakarta.persistence.MappedSuperclass;

/**
* In-flight holder for various types of "global" registrations. Also acts as the
* {@linkplain #createResult builder} for {@linkplain ProcessResult} as returned
* by {@linkplain org.hibernate.models.orm.spi.Processor#process}
* {@linkplain #createResult builder} for {@linkplain CategorizedDomainModel} as returned
* by {@linkplain org.hibernate.models.orm.spi.ManagedResourcesProcessor#processManagedResources}
*
* @author Steve Ebersole
*/
public class ProcessResultCollector {
private final GlobalRegistrationsImpl globalRegistrations;

public class DomainModelCategorizationCollector {
private final boolean areIdGeneratorsGlobal;
private final Set<ClassDetails> rootEntities = new HashSet<>();
private final Map<String,ClassDetails> mappedSuperclasses = new HashMap<>();
private final Map<String,ClassDetails> embeddables = new HashMap<>();
private final GlobalRegistrationsImpl globalRegistrations;

public ProcessResultCollector(boolean areIdGeneratorsGlobal, SourceModelBuildingContext sourceModelBuildingContext) {
this.globalRegistrations = new GlobalRegistrationsImpl( sourceModelBuildingContext );
public DomainModelCategorizationCollector(boolean areIdGeneratorsGlobal, ClassDetailsRegistry classDetailsRegistry) {
this.areIdGeneratorsGlobal = areIdGeneratorsGlobal;
this.globalRegistrations = new GlobalRegistrationsImpl( classDetailsRegistry );
}

public Set<ClassDetails> getRootEntities() {
return rootEntities;
}

public Map<String, ClassDetails> getMappedSuperclasses() {
return mappedSuperclasses;
}

public Map<String, ClassDetails> getEmbeddables() {
return embeddables;
}

public GlobalRegistrationsImpl getGlobalRegistrations() {
Expand Down Expand Up @@ -83,6 +107,24 @@ public void apply(ClassDetails classDetails) {

// todo : named queries
// todo : named graphs

if ( classDetails.getAnnotationUsage( MappedSuperclass.class ) != null ) {
if ( classDetails.getClassName() != null ) {
mappedSuperclasses.put( classDetails.getClassName(), classDetails );
}
}
else if ( classDetails.getAnnotationUsage( Entity.class ) != null ) {
if ( EntityHierarchyBuilder.isRoot( classDetails ) ) {
rootEntities.add( classDetails );
}
}
else if ( classDetails.getAnnotationUsage( Embeddable.class ) != null ) {
if ( classDetails.getClassName() != null ) {
embeddables.put( classDetails.getClassName(), classDetails );
}
}

// todo : converters? - @Converter / AttributeConverter, as opposed to @ConverterRegistration which is already collected
}

public void apply(PackageDetails packageDetails) {
Expand All @@ -99,20 +141,21 @@ public void apply(PackageDetails packageDetails) {
}

/**
* Builder for {@linkplain ProcessResult} based on our internal state plus
* Builder for {@linkplain CategorizedDomainModel} based on our internal state plus
* the incoming set of managed types.
*
* @param entityHierarchies All entity hierarchies defined in the persistence-unit
* @param mappedSuperclasses All mapped-superclasses defined in the persistence-unit
* @param embeddables All embeddables defined in the persistence-unit
* @param entityHierarchies All entity hierarchies defined in the persistence-unit, built based
* on {@linkplain #getRootEntities()}
*
* @see org.hibernate.models.orm.spi.Processor#process
* @see org.hibernate.models.orm.spi.ManagedResourcesProcessor#processManagedResources
*/
public ProcessResult createResult(
public CategorizedDomainModel createResult(
Set<EntityHierarchy> entityHierarchies,
Map<String, ClassDetails> mappedSuperclasses,
Map<String, ClassDetails> embeddables) {
return new ProcessResultImpl(
ClassDetailsRegistry classDetailsRegistry,
AnnotationDescriptorRegistry annotationDescriptorRegistry) {
return new CategorizedDomainModelImpl(
classDetailsRegistry,
annotationDescriptorRegistry,
entityHierarchies,
mappedSuperclasses,
embeddables,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
import org.hibernate.models.source.spi.AnnotationUsage;
import org.hibernate.models.source.spi.ClassDetails;
import org.hibernate.models.source.spi.ClassDetailsRegistry;
import org.hibernate.models.source.spi.SourceModelBuildingContext;
import org.hibernate.models.source.spi.SourceModelContext;

import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.TableGenerator;
Expand Down Expand Up @@ -91,8 +91,8 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
private Map<String,TableGeneratorRegistration> tableGeneratorRegistrations;
private Map<String,GenericGeneratorRegistration> genericGeneratorRegistrations;

public GlobalRegistrationsImpl(SourceModelBuildingContext sourceModelBuildingContext) {
this( sourceModelBuildingContext.getClassDetailsRegistry() );
public GlobalRegistrationsImpl(SourceModelContext sourceModelContext) {
this( sourceModelContext.getClassDetailsRegistry() );
}

public GlobalRegistrationsImpl(ClassDetailsRegistry classDetailsRegistry) {
Expand Down
Loading

0 comments on commit 25dc1c9

Please sign in to comment.