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);
}