From 7c60ccfb0758ccec201158eedaa6a325909dfd5e Mon Sep 17 00:00:00 2001 From: "@fbiville" Date: Thu, 16 Mar 2017 21:05:13 +0100 Subject: [PATCH] Centralize custom name extraction --- .../tooling/procedure/ProcedureProcessor.java | 20 +------ .../procedure/UserFunctionProcessor.java | 20 +------ .../compilerutils/CustomNameExtractor.java | 56 +++++++++++++++++++ .../CustomNameExtractorTest.java | 54 ++++++++++++++++++ .../DuplicatedProcedureValidatorTest.java | 5 +- 5 files changed, 119 insertions(+), 36 deletions(-) create mode 100644 community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractor.java create mode 100644 community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractorTest.java diff --git a/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/ProcedureProcessor.java b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/ProcedureProcessor.java index 6c4a75442e673..26f90068ba78f 100644 --- a/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/ProcedureProcessor.java +++ b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/ProcedureProcessor.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; -import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; @@ -40,6 +39,7 @@ import javax.lang.model.util.Types; import org.neo4j.procedure.Procedure; +import org.neo4j.tooling.procedure.compilerutils.CustomNameExtractor; import org.neo4j.tooling.procedure.messages.CompilationMessage; import org.neo4j.tooling.procedure.messages.MessagePrinter; import org.neo4j.tooling.procedure.validators.DuplicatedProcedureValidator; @@ -57,21 +57,6 @@ public class ProcedureProcessor extends AbstractProcessor private ElementVisitor,Void> visitor; private MessagePrinter messagePrinter; - public static Optional getCustomName( Procedure proc ) - { - String name = proc.name(); - if ( !name.isEmpty() ) - { - return Optional.of( name ); - } - String value = proc.value(); - if ( !value.isEmpty() ) - { - return Optional.of( value ); - } - return Optional.empty(); - } - @Override public Set getSupportedOptions() { @@ -102,7 +87,8 @@ public synchronized void init( ProcessingEnvironment processingEnv ) visitor = new StoredProcedureVisitor( typeUtils, elementUtils, processingEnv.getOptions().containsKey( IGNORE_CONTEXT_WARNINGS_OPTION ) ); duplicationPredicate = - new DuplicatedProcedureValidator<>( elementUtils, sprocType, ProcedureProcessor::getCustomName ); + new DuplicatedProcedureValidator<>( elementUtils, sprocType, + ( proc ) -> CustomNameExtractor.getName( proc::name, proc::value ) ); } @Override diff --git a/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/UserFunctionProcessor.java b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/UserFunctionProcessor.java index f73cbee3a54bf..12dfd02bb6377 100644 --- a/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/UserFunctionProcessor.java +++ b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/UserFunctionProcessor.java @@ -20,6 +20,8 @@ package org.neo4j.tooling.procedure; import com.google.auto.service.AutoService; + +import org.neo4j.tooling.procedure.compilerutils.CustomNameExtractor; import org.neo4j.tooling.procedure.compilerutils.TypeMirrorUtils; import org.neo4j.tooling.procedure.messages.CompilationMessage; import org.neo4j.tooling.procedure.messages.MessagePrinter; @@ -29,7 +31,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; -import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; @@ -56,21 +57,6 @@ public class UserFunctionProcessor extends AbstractProcessor private MessagePrinter messagePrinter; private Function,Stream> duplicationPredicate; - public static Optional getCustomName( UserFunction function ) - { - String name = function.name(); - if ( !name.isEmpty() ) - { - return Optional.of( name ); - } - String value = function.value(); - if ( !value.isEmpty() ) - { - return Optional.of( value ); - } - return Optional.empty(); - } - @Override public Set getSupportedAnnotationTypes() { @@ -96,7 +82,7 @@ public synchronized void init( ProcessingEnvironment processingEnv ) messagePrinter = new MessagePrinter( processingEnv.getMessager() ); visitor = new UserFunctionVisitor( typeUtils, elementUtils, new TypeMirrorUtils( typeUtils, elementUtils ) ); duplicationPredicate = new DuplicatedProcedureValidator<>( elementUtils, userFunctionType, - UserFunctionProcessor::getCustomName ); + ( function ) -> CustomNameExtractor.getName( function::name, function::value ) ); } @Override diff --git a/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractor.java b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractor.java new file mode 100644 index 0000000000000..ee931411dad05 --- /dev/null +++ b/community/procedure-compiler/processor/src/main/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractor.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2002-2017 "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.tooling.procedure.compilerutils; + +import java.util.Optional; +import java.util.function.Supplier; + +import org.neo4j.procedure.Procedure; +import org.neo4j.procedure.UserFunction; +import org.neo4j.procedure.UserAggregationFunction; + +public class CustomNameExtractor +{ + private CustomNameExtractor() + { + + } + + /** + * Extracts user-defined names, usually from a {@link Procedure}, {@link UserFunction} + * or {@link UserAggregationFunction}. + * + * As such, extracted strings are assumed to be non-null. + */ + public static Optional getName(Supplier nameSupplier, Supplier valueSupplier) + { + String name = nameSupplier.get().trim(); + if ( !name.isEmpty() ) + { + return Optional.of( name ); + } + String value = valueSupplier.get().trim(); + if ( !value.isEmpty() ) + { + return Optional.of( value ); + } + return Optional.empty(); + } +} diff --git a/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractorTest.java b/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractorTest.java new file mode 100644 index 0000000000000..79a870620952e --- /dev/null +++ b/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/compilerutils/CustomNameExtractorTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2017 "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.tooling.procedure.compilerutils; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CustomNameExtractorTest +{ + + @Test + public void favours_name_over_value() + { + assertThat(CustomNameExtractor.getName( () -> "name", () -> "value" )).contains( "name" ); + assertThat(CustomNameExtractor.getName( () -> "name", () -> "" )).contains( "name" ); + assertThat(CustomNameExtractor.getName( () -> "name", () -> " " )).contains( "name" ); + assertThat(CustomNameExtractor.getName( () -> " name ", () -> " " )).contains( "name" ); + } + + @Test + public void returns_value_if_trimmed_name_is_empty() + { + assertThat(CustomNameExtractor.getName( () -> "", () -> "value" )).contains( "value" ); + assertThat(CustomNameExtractor.getName( () -> " ", () -> "value" )).contains( "value" ); + assertThat(CustomNameExtractor.getName( () -> " ", () -> " value " )).contains( "value" ); + } + + @Test + public void returns_nothing_if_none_defined() + { + assertThat(CustomNameExtractor.getName( () -> "", () -> "" )).isEmpty(); + assertThat(CustomNameExtractor.getName( () -> " ", () -> "" )).isEmpty(); + assertThat(CustomNameExtractor.getName( () -> "", () -> " " )).isEmpty(); + assertThat(CustomNameExtractor.getName( () -> " ", () -> " " )).isEmpty(); + } +} diff --git a/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/validators/DuplicatedProcedureValidatorTest.java b/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/validators/DuplicatedProcedureValidatorTest.java index cad6e2b2442ce..47407bbd8270b 100644 --- a/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/validators/DuplicatedProcedureValidatorTest.java +++ b/community/procedure-compiler/processor/src/test/java/org/neo4j/tooling/procedure/validators/DuplicatedProcedureValidatorTest.java @@ -34,7 +34,7 @@ import javax.tools.Diagnostic; import org.neo4j.procedure.Procedure; -import org.neo4j.tooling.procedure.ProcedureProcessor; +import org.neo4j.tooling.procedure.compilerutils.CustomNameExtractor; import org.neo4j.tooling.procedure.messages.CompilationMessage; import org.neo4j.tooling.procedure.validators.examples.DefaultProcedureA; import org.neo4j.tooling.procedure.validators.examples.DefaultProcedureB; @@ -58,7 +58,8 @@ public class DuplicatedProcedureValidatorTest public void prepare() { elements = compilation.getElements(); - validator = new DuplicatedProcedureValidator<>( elements, Procedure.class, ProcedureProcessor::getCustomName ); + validator = new DuplicatedProcedureValidator<>( elements, Procedure.class, + ( proc ) -> CustomNameExtractor.getName( proc::name, proc::value ) ); } @Test