/** * Close the given {@code closeable} <strong>immediately</strong>, * swallowing any throwable in order to * {@link Throwable#addSuppressed(Throwable) add it as suppressed} to the main throwable. *<p> * See also {@link #push(ClosingOperator, Object)} * for when the object to close does not implement {@link AutoCloseable}. * * @param closeable An {@link AutoCloseable} to close. * @return {@code this}, for method chaining. */ public SuppressingCloser push(AutoCloseable closeable) { return push( AutoCloseable::close, closeable ); }
@Override public LuceneIndexManagerImpl build() { LuceneIndexModel model = null; IndexWriter indexWriter = null; try { model = schemaRootNodeBuilder.build( indexName ); indexWriter = createIndexWriter( model ); return new LuceneIndexManagerImpl( indexingBackendContext, searchBackendContext, indexName, model, indexWriter ); } catch (RuntimeException e) { new SuppressingCloser( e ) .push( model ) .push( indexWriter ); throw e; } }
@Override @SuppressWarnings("unchecked") // Checked using reflection public BeanHolder<T> getBean(BeanProvider beanProvider) { BeanHolder<?> beanHolder = casted.getBean( beanProvider ); try { // Just let the type throw an exception if something is wrong expectedType.cast( beanHolder.get() ); // The instance can safely be cast to the expected type, so we can safely do this return (BeanHolder<T>) beanHolder; } catch (Exception e) { new SuppressingCloser( e ).push( beanHolder ); throw e; } }
@Override @SuppressWarnings("unchecked") // Checked using reflection public BeanHolder<T> getBean(BeanProvider beanProvider) { BeanHolder<?> beanHolder = casted.getBean( beanProvider ); try { // Just let the type throw an exception if something is wrong expectedType.cast( beanHolder.get() ); // The instance can safely be cast to the expected type, so we can safely do this return (BeanHolder<T>) beanHolder; } catch (Exception e) { new SuppressingCloser( e ).push( beanHolder ); throw e; } }
public SessionFactory build() { ServiceRegistry serviceRegistry = null; MetadataSources metadataSources; SessionFactoryBuilder sessionFactoryBuilder; try { serviceRegistry = registryBuilder.build(); metadataSources = new MetadataSources( serviceRegistry ); metadataSourcesContributors.forEach( c -> c.accept( metadataSources ) ); Metadata metadata = metadataSources.buildMetadata(); sessionFactoryBuilder = metadata.getSessionFactoryBuilder(); sessionFactoryBuilderContributors.forEach( c -> c.accept( sessionFactoryBuilder ) ); return sessionFactoryBuilder.build(); } catch (RuntimeException e) { new SuppressingCloser( e ).push( ServiceRegistry::close, serviceRegistry ); throw e; } }
private IndexWriter createIndexWriter(LuceneIndexModel model) { IndexWriterConfig indexWriterConfig = new IndexWriterConfig( model.getScopedAnalyzer() ); try { Directory directory = indexingBackendContext.createDirectory( indexName ); try { return new IndexWriter( directory, indexWriterConfig ); } catch (RuntimeException e) { new SuppressingCloser( e ).push( directory ); throw e; } } catch (IOException | RuntimeException e) { throw log.unableToCreateIndexWriter( getEventContext(), e ); } }
public CloseableJavaBeanMapping build() { SearchIntegration integration = integrationBuilder.build(); try { JavaBeanMapping mapping = integration.getMapping( mappingKey ); /* * Since the user doesn't have access to the integration, but only to the (closeable) mapping, * make sure to close the integration whenever the mapping is closed by the user. */ JavaBeanMappingImpl mappingImpl = (JavaBeanMappingImpl) mapping; mappingImpl.onClose( integration::close ); return mappingImpl; } catch (RuntimeException e) { new SuppressingCloser( e ).push( integration ); throw e; } } }
@Override public <T> BoundRoutingKeyBridge<T> addRoutingKeyBridge(IndexModelBindingContext bindingContext, BoundPojoModelPathTypeNode<T> modelPath, BridgeBuilder<? extends RoutingKeyBridge> builder) { BeanHolder<? extends RoutingKeyBridge> bridgeHolder = builder.build( bridgeBuildContext ); try { PojoModelTypeRootElement<T> pojoModelRootElement = new PojoModelTypeRootElement<>( modelPath, typeAdditionalMetadataProvider ); bridgeHolder.get().bind( new RoutingKeyBridgeBindingContextImpl( pojoModelRootElement ) ); bindingContext.explicitRouting(); return new BoundRoutingKeyBridge<>( bridgeHolder, pojoModelRootElement ); } catch (RuntimeException e) { new SuppressingCloser( e ) .push( holder -> holder.get().close(), bridgeHolder ) .push( BeanHolder::close, bridgeHolder ); throw e; } }
@Override public <T> BoundRoutingKeyBridge<T> addRoutingKeyBridge(IndexModelBindingContext bindingContext, BoundPojoModelPathTypeNode<T> modelPath, BridgeBuilder<? extends RoutingKeyBridge> builder) { BeanHolder<? extends RoutingKeyBridge> bridgeHolder = builder.build( bridgeBuildContext ); try { PojoModelTypeRootElement<T> pojoModelRootElement = new PojoModelTypeRootElement<>( modelPath, typeAdditionalMetadataProvider ); bridgeHolder.get().bind( new RoutingKeyBridgeBindingContextImpl( pojoModelRootElement ) ); bindingContext.explicitRouting(); return new BoundRoutingKeyBridge<>( bridgeHolder, pojoModelRootElement ); } catch (RuntimeException e) { new SuppressingCloser( e ) .push( holder -> holder.get().close(), bridgeHolder ) .push( BeanHolder::close, bridgeHolder ); throw e; } }
new SuppressingCloser( e ).push( ElasticsearchClientImplementor::close, client ); throw e;
@Override public <I> BeanHolder<? extends IdentifierBridge<I>> addIdentifierBridge(IndexModelBindingContext bindingContext, BoundPojoModelPathPropertyNode<?, I> modelPath, BridgeBuilder<? extends IdentifierBridge<?>> builder) { PojoGenericTypeModel<I> typeModel = modelPath.valueWithoutExtractors().getTypeModel(); BridgeBuilder<? extends IdentifierBridge<?>> defaultedBuilder = builder; if ( builder == null ) { defaultedBuilder = bridgeResolver.resolveIdentifierBridgeForType( typeModel ); } /* * TODO HSEARCH-3243 check that the bridge is suitable for the given typeModel * (use introspection, similarly to what we do to detect the value bridge's field type?) */ BeanHolder<? extends IdentifierBridge<I>> bridgeHolder = (BeanHolder<IdentifierBridge<I>>) defaultedBuilder.build( bridgeBuildContext ); try { IdentifierBridge<I> bridge = bridgeHolder.get(); bridge.bind( new IdentifierBridgeBindingContextImpl<>( new PojoModelValueElement<>( typeModel ) ) ); bindingContext.idDslConverter( new PojoIdentifierBridgeToDocumentIdentifierValueConverter( bridge ) ); return bridgeHolder; } catch (RuntimeException e) { new SuppressingCloser( e ) .push( holder -> holder.get().close(), bridgeHolder ) .push( BeanHolder::close, bridgeHolder ); throw e; } }
@Override public <I> BeanHolder<? extends IdentifierBridge<I>> addIdentifierBridge(IndexModelBindingContext bindingContext, BoundPojoModelPathPropertyNode<?, I> modelPath, BridgeBuilder<? extends IdentifierBridge<?>> builder) { PojoGenericTypeModel<I> typeModel = modelPath.valueWithoutExtractors().getTypeModel(); BridgeBuilder<? extends IdentifierBridge<?>> defaultedBuilder = builder; if ( builder == null ) { defaultedBuilder = bridgeResolver.resolveIdentifierBridgeForType( typeModel ); } /* * TODO HSEARCH-3243 check that the bridge is suitable for the given typeModel * (use introspection, similarly to what we do to detect the value bridge's field type?) */ BeanHolder<? extends IdentifierBridge<I>> bridgeHolder = (BeanHolder<IdentifierBridge<I>>) defaultedBuilder.build( bridgeBuildContext ); try { IdentifierBridge<I> bridge = bridgeHolder.get(); bridge.bind( new IdentifierBridgeBindingContextImpl<>( new PojoModelValueElement<>( typeModel ) ) ); bindingContext.idDslConverter( new PojoIdentifierBridgeToDocumentIdentifierValueConverter( bridge ) ); return bridgeHolder; } catch (RuntimeException e) { new SuppressingCloser( e ) .push( holder -> holder.get().close(), bridgeHolder ) .push( BeanHolder::close, bridgeHolder ); throw e; } }
new SuppressingCloser( e ).push( ElasticsearchClientImplementor::close, client ); throw e;