You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by pz...@apache.org on 2005/11/29 18:00:42 UTC
svn commit: r349761 - in /incubator/synapse/trunk/scratch/prototype3:
SpringMediator/org/apache/synapse/processors/mediatortypes/spring/
XSLTTransform/ XSLTTransform/org/ XSLTTransform/org/apache/
XSLTTransform/org/apache/synapse/ XSLTTransform/org/apa...
Author: pzf
Date: Tue Nov 29 09:00:18 2005
New Revision: 349761
URL: http://svn.apache.org/viewcvs?rev=349761&view=rev
Log:
more docs plus first cut at an XSLT transformer
Added:
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessor.java
incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessorConfigurator.java
Modified:
incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessor.java
incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessorConfigurator.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/HeaderType.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/Processor.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseEnvironment.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseException.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseMessage.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/EnvironmentAware.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/Mediator.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2FlexibleMEPClient.java
incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2Sender.java
Modified: incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessor.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessor.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessor.java Tue Nov 29 09:00:18 2005
@@ -1,10 +1,5 @@
package org.apache.synapse.processors.mediatortypes.spring;
-
-
-import javax.xml.namespace.QName;
-
-import org.apache.synapse.xml.Constants;
import org.apache.synapse.SynapseEnvironment;
import org.apache.synapse.SynapseMessage;
@@ -15,7 +10,7 @@
/**
* @author Paul Fremantle
- * @see org.apache.synapse.processors.mediatortypes.spring.SpringMediatorProcessorConfigurator
+ * @see org.apache.synapse.processors.builtin.xslt.XSLTProcessorConfigurator
* <p> This class is the class that "plugs" Spring-based mediators into Synapse.
* <p> A spring based mediator is any object that implements mediator and can be instantiated by
* Spring (see www.springframework.org). The mediator definition is set up using the
@@ -26,9 +21,7 @@
*
*/
public class SpringMediatorProcessor extends AbstractProcessor {
- private static final QName tagName = new QName(Constants.SYNAPSE_NAMESPACE
- + "/spring", "springmediator");
-
+
private GenericApplicationContext ctx = null;
private String beanName = null;
@@ -42,10 +35,7 @@
}
- public QName getTagQName() {
-
- return tagName;
- }
+
public void setContext(GenericApplicationContext ctx) {
this.ctx = ctx;
Modified: incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessorConfigurator.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessorConfigurator.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessorConfigurator.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/SpringMediator/org/apache/synapse/processors/mediatortypes/spring/SpringMediatorProcessorConfigurator.java Tue Nov 29 09:00:18 2005
@@ -25,7 +25,7 @@
/**
* @author Paul Fremantle
- * @see org.apache.synapse.processors.mediatortypes.spring.SpringMediatorProcessor
+ * @see org.apache.synapse.processors.builtin.xslt.XSLTProcessor
* <p> This class configures the Spring mediator type.
* <p> The tag looks like this
* <xmp>
Added: incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessor.java?rev=349761&view=auto
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessor.java (added)
+++ incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessor.java Tue Nov 29 09:00:18 2005
@@ -0,0 +1,95 @@
+package org.apache.synapse.processors.builtin.xslt;
+
+
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.axis2.om.OMAbstractFactory;
+import org.apache.axis2.om.OMElement;
+import org.apache.axis2.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.synapse.SynapseEnvironment;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.SynapseMessage;
+
+import org.apache.synapse.processors.AbstractProcessor;
+
+/**
+ * @author Paul Fremantle
+ * @see org.apache.synapse.processors.builtin.xslt.XSLTProcessorConfigurator
+ * <p> This class is the class that transforms messages using XSLT.
+ *
+
+ *
+ */
+public class XSLTProcessor extends AbstractProcessor {
+
+ private Transformer tran = null;
+
+ private boolean isBody = false;
+
+ /* (non-Javadoc)
+ * @see org.apache.synapse.Processor#process(org.apache.synapse.SynapseEnvironment, org.apache.synapse.SynapseMessage)
+ */
+ public boolean process(SynapseEnvironment se, SynapseMessage smc) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ XMLStreamWriter xsw;
+ try {
+ xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(baos);
+
+ if (isBody) smc.getEnvelope().getBody().serialize(xsw);
+ else smc.getEnvelope().serialize(xsw);
+
+ Source src = new StreamSource(new ByteArrayInputStream(baos.toByteArray()));
+ ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
+ StreamResult result = new StreamResult(baos2);
+ tran.transform(src, result);
+ StAXOMBuilder builder = new StAXOMBuilder(new ByteArrayInputStream(baos2.toByteArray()));
+ OMElement nw = builder.getDocumentElement();
+ if (isBody) smc.getEnvelope().setFirstChild(nw);
+ //TODO don't assume SOAP 1.1
+ else smc.setEnvelope(OMAbstractFactory.getSOAP11Factory().createSOAPEnvelope(builder));
+
+ } catch (Exception e) {
+ throw new SynapseException(e);
+ }
+ return true;
+ }
+
+ /**
+ * @param b
+ * <p> If isBody is true then the XSLT is applied to the Body of the SOAP message, otherwise to the whole env
+ */
+ public void setIsBody(boolean b) {
+ isBody = b;
+ }
+
+
+ /**
+ * @param is
+ * <p>
+ * This sets the correct XSL transform
+ */
+ public void setXSLInputStream(InputStream is) {
+ try {
+ Source src = new StreamSource(is);
+ tran = TransformerFactory.newInstance().newTransformer(src);
+ } catch (Exception e) {
+ throw new SynapseException(e);
+
+ }
+ }
+
+}
+
+
Added: incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessorConfigurator.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessorConfigurator.java?rev=349761&view=auto
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessorConfigurator.java (added)
+++ incubator/synapse/trunk/scratch/prototype3/XSLTTransform/org/apache/synapse/processors/builtin/xslt/XSLTProcessorConfigurator.java Tue Nov 29 09:00:18 2005
@@ -0,0 +1,57 @@
+package org.apache.synapse.processors.builtin.xslt;
+
+import java.io.InputStream;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axis2.om.OMAttribute;
+import org.apache.axis2.om.OMElement;
+import org.apache.synapse.xml.Constants;
+import org.apache.synapse.Processor;
+import org.apache.synapse.SynapseEnvironment;
+import org.apache.synapse.SynapseException;
+
+
+
+import org.apache.synapse.xml.AbstractProcessorConfigurator;
+
+
+
+/**
+ * @author Paul Fremantle
+ * @see org.apache.synapse.processors.builtin.xslt.XSLTProcessor
+ * <p> This class configures the XSLT transformer
+ * <p> The tag looks like this
+ * <xmp><synxslt:xslt name="x" xsl="file.xsl" type="body|envelope"/></xmp>
+ * Perform the given XSLT on the SOAP-Envelope or Body
+ * <p>If type is not present, assumed to be body
+ */
+public class XSLTProcessorConfigurator extends AbstractProcessorConfigurator {
+ private static final QName tagName = new QName(Constants.SYNAPSE_NAMESPACE+"/xslt", "xslt");
+
+ public Processor createProcessor(SynapseEnvironment se, OMElement el) {
+ XSLTProcessor xp = new XSLTProcessor();
+ super.setNameOnProcessor(se,el,xp);
+
+ OMAttribute type = el.getAttribute(new QName("type"));
+ if (type != null && type.getAttributeValue().trim().toLowerCase().equals("envelope")) xp.setIsBody(false);
+ else xp.setIsBody(true);
+
+ OMAttribute xsl = el.getAttribute(new QName("xsl"));
+ if (xsl == null) throw new SynapseException("no xsl attribute on: "+el.toString());
+
+ InputStream xslStream = se.getClassLoader().getResourceAsStream(xsl.getAttributeValue());
+ xp.setXSLInputStream(xslStream);
+
+ return xp;
+
+
+
+ }
+
+ public QName getTagQName() {
+
+ return tagName;
+ }
+
+}
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/HeaderType.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/HeaderType.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/HeaderType.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/HeaderType.java Tue Nov 29 09:00:18 2005
@@ -1,7 +1,30 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.synapse;
import org.apache.axis2.addressing.EndpointReference;
+/**
+ * @author Paul Fremantle
+ * <p> This class encapsulates access to headers. It has a set of "logical names" (e.g. strings)
+ * Once you have set the logical name you can read and write that header on a SynapseMessage
+ * It is used by the RegexProcessor and the HeaderProcessor classes.
+ *
+ */
public class HeaderType {
private final static int TO = 1, FROM = 2, FAULT = 3, ACTION = 4,
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/Processor.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/Processor.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/Processor.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/Processor.java Tue Nov 29 09:00:18 2005
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.synapse;
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseEnvironment.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseEnvironment.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseEnvironment.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseEnvironment.java Tue Nov 29 09:00:18 2005
@@ -16,6 +16,12 @@
package org.apache.synapse;
+/**
+ * @author Paul Fremantle
+ *
+ * <p>Common stuff needed to embed Synapse into a given runtime (e.g. Axis2)
+ *
+ */
public interface SynapseEnvironment {
public void injectMessage(SynapseMessage smc);
public ClassLoader getClassLoader();
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseException.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseException.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseException.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseException.java Tue Nov 29 09:00:18 2005
@@ -15,6 +15,11 @@
*/
package org.apache.synapse;
+/**
+ * @author Paul Fremantle
+ * <p>Runtime exception for Synapse code to throw
+ *
+ */
public class SynapseException extends RuntimeException {
private static final long serialVersionUID = -7244032125641596311L;
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseMessage.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseMessage.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseMessage.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/SynapseMessage.java Tue Nov 29 09:00:18 2005
@@ -21,6 +21,12 @@
import org.apache.axis2.addressing.RelatesTo;
import org.apache.axis2.soap.SOAPEnvelope;
+/**
+ * @author Paul Fremantle
+ *
+ * <p> The core definition of a message flowing thru Axis.
+ *
+ */
public interface SynapseMessage {
public EndpointReference getFaultTo();
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/EnvironmentAware.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/EnvironmentAware.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/EnvironmentAware.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/EnvironmentAware.java Tue Nov 29 09:00:18 2005
@@ -1,7 +1,28 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.synapse.api;
import org.apache.synapse.SynapseEnvironment;
+/**
+ * @author Paul Fremantle
+ * <p>API for Mediators to get access to the Synapse Environment
+ *
+ */
public interface EnvironmentAware {
public void setSynapseEnvironment(SynapseEnvironment se);
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/Mediator.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/Mediator.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/Mediator.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/api/Mediator.java Tue Nov 29 09:00:18 2005
@@ -17,6 +17,11 @@
import org.apache.synapse.SynapseMessage;
+/**
+ * @author Paul Fremantle
+ * <p>API interface for pluggable mediators
+ *
+ */
public interface Mediator {
public boolean mediate(SynapseMessage smc);
}
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2FlexibleMEPClient.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2FlexibleMEPClient.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2FlexibleMEPClient.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2FlexibleMEPClient.java Tue Nov 29 09:00:18 2005
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.synapse.axis2;
import org.apache.axis2.addressing.EndpointReference;
@@ -12,17 +28,16 @@
import org.apache.axis2.engine.AxisConfigurationImpl;
import org.apache.axis2.engine.AxisEngine;
import org.apache.axis2.om.OMAbstractFactory;
-import org.apache.axis2.om.OMElement;
-import org.apache.axis2.om.OMNamespace;
+
import org.apache.axis2.soap.SOAPEnvelope;
import org.apache.axis2.transport.TransportUtils;
import org.apache.axis2.util.UUIDGenerator;
import org.apache.synapse.Constants;
import org.apache.synapse.SynapseException;
-import org.apache.ws.security.SOAP11Constants;
+
import javax.xml.namespace.QName;
-import java.util.Iterator;
+
public class Axis2FlexibleMEPClient {
Modified: incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2Sender.java
URL: http://svn.apache.org/viewcvs/incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2Sender.java?rev=349761&r1=349760&r2=349761&view=diff
==============================================================================
--- incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2Sender.java (original)
+++ incubator/synapse/trunk/scratch/prototype3/src/org/apache/synapse/axis2/Axis2Sender.java Tue Nov 29 09:00:18 2005
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package org.apache.synapse.axis2;
import org.apache.axis2.AxisFault;
---------------------------------------------------------------------
To unsubscribe, e-mail: synapse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: synapse-dev-help@ws.apache.org