use of org.neo4j.kernel.api.proc.FieldSignature in project neo4j by neo4j.
the class ProcedureSignatureTest method outputSignatureShouldNotBeModifiable.
@Test
public void outputSignatureShouldNotBeModifiable() throws Throwable {
// Expect
exception.expect(UnsupportedOperationException.class);
// When
signature.outputSignature().add(new FieldSignature("b", Neo4jTypes.NTAny));
}
use of org.neo4j.kernel.api.proc.FieldSignature in project neo4j by neo4j.
the class GetServersProcedureV1Test method shouldHaveCorrectSignature.
@Test
public void shouldHaveCorrectSignature() throws Exception {
// given
final LegacyGetServersProcedure proc = new LegacyGetServersProcedure(null, null, config, getInstance());
// when
ProcedureSignature signature = proc.signature();
// then
assertThat(signature.outputSignature(), containsInAnyOrder(new FieldSignature("ttl", NTInteger), new FieldSignature("servers", NTMap)));
}
use of org.neo4j.kernel.api.proc.FieldSignature in project neo4j by neo4j.
the class GetServersProcedureV2Test method shouldHaveCorrectSignature.
@Test
public void shouldHaveCorrectSignature() throws Exception {
// given
GetServersProcedureForMultiDC proc = new GetServersProcedureForMultiDC(null);
// when
ProcedureSignature signature = proc.signature();
// then
assertThat(signature.inputSignature(), containsInAnyOrder(new FieldSignature("context", NTMap)));
assertThat(signature.outputSignature(), containsInAnyOrder(new FieldSignature("ttl", NTInteger), new FieldSignature("servers", NTMap)));
}
use of org.neo4j.kernel.api.proc.FieldSignature in project neo4j by neo4j.
the class ReflectiveProcedureCompiler method compileProcedure.
private CallableProcedure compileProcedure(Class<?> procDefinition, MethodHandle constructor, Method method, Optional<String> warning, boolean fullAccess, QualifiedName procName) throws ProcedureException, IllegalAccessException {
MethodHandle procedureMethod = lookup.unreflect(method);
List<FieldSignature> inputSignature = inputSignatureDeterminer.signatureFor(method);
OutputMapper outputMapper = outputMappers.mapper(method);
Optional<String> description = description(method);
Procedure procedure = method.getAnnotation(Procedure.class);
Mode mode = procedure.mode();
if (method.isAnnotationPresent(PerformsWrites.class)) {
if (!procedure.mode().equals(org.neo4j.procedure.Mode.DEFAULT)) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Conflicting procedure annotation, cannot use PerformsWrites and mode");
} else {
mode = Mode.WRITE;
}
}
Optional<String> deprecated = deprecated(method, procedure::deprecatedBy, "Use of @Procedure(deprecatedBy) without @Deprecated in " + procName);
List<FieldInjections.FieldSetter> setters = allFieldInjections.setters(procDefinition);
if (!fullAccess && !config.fullAccessFor(procName.toString())) {
try {
setters = safeFieldInjections.setters(procDefinition);
} catch (ComponentInjectionException e) {
description = Optional.of(procName.toString() + " is not available due to having restricted access rights, check configuration.");
log.warn(description.get());
ProcedureSignature signature = new ProcedureSignature(procName, inputSignature, outputMapper.signature(), Mode.DEFAULT, Optional.empty(), new String[0], description, warning);
return new FailedLoadProcedure(signature);
}
}
ProcedureSignature signature = new ProcedureSignature(procName, inputSignature, outputMapper.signature(), mode, deprecated, config.rolesFor(procName.toString()), description, warning);
return new ReflectiveProcedure(signature, constructor, procedureMethod, outputMapper, setters);
}
use of org.neo4j.kernel.api.proc.FieldSignature in project neo4j by neo4j.
the class ReflectiveProcedureCompiler method compileAggregationFunction.
private CallableUserAggregationFunction compileAggregationFunction(Class<?> definition, MethodHandle constructor, Method method, QualifiedName funcName) throws ProcedureException, IllegalAccessException {
if (funcName.namespace() == null || funcName.namespace().length == 0) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "It is not allowed to define functions in the root namespace please use a namespace, e.g. `@UserFunction(\"org.example.com.%s\")", funcName.name());
}
//find update and result method
Method update = null;
Method result = null;
Class<?> aggregator = method.getReturnType();
for (Method m : aggregator.getDeclaredMethods()) {
if (m.isAnnotationPresent(UserAggregationUpdate.class)) {
if (update != null) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Class '%s' contains multiple methods annotated with '@%s'.", aggregator.getSimpleName(), UserAggregationUpdate.class.getSimpleName());
}
update = m;
}
if (m.isAnnotationPresent(UserAggregationResult.class)) {
if (result != null) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Class '%s' contains multiple methods annotated with '@%s'.", aggregator.getSimpleName(), UserAggregationResult.class.getSimpleName());
}
result = m;
}
}
if (result == null || update == null) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Class '%s' must contain methods annotated with both '@%s' as well as '@%s'.", aggregator.getSimpleName(), UserAggregationResult.class.getSimpleName(), UserAggregationUpdate.class.getSimpleName());
}
if (update.getReturnType() != void.class) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Update method '%s' in %s has type '%s' but must have return type 'void'.", update.getName(), aggregator.getSimpleName(), update.getReturnType().getSimpleName());
}
if (!Modifier.isPublic(method.getModifiers())) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Aggregation method '%s' in %s must be public.", method.getName(), definition.getSimpleName());
}
if (!Modifier.isPublic(aggregator.getModifiers())) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Aggregation class '%s' must be public.", aggregator.getSimpleName());
}
if (!Modifier.isPublic(update.getModifiers())) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Aggregation update method '%s' in %s must be public.", method.getName(), aggregator.getSimpleName());
}
if (!Modifier.isPublic(result.getModifiers())) {
throw new ProcedureException(Status.Procedure.ProcedureRegistrationFailed, "Aggregation result method '%s' in %s must be public.", method.getName(), aggregator.getSimpleName());
}
List<FieldSignature> inputSignature = inputSignatureDeterminer.signatureFor(update);
Class<?> returnType = result.getReturnType();
TypeMappers.NeoValueConverter valueConverter = typeMappers.converterFor(returnType);
MethodHandle creator = lookup.unreflect(method);
MethodHandle updateMethod = lookup.unreflect(update);
MethodHandle resultMethod = lookup.unreflect(result);
Optional<String> description = description(method);
UserAggregationFunction function = method.getAnnotation(UserAggregationFunction.class);
Optional<String> deprecated = deprecated(method, function::deprecatedBy, "Use of @UserAggregationFunction(deprecatedBy) without @Deprecated in " + funcName);
List<FieldInjections.FieldSetter> setters = allFieldInjections.setters(definition);
if (!config.fullAccessFor(funcName.toString())) {
try {
setters = safeFieldInjections.setters(definition);
} catch (ComponentInjectionException e) {
description = Optional.of(funcName.toString() + " is not available due to having restricted access rights, check configuration.");
log.warn(description.get());
UserFunctionSignature signature = new UserFunctionSignature(funcName, inputSignature, valueConverter.type(), deprecated, config.rolesFor(funcName.toString()), description);
return new FailedLoadAggregatedFunction(signature);
}
}
UserFunctionSignature signature = new UserFunctionSignature(funcName, inputSignature, valueConverter.type(), deprecated, config.rolesFor(funcName.toString()), description);
return new ReflectiveUserAggregationFunction(signature, constructor, creator, updateMethod, resultMethod, valueConverter, setters);
}
Aggregations