@Override public RawIterator<Object[], ProcedureException> apply( Context ctx, Object[] input, ResourceTracker resourceTracker ) { return RawIterator.<Object[], ProcedureException>of( input ); } };
@Override public RawIterator<Object[],ProcedureException> apply( Context context, Object[] objects, ResourceTracker resourceTracker ) throws ProcedureException { try { Thread.sleep( 50 ); } catch ( InterruptedException e ) { throw new ProcedureException( Status.General.UnknownError, e, "Interrupted" ); } return RawIterator.empty(); } } );
@Override public TO next() throws EX { FROM from = fromIterator.next(); return function.apply( from ); }
@Override public boolean hasNext() throws EX { return fromIterator.hasNext(); }
@Override public void remove() { fromIterator.remove(); } }
return RawIterator.from( () ->
@Override public Object[] next() throws ProcedureException { try ( KernelTransaction.Revertable ignore = ktx.overrideWith( procedureSecurityContext ) ) { return procedureCall.next(); } } };
@Override public boolean hasNext() throws ProcedureException { try ( KernelTransaction.Revertable ignore = ktx.overrideWith( procedureSecurityContext ) ) { return procedureCall.hasNext(); } }
@Override public void remove() { fromIterator.remove(); } }
return RawIterator.from( () ->
@Override public RawIterator<Object[], ProcedureException> apply( Context ctx, Object[] input, ResourceTracker resourceTracker ) { return RawIterator.<Object[], ProcedureException>of( input ); } };
@Test public void shouldIgnoreWhiteListingIfFullAccess() throws Throwable { // Given ProcedureConfig config = new ProcedureConfig( Config.defaults( procedure_whitelist, "empty" ) ); Log log = mock(Log.class); ReflectiveProcedureCompiler procedureCompiler = new ReflectiveProcedureCompiler( new TypeMappers(), components, components, log, config ); // When CallableProcedure proc = procedureCompiler.compileProcedure( SingleReadOnlyProcedure.class, null, true ).get( 0 ); // Then RawIterator<Object[],ProcedureException> result = proc.apply( new BasicContext(), new Object[0], resourceTracker ); assertEquals( result.next()[0], "Bonnie" ); }
@Test public void shouldAllowVoidOutput() throws Throwable { // When CallableProcedure proc = compile( ProcedureWithVoidOutput.class ).get( 0 ); // Then assertEquals( 0, proc.signature().outputSignature().size() ); assertFalse( proc.apply( null, new Object[0], resourceTracker ).hasNext() ); }
@Override public RawIterator<Object[], ProcedureException> apply( Context ctx, Object[] input, ResourceTracker resourceTracker ) throws ProcedureException { return RawIterator.<Object[], ProcedureException>of( new Object[]{ctx.get( someKey )} ); } } );
@Test public void shouldLoadWhiteListedProcedure() throws Throwable { // Given ProcedureConfig config = new ProcedureConfig( Config.defaults( procedure_whitelist, "org.neo4j.kernel.impl.proc.listCoolPeople" ) ); Log log = mock(Log.class); ReflectiveProcedureCompiler procedureCompiler = new ReflectiveProcedureCompiler( new TypeMappers(), components, components, log, config ); // When CallableProcedure proc = procedureCompiler.compileProcedure( SingleReadOnlyProcedure.class, null, false ).get( 0 ); // When RawIterator<Object[],ProcedureException> result = proc.apply( new BasicContext(), new Object[0], resourceTracker ); // Then assertEquals( result.next()[0], "Bonnie" ); }
@Override public boolean hasNext() throws EX { return fromIterator.hasNext(); }
private Callables loadProcedures( URL jar, ClassLoader loader, Callables target ) throws IOException, KernelException { RawIterator<Class<?>,IOException> classes = listClassesIn( jar, loader ); while ( classes.hasNext() ) { Class<?> next = classes.next(); target.addAllProcedures( compiler.compileProcedure( next, null, false ) ); target.addAllFunctions( compiler.compileFunction( next ) ); target.addAllAggregationFunctions( compiler.compileAggregationFunction( next ) ); } return target; }