You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@falcon.apache.org by ra...@apache.org on 2015/07/16 02:21:50 UTC

falcon git commit: FALCON-1278 Submitted entity properties must have unique names contributed by Raghav Kumar Gautam

Repository: falcon
Updated Branches:
  refs/heads/master 9f69ae271 -> 5f58c380b


FALCON-1278 Submitted entity properties must have unique names contributed by Raghav Kumar Gautam


Project: http://git-wip-us.apache.org/repos/asf/falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/falcon/commit/5f58c380
Tree: http://git-wip-us.apache.org/repos/asf/falcon/tree/5f58c380
Diff: http://git-wip-us.apache.org/repos/asf/falcon/diff/5f58c380

Branch: refs/heads/master
Commit: 5f58c380bf28d91a40d7a1a640bec742b4b72e12
Parents: 9f69ae2
Author: Raghav Kumar Gautam <ra...@apache.org>
Authored: Wed Jul 15 17:19:11 2015 -0700
Committer: Raghav Kumar Gautam <ra...@apache.org>
Committed: Wed Jul 15 17:21:37 2015 -0700

----------------------------------------------------------------------
 falcon-regression/CHANGES.txt                   |  2 +
 .../regression/Entities/ClusterMerlin.java      | 24 +++++++--
 .../falcon/regression/Entities/FeedMerlin.java  | 42 +++++++--------
 .../regression/Entities/ProcessMerlin.java      | 57 +++++++++++---------
 .../falcon/regression/core/bundle/Bundle.java   | 11 ++--
 .../falcon/regression/core/util/BundleUtil.java | 42 ++++-----------
 .../regression/ui/search/ClusterWizardPage.java |  2 +-
 .../falcon/regression/AuthorizationTest.java    |  6 +--
 .../regression/EmbeddedPigScriptTest.java       | 15 ++----
 .../apache/falcon/regression/LogMoverTest.java  | 24 ++++-----
 .../regression/prism/EntityDryRunTest.java      |  6 +--
 .../falcon/regression/prism/FeedDelayTest.java  |  4 +-
 .../regression/prism/PrismFeedUpdateTest.java   |  5 +-
 .../prism/ProcessPartitionExpVariableTest.java  | 11 ++--
 .../prism/UpdateAtSpecificTimeTest.java         |  4 +-
 .../falcon/regression/security/FeedAclTest.java |  8 +--
 .../regression/security/ProcessAclTest.java     |  8 +--
 17 files changed, 119 insertions(+), 152 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/CHANGES.txt
----------------------------------------------------------------------
diff --git a/falcon-regression/CHANGES.txt b/falcon-regression/CHANGES.txt
index b062872..ebfc0cb 100644
--- a/falcon-regression/CHANGES.txt
+++ b/falcon-regression/CHANGES.txt
@@ -357,6 +357,8 @@ Trunk (Unreleased)
    FALCON-681 delete duplicate feed retention test from falcon regression (SamarthG)
 
   BUG FIXES
+   FALCON-1278 Submitted entity properties must have unique names (Raghav Kumar Gautam)
+
    FALCON-1300 Use xml instead of properties for log4j (Raghav Kumar Gautam via Ruslan Ostafiychuk)
 
    FALCON-1290 Push Enter in start/end filter on entity page, start instance is included (Ruslan Ostafiychuk)

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ClusterMerlin.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ClusterMerlin.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ClusterMerlin.java
index 0198e19..fe1338a 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ClusterMerlin.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ClusterMerlin.java
@@ -169,11 +169,29 @@ public class ClusterMerlin extends Cluster {
         getLocations().getLocations().add(newLocation);
     }
 
-    public void addProperty(String name, String value) {
-        Property property = new Property();
+    /**
+     * Add/replace a property.
+     * @param name name of the property
+     * @param value value of the property
+     * @return this
+     */
+    public ClusterMerlin withProperty(String name, String value) {
+        final List<Property> properties = getProperties().getProperties();
+        //if property with same name exists, just replace the value
+        for (Property property : properties) {
+            if (property.getName().equals(name)) {
+                LOGGER.info(String.format("Overwriting property name = %s oldVal = %s newVal = %s",
+                    property.getName(), property.getValue(), value));
+                property.setValue(value);
+                return this;
+            }
+        }
+        //if property is not added already, add it
+        final Property property = new Property();
         property.setName(name);
         property.setValue(value);
-        getProperties().getProperties().add(property);
+        properties.add(property);
+        return this;
     }
 
     public void addInterface(Interfacetype type, String endpoint, String version) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
index 787ddc1..ba1d228 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/FeedMerlin.java
@@ -88,26 +88,27 @@ public class FeedMerlin extends Feed {
     }
 
     /**
-     * Sets custom feed property.
-     * @param propertyName custom property name
-     * @param propertyValue custom property value
+     * Add/replace a property.
+     * @param name name of the property
+     * @param value value of the property
+     * @return this
      */
-    public FeedMerlin setFeedProperty(String propertyName, String propertyValue) {
-        boolean found = false;
-        for (Property prop : this.getProperties().getProperties()) {
-            //check if it is present
-            if (prop.getName().equalsIgnoreCase(propertyName)) {
-                prop.setValue(propertyValue);
-                found = true;
-                break;
+    public FeedMerlin withProperty(String name, String value) {
+        final List<Property> properties = getProperties().getProperties();
+        //if property with same name exists, just replace the value
+        for (Property property : properties) {
+            if (property.getName().equals(name)) {
+                LOGGER.info(String.format("Overwriting property name = %s oldVal = %s newVal = %s",
+                    property.getName(), property.getValue(), value));
+                property.setValue(value);
+                return this;
             }
         }
-        if (!found) {
-            Property property = new Property();
-            property.setName(propertyName);
-            property.setValue(propertyValue);
-            this.getProperties().getProperties().add(property);
-        }
+        //if property is not added already, add it
+        final Property property = new Property();
+        property.setName(name);
+        property.setValue(value);
+        properties.add(property);
         return this;
     }
 
@@ -288,13 +289,6 @@ public class FeedMerlin extends Feed {
         }
     }
 
-    public void addProperty(String someProp, String someVal) {
-        Property property = new Property();
-        property.setName(someProp);
-        property.setValue(someVal);
-        this.getProperties().getProperties().add(property);
-    }
-
     /**
      * Sets unique names for the feed.
      * @return mapping of old name to new name

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ProcessMerlin.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ProcessMerlin.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ProcessMerlin.java
index 615587d..ae5c70c 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ProcessMerlin.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/Entities/ProcessMerlin.java
@@ -24,10 +24,9 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.falcon.entity.v0.EntityType;
 import org.apache.falcon.entity.v0.Frequency;
-import org.apache.falcon.entity.v0.process.EngineType;
-import org.apache.falcon.entity.v0.process.Sla;
 import org.apache.falcon.entity.v0.process.ACL;
 import org.apache.falcon.entity.v0.process.Cluster;
+import org.apache.falcon.entity.v0.process.EngineType;
 import org.apache.falcon.entity.v0.process.Input;
 import org.apache.falcon.entity.v0.process.Inputs;
 import org.apache.falcon.entity.v0.process.Output;
@@ -35,6 +34,7 @@ import org.apache.falcon.entity.v0.process.Outputs;
 import org.apache.falcon.entity.v0.process.Process;
 import org.apache.falcon.entity.v0.process.Properties;
 import org.apache.falcon.entity.v0.process.Property;
+import org.apache.falcon.entity.v0.process.Sla;
 import org.apache.falcon.entity.v0.process.Validity;
 import org.apache.falcon.entity.v0.process.Workflow;
 import org.apache.falcon.regression.core.util.TimeUtil;
@@ -182,19 +182,35 @@ public class ProcessMerlin extends Process {
         }
     }
 
-    public final void setProperty(String name, String value) {
-        Property p = new Property();
-        p.setName(name);
-        p.setValue(value);
-        if (null == getProperties() || null == getProperties()
-            .getProperties() || getProperties().getProperties().size()
-            <= 0) {
-            Properties props = new Properties();
-            props.getProperties().add(p);
-            setProperties(props);
-        } else {
-            getProperties().getProperties().add(p);
+    public final ProcessMerlin clearProperties() {
+        final Properties properties = new Properties();
+        setProperties(properties);
+        return this;
+    }
+
+    /**
+     * Add/replace a property.
+     * @param name name of the property
+     * @param value value of the property
+     * @return this
+     */
+    public final ProcessMerlin withProperty(String name, String value) {
+        final List<Property> properties = getProperties().getProperties();
+        //if property with same name exists, just replace the value
+        for (Property property : properties) {
+            if (property.getName().equals(name)) {
+                LOGGER.info(String.format("Overwriting property name = %s oldVal = %s newVal = %s",
+                    property.getName(), property.getValue(), value));
+                property.setValue(value);
+                return this;
+            }
         }
+        //if property is not added already, add it
+        final Property property = new Property();
+        property.setName(name);
+        property.setValue(value);
+        properties.add(property);
+        return this;
     }
 
     @Override
@@ -431,17 +447,6 @@ public class ProcessMerlin extends Process {
     }
 
     /**
-     * Adds optional property to process definition.
-     *
-     * @param properties desired properties to be added
-     */
-    public void addProperties(Property... properties) {
-        for (Property property : properties) {
-            this.getProperties().getProperties().add(property);
-        }
-    }
-
-    /**
      * Changes names of process inputs.
      *
      * @param names desired names of inputs
@@ -608,7 +613,7 @@ public class ProcessMerlin extends Process {
         draft.getOutputs().getOutputs().clear();
         draft.setRetry(null);
         draft.clearProcessCluster();
-        draft.getProperties().getProperties().clear();
+        draft.clearProperties();
         draft.setFrequency(null);
         draft.setOrder(null);
         draft.setTimezone(null);

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
index c8f2320..f463f91 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/bundle/Bundle.java
@@ -27,7 +27,6 @@ import org.apache.falcon.entity.v0.feed.Feed;
 import org.apache.falcon.entity.v0.process.Cluster;
 import org.apache.falcon.entity.v0.process.EngineType;
 import org.apache.falcon.entity.v0.process.LateProcess;
-import org.apache.falcon.entity.v0.process.Property;
 import org.apache.falcon.entity.v0.process.Retry;
 import org.apache.falcon.regression.Entities.ClusterMerlin;
 import org.apache.falcon.regression.Entities.FeedMerlin;
@@ -795,10 +794,8 @@ public class Bundle {
      *
      * @param properties desired properties to be added
      */
-    public void addProcessProperty(Property... properties) {
-        ProcessMerlin p = new ProcessMerlin(processData);
-        p.addProperties(properties);
-        processData = p.toString();
+    public void addProcessProperty(String propName, String propValue) {
+        processData = new ProcessMerlin(processData).withProperty(propName, propValue).toString();
     }
 
     /**
@@ -840,10 +837,8 @@ public class Bundle {
     }
 
     public void setProcessProperty(String property, String value) {
-        ProcessMerlin process = new ProcessMerlin(this.getProcessData());
-        process.setProperty(property, value);
+        ProcessMerlin process = getProcessObject().withProperty(property, value);
         this.setProcessData(process.toString());
-
     }
 
     public String getDatasetPath() {

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/BundleUtil.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/BundleUtil.java b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/BundleUtil.java
index bda5c23..16ff6cb 100644
--- a/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/BundleUtil.java
+++ b/falcon-regression/merlin-core/src/main/java/org/apache/falcon/regression/core/util/BundleUtil.java
@@ -25,7 +25,6 @@ import org.apache.falcon.entity.v0.cluster.ClusterLocationType;
 import org.apache.falcon.entity.v0.cluster.Interface;
 import org.apache.falcon.entity.v0.cluster.Interfacetype;
 import org.apache.falcon.entity.v0.cluster.Location;
-import org.apache.falcon.entity.v0.cluster.Property;
 import org.apache.falcon.regression.Entities.ClusterMerlin;
 import org.apache.falcon.regression.Entities.FeedMerlin;
 import org.apache.falcon.regression.Entities.ProcessMerlin;
@@ -132,9 +131,7 @@ public final class BundleUtil {
                 final String protectionPropName = "hadoop.rpc.protection";
                 final String protectionPropValue = Config.getProperty(protectionPropName);
                 if (StringUtils.isNotEmpty(protectionPropValue)) {
-                    final Property property = getFalconClusterPropertyObject(
-                        protectionPropName, protectionPropValue.trim());
-                    clusterMerlin.getProperties().getProperties().add(property);
+                    clusterMerlin.withProperty(protectionPropName, protectionPropValue.trim());
                 }
                 clusterData = clusterMerlin.toString();
             } else if (data.contains("uri:falcon:feed:0.1")) {
@@ -198,56 +195,35 @@ public final class BundleUtil {
         }
         //set colo name:
         clusterObject.setColo(Config.getProperty(prefix + "colo"));
-        // get the properties object for the cluster
-        org.apache.falcon.entity.v0.cluster.Properties clusterProperties =
-            clusterObject.getProperties();
         // properties in the cluster needed when secure mode is on
         if (MerlinConstants.IS_SECURE) {
             // add the namenode principal to the properties object
-            clusterProperties.getProperties().add(getFalconClusterPropertyObject(
-                    "dfs.namenode.kerberos.principal",
-                    Config.getProperty(prefix + "namenode.kerberos.principal", "none")));
+            clusterObject.withProperty("dfs.namenode.kerberos.principal",
+                Config.getProperty(prefix + "namenode.kerberos.principal", "none"));
 
             // add the hive meta store principal to the properties object
-            clusterProperties.getProperties().add(getFalconClusterPropertyObject(
-                    "hive.metastore.kerberos.principal",
-                    Config.getProperty(prefix + "hive.metastore.kerberos.principal", "none")));
+            clusterObject.withProperty("hive.metastore.kerberos.principal",
+                Config.getProperty(prefix + "hive.metastore.kerberos.principal", "none"));
 
-            // Until oozie has better integration with secure hive we need to send the properites to
+            // Until oozie has better integration with secure hive we need to send the properties to
             // falcon.
             // hive.metastore.sasl.enabled = true
-            clusterProperties.getProperties()
-                .add(getFalconClusterPropertyObject("hive.metastore.sasl.enabled", "true"));
+            clusterObject.withProperty("hive.metastore.sasl.enabled", "true");
             // Only set the metastore uri if its not empty or null.
         }
         String hiveMetastoreUris = Config.getProperty(prefix + "hive.metastore.uris");
         if (StringUtils.isNotBlank(hiveMetastoreUris)) {
             //hive.metastore.uris
-            clusterProperties.getProperties()
-                .add(getFalconClusterPropertyObject("hive.metastore.uris", hiveMetastoreUris));
+            clusterObject.withProperty("hive.metastore.uris", hiveMetastoreUris);
         }
         String hiveServer2Uri = Config.getProperty(prefix + "hive.server2.uri");
         if (StringUtils.isNotBlank(hiveServer2Uri)) {
             //hive.metastore.uris
-            clusterProperties.getProperties()
-                .add(getFalconClusterPropertyObject("hive.server2.uri", hiveServer2Uri));
+            clusterObject.withProperty("hive.server2.uri", hiveServer2Uri);
         }
         return clusterObject;
     }
 
-    /**
-     * Forms property object based on parameters.
-     * @param name property name
-     * @param value property value
-     * @return property object
-     */
-    private static Property getFalconClusterPropertyObject(String name, String value) {
-        Property property = new Property();
-        property.setName(name);
-        property.setValue(value);
-        return property;
-    }
-
     public static List<ClusterMerlin> getClustersFromStrings(List<String> clusterStrings) {
         List<ClusterMerlin> clusters = new ArrayList<>();
         for (String clusterString : clusterStrings) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
index cb6315b..0d0abe6 100644
--- a/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
+++ b/falcon-regression/merlin/src/main/java/org/apache/falcon/regression/ui/search/ClusterWizardPage.java
@@ -369,7 +369,7 @@ public class ClusterWizardPage extends AbstractSearchPage {
                 int indx = line.indexOf(":");
                 String name = line.substring(0, indx).trim();
                 String value = line.substring(indx + 1, line.length()).trim();
-                cluster.addProperty(name, value);
+                cluster.withProperty(name, value);
             }
         }
         //retrieve locations

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/AuthorizationTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/AuthorizationTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/AuthorizationTest.java
index e09033f..9c37562 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/AuthorizationTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/AuthorizationTest.java
@@ -693,8 +693,7 @@ public class AuthorizationTest extends BaseTestClass {
         String oldFeedBundleId = OozieUtil.getLatestBundleID(clusterOC, Util.readEntityName(feed), EntityType.FEED);
 
         //update process by U1
-        ProcessMerlin processObj = bundles[0].getProcessObject();
-        processObj.setProperty("randomProp", "randomVal");
+        ProcessMerlin processObj = bundles[0].getProcessObject().withProperty("randomProp", "randomVal");
         serviceResponse = prism.getProcessHelper().update(bundles[0].getProcessData(), processObj.toString());
         AssertUtil.assertSucceeded(serviceResponse);
 
@@ -735,8 +734,7 @@ public class AuthorizationTest extends BaseTestClass {
         String oldFeedBundleId = OozieUtil.getLatestBundleID(clusterOC, Util.readEntityName(feed), EntityType.FEED);
 
         //update process by U2
-        ProcessMerlin processObj = bundles[0].getProcessObject();
-        processObj.setProperty("randomProp", "randomVal");
+        ProcessMerlin processObj = bundles[0].getProcessObject().withProperty("randomProp", "randomVal");
         serviceResponse = prism.getProcessHelper().update(bundles[0].getProcessData(), processObj.toString(),
             MerlinConstants.USER2_NAME);
         AssertUtil.assertSucceeded(serviceResponse);

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/EmbeddedPigScriptTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/EmbeddedPigScriptTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/EmbeddedPigScriptTest.java
index 4fb3c4a..87fab7c 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/EmbeddedPigScriptTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/EmbeddedPigScriptTest.java
@@ -18,13 +18,11 @@
 
 package org.apache.falcon.regression;
 
-import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.entity.v0.EntityType;
 import org.apache.falcon.entity.v0.Frequency.TimeUnit;
 import org.apache.falcon.entity.v0.process.EngineType;
-import org.apache.falcon.entity.v0.process.Process;
-import org.apache.falcon.entity.v0.process.Properties;
-import org.apache.falcon.entity.v0.process.Property;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
+import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.regression.core.enumsAndConstants.ResponseErrors;
 import org.apache.falcon.regression.core.helpers.ColoHelper;
 import org.apache.falcon.regression.core.response.ServiceResponse;
@@ -100,13 +98,8 @@ public class EmbeddedPigScriptTest extends BaseTestClass {
         bundles[0].setProcessPeriodicity(5, TimeUnit.minutes);
         bundles[0].setOutputFeedPeriodicity(5, TimeUnit.minutes);
 
-        final Process processElement = bundles[0].getProcessObject();
-        final Properties properties = new Properties();
-        final Property property = new Property();
-        property.setName("queueName");
-        property.setValue("default");
-        properties.getProperties().add(property);
-        processElement.setProperties(properties);
+        final ProcessMerlin processElement = bundles[0].getProcessObject();
+        processElement.clearProperties().withProperty("queueName", "default");
         processElement.getWorkflow().setEngine(EngineType.PIG);
         bundles[0].setProcessData(processElement.toString());
         bundles[0].submitFeedsScheduleProcess(prism);

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/LogMoverTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/LogMoverTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/LogMoverTest.java
index 56fe8ab..5398581 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/LogMoverTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/LogMoverTest.java
@@ -18,14 +18,19 @@
 
 package org.apache.falcon.regression;
 
-import org.apache.falcon.entity.v0.process.Process;
-import org.apache.falcon.entity.v0.process.Properties;
-import org.apache.falcon.entity.v0.process.Property;
-import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.entity.v0.EntityType;
 import org.apache.falcon.entity.v0.Frequency.TimeUnit;
+import org.apache.falcon.regression.Entities.ProcessMerlin;
+import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.regression.core.helpers.ColoHelper;
-import org.apache.falcon.regression.core.util.*;
+import org.apache.falcon.regression.core.util.AssertUtil;
+import org.apache.falcon.regression.core.util.BundleUtil;
+import org.apache.falcon.regression.core.util.HadoopUtil;
+import org.apache.falcon.regression.core.util.InstanceUtil;
+import org.apache.falcon.regression.core.util.OSUtil;
+import org.apache.falcon.regression.core.util.OozieUtil;
+import org.apache.falcon.regression.core.util.TimeUtil;
+import org.apache.falcon.regression.core.util.Util;
 import org.apache.falcon.regression.testHelper.BaseTestClass;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.log4j.Logger;
@@ -88,13 +93,8 @@ public class LogMoverTest extends BaseTestClass {
                 bundles[0].getFeedDataPathPrefix(), dataDates);
 
         // Defining path to be used in pig script
-        final Process processElement = bundles[0].getProcessObject();
-        final Properties properties = new Properties();
-        final Property property = new Property();
-        property.setName("inputPath");
-        property.setValue(propPath);
-        properties.getProperties().add(property);
-        processElement.setProperties(properties);
+        final ProcessMerlin processElement = bundles[0].getProcessObject();
+        processElement.clearProperties().withProperty("inputPath", propPath);
         bundles[0].setProcessData(processElement.toString());
         process = bundles[0].getProcessData();
         processName = Util.readEntityName(process);

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/EntityDryRunTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/EntityDryRunTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/EntityDryRunTest.java
index 529df25..4dc776f 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/EntityDryRunTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/EntityDryRunTest.java
@@ -115,8 +115,8 @@ public class EntityDryRunTest extends BaseTestClass {
      */
     @Test(groups = {"singleCluster"})
     public void testDryRunFailureScheduleFeed() throws Exception {
-        FeedMerlin feed = new FeedMerlin(bundles[0].getInputFeedFromBundle());
-        feed.setFeedProperty("EntityDryRunTestProp", "${coord:someEL(1)");
+        FeedMerlin feed = new FeedMerlin(bundles[0].getInputFeedFromBundle())
+            .withProperty("EntityDryRunTestProp", "${coord:someEL(1)");
         bundles[0].submitClusters(prism);
         ServiceResponse response = prism.getFeedHelper().submitAndSchedule(feed.toString());
         validate(response,
@@ -132,7 +132,7 @@ public class EntityDryRunTest extends BaseTestClass {
         FeedMerlin feed = new FeedMerlin(bundles[0].getInputFeedFromBundle());
         ServiceResponse response = prism.getFeedHelper().submitAndSchedule(feed.toString());
         AssertUtil.assertSucceeded(response);
-        feed.setFeedProperty("EntityDryRunTestProp", "${coord:someEL(1)");
+        feed.withProperty("EntityDryRunTestProp", "${coord:someEL(1)");
         response = prism.getFeedHelper().update(feed.toString(), feed.toString());
         validate(response, "The new entity (feed) " + bundles[0].getInputFeedNameFromBundle()
             + " can't be scheduled");

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/FeedDelayTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/FeedDelayTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/FeedDelayTest.java
index e43621a..22aabfa 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/FeedDelayTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/FeedDelayTest.java
@@ -123,8 +123,8 @@ public class FeedDelayTest extends BaseTestClass {
                         .withDataLocation(targetDataLocation)
                         .build()).toString();
 
-        feed = FeedMerlin.fromString(feed).setFeedProperty("timeout", "minutes(35)").toString();
-        feed = FeedMerlin.fromString(feed).setFeedProperty("parallel", "3").toString();
+        feed = FeedMerlin.fromString(feed).withProperty("timeout", "minutes(35)").toString();
+        feed = FeedMerlin.fromString(feed).withProperty("parallel", "3").toString();
 
         LOGGER.info("feed : " + Util.prettyPrintXml(feed));
         AssertUtil.assertSucceeded(prism.getFeedHelper().submitAndSchedule(feed));

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/PrismFeedUpdateTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/PrismFeedUpdateTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/PrismFeedUpdateTest.java
index 35806fd..5e868e2 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/PrismFeedUpdateTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/PrismFeedUpdateTest.java
@@ -204,7 +204,7 @@ public class PrismFeedUpdateTest extends BaseTestClass {
             CoordinatorAction.Status.RUNNING, EntityType.PROCESS, 1);
 
         //change feed location path
-        outputFeed.setFeedProperty("queueName", "myQueue");
+        outputFeed.withProperty("queueName", "myQueue");
         LOGGER.info("updated feed: " + Util.prettyPrintXml(outputFeed.toString()));
 
         //update feed first time
@@ -229,8 +229,7 @@ public class PrismFeedUpdateTest extends BaseTestClass {
         OozieUtil.waitForBundleToReachState(cluster1OC, bundles[0].getProcessName(),
             Job.Status.SUCCEEDED, 20);
 
-        FeedMerlin feed = new FeedMerlin(bundles[0].getDataSets().get(0));
-        feed.addProperty("someProp", "someVal");
+        FeedMerlin feed = new FeedMerlin(bundles[0].getDataSets().get(0)).withProperty("someProp", "someVal");
         AssertUtil.assertSucceeded(prism.getFeedHelper().update(feed.toString(), feed.toString()));
         //check for new feed bundle creation
         Assert.assertEquals(OozieUtil.getNumberOfBundle(cluster1OC, EntityType.FEED,

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/ProcessPartitionExpVariableTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/ProcessPartitionExpVariableTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/ProcessPartitionExpVariableTest.java
index 20c60d2..30b20c5 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/ProcessPartitionExpVariableTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/ProcessPartitionExpVariableTest.java
@@ -18,9 +18,8 @@
 
 package org.apache.falcon.regression.prism;
 
-import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.entity.v0.EntityType;
-import org.apache.falcon.entity.v0.process.Property;
+import org.apache.falcon.regression.core.bundle.Bundle;
 import org.apache.falcon.regression.core.helpers.ColoHelper;
 import org.apache.falcon.regression.core.util.BundleUtil;
 import org.apache.falcon.regression.core.util.HadoopUtil;
@@ -30,6 +29,7 @@ import org.apache.falcon.regression.core.util.TimeUtil;
 import org.apache.falcon.regression.core.util.Util;
 import org.apache.falcon.regression.testHelper.BaseTestClass;
 import org.apache.hadoop.fs.FileSystem;
+import org.apache.log4j.Logger;
 import org.apache.oozie.client.CoordinatorAction;
 import org.apache.oozie.client.OozieClient;
 import org.joda.time.DateTime;
@@ -39,7 +39,6 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
-import org.apache.log4j.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -91,11 +90,7 @@ public class ProcessPartitionExpVariableTest extends BaseTestClass {
 
         bundles[0].generateRequiredBundle(1, 2, 1, baseTestDir, 1, startTime, endTime);
         bundles[0].setProcessInputNames("inputData0", "inputData");
-        Property p = new Property();
-        p.setName("var1");
-        p.setValue("hardCoded");
-
-        bundles[0].addProcessProperty(p);
+        bundles[0].addProcessProperty("var1", "hardCoded");
         bundles[0].setProcessInputPartition("${var1}", "${fileTime}");
 
         for (int i = 0; i < bundles[0].getDataSets().size(); i++) {

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/UpdateAtSpecificTimeTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/UpdateAtSpecificTimeTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/UpdateAtSpecificTimeTest.java
index 189ef2f..e10f8d1 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/UpdateAtSpecificTimeTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/prism/UpdateAtSpecificTimeTest.java
@@ -284,7 +284,7 @@ public class UpdateAtSpecificTimeTest extends BaseTestClass {
             Util.shutDownService(cluster2.getProcessHelper());
 
             //add some property to feed so that new bundle is created
-            FeedMerlin updatedFeed = new FeedMerlin(feed).setFeedProperty("someProp", "someVal");
+            FeedMerlin updatedFeed = new FeedMerlin(feed).withProperty("someProp", "someVal");
 
             //save old data
             String oldBundleCluster1 = OozieUtil.getLatestBundleID(cluster1OC,
@@ -398,7 +398,7 @@ public class UpdateAtSpecificTimeTest extends BaseTestClass {
         String oldBundleID = OozieUtil.getLatestBundleID(cluster1OC,
             Util.readEntityName(feed), EntityType.FEED);
         String updateTime = TimeUtil.addMinsToTime(endTime, 60);
-        FeedMerlin updatedFeed = new FeedMerlin(feed).setFeedProperty("someProp", "someVal");
+        FeedMerlin updatedFeed = new FeedMerlin(feed).withProperty("someProp", "someVal");
         LOGGER.info("Original Feed : " + Util.prettyPrintXml(feed));
         LOGGER.info("Updated Feed :" + Util.prettyPrintXml(updatedFeed.toString()));
         LOGGER.info("Update Time : " + updateTime);

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/FeedAclTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/FeedAclTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/FeedAclTest.java
index 6144c69..9259f5e 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/FeedAclTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/FeedAclTest.java
@@ -119,9 +119,7 @@ public class FeedAclTest extends BaseTestClass {
         bundles[0].submitClusters(prism);
         bundles[0].submitFeeds(prism);
         if (op == EntityOp.update) {
-            FeedMerlin feedMerlin = new FeedMerlin(feedString);
-            feedMerlin.addProperty("abc", "xyz");
-            feedString = feedMerlin.toString();
+            feedString = new FeedMerlin(feedString).withProperty("abc", "xyz").toString();
         }
         final boolean executeRes = op.executeAs(user, feedHelper, feedString);
         Assert.assertEquals(executeRes, isAllowed, "Unexpected result user " + user
@@ -164,9 +162,7 @@ public class FeedAclTest extends BaseTestClass {
         if (op == EntityOp.resume) {
             feedHelper.suspend(feedString);
         } else if (op == EntityOp.update) {
-            FeedMerlin feedMerlin = new FeedMerlin(feedString);
-            feedMerlin.addProperty("abc", "xyz");
-            feedString = feedMerlin.toString();
+            feedString = new FeedMerlin(feedString).withProperty("abc", "xyz").toString();
         }
         final boolean executeRes = op.executeAs(user, feedHelper, feedString);
         Assert.assertEquals(executeRes, isAllowed, "Unexpected result user " + user

http://git-wip-us.apache.org/repos/asf/falcon/blob/5f58c380/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/ProcessAclTest.java
----------------------------------------------------------------------
diff --git a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/ProcessAclTest.java b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/ProcessAclTest.java
index b649915..eb05859 100644
--- a/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/ProcessAclTest.java
+++ b/falcon-regression/merlin/src/test/java/org/apache/falcon/regression/security/ProcessAclTest.java
@@ -126,9 +126,7 @@ public class ProcessAclTest extends BaseTestClass {
         throws Exception {
         bundles[0].submitProcess(true);
         if (op == EntityOp.update) {
-            ProcessMerlin processMerlin = new ProcessMerlin(processString);
-            processMerlin.setProperty("abc", "xyz");
-            processString = processMerlin.toString();
+            processString = new ProcessMerlin(processString).withProperty("abc", "xyz").toString();
         }
         final boolean executeRes = op.executeAs(user, processHelper, processString);
         Assert.assertEquals(executeRes, isAllowed, "Unexpected result user " + user
@@ -172,9 +170,7 @@ public class ProcessAclTest extends BaseTestClass {
         if (op == EntityOp.resume) {
             processHelper.suspend(processString);
         } else if (op == EntityOp.update) {
-            ProcessMerlin processMerlin = new ProcessMerlin(processString);
-            processMerlin.setProperty("abc", "xyz");
-            processString = processMerlin.toString();
+            processString = new ProcessMerlin(processString).withProperty("abc", "xyz").toString();
         }
         final boolean executeRes = op.executeAs(user, processHelper, processString);
         Assert.assertEquals(executeRes, isAllowed, "Unexpected result user " + user