Author: supun
Date: Mon Dec 13 11:06:27 2010
New Revision: 1045061
URL: http://svn.apache.org/viewvc?rev=1045061&view=rev
Log:
applying patch for issue SYNAPSE-711, many thanks Udayanga for the contribution
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Axis2SynapseController.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/SynapseEnvironment.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2SynapseEnvironment.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathFunctionContext.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Axis2SynapseController.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Axis2SynapseController.java?rev=1045061&r1=1045060&r2=1045061&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Axis2SynapseController.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Axis2SynapseController.java
Mon Dec 13 11:06:27 2010
@@ -50,6 +50,9 @@ import org.apache.synapse.core.axis2.*;
import org.apache.synapse.eventing.SynapseEventSource;
import org.apache.synapse.task.*;
import
org.apache.synapse.securevault.secret.handler.SharedSecretCallbackHandlerCache;
+import org.apache.synapse.util.xpath.ext.SynapseXpathFunctionContextProvider;
+import org.apache.synapse.util.xpath.ext.SynapseXpathVariableResolver;
+import org.apache.synapse.util.xpath.ext.XpathExtensionUtil;
import java.util.*;
@@ -154,7 +157,7 @@ public class Axis2SynapseController impl
configurationContext.getAxisConfiguration().addParameter(serverContextParameter);
configurationContext.getAxisConfiguration().addParameter(serverConfigParameter);
} catch (AxisFault ignored) {
- log.fatal("Error adding the parameter to the Axis Configuration");
+ log.fatal("Error adding the parameter to the Axis Configuration");
}
// we retrieve these properties to initialize the task scheduler in
the envrionment
@@ -169,7 +172,7 @@ public class Axis2SynapseController impl
if (taskScheduler != null && (taskScheduler instanceof TaskScheduler))
{
this.taskScheduler = (TaskScheduler) taskScheduler;
}
-
+
addDefaultBuildersAndFormatters(configurationContext.getAxisConfiguration());
deployMediatorExtensions();
initDataSourceHelper(serverContextInformation);
@@ -177,6 +180,35 @@ public class Axis2SynapseController impl
initialized = true;
}
+
+ /**
+ * This method initializes Xpath Extensions available through
synapse.properties file
+ * Xpath Extensions can be defined in Variable Context Extensions +
Function Context Extensions
+ * synapse.xpath.var.extensions --> Variable Extensions
+ * synapse.xpath.func.extensions --> Function Extensions
+ */
+ private void initXpathExtensions() {
+ Axis2SynapseEnvironment axis2SynapseEnvironment =
(Axis2SynapseEnvironment) synapseEnvironment;
+
+ /*Initalize Function Context extensions for xpath
+ */
+ List<SynapseXpathFunctionContextProvider> functionExtensions =
+ XpathExtensionUtil.getRegisteredFunctionExtensions();
+ for (SynapseXpathFunctionContextProvider functionExtension :
functionExtensions) {
+
axis2SynapseEnvironment.setXpathFunctionExtensions(functionExtension);
+ }
+
+ /*Initalize Variable Context extensions for xpath
+ */
+ List<SynapseXpathVariableResolver> variableExtensions =
+ XpathExtensionUtil.getRegisteredVariableExtensions();
+ for (SynapseXpathVariableResolver variableExtension :
variableExtensions) {
+
axis2SynapseEnvironment.setXpathVariableExtensions(variableExtension);
+ }
+
+ }
+
+
/**
* {...@inheritdoc}
*/
@@ -248,7 +280,7 @@ public class Axis2SynapseController impl
/* if JMX Adapter has been configured and started, output usage
information rather
at the end of the startup process to make it more obvious */
if (jmxAdapter != null && jmxAdapter.isRunning()) {
- log.info("Management using JMX available via: "
+ log.info("Management using JMX available via: "
+ jmxAdapter.getJmxInformation().getJmxUrl());
}
}
@@ -270,10 +302,10 @@ public class Axis2SynapseController impl
if (synapseTaskManager.isInitialized()) {
synapseTaskManager.pauseAll();
}
-
+
log.info("Entered maintenence mode");
}
-
+
/**
* {...@inheritdoc}
*/
@@ -378,7 +410,7 @@ public class Axis2SynapseController impl
synapseEnvironment = new Axis2SynapseEnvironment(
configurationContext, synapseConfiguration,
serverContextInformation);
MessageContextCreatorForAxis2.setSynEnv(synapseEnvironment);
-
+
Parameter synapseEnvironmentParameter = new Parameter(
SynapseConstants.SYNAPSE_ENV, synapseEnvironment);
try {
@@ -392,6 +424,10 @@ public class Axis2SynapseController impl
synapseEnvironment.getTaskManager().init(taskDescriptionRepository,
taskScheduler);
synapseConfiguration.init(synapseEnvironment);
synapseEnvironment.setInitialized(true);
+
+ //we initialize xpath extensions here since synapse environment is
available
+ initXpathExtensions();
+
return synapseEnvironment;
}
@@ -456,7 +492,7 @@ public class Axis2SynapseController impl
handleFatal("Could not set parameters '" +
SynapseConstants.SYNAPSE_CONFIG +
"' to the Axis2 configuration : " + e.getMessage(), e);
}
-
+
addServerIPAndHostEnrties();
return synapseConfiguration;
@@ -476,17 +512,17 @@ public class Axis2SynapseController impl
/**
* Waits until it is safe to stop or the the specified end time has been
reached. A delay
* of <code>waitIntervalMillis</code> milliseconds is used between each
subsequent check.
- * If the state "safeToStop" is reached before the specified
<code>endTime</code>,
+ * If the state "safeToStop" is reached before the specified
<code>endTime</code>,
* the return value is true.
- *
+ *
* @param waitIntervalMillis the pause time (delay) in milliseconds
between subsequent checks
* @param endTime the time until which the checks need to
finish successfully
- *
+ *
* @return true, if a safe state is reached before the specified
<code>endTime</code>,
* otherwise false (forceful stop required)
*/
public boolean waitUntilSafeToStop(long waitIntervalMillis, long endTime) {
-
+
boolean safeToStop = false;
boolean forcefulStop = false;
Axis2TransportHelper transportHelper = new
Axis2TransportHelper(configurationContext);
@@ -510,7 +546,7 @@ public class Axis2SynapseController impl
+ " active connections to be closed..");
}
int pendingTransportThreads = pendingListenerThreads +
pendingSenderThreads;
-
+
int pendingCallbacks = serverContextInformation.getCallbackCount();
if (pendingCallbacks > 0) {
log.info("Waiting for: " + pendingCallbacks + "
callbacks/replies..");
@@ -548,7 +584,7 @@ public class Axis2SynapseController impl
}
}
}
-
+
return !forcefulStop;
}
@@ -581,7 +617,7 @@ public class Axis2SynapseController impl
listenerManager = new ListenerManager();
listenerManager.init(configurationContext);
}
-
+
// do not use the listener manager shutdown hook, because it
clashes with the
// SynapseServer shutdown hook.
listenerManager.setShutdownHookRequired(false);
@@ -616,7 +652,7 @@ public class Axis2SynapseController impl
synapseServiceGroup.addService(synapseService);
axisCfg.addServiceGroup(synapseServiceGroup);
}
-
+
/**
* Removes the Synapse Service from the Axis2 configuration.
*
@@ -690,13 +726,13 @@ public class Axis2SynapseController impl
}
/**
* Removes all Synapse proxy services from the Axis2 configuration.
- *
+ *
* @throws AxisFault if an error occurs undeploying proxy services
*/
private void undeployProxyServices() throws AxisFault {
-
+
log.info("Undeploying Proxy services...");
-
+
for (ProxyService proxy : synapseConfiguration.getProxyServices()) {
configurationContext.getAxisConfiguration().removeService(
proxy.getName());
@@ -719,7 +755,7 @@ public class Axis2SynapseController impl
/**
* Deploys all event sources.
- *
+ *
* @throws AxisFault if an error occurs deploying the event sources.
*/
private void deployEventSources() throws AxisFault {
@@ -728,10 +764,10 @@ public class Axis2SynapseController impl
eventSource.buildService(configurationContext.getAxisConfiguration());
}
}
-
+
/**
* Undeploys all event sources.
- *
+ *
* @throws AxisFault if an error occurs undeploying the event sources.
*/
private void undeployEventSources() throws AxisFault {
@@ -774,7 +810,7 @@ public class Axis2SynapseController impl
if (handler instanceof SecretCallbackHandler) {
cache.setSecretCallbackHandler((SecretCallbackHandler) handler);
}
- }
+ }
private void addDefaultBuildersAndFormatters(AxisConfiguration axisConf) {
if (axisConf.getMessageBuilder("text/plain") == null) {
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/SynapseEnvironment.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/SynapseEnvironment.java?rev=1045061&r1=1045060&r2=1045061&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/SynapseEnvironment.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/SynapseEnvironment.java
Mon Dec 13 11:06:27 2010
@@ -27,7 +27,11 @@ import org.apache.synapse.aspects.statis
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.endpoints.EndpointDefinition;
import org.apache.synapse.mediators.base.SequenceMediator;
+import org.apache.synapse.util.xpath.ext.SynapseXpathFunctionContextProvider;
+import org.apache.synapse.util.xpath.ext.SynapseXpathVariableResolver;
+import javax.xml.namespace.QName;
+import java.util.Map;
import java.util.concurrent.ExecutorService;
/**
@@ -142,4 +146,19 @@ public interface SynapseEnvironment {
* @return {...@link org.apache.synapse.ServerContextInformation} of this
synapse environment
*/
public ServerContextInformation getServerContextInformation();
+
+ /**
+ * Get all Xpath Extension objects for Function contexts
+ * @return Map containing xpath extension objects
+ */
+ public Map<QName, SynapseXpathFunctionContextProvider>
getXpathFunctionExtensions();
+
+
+ /**
+ * Get all Xpath Extension objects for Variable contexts
+ * @return Map containing xpath extension objects
+ */
+ public Map<QName, SynapseXpathVariableResolver>
getXpathVariableExtensions();
+
+
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2SynapseEnvironment.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2SynapseEnvironment.java?rev=1045061&r1=1045060&r2=1045061&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2SynapseEnvironment.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2SynapseEnvironment.java
Mon Dec 13 11:06:27 2010
@@ -39,7 +39,12 @@ import org.apache.synapse.mediators.Medi
import org.apache.synapse.mediators.MediatorWorker;
import org.apache.synapse.mediators.base.SequenceMediator;
import org.apache.synapse.util.concurrent.SynapseThreadPool;
+import org.apache.synapse.util.xpath.ext.SynapseXpathFunctionContextProvider;
+import org.apache.synapse.util.xpath.ext.SynapseXpathVariableResolver;
+import javax.xml.namespace.QName;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.ExecutorService;
/**
@@ -60,6 +65,14 @@ public class Axis2SynapseEnvironment imp
private ServerContextInformation contextInformation;
+ /** Map containing Xpath Function Context Extensions */
+ Map<QName, SynapseXpathFunctionContextProvider> xpathFunctionExtensions =
+ new HashMap<QName, SynapseXpathFunctionContextProvider>();
+
+ /** Map containing Xpath Variable Context Extensions */
+ Map<QName, SynapseXpathVariableResolver> xpathVariableExtensions =
+ new HashMap<QName, SynapseXpathVariableResolver>();
+
public Axis2SynapseEnvironment(SynapseConfiguration synCfg) {
int coreThreads = SynapseThreadPool.SYNAPSE_CORE_THREADS;
@@ -373,6 +386,37 @@ public class Axis2SynapseEnvironment imp
return this.configContext;
}
+ /**
+ * Returns all declared xpath Function Extensions
+ * @return Hash Map Contatining Function Extensions with supported QName
keys
+ */
+ public Map<QName, SynapseXpathFunctionContextProvider>
getXpathFunctionExtensions() {
+ return xpathFunctionExtensions;
+ }
+
+ /**
+ * Returns all declared xpath Variable Extensions
+ * @return Hash Map Contatining Variable Extensions with supported QName
keys
+ */
+ public Map<QName, SynapseXpathVariableResolver>
getXpathVariableExtensions() {
+ return xpathVariableExtensions;
+ }
+
+ public void setXpathFunctionExtensions(SynapseXpathFunctionContextProvider
functionExt){
+ if(functionExt!=null) {
+ xpathFunctionExtensions.put(functionExt.getResolvingQName(),
functionExt);
+ }
+ }
+
+
+ public void setXpathVariableExtensions(SynapseXpathVariableResolver
variableExt){
+ if(variableExt!=null) {
+ xpathVariableExtensions.put(variableExt.getResolvingQName(),
variableExt);
+ }
+ }
+
+
+
private void handleException(String message, Throwable e) {
log.error(message, e);
throw new SynapseException(message, e);
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathFunctionContext.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathFunctionContext.java?rev=1045061&r1=1045060&r2=1045061&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathFunctionContext.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathFunctionContext.java
Mon Dec 13 11:06:27 2010
@@ -21,6 +21,7 @@ package org.apache.synapse.util.xpath;
import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.GetPropertyFunction;
+import org.apache.synapse.util.xpath.ext.XpathExtensionUtil;
import org.jaxen.Function;
import org.jaxen.FunctionContext;
import org.jaxen.UnresolvableException;
@@ -82,7 +83,12 @@ public class SynapseXPathFunctionContext
// create a base64Encode function and set it to the XPath
return new Base64EncodeFunction();
}
-
+ //We check if custom Xpath extensions are available
+ Function extensionFunction =
XpathExtensionUtil.getFunctionContext(synCtx,namespaceURI,prefix,
+
localName);
+ if(extensionFunction!=null) {
+ return extensionFunction;
+ }
// if not the get-property function then try to get it from the parent
context
return parent.getFunction(namespaceURI, prefix, localName);
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java?rev=1045061&r1=1045060&r2=1045061&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/xpath/SynapseXPathVariableContext.java
Mon Dec 13 11:06:27 2010
@@ -30,6 +30,7 @@ import org.apache.axis2.Constants;
import org.apache.axis2.transport.http.util.URIEncoderDecoder;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
+import org.apache.synapse.util.xpath.ext.XpathExtensionUtil;
import org.jaxen.UnresolvableException;
import org.jaxen.VariableContext;
@@ -199,7 +200,11 @@ public class SynapseXPathVariableContext
}
}
}
-
+ //try resolving using available custom extensions
+ Object obj =
XpathExtensionUtil.resolveVariableContext(synCtx,namespaceURI,prefix,localName);
+ if(obj!=null) {
+ return obj;
+ }
return parent.getVariableValue(namespaceURI, prefix, localName);
}
}