[ 
https://issues.apache.org/jira/browse/NIFI-360?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14340835#comment-14340835
 ] 

ASF GitHub Bot commented on NIFI-360:
-------------------------------------

Github user markap14 commented on a diff in the pull request:

    https://github.com/apache/incubator-nifi/pull/28#discussion_r25540061
  
    --- Diff: 
nifi/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/JsonUtils.java
 ---
    @@ -0,0 +1,127 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one or more
    + * contributor license agreements.  See the NOTICE file distributed with
    + * this work for additional information regarding copyright ownership.
    + * The ASF licenses this file to You under the Apache License, Version 2.0
    + * (the "License"); you may not use this file except in compliance with
    + * the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +package org.apache.nifi.processors.standard.util;
    +
    +import com.jayway.jsonpath.Configuration;
    +import com.jayway.jsonpath.DocumentContext;
    +import com.jayway.jsonpath.InvalidPathException;
    +import com.jayway.jsonpath.JsonPath;
    +import com.jayway.jsonpath.spi.json.JsonProvider;
    +import net.minidev.json.JSONValue;
    +import org.apache.nifi.components.ValidationContext;
    +import org.apache.nifi.components.ValidationResult;
    +import org.apache.nifi.components.Validator;
    +import org.apache.nifi.flowfile.FlowFile;
    +import org.apache.nifi.processor.ProcessSession;
    +import org.apache.nifi.processor.io.InputStreamCallback;
    +import org.apache.nifi.stream.io.BufferedInputStream;
    +import org.apache.nifi.util.BooleanHolder;
    +import org.apache.nifi.util.ObjectHolder;
    +
    +import java.io.IOException;
    +import java.io.InputStream;
    +import java.io.InputStreamReader;
    +import java.util.List;
    +import java.util.Map;
    +
    +/**
    + * Provides utilities for interacting with JSON elements and JsonPath 
expressions and results
    + *
    + * @see <a href="http://json.org";>http://json.org</a>
    + * @see <a 
href="https://github.com/jayway/JsonPath";>https://github.com/jayway/JsonPath</a>
    + */
    +public class JsonUtils {
    +
    +    static final JsonProvider JSON_PROVIDER = 
Configuration.defaultConfiguration().jsonProvider();
    +
    +    public static final Validator JSON_PATH_VALIDATOR = new Validator() {
    +        @Override
    +        public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
    +            String error = null;
    +            try {
    +                JsonPath compile = JsonPath.compile(input);
    +            } catch (InvalidPathException ipe) {
    +                error = ipe.toString();
    +            }
    +            return new ValidationResult.Builder().valid(error == 
null).explanation(error).build();
    +        }
    +    };
    +
    +    public static DocumentContext 
validateAndEstablishJsonContext(ProcessSession processSession, FlowFile 
flowFile) {
    +
    +        final BooleanHolder validJsonHolder = new BooleanHolder(false);
    +        processSession.read(flowFile, new InputStreamCallback() {
    +            @Override
    +            public void process(InputStream in) throws IOException {
    +                validJsonHolder.set(JsonUtils.isValidJson(in));
    +            }
    +        });
    +
    +        // Parse the document once into an associated context to support 
multiple path evaluations if specified
    +        final ObjectHolder<DocumentContext> contextHolder = new 
ObjectHolder<>(null);
    +
    +        if (validJsonHolder.get()) {
    +            processSession.read(flowFile, new InputStreamCallback() {
    --- End diff --
    
    Do we need to read the content to validate it above and then read it again 
here? Can we just assume that it's valid unless an Exception is thrown?


> Create Processors to work against JSON data
> -------------------------------------------
>
>                 Key: NIFI-360
>                 URL: https://issues.apache.org/jira/browse/NIFI-360
>             Project: Apache NiFi
>          Issue Type: New Feature
>          Components: Extensions
>            Reporter: Aldrin Piri
>            Assignee: Aldrin Piri
>            Priority: Minor
>              Labels: processor
>
> I have created two Processors, EvaluateJsonPath and SplitJson which are 
> analogs of the functionality provided through EvaluateXPath and SpiltXML.
> Both are powered primarily around the usage of [JsonPath by 
> Jayway|https://github.com/jayway/JsonPath].
> Their capability descriptions are provided below:
> {panel:title= EvaluateJsonPath}
> Evaluates one or more JsonPath expressions against the content of a FlowFile. 
>  The results of those expressions are assigned to FlowFile Attributes or are 
> written to the content of the FlowFile itself, depending on configuration of 
> the Processor. JsonPaths are entered by adding user-defined properties; the 
> name of the property maps to the Attribute Name into which the result will be 
> placed (if the Destination is flowfile-attribute; otherwise, the property 
> name is ignored). 
> The value of the property must be a valid JsonPath expression. If the 
> JsonPath evaluates to a JSON array or JSON object and the Return Type is set 
> to 'scalar' the FlowFile will be unmodified and will be routed to failure. A 
> Return Type of JSON can return scalar values if the provided JsonPath 
> evaluates to the specified value and will be routed as a match. If 
> Destination is 'flowfile-content' and the JsonPath does not evaluate to a 
> defined path, the FlowFile will be routed to 'unmatched' without having its 
> contents modified. If Destination is flowfile-attribute and the expression 
> matches nothing, attributes will be created with empty strings as the value, 
> and the FlowFile will always be routed to 'matched.'
> {panel}
> {panel:title=SplitJson}
> Splits a JSON File into multiple, separate FlowFiles for an array element 
> specified by a JsonPath expression. Each generated FlowFile is comprised of 
> an element of the specified array and transferred to relationship 'split, 
> with the original file transferred to the 'original' relationship. If the 
> specified JsonPath is not found or  does not evaluate to an array element, 
> the original file is routed to 'failure' and no files are generated.
> {panel}
> One item of note is the transitive dependency of ASM through Json-Smart 
> through JsonPath.
> I have included, what I believe is needed to appropriately make use of this 
> item in the LICENSE.  Review of its correctness would is requested.
> Any feedback is appreciated.  Thanks!



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to