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 2010/12/13 12:06:27 UTC

svn commit: r1045061 - in /synapse/trunk/java/modules/core/src/main/java/org/apache/synapse: ./ core/ core/axis2/ util/xpath/

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