You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by ru...@apache.org on 2010/02/25 15:50:48 UTC

svn commit: r916303 - in /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse: config/xml/PropertyMediatorFactory.java config/xml/PropertyMediatorSerializer.java mediators/builtin/PropertyMediator.java

Author: ruwan
Date: Thu Feb 25 14:50:47 2010
New Revision: 916303

URL: http://svn.apache.org/viewvc?rev=916303&view=rev
Log:
Fixing the issue SYNAPSE-588, committing for Supun

Modified:
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorFactory.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorSerializer.java
    synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/PropertyMediator.java

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorFactory.java?rev=916303&r1=916302&r2=916303&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorFactory.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorFactory.java Thu Feb 25 14:50:47 2010
@@ -27,6 +27,7 @@
 import org.jaxen.JaxenException;
 
 import javax.xml.namespace.QName;
+import java.util.regex.Pattern;
 
 /**
  * Creates a property mediator through the supplied XML configuration
@@ -39,6 +40,8 @@
     private static final QName ATT_SCOPE = new QName("scope");
     private static final QName ATT_ACTION = new QName("action");
     private static final QName ATT_TYPE = new QName("type");
+    private static final QName ATT_PATTERN = new QName("pattern");
+    private static final QName ATT_GROUP = new QName("group");
 
     public Mediator createMediator(OMElement elem) {
 
@@ -49,6 +52,8 @@
         OMAttribute scope = elem.getAttribute(ATT_SCOPE);
         OMAttribute action = elem.getAttribute(ATT_ACTION);
         OMAttribute type = elem.getAttribute(ATT_TYPE);
+        OMAttribute pattern = elem.getAttribute(ATT_PATTERN);
+        OMAttribute group = elem.getAttribute(ATT_GROUP);
 
         OMElement valueElement = elem.getFirstElement();
 
@@ -86,6 +91,24 @@
             }
         }
 
+        if (pattern != null) {
+            propMediator.setPattern(Pattern.compile(pattern.getAttributeValue()));
+            if (group != null) {
+                int groupValue = Integer.parseInt(group.getAttributeValue());
+                if (groupValue >= 0) {
+                    propMediator.setGroup(groupValue);
+                } else {                    
+                    String msg = "group can have a positive value only";
+                    log.error(msg);
+                    throw new SynapseException(msg);
+                }
+            }
+        } else if (group != null) {
+            String msg = "group is only allowed when a pattern is specified";
+            log.error(msg);
+            throw new SynapseException(msg);
+        }
+
         // The action attribute is optional, if provided and equals to 'remove' the
         // property mediator will act as a property remove mediator
         if (action != null && "remove".equals(action.getAttributeValue())) {

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorSerializer.java?rev=916303&r1=916302&r2=916303&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorSerializer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/PropertyMediatorSerializer.java Thu Feb 25 14:50:47 2010
@@ -77,6 +77,15 @@
                     "type" , nullNS, mediator.getType()));
         }
 
+        if (mediator.getPattern() != null) {
+            property.addAttribute(fac.createOMAttribute(
+                    "pattern", nullNS, mediator.getPattern().toString()));
+            if (mediator.getGroup() >= 0) {
+                property.addAttribute(fac.createOMAttribute(
+                        "group", nullNS, Integer.toString(mediator.getGroup())));
+            }
+        }
+
         if (parent != null) {
             parent.addChild(property);
         }

Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/PropertyMediator.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/PropertyMediator.java?rev=916303&r1=916302&r2=916303&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/PropertyMediator.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/PropertyMediator.java Thu Feb 25 14:50:47 2010
@@ -33,6 +33,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 
 /**
  * The property mediator would save(or remove) a named property as a local property of
@@ -62,6 +64,13 @@
     /** Set the property (ACTION_SET) or remove it (ACTION_REMOVE). Defaults to ACTION_SET */
     private int action = ACTION_SET;
 
+    /** Regualar expresion pattern to be evaluated over the property value.
+     * Resulting match string will be applied to the property */
+    private Pattern pattern;
+
+    /** A pattern can be matched to several parts of the value. Which one to choose.*/
+    private int group = 0;
+
     /**
      * Sets a property into the current (local) Synapse Context or into the Axis Message Context
      * or into Transports Header and removes above properties from the corresponding locations.
@@ -85,6 +94,12 @@
 
             Object resultValue = getResultValue(synCtx);
 
+            // if the result value is a String we can apply a reguar expression to
+            // choose part of it
+            if (resultValue instanceof String && pattern != null) {
+                resultValue = getMatchedValue((String) resultValue, synLog);
+            }
+
             if (synLog.isTraceOrDebugEnabled()) {
                 synLog.traceOrDebug("Setting property : " + name + " at scope : " +
                     (scope == null ? "default" : scope) + " to : " + resultValue + " (i.e. " +
@@ -252,6 +267,22 @@
         this.action = action;
     }
 
+    public Pattern getPattern() {
+        return pattern;
+    }
+
+    public void setPattern(Pattern pattern) {
+        this.pattern = pattern;
+    }
+
+    public int getGroup() {
+        return group;
+    }
+
+    public void setGroup(int group) {
+        this.group = group;
+    }
+
     private Object getResultValue(MessageContext synCtx) {
         if (value != null) {
             return value;
@@ -287,4 +318,42 @@
             throw new SynapseException(msg, e);
         }
     }
+
+    /**
+     * Apply the Regular expression on to the String value and choose the matching group.
+     * If a matching not found same string passed in to this method will be returned.
+     * If a pattern is not specified same String passed to this method will be retured.
+     *
+     * @param value String value against the regular expression is matched
+     * @param synLog log
+     * @return the matched string group
+     */
+    private String getMatchedValue(String value, SynapseLog synLog) {
+
+        String matchedValue = value;
+        // if we cannot find a match set the value to empty string
+        Matcher matcher = pattern.matcher(value);
+        if (matcher.matches()) {
+            
+            if (matcher.groupCount() >= group) {
+                matchedValue = matcher.group(group);
+            } else {
+                if (synLog.isTraceOrDebugEnabled()) {
+                    String msg = "Failed to get a match for regx : " +
+                            pattern.toString() + " with the property value :" +
+                            value + " for group :" + group;
+                    synLog.traceOrDebug(msg);
+                }
+            }
+            
+        } else {
+            if (synLog.isTraceOrDebugEnabled()) {
+                String msg = "Unable to find a match for regx : " +
+                        pattern.toString() + " with the property value :" + value;
+                synLog.traceOrDebug(msg);
+            }
+        }
+        
+        return matchedValue;
+    }
 }