From 7bb43e5eab79db33048db9c7a63895a0fb74774a Mon Sep 17 00:00:00 2001 From: Ben Butler-Cole Date: Wed, 10 Aug 2016 15:20:18 +0100 Subject: [PATCH] Migrate built-in procedures from explicit definitions to annotation-based --- .../builtinprocs/BuiltInProcedures.java | 177 +++++++++++++++--- ...re.java => BuiltInProceduresProvider.java} | 30 +-- .../ListConstraintsProcedure.java | 64 ------- .../builtinprocs/ListIndexesProcedure.java | 77 -------- .../builtinprocs/ListLabelsProcedure.java | 47 ----- .../builtinprocs/ListProceduresProcedure.java | 55 ------ .../ListPropertyKeysProcedure.java | 46 ----- .../ListRelationshipTypesProcedure.java | 48 ----- .../SpecialBuiltInProcedures.java | 54 ++++++ .../kernel/impl/factory/DataSourceModule.java | 4 +- .../neo4j/kernel/impl/proc/Procedures.java | 4 +- ...o4j.kernel.impl.factory.ProceduresProvider | 1 + .../builtinprocs/BuiltInProceduresTest.java | 18 +- .../integrationtest/BuiltinProceduresIT.java | 2 +- 14 files changed, 237 insertions(+), 390 deletions(-) rename community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/{AwaitIndexProcedure.java => BuiltInProceduresProvider.java} (52%) delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListConstraintsProcedure.java delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListIndexesProcedure.java delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListLabelsProcedure.java delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListProceduresProcedure.java delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListPropertyKeysProcedure.java delete mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListRelationshipTypesProcedure.java create mode 100644 community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/SpecialBuiltInProcedures.java create mode 100644 community/kernel/src/main/resources/META-INF/services/org.neo4j.kernel.impl.factory.ProceduresProvider diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java index feeaa8525fef..e1948ca7f7a7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java @@ -19,44 +19,165 @@ */ package org.neo4j.kernel.builtinprocs; -import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; -import org.neo4j.function.ThrowingConsumer; +import org.neo4j.graphdb.Label; +import org.neo4j.graphdb.RelationshipType; +import org.neo4j.kernel.api.KernelTransaction; +import org.neo4j.kernel.api.ReadOperations; +import org.neo4j.kernel.api.StatementTokenNameLookup; +import org.neo4j.kernel.api.TokenNameLookup; import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.impl.proc.Procedures; +import org.neo4j.kernel.api.exceptions.Status; +import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; +import org.neo4j.kernel.api.index.IndexDescriptor; +import org.neo4j.kernel.api.proc.ProcedureSignature; +import org.neo4j.kernel.impl.api.TokenAccess; +import org.neo4j.procedure.Context; +import org.neo4j.procedure.Procedure; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureName; +import static org.neo4j.helpers.collection.Iterators.asList; +import static org.neo4j.procedure.Procedure.Mode.READ; -/** - * This registers procedures that are expected to be available by default in Neo4j. - */ -public class BuiltInProcedures implements ThrowingConsumer +public class BuiltInProcedures { - private final String neo4jVersion; - private final String neo4jEdition; + @Context + public KernelTransaction tx; + + @Procedure(name = "db.labels", mode = READ) + public Stream listLabels() + { + return TokenAccess.LABELS.inUse( tx.acquireStatement() ).map( LabelResult::new ).stream(); + } + + @Procedure(name = "db.propertyKeys", mode = READ) + public Stream listPropertyKeys() + { + return TokenAccess.PROPERTY_KEYS.inUse( tx.acquireStatement() ).map( PropertyKeyResult::new ).stream(); + } + + @Procedure(name = "db.relationshipTypes", mode = READ) + public Stream listRelationshipTypes() + { + return TokenAccess.RELATIONSHIP_TYPES.inUse( tx.acquireStatement() ) + .map( RelationshipTypeResult::new ).stream(); + } + + @Procedure(name = "db.indexes", mode = READ) + public Stream listIndexes() throws ProcedureException + { + ReadOperations operations = tx.acquireStatement().readOperations(); + TokenNameLookup tokens = new StatementTokenNameLookup( operations ); + + List indexes = asList( operations.indexesGetAll() ); + indexes.sort( ( a, b ) -> a.userDescription( tokens ).compareTo( b.userDescription( tokens ) ) ); + ArrayList result = new ArrayList<>(); + for ( IndexDescriptor index : indexes ) + { + try + { + result.add( new IndexResult( "INDEX ON " + index.userDescription( tokens ), + operations.indexGetState( index ).toString() ) ); + } + catch ( IndexNotFoundKernelException e ) + { + throw new ProcedureException( Status.Schema.IndexNotFound, e, + "No index on ", index.userDescription( tokens ) ); + } + } + return result.stream(); + } + + @Procedure(name = "db.awaitIndex", mode = READ) + public void awaitIndex() + { + } + + @Procedure(name = "db.constraints", mode = READ) + public Stream listConstraints() + { + ReadOperations operations = tx.acquireStatement().readOperations(); + TokenNameLookup tokens = new StatementTokenNameLookup( operations ); + + return asList( operations.constraintsGetAll() ) + .stream() + .map( ( constraint ) -> constraint.userDescription( tokens ) ) + .sorted() + .map( ConstraintResult::new ); + } - public BuiltInProcedures( String neo4jVersion, String neo4jEdition ) + @Procedure(name = "dbms.procedures", mode = READ) + public Stream listProcedures() { - this.neo4jVersion = neo4jVersion; - this.neo4jEdition = neo4jEdition; + return tx.acquireStatement().readOperations().proceduresGetAll() + .stream() + .sorted( ( a, b ) -> a.name().toString().compareTo( b.name().toString() ) ) + .map( ProcedureResult::new ); + } + + public class LabelResult + { + public final String label; + + private LabelResult( Label label ) + { + this.label = label.name(); + } + } + + public class PropertyKeyResult + { + public final String propertyKey; + + private PropertyKeyResult( String propertyKey ) + { + this.propertyKey = propertyKey; + } + } + + public class RelationshipTypeResult + { + public final String relationshipType; + + private RelationshipTypeResult( RelationshipType relationshipType ) + { + this.relationshipType = relationshipType.name(); + } + } + + public class IndexResult + { + public final String description; + public final String state; + + private IndexResult( String description, String state ) + { + this.description = description; + this.state = state; + } + } + + public class ConstraintResult + { + public final String description; + + private ConstraintResult( String description ) + { + this.description = description; + } } - @Override - public void accept( Procedures procs ) throws ProcedureException + public class ProcedureResult { - // These are 'db'-namespaced procedures. They deal with database-level - // functionality - eg. things that differ across databases - procs.register( new ListLabelsProcedure( procedureName( "db", "labels" ) ) ); - procs.register( new ListPropertyKeysProcedure( procedureName( "db", "propertyKeys" ) ) ); - procs.register( new ListRelationshipTypesProcedure( procedureName( "db", "relationshipTypes" ) ) ); - procs.register( new ListIndexesProcedure( procedureName( "db", "indexes" ) ) ); - procs.register( new AwaitIndexProcedure( procedureName( "db", "awaitIndex" ) ) ); - procs.register( new ListConstraintsProcedure( procedureName( "db", "constraints" ) ) ); + public final String name; + public final String signature; - // These are 'sys'-namespaced procedures, they deal with DBMS-level - // functionality - eg. things that apply across databases. - procs.register( new ListProceduresProcedure( procedureName( "dbms", "procedures" ) ) ); - procs.register( new ListComponentsProcedure( procedureName( "dbms", "components" ), neo4jVersion, neo4jEdition ) ); - procs.register( new JmxQueryProcedure( procedureName( "dbms", "queryJmx" ), ManagementFactory.getPlatformMBeanServer() ) ); + private ProcedureResult( ProcedureSignature signature ) + { + this.name = signature.name().toString(); + this.signature = signature.toString(); + } } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/AwaitIndexProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresProvider.java similarity index 52% rename from community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/AwaitIndexProcedure.java rename to community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresProvider.java index 5246a9aef17f..7ac07e30146a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/AwaitIndexProcedure.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresProvider.java @@ -19,25 +19,29 @@ */ package org.neo4j.kernel.builtinprocs; -import org.neo4j.collection.RawIterator; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.ProcedureSignature; +import org.neo4j.helpers.Service; +import org.neo4j.kernel.api.exceptions.KernelException; +import org.neo4j.kernel.impl.factory.ProceduresProvider; +import org.neo4j.kernel.impl.proc.Procedures; -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.emptyIterator; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class AwaitIndexProcedure extends CallableProcedure.BasicProcedure +@Service.Implementation( ProceduresProvider.class ) +public class BuiltInProceduresProvider extends Service implements ProceduresProvider { - public AwaitIndexProcedure( ProcedureSignature.ProcedureName name ) + public BuiltInProceduresProvider() { - super( procedureSignature( name ).build() ); + super( "built-in-procedures-provider" ); } @Override - public RawIterator apply( Context ctx, Object[] input ) throws ProcedureException + public void registerProcedures( Procedures procedures ) { - return asRawIterator( emptyIterator() ); + try + { + procedures.register( BuiltInProcedures.class ); + } + catch ( KernelException e ) + { + throw new RuntimeException( e ); + } } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListConstraintsProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListConstraintsProcedure.java deleted file mode 100644 index 2940f40a6f2d..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListConstraintsProcedure.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.builtinprocs; - -import java.util.List; - -import org.neo4j.collection.RawIterator; -import org.neo4j.kernel.api.Statement; -import org.neo4j.kernel.api.StatementTokenNameLookup; -import org.neo4j.kernel.api.TokenNameLookup; -import org.neo4j.kernel.api.constraints.PropertyConstraint; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.Neo4jTypes; -import org.neo4j.kernel.api.proc.ProcedureSignature.ProcedureName; - -import static org.neo4j.helpers.collection.Iterators.asList; -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.CallableProcedure.Context.KERNEL_TRANSACTION; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class ListConstraintsProcedure extends CallableProcedure.BasicProcedure -{ - protected ListConstraintsProcedure(ProcedureName procedureName) - { - super( procedureSignature( procedureName ) - .out( "description", Neo4jTypes.NTString ) - .build() ); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) - throws ProcedureException - { - Statement statement = ctx.get( KERNEL_TRANSACTION ).acquireStatement(); - TokenNameLookup tokens = new StatementTokenNameLookup(statement.readOperations()); - - List indexes = - asList( statement.readOperations().constraintsGetAll() ); - - indexes.sort( (a,b) -> a.userDescription(tokens).compareTo( b.userDescription(tokens) ) ); - - return map( ( item ) -> new Object[]{ item.userDescription(tokens) }, - asRawIterator( indexes.iterator() ) ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListIndexesProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListIndexesProcedure.java deleted file mode 100644 index 8e8c59d6ba5d..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListIndexesProcedure.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.builtinprocs; - -import java.util.List; - -import org.neo4j.collection.RawIterator; -import org.neo4j.kernel.api.Statement; -import org.neo4j.kernel.api.StatementTokenNameLookup; -import org.neo4j.kernel.api.TokenNameLookup; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.exceptions.Status; -import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; -import org.neo4j.kernel.api.index.IndexDescriptor; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.Neo4jTypes; -import org.neo4j.kernel.api.proc.ProcedureSignature.ProcedureName; - -import static org.neo4j.helpers.collection.Iterators.asList; -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.CallableProcedure.Context.KERNEL_TRANSACTION; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class ListIndexesProcedure extends CallableProcedure.BasicProcedure -{ - protected ListIndexesProcedure(ProcedureName procedureName) - { - super( procedureSignature( procedureName ) - .out( "description", Neo4jTypes.NTString ) - .out( "state", Neo4jTypes.NTString ) - .build() ); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) - throws ProcedureException - { - Statement statement = ctx.get( KERNEL_TRANSACTION ).acquireStatement(); - TokenNameLookup tokens = new StatementTokenNameLookup(statement.readOperations()); - - List indexes = - asList( statement.readOperations().indexesGetAll() ); - indexes.sort( (a,b) -> a.userDescription(tokens).compareTo( b.userDescription(tokens) ) ); - - return map( ( index ) -> { - try - { - return new Object[]{"INDEX ON " + index.userDescription( tokens ), - statement.readOperations().indexGetState( index ).toString()}; - } - catch ( IndexNotFoundKernelException e ) - { - throw new ProcedureException( Status.Schema.IndexNotFound, e, - "No index on ", index.userDescription( tokens ) ); - } - }, - asRawIterator( indexes.iterator() ) ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListLabelsProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListLabelsProcedure.java deleted file mode 100644 index aa11b09e824c..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListLabelsProcedure.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.builtinprocs; - -import org.neo4j.collection.RawIterator; -import org.neo4j.graphdb.Label; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.Neo4jTypes; -import org.neo4j.kernel.api.proc.ProcedureSignature.ProcedureName; -import org.neo4j.kernel.impl.api.TokenAccess; - -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class ListLabelsProcedure extends CallableProcedure.BasicProcedure -{ - public ListLabelsProcedure( ProcedureName name ) - { - super( procedureSignature( name ).out( "label", Neo4jTypes.NTString ).build() ); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) throws ProcedureException - { - RawIterator labels = asRawIterator( TokenAccess.LABELS.inUse( ctx.get( Context.KERNEL_TRANSACTION ).acquireStatement() ) ); - return map( ( l) -> new Object[]{l.name()}, labels ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListProceduresProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListProceduresProcedure.java deleted file mode 100644 index cd5519f5dfd2..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListProceduresProcedure.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.builtinprocs; - -import java.util.ArrayList; -import java.util.Set; - -import org.neo4j.collection.RawIterator; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.ProcedureSignature; -import org.neo4j.kernel.api.proc.ProcedureSignature.ProcedureName; - -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.Neo4jTypes.NTString; - -public class ListProceduresProcedure extends CallableProcedure.BasicProcedure -{ - public ListProceduresProcedure( ProcedureName procedureName ) - { - super( ProcedureSignature.procedureSignature( procedureName ) - .out( "name", NTString ) - .out( "signature", NTString ) - .build() ); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) throws ProcedureException - { - Set procedureSignatures = ctx.get( Context.KERNEL_TRANSACTION ).acquireStatement().readOperations().proceduresGetAll(); - ArrayList sorted = new ArrayList<>( procedureSignatures ); - sorted.sort( (a,b) -> a.name().toString().compareTo( b.name().toString() ) ); - - RawIterator signatures = asRawIterator( sorted.iterator() ); - return map( ( signature ) -> new Object[]{ signature.name().toString(), signature.toString() }, signatures ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListPropertyKeysProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListPropertyKeysProcedure.java deleted file mode 100644 index 317c8a3d96eb..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListPropertyKeysProcedure.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.builtinprocs; - -import org.neo4j.collection.RawIterator; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.Neo4jTypes; -import org.neo4j.kernel.api.proc.ProcedureSignature; -import org.neo4j.kernel.impl.api.TokenAccess; - -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class ListPropertyKeysProcedure extends CallableProcedure.BasicProcedure -{ - public ListPropertyKeysProcedure( ProcedureSignature.ProcedureName name ) - { - super( procedureSignature( name ).out( "propertyKey", Neo4jTypes.NTString ).build() ); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) throws ProcedureException - { - RawIterator labels = asRawIterator( TokenAccess.PROPERTY_KEYS.inUse( ctx.get( Context.KERNEL_TRANSACTION ).acquireStatement() ) ); - return map( ( key) -> new Object[]{key}, labels ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListRelationshipTypesProcedure.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListRelationshipTypesProcedure.java deleted file mode 100644 index c47c4174e04a..000000000000 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/ListRelationshipTypesProcedure.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.builtinprocs; - -import org.neo4j.collection.RawIterator; -import org.neo4j.graphdb.RelationshipType; -import org.neo4j.kernel.api.exceptions.ProcedureException; -import org.neo4j.kernel.api.proc.CallableProcedure; -import org.neo4j.kernel.api.proc.Neo4jTypes; -import org.neo4j.kernel.api.proc.ProcedureSignature; -import org.neo4j.kernel.impl.api.TokenAccess; - -import static org.neo4j.helpers.collection.Iterators.asRawIterator; -import static org.neo4j.helpers.collection.Iterators.map; -import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureSignature; - -public class ListRelationshipTypesProcedure extends CallableProcedure.BasicProcedure -{ - public ListRelationshipTypesProcedure( ProcedureSignature.ProcedureName name ) - { - super( procedureSignature( name ).out( "relationshipType", Neo4jTypes.NTString ).build()); - } - - @Override - public RawIterator apply( Context ctx, Object[] input ) throws ProcedureException - { - RawIterator types = - asRawIterator( TokenAccess.RELATIONSHIP_TYPES.inUse( ctx.get( Context.KERNEL_TRANSACTION ).acquireStatement() ) ); - return map( ( l) -> new Object[]{l.name()}, types ); - } -} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/SpecialBuiltInProcedures.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/SpecialBuiltInProcedures.java new file mode 100644 index 000000000000..0131c5ec4b61 --- /dev/null +++ b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/SpecialBuiltInProcedures.java @@ -0,0 +1,54 @@ +/* + * 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.builtinprocs; + +import java.lang.management.ManagementFactory; + +import org.neo4j.function.ThrowingConsumer; +import org.neo4j.kernel.api.exceptions.ProcedureException; +import org.neo4j.kernel.impl.proc.Procedures; + +import static org.neo4j.kernel.api.proc.ProcedureSignature.procedureName; + +/** + * This class houses built-in procedures which use a backdoor to inject dependencies. + *

+ * TODO: The dependencies should be made available by a standard mechanism so the backdoor is not needed. + */ +public class SpecialBuiltInProcedures implements ThrowingConsumer +{ + private final String neo4jVersion; + private final String neo4jEdition; + + public SpecialBuiltInProcedures( String neo4jVersion, String neo4jEdition ) + { + this.neo4jVersion = neo4jVersion; + this.neo4jEdition = neo4jEdition; + } + + @Override + public void accept( Procedures procs ) throws ProcedureException + { + procs.register( new ListComponentsProcedure( procedureName( "dbms", "components" ), + neo4jVersion, neo4jEdition ) ); + procs.register( new JmxQueryProcedure( procedureName( "dbms", "queryJmx" ), + ManagementFactory.getPlatformMBeanServer() ) ); + } +} diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java index 4ce74582f903..4a177af7c028 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/DataSourceModule.java @@ -42,7 +42,7 @@ import org.neo4j.kernel.api.Statement; import org.neo4j.kernel.api.legacyindex.AutoIndexing; import org.neo4j.kernel.api.security.AuthSubject; -import org.neo4j.kernel.builtinprocs.BuiltInProcedures; +import org.neo4j.kernel.builtinprocs.SpecialBuiltInProcedures; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.guard.Guard; import org.neo4j.kernel.impl.api.NonTransactionalTokenNameLookup; @@ -349,7 +349,7 @@ private Procedures setupProcedures( PlatformModule platform, EditionModule editi Log internalLog = platform.logging.getInternalLog( Procedures.class ); Procedures procedures = new Procedures( - new BuiltInProcedures( Version.getKernel().getReleaseVersion(), + new SpecialBuiltInProcedures( Version.getKernel().getReleaseVersion(), platform.databaseInfo.edition.toString() ), pluginDir, internalLog ); platform.life.add( procedures ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/Procedures.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/Procedures.java index 63596b5d22db..07c299e41420 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/Procedures.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/proc/Procedures.java @@ -28,7 +28,7 @@ import org.neo4j.kernel.api.exceptions.ProcedureException; import org.neo4j.kernel.api.proc.CallableProcedure; import org.neo4j.kernel.api.proc.ProcedureSignature; -import org.neo4j.kernel.builtinprocs.BuiltInProcedures; +import org.neo4j.kernel.builtinprocs.SpecialBuiltInProcedures; import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.logging.Log; import org.neo4j.logging.NullLog; @@ -50,7 +50,7 @@ public class Procedures extends LifecycleAdapter public Procedures() { - this( new BuiltInProcedures( "N/A", "N/A" ), null, NullLog.getInstance() ); + this( new SpecialBuiltInProcedures( "N/A", "N/A" ), null, NullLog.getInstance() ); } public Procedures( ThrowingConsumer builtin, File pluginDir, Log log ) diff --git a/community/kernel/src/main/resources/META-INF/services/org.neo4j.kernel.impl.factory.ProceduresProvider b/community/kernel/src/main/resources/META-INF/services/org.neo4j.kernel.impl.factory.ProceduresProvider new file mode 100644 index 000000000000..9c91a3006937 --- /dev/null +++ b/community/kernel/src/main/resources/META-INF/services/org.neo4j.kernel.impl.factory.ProceduresProvider @@ -0,0 +1 @@ +org.neo4j.kernel.builtinprocs.BuiltInProceduresProvider diff --git a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java index 46cd426bc96d..3cbb7c8b0452 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java @@ -19,17 +19,17 @@ */ package org.neo4j.kernel.builtinprocs; -import org.hamcrest.Matcher; -import org.junit.Before; -import org.junit.Test; -import org.mockito.stubbing.Answer; - import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import org.hamcrest.Matcher; +import org.junit.Before; +import org.junit.Test; +import org.mockito.stubbing.Answer; + import org.neo4j.helpers.collection.Iterators; import org.neo4j.kernel.api.KernelTransaction; import org.neo4j.kernel.api.ReadOperations; @@ -48,6 +48,7 @@ import static java.util.Collections.emptyIterator; import static java.util.Collections.singletonList; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; @@ -56,6 +57,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; + import static org.neo4j.kernel.api.proc.CallableProcedure.Context.KERNEL_TRANSACTION; public class BuiltInProceduresTest @@ -141,7 +143,7 @@ public void shouldListCorrectBuiltinProcedures() throws Throwable { // When/Then assertThat( call( "dbms.procedures" ), contains( - record( "db.awaitIndex", "db.awaitIndex() :: ()" ), + record( "db.awaitIndex", "db.awaitIndex() :: VOID" ), record( "db.constraints", "db.constraints() :: (description :: STRING?)" ), record( "db.indexes", "db.indexes() :: (description :: STRING?, state :: STRING?)" ), record( "db.labels", "db.labels() :: (label :: STRING?)" ), @@ -230,7 +232,9 @@ private Integer token( String name, Map tokens ) @Before public void setup() throws Exception { - new BuiltInProcedures("1.3.37", Edition.enterprise.toString() ).accept( procs ); + procs.registerComponent( KernelTransaction.class, ( ctx ) -> ctx.get( KERNEL_TRANSACTION ) ); + new SpecialBuiltInProcedures("1.3.37", Edition.enterprise.toString() ).accept( procs ); + new BuiltInProceduresProvider().registerProcedures( procs ); when(tx.acquireStatement()).thenReturn( statement ); when(statement.readOperations()).thenReturn( read ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltinProceduresIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltinProceduresIT.java index b2016dcb9140..3070dd85604f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltinProceduresIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltinProceduresIT.java @@ -104,7 +104,7 @@ public void listProcedures() throws Throwable assertThat( asList( stream ), containsInAnyOrder( equalTo( new Object[]{"db.constraints", "db.constraints() :: (description :: STRING?)"} ), equalTo( new Object[]{"db.indexes", "db.indexes() :: (description :: STRING?, state :: STRING?)"} ), - equalTo( new Object[]{"db.awaitIndex", "db.awaitIndex() :: ()"} ), + equalTo( new Object[]{"db.awaitIndex", "db.awaitIndex() :: VOID"} ), equalTo( new Object[]{"db.propertyKeys", "db.propertyKeys() :: (propertyKey :: STRING?)"} ), equalTo( new Object[]{"db.labels", "db.labels() :: (label :: STRING?)"} ), equalTo( new Object[]{"db.relationshipTypes", "db.relationshipTypes() :: (relationshipType :: " +