You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mt...@apache.org on 2018/06/05 22:25:36 UTC
nifi git commit: NIFI-5261: Added JSON_VALIDATOR to StandardValidators
Repository: nifi
Updated Branches:
refs/heads/master cb216b79e -> 504152eaa
NIFI-5261: Added JSON_VALIDATOR to StandardValidators
This closes #2758
Signed-off-by: Mike Thomsen <mi...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/504152ea
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/504152ea
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/504152ea
Branch: refs/heads/master
Commit: 504152eaa1cd377e4e9c94d2e5670855c8d2f7b0
Parents: cb216b7
Author: zenfenan <si...@gmail.com>
Authored: Mon Jun 4 22:48:38 2018 +0530
Committer: Mike Thomsen <mi...@gmail.com>
Committed: Tue Jun 5 18:24:47 2018 -0400
----------------------------------------------------------------------
nifi-commons/nifi-utils/pom.xml | 5 +++
.../nifi/processor/util/StandardValidators.java | 22 ++++++++++++
.../util/validator/TestStandardValidators.java | 38 ++++++++++++++++++++
.../ElasticSearchRestProcessor.java | 2 +-
.../factory/CredentialPropertyDescriptors.java | 2 +-
.../nifi/processors/mongodb/GetMongo.java | 24 ++-----------
.../nifi/processors/mongodb/PutMongo.java | 2 +-
.../processors/mongodb/RunMongoAggregation.java | 23 ++----------
8 files changed, 73 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-commons/nifi-utils/pom.xml
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-utils/pom.xml b/nifi-commons/nifi-utils/pom.xml
index 5a023b6..26d64ae 100644
--- a/nifi-commons/nifi-utils/pom.xml
+++ b/nifi-commons/nifi-utils/pom.xml
@@ -40,5 +40,10 @@
<artifactId>nifi-api</artifactId>
<version>1.7.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>2.8.1</version>
+ </dependency>
</dependencies>
</project>
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/processor/util/StandardValidators.java b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
index adf499a..b1e39fa 100644
--- a/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
+++ b/nifi-commons/nifi-utils/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
@@ -30,6 +30,9 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonSyntaxException;
import org.apache.nifi.components.PropertyValue;
import org.apache.nifi.components.ValidationContext;
import org.apache.nifi.components.ValidationResult;
@@ -480,6 +483,25 @@ public class StandardValidators {
public static final Validator FILE_EXISTS_VALIDATOR = new FileExistsValidator(true);
+ /**
+ * {@link Validator} that ensures the value is a valid JSON
+ */
+ public static final Validator JSON_VALIDATOR = (subject, input, context) -> {
+ if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(input)) {
+ return new ValidationResult.Builder().subject(subject).input(input).explanation("Expression Language Present").valid(true).build();
+ }
+
+ try {
+ new Gson().fromJson(input, JsonElement.class);
+ } catch (JsonSyntaxException e) {
+ return new ValidationResult.Builder().subject(subject).input(input).valid(false)
+ .explanation(subject + " is not a valid JSON representation due to " + e.getLocalizedMessage())
+ .build();
+ }
+
+ return new ValidationResult.Builder().subject(subject).input(input).valid(true).build();
+ };
+
//
//
// FACTORY METHODS FOR VALIDATORS
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
index 81888ca..147ed13 100644
--- a/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
+++ b/nifi-commons/nifi-utils/src/test/java/org/apache/nifi/util/validator/TestStandardValidators.java
@@ -288,4 +288,42 @@ public class TestStandardValidators {
vr = val.validate("foo", "2016-01-01T01:01:01.000Z", vc);
assertTrue(vr.isValid());
}
+
+ @Test
+ public void testJSONObjectValidator() {
+ final Validator validator = StandardValidators.JSON_VALIDATOR;
+ final ValidationContext context = mock(ValidationContext.class);
+ final String DUMMY_JSON_PROPERTY = "JSONProperty";
+ ValidationResult validationResult;
+
+ // Flat JSON
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY,"{\"Name\" : \"Crockford, Douglas\"}", context);
+ assertTrue(validationResult.isValid());
+
+ // Nested JSON
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "{ \"Name\" : \"Crockford, Douglas\", \"ContactInfo\": { \"Mobile\" : 0987654321, \"Email\" : \"mrx@xyz.zyx\" } }", context);
+ assertTrue(validationResult.isValid());
+
+ // JSON object with JSON array
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "{ \"name\":\"Smith, John\", \"age\":30, \"cars\":[ \"Ford\", \"BMW\", \"Fiat\" ] } ", context);
+ assertTrue(validationResult.isValid());
+
+ // JSON array
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "[\"one\", \"two\", \"three\"]", context);
+ assertTrue(validationResult.isValid());
+
+ // JSON Primitives
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "bncjbhjfjhj", context);
+ assertTrue(validationResult.isValid());
+
+ // Empty JSON
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "{}", context);
+ assertTrue(validationResult.isValid());
+
+ // Invalid JSON
+ validationResult = validator.validate(DUMMY_JSON_PROPERTY, "\"Name\" : \"Smith, John\"", context);
+ assertFalse(validationResult.isValid());
+ assertTrue(validationResult.getExplanation().contains("not a valid JSON representation"));
+
+ }
}
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-restapi-processors/src/main/java/org/apache/nifi/processors/elasticsearch/ElasticSearchRestProcessor.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-restapi-processors/src/main/java/org/apache/nifi/processors/elasticsearch/ElasticSearchRestProcessor.java b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-restapi-processors/src/main/java/org/apache/nifi/processors/elasticsearch/ElasticSearchRestProcessor.java
index e94a1cc..43df991 100644
--- a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-restapi-processors/src/main/java/org/apache/nifi/processors/elasticsearch/ElasticSearchRestProcessor.java
+++ b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-restapi-processors/src/main/java/org/apache/nifi/processors/elasticsearch/ElasticSearchRestProcessor.java
@@ -55,7 +55,7 @@ public interface ElasticSearchRestProcessor {
"If this parameter is not set, the query will be read from the flowfile content.")
.required(false)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.build();
PropertyDescriptor QUERY_ATTRIBUTE = new PropertyDescriptor.Builder()
.name("el-query-attribute")
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/credentials/factory/CredentialPropertyDescriptors.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/credentials/factory/CredentialPropertyDescriptors.java b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/credentials/factory/CredentialPropertyDescriptors.java
index 0728eb0..2531ab0 100644
--- a/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/credentials/factory/CredentialPropertyDescriptors.java
+++ b/nifi-nar-bundles/nifi-gcp-bundle/nifi-gcp-processors/src/main/java/org/apache/nifi/processors/gcp/credentials/factory/CredentialPropertyDescriptors.java
@@ -83,7 +83,7 @@ public final class CredentialPropertyDescriptors {
.displayName("Service Account JSON")
.expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY)
.required(false)
- .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.description("The raw JSON containing a Service Account keyfile.")
.sensitive(true)
.build();
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/GetMongo.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/GetMongo.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/GetMongo.java
index 2840262..3cf80ad 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/GetMongo.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/GetMongo.java
@@ -29,7 +29,6 @@ import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.components.AllowableValue;
import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.components.Validator;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.flowfile.FlowFile;
@@ -60,23 +59,6 @@ import java.util.Set;
@InputRequirement(Requirement.INPUT_ALLOWED)
@CapabilityDescription("Creates FlowFiles from documents in MongoDB")
public class GetMongo extends AbstractMongoProcessor {
- public static final Validator DOCUMENT_VALIDATOR = (subject, value, context) -> {
- final ValidationResult.Builder builder = new ValidationResult.Builder();
- builder.subject(subject).input(value);
-
- if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(value)) {
- return builder.valid(true).explanation("Contains Expression Language").build();
- }
-
- String reason = null;
- try {
- Document.parse(value);
- } catch (final RuntimeException e) {
- reason = e.getLocalizedMessage();
- }
-
- return builder.explanation(reason).valid(reason == null).build();
- };
static final Relationship REL_SUCCESS = new Relationship.Builder().name("success").description("All files are routed to success").build();
static final Relationship REL_FAILURE = new Relationship.Builder()
@@ -97,7 +79,7 @@ public class GetMongo extends AbstractMongoProcessor {
"that will result in a full collection fetch using a \"{}\" query.")
.required(false)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .addValidator(DOCUMENT_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.build();
static final PropertyDescriptor PROJECTION = new PropertyDescriptor.Builder()
@@ -105,14 +87,14 @@ public class GetMongo extends AbstractMongoProcessor {
.description("The fields to be returned from the documents in the result set; must be a valid BSON document")
.required(false)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .addValidator(DOCUMENT_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.build();
static final PropertyDescriptor SORT = new PropertyDescriptor.Builder()
.name("Sort")
.description("The fields by which to sort; must be a valid BSON document")
.required(false)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
- .addValidator(DOCUMENT_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.build();
static final PropertyDescriptor LIMIT = new PropertyDescriptor.Builder()
.name("Limit")
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/PutMongo.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/PutMongo.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/PutMongo.java
index f9a0b2b..839ad9e 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/PutMongo.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/PutMongo.java
@@ -100,7 +100,7 @@ public class PutMongo extends AbstractMongoProcessor {
.displayName("Update Query")
.description("Specify a full MongoDB query to be used for the lookup query to do an update/upsert.")
.required(false)
- .addValidator(StandardValidators.NON_BLANK_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
http://git-wip-us.apache.org/repos/asf/nifi/blob/504152ea/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/RunMongoAggregation.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/RunMongoAggregation.java b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/RunMongoAggregation.java
index 01cf96a..ff32039 100644
--- a/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/RunMongoAggregation.java
+++ b/nifi-nar-bundles/nifi-mongodb-bundle/nifi-mongodb-processors/src/main/java/org/apache/nifi/processors/mongodb/RunMongoAggregation.java
@@ -28,14 +28,13 @@ import org.apache.nifi.annotation.behavior.InputRequirement;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.components.PropertyDescriptor;
-import org.apache.nifi.components.ValidationResult;
-import org.apache.nifi.components.Validator;
import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.flowfile.FlowFile;
import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.processor.util.StandardValidators;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -83,31 +82,13 @@ public class RunMongoAggregation extends AbstractMongoProcessor {
return result;
}
- public static final Validator AGG_VALIDATOR = (subject, value, context) -> {
- final ValidationResult.Builder builder = new ValidationResult.Builder();
- builder.subject(subject).input(value);
-
- if (context.isExpressionLanguageSupported(subject) && context.isExpressionLanguagePresent(value)) {
- return builder.valid(true).explanation("Contains Expression Language").build();
- }
-
- String reason = null;
- try {
- buildAggregationQuery(value);
- } catch (final RuntimeException | IOException e) {
- reason = e.getLocalizedMessage();
- }
-
- return builder.explanation(reason).valid(reason == null).build();
- };
-
static final PropertyDescriptor QUERY = new PropertyDescriptor.Builder()
.name("mongo-agg-query")
.displayName("Query")
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.description("The aggregation query to be executed.")
.required(true)
- .addValidator(AGG_VALIDATOR)
+ .addValidator(StandardValidators.JSON_VALIDATOR)
.build();
static {