public static Builder procedureSignature( String... namespaceAndName ) { String[] namespace = namespaceAndName.length > 1 ? Arrays.copyOf( namespaceAndName, namespaceAndName.length - 1 ) : new String[0]; String name = namespaceAndName[namespaceAndName.length - 1]; return procedureSignature( namespace, name ); }
private ProcedureResult( ProcedureSignature signature ) { this.name = signature.name().toString(); this.signature = signature.toString(); this.description = signature.description().orElse( "" ); this.mode = signature.mode().toString(); } }
@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() ) ); } }
public static QualifiedName procedureName( String... namespaceAndName ) { return procedureSignature( namespaceAndName ).build().name(); } }
@Override public RawIterator<Object[],ProcedureException> apply( Context ctx, Object[] input, ResourceTracker resourceTracker ) throws ProcedureException { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, signature().description().orElse( "Failed to load " + signature().name() ) ); } }
QualifiedName name = signature.name(); String descriptiveName = signature.toString(); validateSignature( descriptiveName, signature.inputSignature(), "input" ); validateSignature( descriptiveName, signature.outputSignature(), "output" ); if ( ! signature.isVoid() && signature.outputSignature().isEmpty() ) if ( oldImplementation == null ) procedures.put( name, proc, signature.caseInsensitive() ); procedures.put( name, proc, signature.caseInsensitive() );
@Description( "List all procedures in the DBMS." ) @Procedure( name = "dbms.procedures", mode = DBMS ) public Stream<ProcedureResult> listProcedures() { securityContext.assertCredentialsNotExpired(); return graph.getDependencyResolver().resolveDependency( Procedures.class ).getAllProcedures().stream() .sorted( Comparator.comparing( a -> a.name().toString() ) ) .map( ProcedureResult::new ); }
@Test public void shouldGetBuiltInProcedureByName() throws Throwable { // When ProcedureSignature found = procs() .procedureGet( procedureName( "db", "labels" ) ).signature(); // Then assertThat( found, equalTo( procedureSignature( procedureName( "db", "labels" ) ) .out( "label", NTString ).build() ) ); commit(); }
@Test public void toStringShouldMatchCypherSyntax() { // When String toStr = procedureSignature( "org", "myProcedure" ) .in( "inputArg", Neo4jTypes.NTList( Neo4jTypes.NTString ) ) .out( "outputArg", Neo4jTypes.NTNumber ) .build() .toString(); // Then assertEquals( "org.myProcedure(inputArg :: LIST? OF STRING?) :: (outputArg :: NUMBER?)", toStr ); }
List<FieldSignature> inputSignature = signature.inputSignature(); if ( inputSignature.size() != input.length ) signature.name(), inputSignature.size(), input.length ); if ( signature.admin() )
for ( CallableProcedure proc : procs ) String name = proc.signature().name().name(); proc.apply( new BasicContext(), new Object[0], resourceTracker ); switch ( name ) assertFalse( "Should not be deprecated", proc.signature().deprecated().isPresent() ); break; case "oldProc": case "badProc": assertTrue( "Should be deprecated", proc.signature().deprecated().isPresent() ); assertThat( proc.signature().deprecated().get(), equalTo( "newProc" ) ); break; default:
public ProcedureSignature build() { return new ProcedureSignature( name, inputSignature, outputSignature, mode, admin, deprecated, allowed, description, warning, eager, false ); } }
@Override public boolean equals( Object o ) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } ProcedureSignature that = (ProcedureSignature) o; return name.equals( that.name ) && inputSignature.equals( that.inputSignature ) && outputSignature.equals( that.outputSignature ) && isVoid() == that.isVoid(); }
ReflectiveProcedure( ProcedureSignature signature, MethodHandle constructor, Method procedureMethod, OutputMapper outputMapper, List<FieldInjections.FieldSetter> fieldSetters ) { super( null, fieldSetters ); this.constructor = constructor; this.procedureMethod = procedureMethod; this.signature = signature; this.outputMapper = outputMapper; this.indexesToMap = computeIndexesToMap( signature.inputSignature() ); }
QualifiedName name = signature.name(); String descriptiveName = signature.toString(); validateSignature( descriptiveName, signature.inputSignature(), "input" ); validateSignature( descriptiveName, signature.outputSignature(), "output" ); if ( ! signature.isVoid() && signature.outputSignature().isEmpty() ) if ( oldImplementation == null ) procedures.put( name, proc, signature.caseInsensitive() ); procedures.put( name, proc, signature.caseInsensitive() );
private ProcedureException newProcedureException( Throwable throwable ) { // Unwrap the wrapped exception we get from invocation by reflection if ( throwable instanceof InvocationTargetException ) { throwable = throwable.getCause(); } if ( throwable instanceof Status.HasStatus ) { return new ProcedureException( ((Status.HasStatus) throwable).status(), throwable, throwable.getMessage() ); } else { Throwable cause = ExceptionUtils.getRootCause( throwable ); return new ProcedureException( Status.Procedure.ProcedureCallFailed, throwable, "Failed to invoke procedure `%s`: %s", signature.name(), "Caused by: " + (cause != null ? cause : throwable) ); } } }
public static QualifiedName procedureName( String... namespaceAndName ) { return procedureSignature( namespaceAndName ).build().name(); } }
@Test public void toStringForVoidProcedureShouldMatchCypherSyntax() { // Given ProcedureSignature proc = procedureSignature( "org", "myProcedure" ) .in( "inputArg", Neo4jTypes.NTList( Neo4jTypes.NTString ) ) .out( ProcedureSignature.VOID ) .build(); // When String toStr = proc.toString(); // Then assertEquals( "org.myProcedure(inputArg :: LIST? OF STRING?) :: VOID", toStr ); } }
List<FieldSignature> inputSignature = signature.inputSignature(); if ( inputSignature.size() != input.length ) signature.name(), inputSignature.size(), input.length ); if ( signature.admin() )
@Override public RawIterator<Object[],ProcedureException> apply( Context ctx, Object[] input, ResourceTracker resourceTracker ) throws ProcedureException { throw new ProcedureException( Status.Procedure.ProcedureRegistrationFailed, signature().description().orElse( "Failed to load " + signature().name() ) ); } }