From 01f125211b7ae54cbf6af403136244c60b5be23e Mon Sep 17 00:00:00 2001 From: Stefan Plantikow Date: Thu, 18 Feb 2016 13:00:51 +0100 Subject: [PATCH] Factor out SPI class from ProcedureGDSFacadeSPI --- .../impl/proc/ProcedureGDBFacadeSPI.java | 175 ++++++++++++++++++ .../kernel/impl/proc/ProcedureGDSFactory.java | 132 +------------ 2 files changed, 182 insertions(+), 125 deletions(-) create mode 100644 community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java new file mode 100644 index 000000000000..8e3a448f1ce7 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDBFacadeSPI.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.impl.proc; + +import java.net.URL; +import java.util.Map; +import java.util.function.Supplier; + +import org.neo4j.function.ThrowingFunction; +import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.graphdb.Result; +import org.neo4j.graphdb.event.KernelEventHandler; +import org.neo4j.graphdb.event.TransactionEventHandler; +import org.neo4j.graphdb.security.URLAccessValidationError; +import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.kernel.api.Statement; +import org.neo4j.kernel.api.legacyindex.AutoIndexing; +import org.neo4j.kernel.impl.coreapi.CoreAPIAvailabilityGuard; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; +import org.neo4j.kernel.impl.query.QueryExecutionEngine; +import org.neo4j.kernel.impl.query.QueryExecutionKernelException; +import org.neo4j.kernel.impl.query.QuerySession; +import org.neo4j.kernel.impl.store.StoreId; + +class ProcedureGDBFacadeSPI implements GraphDatabaseFacade.SPI +{ + private final KernelTransaction transaction; + private final Supplier queryExecutor; + + private final DependencyResolver resolver; + private final AutoIndexing autoIndexing; + private final Supplier storeId; + private final CoreAPIAvailabilityGuard availability; + private final ThrowingFunction urlValidator; + + public ProcedureGDBFacadeSPI( KernelTransaction transaction, Supplier queryExecutor, DependencyResolver resolver, AutoIndexing autoIndexing, + Supplier storeId, CoreAPIAvailabilityGuard availability, ThrowingFunction urlValidator ) + { + this.transaction = transaction; + this.queryExecutor = queryExecutor; + this.resolver = resolver; + this.autoIndexing = autoIndexing; + this.storeId = storeId; + this.availability = availability; + this.urlValidator = urlValidator; + } + + @Override + public boolean databaseIsAvailable( long timeout ) + { + return availability.isAvailable( timeout ); + } + + @Override + public DependencyResolver resolver() + { + return resolver; + } + + @Override + public StoreId storeId() + { + return storeId.get(); + } + + @Override + public String storeDir() + { + throw new UnsupportedOperationException(); + } + + @Override + public String name() + { + return "ProcedureGraphDatabaseService"; + } + + @Override + public KernelTransaction currentTransaction() + { + availability.assertDatabaseAvailable(); + return transaction; + } + + @Override + public boolean isInOpenTransaction() + { + return transaction.isOpen(); + } + + @Override + public Statement currentStatement() + { + return transaction.acquireStatement(); + } + + @Override + public Result executeQuery( String query, Map parameters, QuerySession querySession ) + { + try + { + availability.assertDatabaseAvailable(); + return queryExecutor.get().executeQuery( query, parameters, querySession ); + } + catch ( QueryExecutionKernelException e ) + { + throw e.asUserException(); + } + } + + @Override + public AutoIndexing autoIndexing() + { + return autoIndexing; + } + + @Override + public void registerKernelEventHandler( KernelEventHandler handler ) + { + throw new UnsupportedOperationException(); + } + + @Override + public void unregisterKernelEventHandler( KernelEventHandler handler ) + { + throw new UnsupportedOperationException(); + } + + @Override + public void registerTransactionEventHandler( TransactionEventHandler handler ) + { + throw new UnsupportedOperationException(); + } + + @Override + public void unregisterTransactionEventHandler( TransactionEventHandler handler ) + { + throw new UnsupportedOperationException(); + } + + @Override + public URL validateURLAccess( URL url ) throws URLAccessValidationError + { + return urlValidator.apply( url ); + } + + @Override + public void shutdown() + { + throw new UnsupportedOperationException(); + } + + @Override + public KernelTransaction beginTransaction() + { + throw new UnsupportedOperationException(); + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java index 9ea0ed4f02c4..b822e10bb748 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/ProcedureGDSFactory.java @@ -20,19 +20,14 @@ package org.neo4j.kernel.impl.proc; import java.net.URL; -import java.util.Map; -import java.util.function.Function; import java.util.function.Supplier; import org.neo4j.function.ThrowingFunction; import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.GraphDatabaseService; -import org.neo4j.graphdb.Result; -import org.neo4j.graphdb.event.KernelEventHandler; -import org.neo4j.graphdb.event.TransactionEventHandler; +import org.neo4j.graphdb.security.URLAccessRule; import org.neo4j.graphdb.security.URLAccessValidationError; import org.neo4j.kernel.api.KernelTransaction; -import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.exceptions.ProcedureException; import org.neo4j.kernel.api.legacyindex.AutoIndexing; import org.neo4j.kernel.api.proc.CallableProcedure; @@ -40,8 +35,6 @@ import org.neo4j.kernel.impl.coreapi.CoreAPIAvailabilityGuard; import org.neo4j.kernel.impl.factory.GraphDatabaseFacade; import org.neo4j.kernel.impl.query.QueryExecutionEngine; -import org.neo4j.kernel.impl.query.QueryExecutionKernelException; -import org.neo4j.kernel.impl.query.QuerySession; import org.neo4j.kernel.impl.store.StoreId; public class ProcedureGDSFactory implements ThrowingFunction @@ -51,22 +44,22 @@ public class ProcedureGDSFactory implements ThrowingFunction storeId; private final Supplier queryExecutor; private final CoreAPIAvailabilityGuard availability; - private final Function urlValidator; - private AutoIndexing autoIndexing = AutoIndexing.UNSUPPORTED; + private final ThrowingFunction urlValidator; + private final AutoIndexing autoIndexing = AutoIndexing.UNSUPPORTED; public ProcedureGDSFactory( Config config, DependencyResolver resolver, Supplier storeId, Supplier queryExecutor, CoreAPIAvailabilityGuard availability, - Function urlValidator ) + URLAccessRule urlAccessRule ) { this.config = config; this.resolver = resolver; this.storeId = storeId; this.queryExecutor = queryExecutor; this.availability = availability; - this.urlValidator = urlValidator; + this.urlValidator = url -> urlAccessRule.validate( config, url ); } @Override @@ -75,120 +68,9 @@ public GraphDatabaseService apply( CallableProcedure.Context context ) throws Pr KernelTransaction transaction = context.get( CallableProcedure.Context.KERNEL_TRANSACTION ); GraphDatabaseFacade facade = new GraphDatabaseFacade(); - facade.init( config, new GraphDatabaseFacade.SPI() - { - @Override - public boolean databaseIsAvailable( long timeout ) - { - return availability.isAvailable( timeout ); - } - - @Override - public DependencyResolver resolver() - { - return resolver; - } - - @Override - public StoreId storeId() - { - return storeId.get(); - } - - @Override - public String storeDir() - { - throw new UnsupportedOperationException(); - } - - @Override - public String name() - { - return "ProcedureGraphDatabaseService"; - } - - @Override - public KernelTransaction currentTransaction() - { - availability.assertDatabaseAvailable(); - return transaction; - } - - @Override - public boolean isInOpenTransaction() - { - return transaction.isOpen(); - } - - @Override - public Statement currentStatement() - { - return transaction.acquireStatement(); - } - - @Override - public Result executeQuery( String query, Map parameters, QuerySession querySession ) - { - try - { - availability.assertDatabaseAvailable(); - return queryExecutor.get().executeQuery( query, parameters, querySession ); - } - catch ( QueryExecutionKernelException e ) - { - throw e.asUserException(); - } - } - - @Override - public AutoIndexing autoIndexing() { - return autoIndexing; - } - - @Override - public void registerKernelEventHandler( KernelEventHandler handler ) - { - throw new UnsupportedOperationException(); - } - - @Override - public void unregisterKernelEventHandler( KernelEventHandler handler ) - { - throw new UnsupportedOperationException(); - } - - @Override - public void registerTransactionEventHandler( TransactionEventHandler handler ) - { - throw new UnsupportedOperationException(); - } - - @Override - public void unregisterTransactionEventHandler( TransactionEventHandler handler ) - { - throw new UnsupportedOperationException(); - } - - @Override - public URL validateURLAccess( URL url ) throws URLAccessValidationError - { - return urlValidator.apply( url ); - } - - @Override - public void shutdown() - { - throw new UnsupportedOperationException(); - } - - @Override - public KernelTransaction beginTransaction() - { - throw new UnsupportedOperationException(); - } - - } ); + facade.init( config, new ProcedureGDBFacadeSPI( transaction, queryExecutor, resolver, AutoIndexing.UNSUPPORTED, storeId, availability, urlValidator ) ); return facade; } + }