Para lograr esto hay que crear un projecto maven java, el fichero jar resultante hay que copiarlo en $ESB_HOME/repository/component/dropins (si es un projecto OSGI) o $ESB_HOME/repository/component/lib(si es un fichero jar), posteriormente hay que registrar nuestra clase en el fichero ESB_HOME\repository\conf\synapse.properties
synapse.properties
synapse.xpath.func.extensions=edu.emmerson.synapse.extension.DemoFunctionProvider,...otros mediators...En cuanto al projecto maven hay que añadir las siguientes dependencias en el fichero pom.xml.
<properties>
<carbon.kernel.version>4.4.1</carbon.kernel.version>
<carbon.mediation.version>4.4.12</carbon.mediation.version>
<synapse.version>2.1.0</synapse.version>
</properties>
<dependencies>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.core</artifactId>
<version>${carbon.kernel.version}</version>
</dependency>
<dependency>
<groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.registry.core</artifactId>
<version>${carbon.kernel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.synapse</groupId>
<artifactId>synapse-core</artifactId>
<version>${synapse.version}</version>
</dependency>
<dependency>
<groupId>org.wso2.carbon.mediation</groupId>
<artifactId>org.wso2.carbon.mediation.initializer</artifactId>
<version>${carbon.mediation.version}</version>
</dependency>
</dependencies>
En nuestro código fuente necesitamos dos clases.La siguiente clase implementa de SynapseXpathFunctionContextProvider, la cual registraremos en el fichero synapse.properties, en esta clase asignaremos un "namespace" y un "nombre" a nuestra función XPath con el cual haremos referencia en nuestras mediaciones, en este caso demo y myfunction.
package edu.emmerson.synapse.extension;
import javax.xml.namespace.QName;
import org.apache.synapse.MessageContext;
import org.apache.synapse.util.xpath.ext.SynapseXpathFunctionContextProvider;
import org.jaxen.Function;
public class DemoFunctionProvider implements SynapseXpathFunctionContextProvider {
private static final String NAME_SPACE_PREFIX = "demo";
private static final String MY_FUNCTION = "myfunction";
public Function getInitializedExtFunction(MessageContext messageContext) {
DemoFunction resolver = new DemoFunction(messageContext);
return resolver;
}
public QName getResolvingQName() {
return new QName(null, MY_FUNCTION, NAME_SPACE_PREFIX);
}
}
La segunda clase es la implementación de la funcionalidad que queremos añadir y esta clase necesita implementar la interface Function, en este caso añade el prefijo Hello al parámetro recibido.
package edu.emmerson.synapse.extension;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseConstants;
import org.jaxen.Context;
import org.jaxen.Function;
import org.jaxen.FunctionCallException;
import org.jaxen.function.StringFunction;
public class DemoFunction implements Function {
private static final Log log = LogFactory.getLog(DemoFunction.class);
private static final Log trace = LogFactory.getLog(SynapseConstants.TRACE_LOGGER);
public static final String NULL_STRING = "";
private final org.apache.synapse.MessageContext synCtx;
public DemoFunction(org.apache.synapse.MessageContext synCtx) {
this.synCtx = synCtx;
}
public Object call(Context context, List args) throws FunctionCallException {
String argOne = StringFunction.evaluate(args.get(0), context.getNavigator());
try {
String val = "Hello " + argOne;
return val;
} catch (Exception msg) {
throw new FunctionCallException(msg);
}
}
}
Finalmente en nuestra secuencia del ESB podemos usarla como en el siguiente ejemplo.
<property description="calling custom xpath function"
expression="demo:myfunction('readers')" name="myProperty"
scope="default" type="STRING"/>
<log level="custom">
<property expression="get-property('myProperty')" name="myProperty"/>
</log>
Después de ejecutar nuestro código podremos ver en el log como se añadio el prefijo Hello al parámetro readers.
[2016-07-17 23:16:20,925] DEBUG - SequenceMediator Mediation started from mediator position : 0 [2016-07-17 23:16:27,656] INFO - LogMediator myProperty = Hello readers
- Enjoy -
No comments:
Post a Comment