fix for SYNAPSE-1010 by buddhima, modified and with a test case

git-svn-id: https://svn.apache.org/repos/asf/synapse/trunk@1745076 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java b/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
index 18d57b9..c81892c 100644
--- a/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
+++ b/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMessageContext.java
@@ -237,6 +237,47 @@
         }
     }
 
+    /**
+     * Remove property from message context
+     * Scope: Default
+     *
+     * @param key Property name
+     */
+    public void removeProperty(String key) {
+        Set pros = mc.getPropertyKeySet();
+        if (pros != null) {
+            pros.remove(key);
+        }
+    }
+
+    /**
+     * Remove property from message context
+     *
+     * @param key   Property name
+     * @param scope Property scope
+     */
+    public void removeProperty(String key, String scope) {
+        if (scope == null || XMLConfigConstants.SCOPE_DEFAULT.equals(scope)) {
+            // Removing property from default scope
+            removeProperty(key);
+        } else if (XMLConfigConstants.SCOPE_AXIS2.equals(scope)) {
+            // Removing property from the Axis2 Message Context
+            Axis2MessageContext axis2smc = (Axis2MessageContext) mc;
+            org.apache.axis2.context.MessageContext axis2MessageCtx = axis2smc.getAxis2MessageContext();
+            axis2MessageCtx.removeProperty(key);
+
+        } else if (XMLConfigConstants.SCOPE_TRANSPORT.equals(scope)) {
+            // Removing transport headers
+            Axis2MessageContext axis2smc = (Axis2MessageContext) mc;
+            org.apache.axis2.context.MessageContext axis2MessageCtx = axis2smc.getAxis2MessageContext();
+            Object headers = axis2MessageCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+            if (headers != null && headers instanceof Map) {
+                Map headersMap = (Map) headers;
+                headersMap.remove(key);
+            }
+        }
+    }
+
     public Set getPropertyKeySet() {
         return mc.getPropertyKeySet();
     }
diff --git a/java/modules/extensions/src/test/java/org/apache/synapse/mediators/bsf/ScriptMediatorTest.java b/java/modules/extensions/src/test/java/org/apache/synapse/mediators/bsf/ScriptMediatorTest.java
index cfa733c..ec5009f 100644
--- a/java/modules/extensions/src/test/java/org/apache/synapse/mediators/bsf/ScriptMediatorTest.java
+++ b/java/modules/extensions/src/test/java/org/apache/synapse/mediators/bsf/ScriptMediatorTest.java
@@ -28,6 +28,7 @@
 import org.apache.synapse.core.axis2.Axis2MessageContext;
 import org.apache.synapse.mediators.TestUtils;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Random;
 
@@ -88,6 +89,43 @@
 
     }
 
+    public void testRemoveProperty() throws Exception {
+        MessageContext mc = TestUtils.getAxis2MessageContext("<empty/>", null);
+
+        // Setting properties
+        mc.setProperty("PROP_DEFAULT", "PROP_DEFAULT_VAL");
+
+        Axis2MessageContext axis2smc = (Axis2MessageContext) mc;
+        org.apache.axis2.context.MessageContext axis2MessageCtx = axis2smc.getAxis2MessageContext();
+        axis2MessageCtx.setProperty("PROP_AXIS2", "PROP_AXIS2_VAL");
+
+        Map headersMap = new HashMap();
+        headersMap.put("PROP_TRP", "PROP_TRP_VAL");
+        axis2MessageCtx.setProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, headersMap);
+
+        // For default scope
+        String removalScript = "mc.removeProperty(\"PROP_DEFAULT\");";
+        ScriptMediator mediator = new ScriptMediator("js", removalScript, null);
+        mediator.mediate(mc);
+        assertNull(mc.getProperty("PROP_DEFAULT"));
+
+        // For Axis2 scope
+        removalScript = "mc.removeProperty(\"PROP_AXIS2\",\"axis2\");";
+        mediator = new ScriptMediator("js", removalScript, null);
+        mediator.mediate(mc);
+        assertNull(axis2MessageCtx.getProperty("PROP_AXIS2"));
+
+        // For Transport scope
+        removalScript = "mc.removeProperty(\"PROP_TRP\",\"transport\");";
+        mediator = new ScriptMediator("js", removalScript, null);
+        mediator.mediate(mc);
+        Object headers = axis2MessageCtx.getProperty(
+                org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+
+        headersMap = (Map) headers;
+        assertNull(headersMap.get("PROP_TRP"));
+    }
+
     public static Test suite() {
         TestSuite suite = new TestSuite();
         suite.addTest(new ScriptMediatorTest("testInlineMediator"));
@@ -95,6 +133,7 @@
             suite.addTest(new RepeatedTest(new ScriptMediatorTest("testThreadSafety"), 10));
         }
         suite.addTest(new ScriptMediatorTest("testSetProperty"));
+        suite.addTest(new ScriptMediatorTest("testRemoveProperty"));
         return suite;
     }