NIFI-1850
- Initial Commit for JSON-to-JSON Schema Converter Editor
- file re-org and licensing
- fixes for cluster (properties weren't updating)
- Minor style updates.
- Removing unecessary method from ComponentFacade.
- This closes #424


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/03dfff2e
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/03dfff2e
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/03dfff2e

Branch: refs/heads/0.x
Commit: 03dfff2e006753efe9eab1f6f20a30710a0845dd
Parents: 84fcc0c
Author: Yolanda M. Davis <[email protected]>
Authored: Mon May 9 08:20:10 2016 -0400
Committer: Matt Gilman <[email protected]>
Committed: Wed Jun 1 10:50:04 2016 -0400

----------------------------------------------------------------------
 LICENSE                                         |   262 +-
 .../apache/nifi/web/ComponentDescriptor.java    |    93 +
 .../org/apache/nifi/web/ComponentDetails.java   |    19 +
 .../nifi/web/NiFiWebConfigurationContext.java   |    20 +
 nifi-assembly/LICENSE                           |   261 +-
 .../org/apache/nifi/web/NiFiServiceFacade.java  |     5 +-
 .../nifi/web/StandardNiFiServiceFacade.java     |    13 +-
 .../StandardNiFiWebConfigurationContext.java    |   408 +-
 .../apache/nifi/web/StandardNiFiWebContext.java |     2 +-
 .../apache/nifi/web/api/ClusterResource.java    |     8 +-
 .../nifi-framework/nifi-web/nifi-web-ui/pom.xml |     2 +
 .../src/main/resources/META-INF/LICENSE         |    21 +
 .../js/codemirror/addon/lint/json-lint.js       |    31 +
 .../webapp/js/codemirror/addon/lint/lint.css    |    73 +
 .../webapp/js/codemirror/addon/lint/lint.js     |   239 +
 .../src/main/webapp/js/jsonlint/LICENSE         |    21 +
 .../src/main/webapp/js/jsonlint/jsonlint.min.js |     1 +
 .../nifi-jolt-transform-json-ui/pom.xml         |   153 +
 .../standard/api/AbstractStandardResource.java  |    39 +
 .../api/processor/ProcessorResource.java        |    68 +
 .../transformjson/TransformJSONResource.java    |    89 +
 .../transformjson/dto/JoltSpecificationDTO.java |    63 +
 .../api/transformjson/dto/ValidationDTO.java    |    54 +
 .../org/apache/nifi/web/util/CustomUIUtils.java |    88 +
 .../src/main/resources/META-INF/LICENSE         |   491 +
 .../src/main/resources/META-INF/NOTICE          |    53 +
 .../META-INF/nifi-processor-configuration       |    15 +
 .../src/main/webapp/WEB-INF/jsp/index.jsp       |    68 +
 .../src/main/webapp/WEB-INF/web.xml             |    50 +
 .../src/main/webapp/app/app.js                  |    44 +
 .../webapp/app/components/error/error.state.js  |    30 +
 .../webapp/app/components/error/error.view.html |    15 +
 .../components/processor/processor.service.js   |    53 +
 .../src/main/webapp/app/main/main.controller.js |    35 +
 .../src/main/webapp/app/main/main.state.js      |    31 +
 .../transformjson/transformjson.controller.js   |   374 +
 .../app/transformjson/transformjson.service.js  |    41 +
 .../app/transformjson/transformjson.state.js    |    39 +
 .../app/transformjson/transformjson.view.html   |   117 +
 .../src/main/webapp/css/main.css                |    55 +
 .../src/main/webapp/js/angular-ui/LICENSE       |    22 +
 .../angular-ui-codemirror/ui-codemirror.min.js  |     7 +
 .../angular-ui-router/angular-ui-router.min.js  |     8 +
 .../src/main/webapp/js/angular/LICENSE          |    21 +
 .../angular-animate/angular-animate.min.js      |    56 +
 .../js/angular/angular-aria/angular-aria.min.js |    14 +
 .../webapp/js/angular/angular-material/LICENSE  |    21 +
 .../angular-material/angular-material.css       | 23185 +++++++++++++++++
 .../angular-material/angular-material.min.js    |    15 +
 .../angular-messages/angular-messages.min.js    |    12 +
 .../angular-resource/angular-resource.min.js    |    15 +
 .../angular/angular-route/angular-route.min.js  |    15 +
 .../angular-sanitize/angular-sanitize.min.js    |    15 +
 .../src/main/webapp/js/angular/angular.min.js   |   311 +
 .../src/main/webapp/js/js-beautify/LICENSE      |    21 +
 .../src/main/webapp/js/js-beautify/beautify.js  |  2333 ++
 .../api/processor/TestProcessorResource.java    |   148 +
 .../TestTransformJSONResource.java              |   178 +
 .../apache/nifi/web/util/TestCustomUIUtils.java |    93 +
 .../nifi-standard-nar/pom.xml                   |     5 +
 .../src/main/resources/META-INF/LICENSE         |   241 +-
 .../nifi-standard-processors/pom.xml            |    33 +-
 .../processors/standard/JoltTransformJSON.java  |   223 +
 .../nifi/processors/standard/TransformJSON.java |   247 -
 .../org.apache.nifi.processor.Processor         |     2 +-
 .../additionalDetails.html                      |    36 +
 .../additionalDetails.html                      |    36 -
 .../standard/TestJoltTransformJSON.java         |   232 +
 .../processors/standard/TestTransformJSON.java  |   325 -
 .../TestJoltTransformJson/cardrOutput.json      |    13 +
 .../TestJoltTransformJson/cardrSpec.json        |     7 +
 .../TestJoltTransformJson/chainrOutput.json     |    16 +
 .../TestJoltTransformJson/chainrSpec.json       |    29 +
 .../TestJoltTransformJson/defaultrOutput.json   |    24 +
 .../TestJoltTransformJson/defaultrSpec.json     |    10 +
 .../resources/TestJoltTransformJson/input.json  |    13 +
 .../TestJoltTransformJson/removrOutput.json     |    10 +
 .../TestJoltTransformJson/removrSpec.json       |     5 +
 .../TestJoltTransformJson/shiftrOutput.json     |     8 +
 .../TestJoltTransformJson/shiftrSpec.json       |    10 +
 .../TestJoltTransformJson/sortrOutput.json      |    13 +
 .../TestTransformJson/cardrOutput.json          |    13 -
 .../resources/TestTransformJson/cardrSpec.json  |     7 -
 .../TestTransformJson/chainrOutput.json         |    16 -
 .../resources/TestTransformJson/chainrSpec.json |    29 -
 .../TestTransformJson/defaultrOutput.json       |    24 -
 .../TestTransformJson/defaultrSpec.json         |    10 -
 .../test/resources/TestTransformJson/input.json |    13 -
 .../TestTransformJson/removrOutput.json         |    10 -
 .../resources/TestTransformJson/removrSpec.json |     5 -
 .../TestTransformJson/shiftrOutput.json         |     8 -
 .../resources/TestTransformJson/shiftrSpec.json |    10 -
 .../TestTransformJson/sortrOutput.json          |    13 -
 .../nifi-standard-utils/pom.xml                 |    65 +
 .../standard/util/TransformFactory.java         |    46 +
 .../standard/util/TestTransformFactory.java     |    89 +
 .../TestTransformFactory/cardrSpec.json         |     7 +
 .../TestTransformFactory/chainrSpec.json        |    29 +
 .../TestTransformFactory/defaultrSpec.json      |    10 +
 .../TestTransformFactory/removrSpec.json        |     5 +
 .../TestTransformFactory/shiftrSpec.json        |    10 +
 nifi-nar-bundles/nifi-standard-bundle/pom.xml   |     8 +
 102 files changed, 31060 insertions(+), 939 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 3ff4503..1e55177 100644
--- a/LICENSE
+++ b/LICENSE
@@ -515,4 +515,264 @@ For details see 
https://github.com/svenkubiak/jBCrypt/blob/0.4.1/LICENSE
     ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
\ No newline at end of file
+    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+This product bundles 'Angular' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'Angular Material' which is available under an MIT 
license.
+
+    Copyright (c) 2014-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'Angular Animate' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+
+This product bundles 'Angular Aria' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Messages' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Resource' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Route' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Sanitize' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'AngularUI Codemirror' which is available under an MIT 
license.
+
+    Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'AngularUI Router' which is available under an MIT 
license.
+
+    Copyright (c) 2013-2015 The AngularUI Team, Karsten Sperling
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'js-beautify' which is available under an MIT license.
+
+    Copyright (c) 2007-2013 Einar Lielmanis and contributors.
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+
+This product bundles 'jsonlint' which is available under an MIT license.
+
+    Copyright (C) 2012 Zachary Carter
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-api/src/main/java/org/apache/nifi/web/ComponentDescriptor.java
----------------------------------------------------------------------
diff --git 
a/nifi-api/src/main/java/org/apache/nifi/web/ComponentDescriptor.java 
b/nifi-api/src/main/java/org/apache/nifi/web/ComponentDescriptor.java
new file mode 100644
index 0000000..9412ee1
--- /dev/null
+++ b/nifi-api/src/main/java/org/apache/nifi/web/ComponentDescriptor.java
@@ -0,0 +1,93 @@
+/*
+ * 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.web;
+
+import java.util.Map;
+
+public class ComponentDescriptor {
+
+    private final String name;
+    private final String displayName;
+    private final String description;
+    private final String defaultValue;
+    private final Map<String,String> allowableValues;
+
+    private ComponentDescriptor(Builder builder){
+        this.name = builder.name;
+        this.displayName = builder.displayName;
+        this.description = builder.description;
+        this.defaultValue = builder.defaultValue;
+        this.allowableValues = builder.allowableValues;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public Map<String,String> getAllowableValues() {
+        return allowableValues;
+    }
+
+    public static final class Builder{
+        private String name;
+        private String displayName;
+        private String description;
+        private String defaultValue;
+        private Map<String,String> allowableValues;
+
+        public Builder name(String name){
+            this.name = name;
+            return this;
+        }
+
+        public Builder displayName(String displayName){
+            this.displayName = displayName;
+            return this;
+        }
+
+        public  Builder description(String description){
+            this.description = description;
+            return this;
+        }
+
+        public Builder defaultValue(String defaultValue){
+            this.defaultValue = defaultValue;
+            return this;
+        }
+
+        public Builder allowableValues(Map<String,String> allowableValues){
+            this.allowableValues = allowableValues;
+            return this;
+        }
+
+        public ComponentDescriptor build(){
+            return new ComponentDescriptor(this);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-api/src/main/java/org/apache/nifi/web/ComponentDetails.java
----------------------------------------------------------------------
diff --git a/nifi-api/src/main/java/org/apache/nifi/web/ComponentDetails.java 
b/nifi-api/src/main/java/org/apache/nifi/web/ComponentDetails.java
index 5614fc2..9d163e4 100644
--- a/nifi-api/src/main/java/org/apache/nifi/web/ComponentDetails.java
+++ b/nifi-api/src/main/java/org/apache/nifi/web/ComponentDetails.java
@@ -31,6 +31,8 @@ public class ComponentDetails {
     private final String state;
     private final String annotationData;
     private final Map<String, String> properties;
+    private final Map<String, ComponentDescriptor> descriptors;
+
     private final Collection<String> validationErrors;
 
     private ComponentDetails(final Builder builder) {
@@ -40,7 +42,9 @@ public class ComponentDetails {
         this.state = builder.state;
         this.annotationData = builder.annotationData;
         this.properties = builder.properties;
+        this.descriptors = builder.descriptors;
         this.validationErrors = builder.validationErrors;
+
     }
 
     /**
@@ -85,6 +89,14 @@ public class ComponentDetails {
         return properties;
     }
 
+
+    /**
+     * @return Mapping of component descriptors
+     */
+    public Map<String,ComponentDescriptor> getDescriptors(){
+        return descriptors;
+    }
+
     /**
      * @return Current validation errors for the component
      */
@@ -100,6 +112,8 @@ public class ComponentDetails {
         private String state;
         private String annotationData;
         private Map<String, String> properties;
+        private Map<String,ComponentDescriptor> descriptors;
+
         private Collection<String> validationErrors;
 
         public Builder id(final String id) {
@@ -137,6 +151,11 @@ public class ComponentDetails {
             return this;
         }
 
+        public Builder descriptors(final Map<String,ComponentDescriptor> 
descriptors){
+            this.descriptors = descriptors;
+            return this;
+        }
+
         public ComponentDetails build() {
             return new ComponentDetails(this);
         }

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java 
b/nifi-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
index 39bea4f..021d243 100644
--- 
a/nifi-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
+++ 
b/nifi-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
@@ -17,6 +17,7 @@
 package org.apache.nifi.web;
 
 import java.util.Collection;
+import java.util.Map;
 
 import org.apache.nifi.controller.ControllerService;
 
@@ -83,6 +84,25 @@ public interface NiFiWebConfigurationContext {
             throws ResourceNotFoundException, InvalidRevisionException, 
ClusterRequestException;
 
     /**
+     * Sets the property values for the underlying component.
+     *
+     * @param configurationContext config context
+     * @param properties Map of property name with property value
+     * @return the configuration for the underlying component
+     * @throws ResourceNotFoundException if the underlying component does not
+     * exit
+     * @throws InvalidRevisionException if a revision other than the current
+     * revision is given
+     * @throws ClusterRequestException if the annotation data was unable to be
+     * set for the underlying component. This exception will only be thrown 
when
+     * operating in a cluster.
+     * @throws IllegalArgumentException When the requestContext isn't fully
+     * populated or isn't appropriate for the given request
+     */
+    ComponentDetails setProperties(NiFiWebConfigurationRequestContext 
configurationContext, Map<String,String> properties)
+            throws ResourceNotFoundException, InvalidRevisionException, 
ClusterRequestException;
+
+    /**
      * Gets the details for the underlying component (including configuration,
      * validation errors, and annotation data).
      *

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-assembly/LICENSE
----------------------------------------------------------------------
diff --git a/nifi-assembly/LICENSE b/nifi-assembly/LICENSE
index 768377b..4d2ade7 100644
--- a/nifi-assembly/LICENSE
+++ b/nifi-assembly/LICENSE
@@ -1166,4 +1166,263 @@ For details see 
https://github.com/bazaarvoice/jolt/blob/jolt-0.0.20/LICENSE
     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.
\ No newline at end of file
+    limitations under the License.
+
+This product bundles 'Angular' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'Angular Material' which is available under an MIT 
license.
+
+    Copyright (c) 2014-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'Angular Animate' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+
+This product bundles 'Angular Aria' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Messages' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Resource' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Route' which is available under an MIT license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'Angular Sanitize' which is available under an MIT 
license.
+
+    Copyright (c) 2010-2016 Google, Inc. http://angularjs.org
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+This product bundles 'AngularUI Codemirror' which is available under an MIT 
license.
+
+    Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'AngularUI Router' which is available under an MIT 
license.
+
+    Copyright (c) 2013-2015 The AngularUI Team, Karsten Sperling
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'js-beautify' which is available under an MIT license.
+
+    Copyright (c) 2007-2013 Einar Lielmanis and contributors.
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.
+
+This product bundles 'jsonlint' which is available under an MIT license.
+
+    Copyright (C) 2012 Zachary Carter
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
index bc5245c..5633f2f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
@@ -75,6 +75,7 @@ import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
 
 import java.util.Collection;
 import java.util.Date;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -215,10 +216,12 @@ public interface NiFiServiceFacade {
      * @param revision the revision to compare with current base revision
      * @param processorId the id of the processor to update
      * @param annotationData the annotation data
+     * @param properties the properties of the processor to update
      *
      * @return snapshot
      */
-    ConfigurationSnapshot<ProcessorDTO> setProcessorAnnotationData(Revision 
revision, String processorId, String annotationData);
+    ConfigurationSnapshot<ProcessorDTO> updateProcessor(Revision revision, 
String processorId, String annotationData, Map<String,String> properties);
+
 
     /**
      * Returns the process group status.

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index 945c671..ebada84 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -1626,14 +1626,19 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         });
     }
 
-    @Override
-    public ConfigurationSnapshot<ProcessorDTO> 
setProcessorAnnotationData(final Revision revision, final String processorId, 
final String annotationData) {
+
+    public ConfigurationSnapshot<ProcessorDTO> updateProcessor(final Revision 
revision, final String processorId, final String annotationData, final 
Map<String,String> properties) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessorDTO>() {
             @Override
             public ConfigurationResult<ProcessorDTO> execute() {
                 // create the processor config
                 final ProcessorConfigDTO config = new ProcessorConfigDTO();
-                config.setAnnotationData(annotationData);
+                if (annotationData != null) {
+                    config.setAnnotationData(annotationData);
+                }
+                if (properties != null) {
+                    config.setProperties(properties);
+                }
 
                 // create the processor dto
                 final ProcessorDTO processorDTO = new ProcessorDTO();
@@ -1665,10 +1670,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                         return dtoFactory.createProcessorDto(processor);
                     }
                 };
+
             }
         });
     }
 
+
     @Override
     public ConfigurationSnapshot<ControllerServiceDTO> 
createControllerService(final Revision revision, final ControllerServiceDTO 
controllerServiceDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ControllerServiceDTO>() {

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
index cae1175..9076063 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java
@@ -16,22 +16,8 @@
  */
 package org.apache.nifi.web;
 
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.ws.rs.HttpMethod;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.action.Action;
 import org.apache.nifi.action.Component;
 import org.apache.nifi.action.FlowChangeAction;
@@ -42,31 +28,44 @@ import org.apache.nifi.admin.service.AuditService;
 import org.apache.nifi.cluster.manager.NodeResponse;
 import org.apache.nifi.cluster.manager.impl.WebClusterManager;
 import org.apache.nifi.controller.ControllerService;
-import org.apache.nifi.web.security.user.NiFiUserDetails;
-import org.apache.nifi.web.security.user.NiFiUserUtils;
+import org.apache.nifi.controller.ControllerServiceLookup;
+import org.apache.nifi.controller.reporting.ReportingTaskProvider;
 import org.apache.nifi.user.NiFiUser;
 import org.apache.nifi.util.NiFiProperties;
+import org.apache.nifi.web.api.dto.ControllerServiceDTO;
 import org.apache.nifi.web.api.dto.ProcessorConfigDTO;
 import org.apache.nifi.web.api.dto.ProcessorDTO;
+import org.apache.nifi.web.api.dto.PropertyDescriptorDTO;
+import org.apache.nifi.web.api.dto.ReportingTaskDTO;
 import org.apache.nifi.web.api.dto.RevisionDTO;
+import org.apache.nifi.web.api.entity.ControllerServiceEntity;
 import org.apache.nifi.web.api.entity.ProcessorEntity;
+import org.apache.nifi.web.api.entity.ReportingTaskEntity;
+import org.apache.nifi.web.security.user.NiFiUserDetails;
+import org.apache.nifi.web.security.user.NiFiUserUtils;
+import org.apache.nifi.web.util.ClientResponseUtils;
 import org.apache.nifi.web.util.WebUtils;
-
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 
-import com.sun.jersey.core.util.MultivaluedMapImpl;
-import org.apache.nifi.controller.ControllerServiceLookup;
-import org.apache.nifi.controller.reporting.ReportingTaskProvider;
-import org.apache.nifi.web.api.dto.ControllerServiceDTO;
-import org.apache.nifi.web.api.dto.ReportingTaskDTO;
-import org.apache.nifi.web.api.entity.ControllerServiceEntity;
-import org.apache.nifi.web.api.entity.ReportingTaskEntity;
-import org.apache.nifi.web.util.ClientResponseUtils;
+import javax.ws.rs.HttpMethod;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * Implements the NiFiWebConfigurationContext interface to support a context 
in both standalone and clustered environments.
@@ -186,43 +185,33 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
     @Override
     @PreAuthorize("hasAnyRole('ROLE_MONITOR', 'ROLE_DFM', 'ROLE_ADMIN')")
     public ComponentDetails getComponentDetails(final NiFiWebRequestContext 
requestContext) throws ResourceNotFoundException, ClusterRequestException {
-        final String id = requestContext.getId();
-
-        if (StringUtils.isBlank(id)) {
-            throw new ResourceNotFoundException(String.format("Configuration 
request context config did not have a component ID."));
-        }
-
-        // ensure the path could be
-        if (requestContext.getExtensionType() == null) {
-            throw new IllegalArgumentException("The UI extension type must be 
specified.");
-        }
+        ComponentFacade componentFacade = getComponentFacade(requestContext);
+        return componentFacade.getComponentDetails(requestContext);
+    }
 
-        // get the component facade for interacting directly with that type of 
object
-        ComponentFacade componentFacade = null;
-        switch (requestContext.getExtensionType()) {
-            case ProcessorConfiguration:
-                componentFacade = new ProcessorFacade();
-                break;
-            case ControllerServiceConfiguration:
-                componentFacade = new ControllerServiceFacade();
-                break;
-            case ReportingTaskConfiguration:
-                componentFacade = new ReportingTaskFacade();
-                break;
-        }
+    @Override
+    @PreAuthorize("hasAnyRole('ROLE_DFM')")
+    public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData)
+            throws ResourceNotFoundException, InvalidRevisionException, 
ClusterRequestException {
 
-        if (componentFacade == null) {
-            throw new IllegalArgumentException("UI extension type must support 
Processor, ControllerService, or ReportingTask configuration.");
-        }
+        ComponentFacade componentFacade = getComponentFacade(requestContext);
+        return componentFacade.setAnnotationData(requestContext, 
annotationData);
 
-        return componentFacade.getComponentDetails(requestContext);
     }
 
+
     @Override
     @PreAuthorize("hasAnyRole('ROLE_DFM')")
-    public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData)
+    public ComponentDetails setProperties(final 
NiFiWebConfigurationRequestContext requestContext, final Map<String, String> 
properties)
             throws ResourceNotFoundException, InvalidRevisionException, 
ClusterRequestException {
 
+        ComponentFacade componentFacade = getComponentFacade(requestContext);
+        return componentFacade.setProperties(requestContext, properties);
+
+    }
+
+    protected ComponentFacade getComponentFacade(final NiFiWebRequestContext 
requestContext) throws ResourceNotFoundException, InvalidRevisionException, 
ClusterRequestException {
+
         final String id = requestContext.getId();
 
         if (StringUtils.isBlank(id)) {
@@ -252,7 +241,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
             throw new IllegalArgumentException("UI extension type must support 
Processor, ControllerService, or ReportingTask configuration.");
         }
 
-        return componentFacade.setAnnotationData(requestContext, 
annotationData);
+        return componentFacade;
     }
 
     /**
@@ -276,6 +265,17 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
          * @return details
          */
         ComponentDetails setAnnotationData(NiFiWebConfigurationRequestContext 
requestContext, String annotationData);
+
+        /**
+         * Sets the properties data using the specified request context.
+         *
+         * @param requestContext context
+         * @param properties     data
+         * @return details
+         */
+
+        ComponentDetails setProperties(NiFiWebConfigurationRequestContext 
requestContext, Map<String, String> properties);
+
     }
 
     /**
@@ -322,40 +322,57 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
             return getComponentConfiguration(processor);
         }
 
-        @Override
-        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+        private URI getRequestURI(final NiFiWebConfigurationRequestContext 
requestContext, String id) {
+            URI requestUrl;
+            try {
+                String path = "/nifi-api/cluster/processors/" + 
URLEncoder.encode(id, "UTF-8");
+                requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
+            } catch (final URISyntaxException | UnsupportedEncodingException 
use) {
+                throw new ClusterRequestException(use);
+            }
+            return requestUrl;
+        }
+
+        private ProcessorEntity getProcessorEntity(Revision revision, String 
id) {
+
+            // create the revision
+            RevisionDTO revisionDto = new RevisionDTO();
+            revisionDto.setClientId(revision.getClientId());
+            revisionDto.setVersion(revision.getVersion());
+
+            // create the processor entity
+            ProcessorEntity processorEntity = new ProcessorEntity();
+            processorEntity.setRevision(revisionDto);
+
+            // create the processor dto
+            ProcessorDTO processorDto = new ProcessorDTO();
+            processorEntity.setProcessor(processorDto);
+            processorDto.setId(id);
+
+            // create the processor configuration with the given annotation 
data
+            ProcessorConfigDTO configDto = new ProcessorConfigDTO();
+            processorDto.setConfig(configDto);
+            return processorEntity;
+
+        }
+
+        private ComponentDetails updateComponent(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData, 
final Map<String, String> componentProperties) {
             final Revision revision = requestContext.getRevision();
             final String id = requestContext.getId();
 
             final ProcessorDTO processor;
+
             if (properties.isClusterManager()) {
+
                 // create the request URL
-                URI requestUrl;
-                try {
-                    String path = "/nifi-api/cluster/processors/" + 
URLEncoder.encode(id, "UTF-8");
-                    requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
-                } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
-                    throw new ClusterRequestException(use);
+                URI requestUrl = getRequestURI(requestContext, id);
+                ProcessorEntity processorEntity = getProcessorEntity(revision, 
id);
+                if (annotationData != null) {
+                    
processorEntity.getProcessor().getConfig().setAnnotationData(annotationData);
+                }
+                if (componentProperties != null) {
+                    
processorEntity.getProcessor().getConfig().setProperties(componentProperties);
                 }
-
-                // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
-                revisionDto.setClientId(revision.getClientId());
-                revisionDto.setVersion(revision.getVersion());
-
-                // create the processor entity
-                ProcessorEntity processorEntity = new ProcessorEntity();
-                processorEntity.setRevision(revisionDto);
-
-                // create the processor dto
-                ProcessorDTO processorDto = new ProcessorDTO();
-                processorEntity.setProcessor(processorDto);
-                processorDto.setId(id);
-
-                // create the processor configuration with the given 
annotation data
-                ProcessorConfigDTO configDto = new ProcessorConfigDTO();
-                processorDto.setConfig(configDto);
-                configDto.setAnnotationData(annotationData);
 
                 // set the content type to json
                 final Map<String, String> headers = getHeaders(requestContext);
@@ -374,12 +391,23 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 }
                 processor = entity.getProcessor();
             } else {
-                final ConfigurationSnapshot<ProcessorDTO> response = 
serviceFacade.setProcessorAnnotationData(revision, id, annotationData);
+                final ConfigurationSnapshot<ProcessorDTO> response = 
serviceFacade.updateProcessor(revision, id, annotationData, 
componentProperties);
                 processor = response.getConfiguration();
             }
 
             // return the processor info
             return getComponentConfiguration(processor);
+
+        }
+
+        @Override
+        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+            return updateComponent(requestContext, annotationData, null);
+        }
+
+        @Override
+        public ComponentDetails 
setProperties(NiFiWebConfigurationRequestContext requestContext, Map<String, 
String> componentProperties) {
+            return updateComponent(requestContext, null, componentProperties);
         }
 
         private ComponentDetails getComponentConfiguration(final ProcessorDTO 
processor) {
@@ -391,8 +419,39 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                     .state(processor.getState())
                     .annotationData(processorConfig.getAnnotationData())
                     .properties(processorConfig.getProperties())
+                    .descriptors(getComponentDescriptors(processorConfig))
                     .validateErrors(processor.getValidationErrors()).build();
         }
+
+        private Map<String, ComponentDescriptor> getComponentDescriptors(final 
ProcessorConfigDTO processorConfig) {
+
+            final Map<String, ComponentDescriptor> descriptors = new 
HashMap<>();
+
+            for (String key : processorConfig.getDescriptors().keySet()) {
+
+                PropertyDescriptorDTO descriptor = 
processorConfig.getDescriptors().get(key);
+                List<PropertyDescriptorDTO.AllowableValueDTO> 
allowableValuesDTO = descriptor.getAllowableValues();
+                Map<String, String> allowableValues = new HashMap<>();
+
+                if (allowableValuesDTO != null) {
+                    for (PropertyDescriptorDTO.AllowableValueDTO value : 
allowableValuesDTO) {
+                        allowableValues.put(value.getValue(), 
value.getDisplayName());
+                    }
+                }
+
+                ComponentDescriptor componentDescriptor = new 
ComponentDescriptor.Builder()
+                        .name(descriptor.getName())
+                        .displayName(descriptor.getDisplayName())
+                        .defaultValue(descriptor.getDefaultValue())
+                        .allowableValues(allowableValues)
+                        .build();
+
+
+                descriptors.put(key, componentDescriptor);
+            }
+
+            return descriptors;
+        }
     }
 
     /**
@@ -400,6 +459,39 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
      */
     private class ControllerServiceFacade implements ComponentFacade {
 
+        private URI getRequestURI(final NiFiWebRequestContext requestContext, 
String id) {
+
+            // create the request URL
+            URI requestUrl;
+            try {
+                String path = "/nifi-api/controller-services/node/" + 
URLEncoder.encode(id, "UTF-8");
+                requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
+            } catch (final URISyntaxException | UnsupportedEncodingException 
use) {
+                throw new ClusterRequestException(use);
+            }
+            return requestUrl;
+
+        }
+
+        private ControllerServiceEntity getControllerServiceEntity(Revision 
revision, String id) {
+
+            // create the revision
+            RevisionDTO revisionDto = new RevisionDTO();
+            revisionDto.setClientId(revision.getClientId());
+            revisionDto.setVersion(revision.getVersion());
+
+            // create the controller service entity
+            ControllerServiceEntity controllerServiceEntity = new 
ControllerServiceEntity();
+            controllerServiceEntity.setRevision(revisionDto);
+
+            // create the controller service dto
+            ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
+            controllerServiceEntity.setControllerService(controllerServiceDto);
+            controllerServiceDto.setId(id);
+            return controllerServiceEntity;
+
+        }
+
         @Override
         public ComponentDetails getComponentDetails(final 
NiFiWebRequestContext requestContext) {
             final String id = requestContext.getId();
@@ -417,13 +509,7 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 }
 
                 // create the request URL
-                URI requestUrl;
-                try {
-                    String path = 
"/nifi-api/controller/controller-services/node/" + URLEncoder.encode(id, 
"UTF-8");
-                    requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
-                } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
-                    throw new ClusterRequestException(use);
-                }
+                URI requestUrl = getRequestURI(requestContext, id);
 
                 // set the request parameters
                 MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
@@ -446,8 +532,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
             return getComponentConfiguration(controllerService);
         }
 
-        @Override
-        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+        private ComponentDetails 
updateComponent(NiFiWebConfigurationRequestContext requestContext, String 
annotationData, Map<String, String> componentProperties) {
             final Revision revision = requestContext.getRevision();
             final String id = requestContext.getId();
 
@@ -455,7 +540,12 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
             if (controllerServiceLookup.getControllerService(id) != null) {
                 final ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
                 controllerServiceDto.setId(id);
-                controllerServiceDto.setAnnotationData(annotationData);
+                if (annotationData != null) {
+                    controllerServiceDto.setAnnotationData(annotationData);
+                }
+                if (componentProperties != null) {
+                    controllerServiceDto.setProperties(componentProperties);
+                }
 
                 final ConfigurationSnapshot<ControllerServiceDTO> response = 
serviceFacade.updateControllerService(revision, controllerServiceDto);
                 controllerService = response.getConfiguration();
@@ -473,28 +563,17 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 getComponentDetails(requestContext);
 
                 // create the request URL
-                URI requestUrl;
-                try {
-                    String path = 
"/nifi-api/controller/controller-services/node/" + URLEncoder.encode(id, 
"UTF-8");
-                    requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
-                } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
-                    throw new ClusterRequestException(use);
-                }
+                URI requestUrl = getRequestURI(requestContext, id);
 
-                // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
-                revisionDto.setClientId(revision.getClientId());
-                revisionDto.setVersion(revision.getVersion());
 
                 // create the controller service entity
-                ControllerServiceEntity controllerServiceEntity = new 
ControllerServiceEntity();
-                controllerServiceEntity.setRevision(revisionDto);
-
-                // create the controller service dto
-                ControllerServiceDTO controllerServiceDto = new 
ControllerServiceDTO();
-                
controllerServiceEntity.setControllerService(controllerServiceDto);
-                controllerServiceDto.setId(id);
-                controllerServiceDto.setAnnotationData(annotationData);
+                ControllerServiceEntity controllerServiceEntity = 
getControllerServiceEntity(revision, id);
+                if (annotationData != null) {
+                    
controllerServiceEntity.getControllerService().setAnnotationData(annotationData);
+                }
+                if (componentProperties != null) {
+                    
controllerServiceEntity.getControllerService().setProperties(componentProperties);
+                }
 
                 // set the content type to json
                 final Map<String, String> headers = getHeaders(requestContext);
@@ -518,6 +597,16 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
             return getComponentConfiguration(controllerService);
         }
 
+        @Override
+        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+            return updateComponent(requestContext, annotationData, null);
+        }
+
+        @Override
+        public ComponentDetails setProperties(final 
NiFiWebConfigurationRequestContext requestContext, final Map<String, String> 
componentProperties) {
+            return updateComponent(requestContext, null, componentProperties);
+        }
+
         private ComponentDetails getComponentConfiguration(final 
ControllerServiceDTO controllerService) {
             return new ComponentDetails.Builder()
                     .id(controllerService.getId())
@@ -535,6 +624,39 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
      */
     private class ReportingTaskFacade implements ComponentFacade {
 
+        private URI getRequestURI(final NiFiWebRequestContext requestContext, 
String id) {
+            // create the request URL
+            URI requestUrl;
+            try {
+                String path = "/nifi-api/reporting-tasks/node/" + 
URLEncoder.encode(id, "UTF-8");
+                requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
+            } catch (final URISyntaxException | UnsupportedEncodingException 
use) {
+                throw new ClusterRequestException(use);
+            }
+
+            return requestUrl;
+        }
+
+        private ReportingTaskEntity getReportingTaskEntity(Revision revision, 
String id) {
+
+            // create the revision
+            RevisionDTO revisionDto = new RevisionDTO();
+            revisionDto.setClientId(revision.getClientId());
+            revisionDto.setVersion(revision.getVersion());
+
+            // create the reporting task entity
+            ReportingTaskEntity reportingTaskEntity = new 
ReportingTaskEntity();
+            reportingTaskEntity.setRevision(revisionDto);
+
+            // create the reporting task dto
+            ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO();
+            reportingTaskEntity.setReportingTask(reportingTaskDto);
+            reportingTaskDto.setId(id);
+
+            return reportingTaskEntity;
+
+        }
+
         @Override
         public ComponentDetails getComponentDetails(final 
NiFiWebRequestContext requestContext) {
             final String id = requestContext.getId();
@@ -552,13 +674,7 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 }
 
                 // create the request URL
-                URI requestUrl;
-                try {
-                    String path = "/nifi-api/controller/reporting-tasks/node/" 
+ URLEncoder.encode(id, "UTF-8");
-                    requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
-                } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
-                    throw new ClusterRequestException(use);
-                }
+                URI requestUrl = getRequestURI(requestContext, id);
 
                 // set the request parameters
                 MultivaluedMap<String, String> parameters = new 
MultivaluedMapImpl();
@@ -581,8 +697,7 @@ public class StandardNiFiWebConfigurationContext implements 
NiFiWebConfiguration
             return getComponentConfiguration(reportingTask);
         }
 
-        @Override
-        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+        private ComponentDetails 
updateComponent(NiFiWebConfigurationRequestContext requestContext, String 
annotationData, Map<String, String> componentProperties) {
             final Revision revision = requestContext.getRevision();
             final String id = requestContext.getId();
 
@@ -590,8 +705,12 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
             if (reportingTaskProvider.getReportingTaskNode(id) != null) {
                 final ReportingTaskDTO reportingTaskDto = new 
ReportingTaskDTO();
                 reportingTaskDto.setId(id);
-                reportingTaskDto.setAnnotationData(annotationData);
-
+                if (annotationData != null) {
+                    reportingTaskDto.setAnnotationData(annotationData);
+                }
+                if (componentProperties != null) {
+                    reportingTaskDto.setProperties(componentProperties);
+                }
                 final ConfigurationSnapshot<ReportingTaskDTO> response = 
serviceFacade.updateReportingTask(revision, reportingTaskDto);
                 reportingTask = response.getConfiguration();
             } else {
@@ -608,29 +727,16 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
                 getComponentDetails(requestContext);
 
                 // create the request URL
-                URI requestUrl;
-                try {
-                    String path = "/nifi-api/controller/reporting-tasks/node/" 
+ URLEncoder.encode(id, "UTF-8");
-                    requestUrl = new URI(requestContext.getScheme(), null, 
"localhost", 0, path, null, null);
-                } catch (final URISyntaxException | 
UnsupportedEncodingException use) {
-                    throw new ClusterRequestException(use);
-                }
-
-                // create the revision
-                RevisionDTO revisionDto = new RevisionDTO();
-                revisionDto.setClientId(revision.getClientId());
-                revisionDto.setVersion(revision.getVersion());
+                URI requestUrl = getRequestURI(requestContext, id);
 
                 // create the reporting task entity
-                ReportingTaskEntity reportingTaskEntity = new 
ReportingTaskEntity();
-                reportingTaskEntity.setRevision(revisionDto);
-
-                // create the reporting task dto
-                ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO();
-                reportingTaskEntity.setReportingTask(reportingTaskDto);
-                reportingTaskDto.setId(id);
-                reportingTaskDto.setAnnotationData(annotationData);
-
+                ReportingTaskEntity reportingTaskEntity = 
getReportingTaskEntity(revision, id);
+                if (annotationData != null) {
+                    
reportingTaskEntity.getReportingTask().setAnnotationData(annotationData);
+                }
+                if (componentProperties != null) {
+                    
reportingTaskEntity.getReportingTask().setProperties(componentProperties);
+                }
                 // set the content type to json
                 final Map<String, String> headers = getHeaders(requestContext);
                 headers.put("Content-Type", "application/json");
@@ -653,6 +759,16 @@ public class StandardNiFiWebConfigurationContext 
implements NiFiWebConfiguration
             return getComponentConfiguration(reportingTask);
         }
 
+        @Override
+        public ComponentDetails setAnnotationData(final 
NiFiWebConfigurationRequestContext requestContext, final String annotationData) 
{
+            return updateComponent(requestContext, annotationData, null);
+        }
+
+        @Override
+        public ComponentDetails setProperties(final 
NiFiWebConfigurationRequestContext requestContext, final Map<String, String> 
componentProperties) {
+            return updateComponent(requestContext, null, componentProperties);
+        }
+
         private ComponentDetails getComponentConfiguration(final 
ReportingTaskDTO reportingTask) {
             return new ComponentDetails.Builder()
                     .id(reportingTask.getId())

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebContext.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebContext.java
index 9667ad6..96ed822 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebContext.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebContext.java
@@ -284,7 +284,7 @@ public class StandardNiFiWebContext implements 
NiFiWebContext {
                 throw new ClusterRequestException("Method resulted in an 
unsuccessful HTTP response code: " + 
nodeResponse.getClientResponse().getStatus());
             }
         } else {
-            serviceFacade.setProcessorAnnotationData(revision, processorId, 
annotationData);
+            serviceFacade.updateProcessor(revision, processorId, 
annotationData,null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ClusterResource.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ClusterResource.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ClusterResource.java
index 857df56..ee279a8 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ClusterResource.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ClusterResource.java
@@ -422,7 +422,7 @@ public class ClusterResource extends ApplicationResource {
     }
 
     /**
-     * Updates the processors annotation data.
+     * Updates the processor data.
      *
      * @param httpServletRequest request
      * @param processorId The id of the processor.
@@ -435,7 +435,7 @@ public class ClusterResource extends ApplicationResource {
     @Path("/processors/{id}")
     @PreAuthorize("hasAnyRole('ROLE_DFM')")
     @ApiOperation(
-            value = "Updates processor annotation data",
+            value = "Updates processor data",
             response = ProcessorEntity.class,
             authorizations = {
                 @Authorization(value = "Read Only", type = "ROLE_MONITOR"),
@@ -497,8 +497,8 @@ public class ClusterResource extends ApplicationResource {
 
             // update the processor
             final RevisionDTO revision = processorEntity.getRevision();
-            final ConfigurationSnapshot<ProcessorDTO> controllerResponse = 
serviceFacade.setProcessorAnnotationData(
-                    new Revision(revision.getVersion(), 
revision.getClientId()), processorId, config.getAnnotationData());
+            final ConfigurationSnapshot<ProcessorDTO> controllerResponse = 
serviceFacade.updateProcessor(
+                    new Revision(revision.getVersion(), 
revision.getClientId()), processorId, 
config.getAnnotationData(),config.getProperties());
 
             // get the processor dto
             final ProcessorDTO responseProcessorDTO = 
controllerResponse.getConfiguration();

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
index 84c8e60..bf3d8f5 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
@@ -628,6 +628,7 @@
                                 js/d3/**/*,
                                 js/codemirror/**/*,
                                 js/jquery/**/*,
+                                js/jsonlint/**/*,
                                 js/nf/nf-namespace.js,
                                 js/nf/nf-namespace.js.gz,
                                 js/nf/nf-universal-capture.js,
@@ -677,6 +678,7 @@
                                 <exclude>src/main/webapp/js/jquery/</exclude>
                                 
<exclude>src/main/webapp/js/d3/d3.min.js</exclude>
                                 
<exclude>src/main/webapp/js/codemirror/</exclude>
+                                <exclude>src/main/webapp/js/jsonlint/</exclude>
                                 
<exclude>src/main/webapp/css/reset.css</exclude>
                             </excludes>
                         </configuration>

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/META-INF/LICENSE
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/META-INF/LICENSE
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/META-INF/LICENSE
index 6769105..f43c255 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/META-INF/LICENSE
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/META-INF/LICENSE
@@ -454,3 +454,24 @@ This product bundles 'json2.js' which is available in the 
'public domain'.
 This product bundles 'reset.css' which is available in the 'public domain'.
     For details see http://meyerweb.com/eric/tools/css/reset/
 
+This product bundles 'jsonlint' which is available under an MIT license.
+
+    Copyright (C) 2012 Zachary Carter
+
+    Permission is hereby granted, free of charge, to any person obtaining a 
copy
+    of this software and associated documentation files (the "Software"), to 
deal
+    in the Software without restriction, including without limitation the 
rights
+    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    copies of the Software, and to permit persons to whom the Software is
+    furnished to do so, subject to the following conditions:
+
+    The above copyright notice and this permission notice shall be included in
+    all copies or substantial portions of the Software.
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/nifi/blob/03dfff2e/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/codemirror/addon/lint/json-lint.js
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/codemirror/addon/lint/json-lint.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/codemirror/addon/lint/json-lint.js
new file mode 100644
index 0000000..9dbb616
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/codemirror/addon/lint/json-lint.js
@@ -0,0 +1,31 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// Depends on jsonlint.js from https://github.com/zaach/jsonlint
+
+// declare global: jsonlint
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.registerHelper("lint", "json", function(text) {
+  var found = [];
+  jsonlint.parseError = function(str, hash) {
+    var loc = hash.loc;
+    found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
+                to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
+                message: str});
+  };
+  try { jsonlint.parse(text); }
+  catch(e) {}
+  return found;
+});
+
+});

Reply via email to