From a85ca0656528e3b1cd28e49a5c63335b6fae5adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 4 Dec 2018 13:34:50 +0100 Subject: [PATCH] HSEARCH-3170 Close container value extractor bean holders as appropriate --- ...licitReindexingResolverBuildingHelper.java | 4 +- ...ngResolverContainerElementNodeBuilder.java | 12 +++--- ...ReindexingResolverPropertyNodeBuilder.java | 6 +-- ...eindexingResolverContainerElementNode.java | 14 +++---- .../impl/ContainerValueExtractorBinder.java | 37 ++++++++++++------- .../building/impl/PojoIndexModelBinder.java | 3 +- .../impl/PojoIndexModelBinderImpl.java | 4 +- ...gProcessorContainerElementNodeBuilder.java | 23 ++++++++---- ...oIndexingProcessorPropertyNodeBuilder.java | 8 ++-- ...IndexingProcessorContainerElementNode.java | 13 ++++--- 10 files changed, 73 insertions(+), 51 deletions(-) diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverBuildingHelper.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverBuildingHelper.java index b83b2d2b082..14b31174602 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverBuildingHelper.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverBuildingHelper.java @@ -15,10 +15,10 @@ import org.hibernate.search.mapper.pojo.dirtiness.ReindexOnUpdate; import org.hibernate.search.mapper.pojo.dirtiness.impl.PojoImplicitReindexingResolver; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.BoundContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorBinder; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.model.additionalmetadata.building.impl.PojoTypeAdditionalMetadataProvider; import org.hibernate.search.mapper.pojo.model.additionalmetadata.impl.PojoTypeAdditionalMetadata; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; @@ -129,7 +129,7 @@ PojoImplicitReindexingResolverBuilder getOrCreateResolverBuilder( return extractorBinder.bindPath( typeModel, extractorPath ); } - ContainerValueExtractor createExtractors( + ContainerValueExtractorHolder createExtractors( BoundContainerValueExtractorPath boundExtractorPath) { return extractorBinder.create( boundExtractorPath ); } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverContainerElementNodeBuilder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverContainerElementNodeBuilder.java index 0f8fcddc652..4afd7c7bce1 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverContainerElementNodeBuilder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverContainerElementNodeBuilder.java @@ -12,7 +12,7 @@ import org.hibernate.search.mapper.pojo.dirtiness.impl.PojoImplicitReindexingResolverNode; import org.hibernate.search.mapper.pojo.dirtiness.impl.PojoImplicitReindexingResolverContainerElementNode; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathValueNode; import org.hibernate.search.mapper.pojo.model.path.spi.PojoPathFilterFactory; @@ -22,15 +22,15 @@ class PojoImplicitReindexingResolverContainerElementNodeBuilder extends AbstractPojoImplicitReindexingResolverNodeBuilder { private final BoundPojoModelPathValueNode modelPath; - private final ContainerValueExtractor extractor; + private final ContainerValueExtractorHolder extractorHolder; private final PojoImplicitReindexingResolverValueNodeBuilderDelegate valueBuilderDelegate; PojoImplicitReindexingResolverContainerElementNodeBuilder(BoundPojoModelPathValueNode modelPath, - ContainerValueExtractor extractor, + ContainerValueExtractorHolder extractorHolder, PojoImplicitReindexingResolverBuildingHelper buildingHelper) { super( buildingHelper ); this.modelPath = modelPath; - this.extractor = extractor; + this.extractorHolder = extractorHolder; this.valueBuilderDelegate = new PojoImplicitReindexingResolverValueNodeBuilderDelegate<>( modelPath, buildingHelper ); } @@ -43,7 +43,7 @@ class PojoImplicitReindexingResolverContainerElementNodeBuilder @Override void closeOnFailure() { try ( Closer closer = new Closer<>() ) { - // TODO HSEARCH-3170 release the extractor beans + closer.push( ContainerValueExtractorHolder::close, extractorHolder ); closer.push( PojoImplicitReindexingResolverValueNodeBuilderDelegate::closeOnFailure, valueBuilderDelegate ); } } @@ -73,7 +73,7 @@ Optional> doBuild(PojoPathFilterFac } else { return Optional.of( new PojoImplicitReindexingResolverContainerElementNode<>( - extractor, valueTypeNodes + extractorHolder, valueTypeNodes ) ); } } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverPropertyNodeBuilder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverPropertyNodeBuilder.java index 873eb9e88eb..b4b4fc2266a 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverPropertyNodeBuilder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/building/impl/PojoImplicitReindexingResolverPropertyNodeBuilder.java @@ -16,9 +16,9 @@ import org.hibernate.search.mapper.pojo.dirtiness.impl.PojoImplicitReindexingResolverNode; import org.hibernate.search.mapper.pojo.dirtiness.impl.PojoImplicitReindexingResolverPropertyNode; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.BoundContainerValueExtractorPath; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.model.path.PojoModelPathValueNode; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathPropertyNode; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathValueNode; @@ -141,11 +141,11 @@ Optional> doBuild(PojoPathFilterFac */ private PojoImplicitReindexingResolverContainerElementNodeBuilder createContainerBuilder(BoundContainerValueExtractorPath boundExtractorPath) { - ContainerValueExtractor extractor = + ContainerValueExtractorHolder extractorHolder = buildingHelper.createExtractors( boundExtractorPath ); BoundPojoModelPathValueNode containerElementPath = modelPath.value( boundExtractorPath ); return new PojoImplicitReindexingResolverContainerElementNodeBuilder<>( - containerElementPath, extractor, buildingHelper + containerElementPath, extractorHolder, buildingHelper ); } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/impl/PojoImplicitReindexingResolverContainerElementNode.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/impl/PojoImplicitReindexingResolverContainerElementNode.java index b317fdcaefa..4546b809e34 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/impl/PojoImplicitReindexingResolverContainerElementNode.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/dirtiness/impl/PojoImplicitReindexingResolverContainerElementNode.java @@ -9,7 +9,7 @@ import java.util.Collection; import java.util.stream.Stream; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.model.spi.PojoRuntimeIntrospector; import org.hibernate.search.util.impl.common.Closer; import org.hibernate.search.util.impl.common.ToStringTreeBuilder; @@ -30,19 +30,19 @@ public class PojoImplicitReindexingResolverContainerElementNode extends PojoImplicitReindexingResolverNode { - private final ContainerValueExtractor extractor; + private final ContainerValueExtractorHolder extractorHolder; private final Collection> nestedNodes; - public PojoImplicitReindexingResolverContainerElementNode(ContainerValueExtractor extractor, + public PojoImplicitReindexingResolverContainerElementNode(ContainerValueExtractorHolder extractorHolder, Collection> nestedNodes) { - this.extractor = extractor; + this.extractorHolder = extractorHolder; this.nestedNodes = nestedNodes; } @Override public void close() { try ( Closer closer = new Closer<>() ) { - // TODO HSEARCH-3170 release the extractor beans + closer.push( ContainerValueExtractorHolder::close, extractorHolder ); closer.pushAll( PojoImplicitReindexingResolverNode::close, nestedNodes ); } } @@ -50,7 +50,7 @@ public void close() { @Override public void appendTo(ToStringTreeBuilder builder) { builder.attribute( "class", getClass().getSimpleName() ); - builder.attribute( "extractor", extractor ); + builder.attribute( "extractor", extractorHolder.get() ); builder.startList( "nestedNodes" ); for ( PojoImplicitReindexingResolverNode nestedNode : nestedNodes ) { builder.value( nestedNode ); @@ -61,7 +61,7 @@ public void appendTo(ToStringTreeBuilder builder) { @Override public void resolveEntitiesToReindex(PojoReindexingCollector collector, PojoRuntimeIntrospector runtimeIntrospector, C dirty, S dirtinessState) { - try ( Stream stream = extractor.extract( dirty ) ) { + try ( Stream stream = extractorHolder.get().extract( dirty ) ) { stream.forEach( containerElement -> resolveEntitiesToReindexForContainerElement( collector, runtimeIntrospector, containerElement, dirtinessState ) ); diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/extractor/impl/ContainerValueExtractorBinder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/extractor/impl/ContainerValueExtractorBinder.java index 8f4559ac836..9a7f9f8009d 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/extractor/impl/ContainerValueExtractorBinder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/extractor/impl/ContainerValueExtractorBinder.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.Optional; +import org.hibernate.search.engine.environment.bean.BeanHolder; import org.hibernate.search.engine.environment.bean.BeanProvider; import org.hibernate.search.engine.mapper.mapping.spi.MappingBuildContext; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; @@ -33,6 +34,7 @@ import org.hibernate.search.mapper.pojo.util.impl.GenericTypeContext; import org.hibernate.search.util.AssertionFailure; import org.hibernate.search.util.impl.common.LoggerFactory; +import org.hibernate.search.util.impl.common.SuppressingCloser; /** * Binds {@link ContainerValueExtractorPath}s to a given input type, @@ -165,7 +167,7 @@ public ContainerValueExtractorBinder(MappingBuildContext buildContext, */ // Checks are performed using reflection when building the resolved path @SuppressWarnings( {"rawtypes", "unchecked"} ) - public ContainerValueExtractor create(BoundContainerValueExtractorPath boundPath) { + public ContainerValueExtractorHolder create(BoundContainerValueExtractorPath boundPath) { if ( boundPath.getExtractorPath().isEmpty() ) { throw new AssertionFailure( "Received a request to create extractors, but the extractor path was empty." @@ -173,20 +175,29 @@ public ContainerValueExtractor create(BoundContainerValueEx ); } ContainerValueExtractor extractor = null; - for ( Class extractorClass : - boundPath.getExtractorPath().getExplicitExtractorClasses() ) { - // TODO HSEARCH-3170 properly handle the release of container value extractor beans - ContainerValueExtractor newExtractor = - beanProvider.getBean( extractorClass ).get(); - if ( extractor == null ) { - // First extractor: must be able to process type C - extractor = (ContainerValueExtractor) newExtractor; - } - else { - extractor = new ChainingContainerValueExtractor( extractor, newExtractor ); + List> beanHolders = new ArrayList<>(); + try { + for ( Class extractorClass : + boundPath.getExtractorPath().getExplicitExtractorClasses() ) { + BeanHolder newExtractorHolder = + beanProvider.getBean( extractorClass ); + beanHolders.add( newExtractorHolder ); + if ( extractor == null ) { + // First extractor: must be able to process type C + extractor = (ContainerValueExtractor) newExtractorHolder.get(); + } + else { + extractor = new ChainingContainerValueExtractor( extractor, newExtractorHolder.get() ); + } } + return new ContainerValueExtractorHolder<>( + (ContainerValueExtractor) extractor, beanHolders + ); + } + catch (RuntimeException e) { + new SuppressingCloser( e ).pushAll( BeanHolder::close, beanHolders ); + throw e; } - return (ContainerValueExtractor) extractor; } public boolean isDefaultExtractorPath(PojoGenericTypeModel sourceType, ContainerValueExtractorPath extractorPath) { diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinder.java index c1f3badbb1b..6a04ebdbcca 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinder.java @@ -23,6 +23,7 @@ import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.BoundContainerValueExtractorPath; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathPropertyNode; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathTypeNode; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathValueNode; @@ -47,7 +48,7 @@ public interface PojoIndexModelBinder { BoundContainerValueExtractorPath bindExtractorPath( PojoGenericTypeModel pojoGenericTypeModel, ContainerValueExtractorPath extractorPath); - ContainerValueExtractor createExtractors( + ContainerValueExtractorHolder createExtractors( BoundContainerValueExtractorPath boundExtractorPath); BeanHolder> addIdentifierBridge(BoundPojoModelPathPropertyNode modelPath, diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinderImpl.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinderImpl.java index d7798094d6a..0575cd506e3 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinderImpl.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/mapping/building/impl/PojoIndexModelBinderImpl.java @@ -31,10 +31,10 @@ import org.hibernate.search.mapper.pojo.bridge.impl.BridgeResolver; import org.hibernate.search.mapper.pojo.bridge.mapping.BridgeBuildContext; import org.hibernate.search.mapper.pojo.bridge.mapping.BridgeBuilder; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.BoundContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorBinder; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.logging.impl.Log; import org.hibernate.search.mapper.pojo.model.additionalmetadata.building.impl.PojoTypeAdditionalMetadataProvider; import org.hibernate.search.mapper.pojo.model.impl.PojoModelPropertyRootElement; @@ -78,7 +78,7 @@ public class PojoIndexModelBinderImpl implements PojoIndexModelBinder { } @Override - public ContainerValueExtractor createExtractors( + public ContainerValueExtractorHolder createExtractors( BoundContainerValueExtractorPath boundExtractorPath) { return extractorBinder.create( boundExtractorPath ); } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorContainerElementNodeBuilder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorContainerElementNodeBuilder.java index ba04a69fa37..60a39b7ccf8 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorContainerElementNodeBuilder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorContainerElementNodeBuilder.java @@ -11,12 +11,13 @@ import org.hibernate.search.engine.mapper.mapping.building.spi.IndexModelBindingContext; import org.hibernate.search.mapper.pojo.dirtiness.building.impl.PojoIndexingDependencyCollectorPropertyNode; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.mapping.building.spi.PojoMappingCollectorValueNode; import org.hibernate.search.mapper.pojo.mapping.building.impl.PojoMappingHelper; import org.hibernate.search.mapper.pojo.model.path.impl.BoundPojoModelPathValueNode; import org.hibernate.search.mapper.pojo.processing.impl.PojoIndexingProcessor; import org.hibernate.search.mapper.pojo.processing.impl.PojoIndexingProcessorContainerElementNode; +import org.hibernate.search.util.impl.common.Closer; /** * A builder of {@link PojoIndexingProcessorContainerElementNode}. @@ -28,16 +29,16 @@ class PojoIndexingProcessorContainerElementNodeBuilder

extends AbstractPojoProcessorNodeBuilder { private final BoundPojoModelPathValueNode modelPath; - private final ContainerValueExtractor extractor; + private final ContainerValueExtractorHolder extractorHolder; private final PojoIndexingProcessorValueNodeBuilderDelegate valueNodeProcessorCollectionBuilder; PojoIndexingProcessorContainerElementNodeBuilder(BoundPojoModelPathValueNode modelPath, - ContainerValueExtractor extractor, + ContainerValueExtractorHolder extractorHolder, PojoMappingHelper mappingHelper, IndexModelBindingContext bindingContext) { super( mappingHelper, bindingContext ); this.modelPath = modelPath; - this.extractor = extractor; + this.extractorHolder = extractorHolder; valueNodeProcessorCollectionBuilder = new PojoIndexingProcessorValueNodeBuilderDelegate<>( modelPath, @@ -56,7 +57,13 @@ public PojoMappingCollectorValueNode value() { @Override void closeOnFailure() { - valueNodeProcessorCollectionBuilder.closeOnFailure(); + try ( Closer closer = new Closer<>() ) { + closer.pushAll( ContainerValueExtractorHolder::close, extractorHolder ); + closer.pushAll( + PojoIndexingProcessorValueNodeBuilderDelegate::closeOnFailure, + valueNodeProcessorCollectionBuilder + ); + } } Optional> build( @@ -78,13 +85,15 @@ private Optional> doBuild( if ( immutableNestedProcessors.isEmpty() ) { /* * If this processor doesn't have any bridge, nor any nested processor, - * it is useless and we don't need to build it + * it is useless and we don't need to build it. + * Release the other resources (the container value extractors) and return. */ + extractorHolder.close(); return Optional.empty(); } else { return Optional.of( new PojoIndexingProcessorContainerElementNode<>( - extractor, immutableNestedProcessors + extractorHolder, immutableNestedProcessors ) ); } } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorPropertyNodeBuilder.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorPropertyNodeBuilder.java index 256a51b7fa8..24da7875acd 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorPropertyNodeBuilder.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/building/impl/PojoIndexingProcessorPropertyNodeBuilder.java @@ -21,9 +21,9 @@ import org.hibernate.search.mapper.pojo.bridge.mapping.BridgeBuilder; import org.hibernate.search.mapper.pojo.dirtiness.building.impl.PojoIndexingDependencyCollectorPropertyNode; import org.hibernate.search.mapper.pojo.dirtiness.building.impl.PojoIndexingDependencyCollectorTypeNode; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractorPath; import org.hibernate.search.mapper.pojo.extractor.impl.BoundContainerValueExtractorPath; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.mapping.building.impl.BoundPropertyBridge; import org.hibernate.search.mapper.pojo.mapping.building.impl.PojoIdentityMappingCollector; import org.hibernate.search.mapper.pojo.mapping.building.impl.PojoMappingHelper; @@ -124,11 +124,11 @@ public PojoMappingCollectorValueNode value(ContainerValueExtractorPath extractor */ private PojoIndexingProcessorContainerElementNodeBuilder createContainerElementNodeBuilder( BoundContainerValueExtractorPath boundExtractorPath) { - ContainerValueExtractor extractor = - mappingHelper.getIndexModelBinder().createExtractors( boundExtractorPath ); BoundPojoModelPathValueNode containerElementPath = modelPath.value( boundExtractorPath ); + ContainerValueExtractorHolder extractorHolder = + mappingHelper.getIndexModelBinder().createExtractors( boundExtractorPath ); return new PojoIndexingProcessorContainerElementNodeBuilder<>( - containerElementPath, extractor, + containerElementPath, extractorHolder, mappingHelper, bindingContext ); } diff --git a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/impl/PojoIndexingProcessorContainerElementNode.java b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/impl/PojoIndexingProcessorContainerElementNode.java index 5c9defbcd09..73d5b1e3171 100644 --- a/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/impl/PojoIndexingProcessorContainerElementNode.java +++ b/mapper/pojo/src/main/java/org/hibernate/search/mapper/pojo/processing/impl/PojoIndexingProcessorContainerElementNode.java @@ -10,7 +10,7 @@ import java.util.stream.Stream; import org.hibernate.search.engine.backend.document.DocumentElement; -import org.hibernate.search.mapper.pojo.extractor.ContainerValueExtractor; +import org.hibernate.search.mapper.pojo.extractor.impl.ContainerValueExtractorHolder; import org.hibernate.search.mapper.pojo.session.context.spi.AbstractPojoSessionContextImplementor; import org.hibernate.search.util.impl.common.Closer; import org.hibernate.search.util.impl.common.ToStringTreeBuilder; @@ -24,18 +24,19 @@ */ public class PojoIndexingProcessorContainerElementNode extends PojoIndexingProcessor { - private final ContainerValueExtractor extractor; + private final ContainerValueExtractorHolder extractorHolder; private final Collection> nestedNodes; - public PojoIndexingProcessorContainerElementNode(ContainerValueExtractor extractor, + public PojoIndexingProcessorContainerElementNode(ContainerValueExtractorHolder extractorHolder, Collection> nestedNodes) { - this.extractor = extractor; + this.extractorHolder = extractorHolder; this.nestedNodes = nestedNodes; } @Override public void close() { try ( Closer closer = new Closer<>() ) { + closer.push( ContainerValueExtractorHolder::close, extractorHolder ); closer.pushAll( PojoIndexingProcessor::close, nestedNodes ); } } @@ -43,7 +44,7 @@ public void close() { @Override public void appendTo(ToStringTreeBuilder builder) { builder.attribute( "class", getClass().getSimpleName() ); - builder.attribute( "extractor", extractor ); + builder.attribute( "extractor", extractorHolder.get() ); builder.startList( "nestedNodes" ); for ( PojoIndexingProcessor nestedNode : nestedNodes ) { builder.value( nestedNode ); @@ -53,7 +54,7 @@ public void appendTo(ToStringTreeBuilder builder) { @Override public final void process(DocumentElement target, C source, AbstractPojoSessionContextImplementor sessionContext) { - try ( Stream stream = extractor.extract( source ) ) { + try ( Stream stream = extractorHolder.get().extract( source ) ) { stream.forEach( sourceItem -> processItem( target, sourceItem, sessionContext ) ); } }