public static TransactionalContextFactory create( GraphDatabaseFacade.SPI spi, ThreadToStatementContextBridge txBridge, PropertyContainerLocker locker ) { Supplier<GraphDatabaseQueryService> queryService = lazySingleton( spi::queryService ); Supplier<Kernel> kernel = lazySingleton( spi::kernel ); Neo4jTransactionalContext.Creator contextCreator = ( tx, initialStatement, executingQuery ) -> new Neo4jTransactionalContext( queryService.get(), txBridge, locker, tx, initialStatement, executingQuery, kernel.get() ); return new Neo4jTransactionalContextFactory( txBridge, contextCreator ); }
private static Suppliers.Lazy<PrintWriter> getReportWriterSupplier( FileSystemAbstraction fileSystem, File reportFile ) { return Suppliers.lazySingleton( () -> { try { return new PrintWriter( createOrOpenAsOutputStream( fileSystem, reportFile, true ) ); } catch ( IOException e ) { throw new RuntimeException( e ); } } ); }
@Test void lazySingletonSupplierShouldOnlyRequestInstanceWhenRequired() { Object o = new Object(); Supplier<Object> mockSupplier = mock( Supplier.class ); when( mockSupplier.get() ).thenReturn( o ); Supplier<Object> supplier = Suppliers.lazySingleton( mockSupplier ); verifyZeroInteractions( mockSupplier ); assertThat( supplier.get(), sameInstance( o ) ); assertThat( supplier.get(), sameInstance( o ) ); assertThat( supplier.get(), sameInstance( o ) ); verify( mockSupplier ).get(); verifyNoMoreInteractions( mockSupplier ); }
@Test void correctlyReportNotInitialisedSuppliers() { Suppliers.Lazy<Object> lazySingleton = Suppliers.lazySingleton( Object::new ); assertFalse( lazySingleton.isInitialised() ); }
@Test void correctlyReportInitialisedSuppliers() { Suppliers.Lazy<Object> lazySingleton = Suppliers.lazySingleton( Object::new ); lazySingleton.get(); assertTrue( lazySingleton.isInitialised() ); } }
/** * Create a new Core API facade, backed by the given SPI and using pre-resolved dependencies */ public void init( SPI spi, ThreadToStatementContextBridge txBridge, Config config, TokenHolders tokenHolders ) { this.spi = spi; this.config = config; this.schema = new SchemaImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); this.statementContext = txBridge; this.tokenHolders = tokenHolders; this.indexManager = Suppliers.lazySingleton( () -> { IndexProviderImpl idxProvider = new IndexProviderImpl( this, () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); AutoIndexerFacade<Node> nodeAutoIndexer = new AutoIndexerFacade<>( () -> new ReadOnlyIndexFacade<>( idxProvider.getOrCreateNodeIndex( NODE_AUTO_INDEX, null ) ), spi.autoIndexing().nodes() ); RelationshipAutoIndexerFacade relAutoIndexer = new RelationshipAutoIndexerFacade( () -> new ReadOnlyRelationshipIndexFacade( idxProvider.getOrCreateRelationshipIndex( RELATIONSHIP_AUTO_INDEX, null ) ), spi.autoIndexing().relationships() ); return new IndexManagerImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ), idxProvider, nodeAutoIndexer, relAutoIndexer ); } ); this.contextFactory = Neo4jTransactionalContextFactory.create( spi, txBridge, locker ); }
public static TransactionalContextFactory create( GraphDatabaseFacade.SPI spi, ThreadToStatementContextBridge txBridge, PropertyContainerLocker locker ) { Supplier<GraphDatabaseQueryService> queryService = lazySingleton( spi::queryService ); Supplier<Kernel> kernel = lazySingleton( spi::kernel ); Neo4jTransactionalContext.Creator contextCreator = ( tx, initialStatement, executingQuery ) -> new Neo4jTransactionalContext( queryService.get(), txBridge, locker, tx, initialStatement, executingQuery, kernel.get() ); return new Neo4jTransactionalContextFactory( txBridge, contextCreator ); }
@Test public void lazySingletonSupplierShouldOnlyRequestInstanceWhenRequired() { Object o = new Object(); Supplier<Object> mockSupplier = mock( Supplier.class ); when( mockSupplier.get() ).thenReturn( o ); Supplier<Object> supplier = Suppliers.lazySingleton( mockSupplier ); verifyZeroInteractions( mockSupplier ); assertThat( supplier.get(), sameInstance( o ) ); assertThat( supplier.get(), sameInstance( o ) ); assertThat( supplier.get(), sameInstance( o ) ); verify( mockSupplier ).get(); verifyNoMoreInteractions( mockSupplier ); }
/** * Create a new Core API facade, backed by the given SPI and using pre-resolved dependencies */ public void init( SPI spi, ThreadToStatementContextBridge txBridge, Config config, TokenHolders tokenHolders ) { this.spi = spi; this.config = config; this.schema = new SchemaImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); this.statementContext = txBridge; this.tokenHolders = tokenHolders; this.indexManager = Suppliers.lazySingleton( () -> { IndexProviderImpl idxProvider = new IndexProviderImpl( this, () -> txBridge.getKernelTransactionBoundToThisThread( true ) ); AutoIndexerFacade<Node> nodeAutoIndexer = new AutoIndexerFacade<>( () -> new ReadOnlyIndexFacade<>( idxProvider.getOrCreateNodeIndex( NODE_AUTO_INDEX, null ) ), spi.autoIndexing().nodes() ); RelationshipAutoIndexerFacade relAutoIndexer = new RelationshipAutoIndexerFacade( () -> new ReadOnlyRelationshipIndexFacade( idxProvider.getOrCreateRelationshipIndex( RELATIONSHIP_AUTO_INDEX, null ) ), spi.autoIndexing().relationships() ); return new IndexManagerImpl( () -> txBridge.getKernelTransactionBoundToThisThread( true ), idxProvider, nodeAutoIndexer, relAutoIndexer ); } ); this.contextFactory = Neo4jTransactionalContextFactory.create( spi, txBridge, locker ); }