You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by su...@apache.org on 2011/03/03 17:52:41 UTC

svn commit: r1076678 - in /synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators: bsf/ xquery/

Author: supun
Date: Thu Mar  3 16:52:41 2011
New Revision: 1076678

URL: http://svn.apache.org/viewvc?rev=1076678&view=rev
Log:
applying patch for SYNAPSE-718, thanks ranga for the contribution

Modified:
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediator.java
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorFactory.java
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorSerializer.java
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediator.java
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorFactory.java
    synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorSerializer.java

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediator.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediator.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediator.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediator.java Thu Mar  3 16:52:41 2011
@@ -28,6 +28,7 @@ import org.apache.synapse.SynapseExcepti
 import org.apache.synapse.SynapseLog;
 import org.apache.synapse.config.Entry;
 import org.apache.synapse.mediators.AbstractMediator;
+import org.apache.synapse.mediators.Value;
 
 import javax.activation.DataHandler;
 import javax.script.*;
@@ -63,8 +64,9 @@ public class ScriptMediator extends Abst
 
     /**
      * The registry entry key for a script loaded from the registry
+     * Handle both static and dynamic(Xpath) Keys
      */
-    private String key;
+    private Value key;
     /**
      * The language of the script code
      */
@@ -72,7 +74,7 @@ public class ScriptMediator extends Abst
     /**
      * The map of included scripts; key = registry entry key, value = script source
      */
-    private final Map<String, Object> includes;
+    private final Map<Value, Object> includes;
     /**
      * The optional name of the function to be invoked, defaults to mediate
      */
@@ -117,7 +119,7 @@ public class ScriptMediator extends Abst
     public ScriptMediator(String language, String scriptSourceCode) {
         this.language = language;
         this.scriptSourceCode = scriptSourceCode;
-        this.includes = new TreeMap<String, Object>();
+        this.includes = new TreeMap<Value, Object>();
         initInlineScript();
     }
 
@@ -129,8 +131,8 @@ public class ScriptMediator extends Abst
      * @param key            the registry entry key to load the script
      * @param function       the function to be invoked
      */
-    public ScriptMediator(String language, Map<String, Object> includeKeysMap,
-                          String key, String function) {
+    public ScriptMediator(String language, Map<Value, Object> includeKeysMap,
+                          Value key, String function) {
         this.language = language;
         this.key = key;
         this.includes = includeKeysMap;
@@ -298,12 +300,14 @@ public class ScriptMediator extends Abst
         // to access the registry entry during mediator initialization then for non-dynamic entries
         // this could be done just the once during mediator initialization.
 
-        Entry entry = synCtx.getConfiguration().getEntryDefinition(key);
+        // Derive actual key from xpath expression or get static key
+        String generatedScriptKey = key.evaluateValue(synCtx);
+        Entry entry = synCtx.getConfiguration().getEntryDefinition(generatedScriptKey);
         boolean needsReload = (entry != null) && entry.isDynamic() &&
                 (!entry.isCached() || entry.isExpired());
         synchronized (resourceLock) {
             if (scriptSourceCode == null || needsReload) {
-                Object o = synCtx.getEntry(key);
+                Object o = synCtx.getEntry(generatedScriptKey);
                 if (o instanceof OMElement) {
                     scriptSourceCode = ((OMElement) (o)).getText();
                     scriptEngine.eval(scriptSourceCode);
@@ -340,15 +344,19 @@ public class ScriptMediator extends Abst
         }
 
         // load <include /> scripts; reload each script if needed
-        for (String includeKey : includes.keySet()) {
+        for (Value includeKey : includes.keySet()) {
+
             String includeSourceCode = (String) includes.get(includeKey);
-            Entry includeEntry = synCtx.getConfiguration().getEntryDefinition(includeKey);
+
+            String generatedKey = includeKey.evaluateValue(synCtx);
+
+            Entry includeEntry = synCtx.getConfiguration().getEntryDefinition(generatedKey);
             boolean includeEntryNeedsReload = (includeEntry != null) && includeEntry.isDynamic()
                     && (!includeEntry.isCached() || includeEntry.isExpired());
             synchronized (resourceLock) {
                 if (includeSourceCode == null || includeEntryNeedsReload) {
                     log.debug("Re-/Loading the include script with key " + includeKey);
-                    Object o = synCtx.getEntry(includeKey);
+                    Object o = synCtx.getEntry(generatedKey);
                     if (o instanceof OMElement) {
                         includeSourceCode = ((OMElement) (o)).getText();
                         scriptEngine.eval(includeSourceCode);
@@ -408,7 +416,7 @@ public class ScriptMediator extends Abst
         return language;
     }
 
-    public String getKey() {
+    public Value getKey() {
         return key;
     }
 
@@ -425,7 +433,7 @@ public class ScriptMediator extends Abst
         throw new SynapseException(msg);
     }
 
-    public Map<String, Object> getIncludeMap() {
+    public Map<Value, Object> getIncludeMap() {
         return includes;
     }
 

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorFactory.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorFactory.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorFactory.java Thu Mar  3 16:52:41 2011
@@ -19,17 +19,18 @@
 
 package org.apache.synapse.mediators.bsf;
 
-import javax.xml.namespace.QName;
-
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
 import org.apache.synapse.Mediator;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.config.xml.AbstractMediatorFactory;
 import org.apache.synapse.config.xml.XMLConfigConstants;
+import org.apache.synapse.mediators.Value;
+import org.apache.synapse.config.xml.ValueFactory;
 
-import java.util.Map;
+import javax.xml.namespace.QName;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Properties;
 import java.util.TreeMap;
 
@@ -84,12 +85,18 @@ public class ScriptMediatorFactory exten
                     "attribute for a script mediator");
         }
 
-        Map<String, Object> includeKeysMap = getIncludeKeysMap(elem);
+        Map<Value, Object> includeKeysMap = getIncludeKeysMap(elem);
 
         if (keyAtt != null) {
+
+            // ValueFactory for creating dynamic or static Key
+            ValueFactory keyFac = new ValueFactory();
+            // create dynamic or static key based on OMElement
+            Value generatedKey = keyFac.createValue(XMLConfigConstants.KEY, elem);
+
             String functionName = (functionAtt == null ? null : functionAtt.getAttributeValue());
             mediator = new ScriptMediator(langAtt.getAttributeValue(),
-                    includeKeysMap, keyAtt.getAttributeValue(), functionName);
+                    includeKeysMap, generatedKey, functionName);
         } else {
             mediator = new ScriptMediator(langAtt.getAttributeValue(), elem.getText());
         }
@@ -98,27 +105,30 @@ public class ScriptMediatorFactory exten
         return mediator;
     }
 
-    private Map<String, Object> getIncludeKeysMap(OMElement elem) {
+    private Map<Value, Object> getIncludeKeysMap(OMElement elem) {
         // get <include /> scripts
         // map key = registry entry key, value = script source
         // at this time map values are null, later loaded
         // from void ScriptMediator.prepareExternalScript(MessageContext synCtx)
 
         // TreeMap used to keep given scripts order if needed
-        Map<String, Object> includeKeysMap = new TreeMap<String, Object>();
+        Map<Value, Object> includeKeysMap = new TreeMap<Value, Object>();
         Iterator itr = elem.getChildrenWithName(INCLUDE_Q);
         while (itr.hasNext()) {
             OMElement includeElem = (OMElement) itr.next();
             OMAttribute key = includeElem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
                     "key"));
+            // ValueFactory for creating dynamic or static Value
+            ValueFactory keyFac = new ValueFactory();
+            // create dynamic or static key based on OMElement
+            Value generatedKey = keyFac.createValue(XMLConfigConstants.KEY, elem);
 
             if (key == null) {
                 throw new SynapseException("Cannot use 'include' element without 'key'" +
                         " attribute for a script mediator");
             }
 
-            String keyText = key.getAttributeValue();
-            includeKeysMap.put(keyText, null);
+            includeKeysMap.put(generatedKey, null);
         }
 
         return includeKeysMap;

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorSerializer.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorSerializer.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/bsf/ScriptMediatorSerializer.java Thu Mar  3 16:52:41 2011
@@ -18,14 +18,16 @@
  */
 package org.apache.synapse.mediators.bsf;
 
-import java.util.Map;
-
-import javax.xml.stream.XMLStreamConstants;
-
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.llom.OMTextImpl;
 import org.apache.synapse.Mediator;
 import org.apache.synapse.config.xml.AbstractMediatorSerializer;
+import org.apache.synapse.config.xml.ValueSerializer;
+import org.apache.synapse.config.xml.XMLConfigConstants;
+import org.apache.synapse.mediators.Value;
+
+import javax.xml.stream.XMLStreamConstants;
+import java.util.Map;
 
 /**
  * Serializer for a script mediator
@@ -44,12 +46,16 @@ public class ScriptMediatorSerializer ex
         OMElement script = fac.createOMElement("script", synNS);
 
         String language = scriptMediator.getLanguage();
-        String key = scriptMediator.getKey();
+        Value key = scriptMediator.getKey();
         String function = scriptMediator.getFunction();
+        ValueSerializer keySerializer = new ValueSerializer();
 
         if (key != null) {
             script.addAttribute(fac.createOMAttribute("language", nullNS, language));
-            script.addAttribute(fac.createOMAttribute("key", nullNS, key));
+
+            // Serialize Value using ValueSerializer
+            keySerializer.serializeValue(key, XMLConfigConstants.KEY, script);
+
             if (!function.equals("mediate")) {
                 script.addAttribute(fac.createOMAttribute("function", nullNS, function));
             }
@@ -61,11 +67,14 @@ public class ScriptMediatorSerializer ex
             script.addChild(textData);
         }
 
-        Map<String, Object> includeMap = scriptMediator.getIncludeMap();
-        for (String includeKey : includeMap.keySet()) {
-            if (includeKey != null && includeKey.length() != 0) {
+        Map<Value, Object> includeMap = scriptMediator.getIncludeMap();
+        for (Value includeKey : includeMap.keySet()) {
+            if (includeKey != null) {
                 OMElement includeKeyElement = fac.createOMElement("include", synNS);
-                includeKeyElement.addAttribute(fac.createOMAttribute("key", nullNS, includeKey));
+
+                // Serialize Value using ValueSerializer
+                keySerializer.serializeValue(includeKey, XMLConfigConstants.KEY, includeKeyElement);
+
                 script.addChild(includeKeyElement);
             }
         }

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediator.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediator.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediator.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediator.java Thu Mar  3 16:52:41 2011
@@ -29,25 +29,25 @@ import org.apache.axiom.om.util.ElementH
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.SynapseLog;
-import org.apache.synapse.util.xpath.SourceXPathSupport;
-import org.apache.synapse.util.xpath.SynapseXPath;
 import org.apache.synapse.config.Entry;
 import org.apache.synapse.config.SynapseConfigUtils;
 import org.apache.synapse.mediators.AbstractMediator;
 import org.apache.synapse.mediators.MediatorProperty;
+import org.apache.synapse.mediators.Value;
+import org.apache.synapse.util.xpath.SourceXPathSupport;
+import org.apache.synapse.util.xpath.SynapseXPath;
 import org.w3c.dom.Element;
 import org.xml.sax.InputSource;
 
+import javax.activation.DataHandler;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.transform.dom.DOMSource;
-import javax.activation.DataHandler;
-import java.io.StringReader;
-import java.io.InputStream;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.*;
 
 
 /**
@@ -67,8 +67,8 @@ public class XQueryMediator extends Abst
     /* Properties that must set to the XQDataSource  */
     private final List<MediatorProperty> dataSourceProperties = new ArrayList<MediatorProperty>();
 
-    /* The key for lookup the xquery */
-    private String queryKey;
+    /* The key for lookup the xquery (Supports both static and dynamic keys)*/
+    private Value queryKey;
 
     /* The source of the xquery */
     private String querySource;
@@ -92,7 +92,7 @@ public class XQueryMediator extends Abst
     private XQConnection cachedConnection = null;
 
     /* An expression that use for multiple  executions.Expression will recreate if query has changed */
-    private XQPreparedExpression cachedPreparedExpression = null;
+    private Map<String, XQPreparedExpression> cachedPreparedExpressionMap = new Hashtable<String, XQPreparedExpression>();
 
     public XQueryMediator() {
     }
@@ -143,10 +143,24 @@ public class XQueryMediator extends Abst
         boolean reLoad = false;
         boolean needBind = false;
         XQResultSequence resultSequence;
+        String generatedQueryKey = null;
+        boolean isQueryKeyGenerated = false;
 
-        if (queryKey != null && !"".equals(queryKey)) {
+        if (queryKey != null) {
+            // Derive actual key from xpath or get static key
+            generatedQueryKey = queryKey.evaluateValue(synCtx);
+        }
 
-            Entry dp = synCtx.getConfiguration().getEntryDefinition(queryKey);
+        if (generatedQueryKey != null) {
+            isQueryKeyGenerated = true;
+        }
+
+        // get expression from generatedQueryKey
+        XQPreparedExpression cachedPreparedExpression = null;
+
+        if (generatedQueryKey != null && !"".equals(generatedQueryKey)) {
+
+            Entry dp = synCtx.getConfiguration().getEntryDefinition(generatedQueryKey);
             // if the queryKey refers to a dynamic resource
             if (dp != null && dp.isDynamic()) {
                 if (!dp.isCached() || dp.isExpired()) {
@@ -182,6 +196,11 @@ public class XQueryMediator extends Abst
                     cachedConnection = cachedXQDataSource.getConnection();
                 }
 
+                //If already cached expression then load it from cachedPreparedExpressionMap
+                if (isQueryKeyGenerated) {
+                    cachedPreparedExpression = cachedPreparedExpressionMap.get(generatedQueryKey);
+                }
+
                 // prepare the expression to execute query
                 if (reLoad || cachedPreparedExpression == null
                         || (cachedPreparedExpression != null
@@ -199,13 +218,19 @@ public class XQueryMediator extends Abst
                             //create an XQPreparedExpression using the query source
                             cachedPreparedExpression =
                                     cachedConnection.prepareExpression(querySource);
+
+                            // if cachedPreparedExpression is created then put it in to cachedPreparedExpressionMap
+                            if (isQueryKeyGenerated) {
+                                cachedPreparedExpressionMap.put(generatedQueryKey, cachedPreparedExpression);
+                            }
+
                             // need binding because the expression just has recreated
                             needBind = true;
                         }
 
                     } else {
 
-                        Object o = synCtx.getEntry(queryKey);
+                        Object o = synCtx.getEntry(generatedQueryKey);
                         if (o == null) {
                             if (synLog.isTraceOrDebugEnabled()) {
                                 synLog.traceOrDebug("Couldn't find the xquery source with a key "
@@ -263,6 +288,12 @@ public class XQueryMediator extends Abst
                             cachedPreparedExpression =
                                     cachedConnection.prepareExpression(inputStream);
                         }
+
+                        // if cachedPreparedExpression is created then put it in to cachedPreparedExpressionMap
+                        if (isQueryKeyGenerated) {
+                            cachedPreparedExpressionMap.put(generatedQueryKey, cachedPreparedExpression);
+                        }
+
                         // need binding because the expression just has recreated
                         needBind = true;
                     }
@@ -601,11 +632,11 @@ public class XQueryMediator extends Abst
         throw new SynapseException(msg);
     }
 
-    public String getQueryKey() {
+    public Value getQueryKey() {
         return queryKey;
     }
 
-    public void setQueryKey(String queryKey) {
+    public void setQueryKey(Value queryKey) {
         this.queryKey = queryKey;
     }
 

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorFactory.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorFactory.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorFactory.java Thu Mar  3 16:52:41 2011
@@ -27,6 +27,8 @@ import org.apache.synapse.Mediator;
 import org.apache.synapse.util.xpath.SynapseXPath;
 import org.apache.synapse.config.xml.*;
 import org.jaxen.JaxenException;
+import org.apache.synapse.mediators.Value;
+import org.apache.synapse.config.xml.ValueFactory;
 
 import javax.xml.namespace.QName;
 import java.util.Iterator;
@@ -64,9 +66,14 @@ public class XQueryMediatorFactory exten
         OMAttribute attrTarget = elem.getAttribute(new QName(XMLConfigConstants.NULL_NAMESPACE,
                 "target"));
         if (xqueryKey != null) {
-            String queryKey = xqueryKey.getAttributeValue();
-            if (queryKey != null) {
-                xQueryMediator.setQueryKey(queryKey.trim());
+            // KeyFactory for creating dynamic or static Key
+            ValueFactory keyFac = new ValueFactory();
+            // create dynamic or static key based on OMElement
+            Value generatedKey = keyFac.createValue(XMLConfigConstants.KEY, elem);
+
+            if (generatedKey != null) {
+                // set generated key as the Key
+                xQueryMediator.setQueryKey(generatedKey);
             } else {
                 handleException("The 'key' attribute is required for the XQuery mediator");
             }

Modified: synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorSerializer.java?rev=1076678&r1=1076677&r2=1076678&view=diff
==============================================================================
--- synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorSerializer.java (original)
+++ synapse/trunk/java/modules/extensions/src/main/java/org/apache/synapse/mediators/xquery/XQueryMediatorSerializer.java Thu Mar  3 16:52:41 2011
@@ -21,11 +21,14 @@ package org.apache.synapse.mediators.xqu
 import net.sf.saxon.javax.xml.xquery.XQItemType;
 import org.apache.axiom.om.OMElement;
 import org.apache.synapse.Mediator;
-import org.apache.synapse.mediators.MediatorProperty;
 import org.apache.synapse.config.xml.AbstractMediatorSerializer;
 import org.apache.synapse.config.xml.SynapseXPathSerializer;
-import org.apache.synapse.util.xpath.SynapseXPath;
+import org.apache.synapse.config.xml.ValueSerializer;
+import org.apache.synapse.config.xml.XMLConfigConstants;
+import org.apache.synapse.mediators.MediatorProperty;
+import org.apache.synapse.mediators.Value;
 import org.apache.synapse.util.xpath.SourceXPathSupport;
+import org.apache.synapse.util.xpath.SynapseXPath;
 
 import javax.xml.namespace.QName;
 import java.util.List;
@@ -50,10 +53,11 @@ public class XQueryMediatorSerializer ex
         XQueryMediator queryMediator = (XQueryMediator) m;
 
         OMElement xquery = fac.createOMElement("xquery", synNS);
-        String key = queryMediator.getQueryKey();
+        Value key = queryMediator.getQueryKey();
         if (key != null) {
-            xquery.addAttribute(fac.createOMAttribute(
-                    "key", nullNS, key));
+            // Serialize Key using KeySerializer
+            ValueSerializer keySerializer =  new ValueSerializer();
+            keySerializer.serializeValue(key, XMLConfigConstants.KEY, xquery);
 
         }