Get spring context

	    @Autowired  
	    ApplicationContext applicationContext; 

	    // ...
	    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
	    // ...
	    ApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
	    // ...
	    ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-webservices.xml");//, "spring/spring-ddbb.xml", "spring/spring-properties.xml" );
	    // ...
	    ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-webservices.xml");//, "spring/spring-ddbb.xml", "spring/spring-properties.xml" );	
	    // ...
Anuncios
Get spring context

Change connection pool at runtime

Retrieve pool data source, from spring context.

	com.mchange.v2.c3p0.ComboPooledDataSource pool = (com.mchange.v2.c3p0.ComboPooledDataSource) context.getBean("idDataSource");
	pool.setJdbcUrl("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=pepe.host.es) (PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))");
	try {
		Connection con = pool.getConnection();
		if(con != null){
 			// TODO check database connection
		}else{
			throw new ConnectionException("Can't load new URL database connection");
		}
		
	} catch (SQLException e) {
		e.printStackTrace();
	}

The method setJdbcUrl(), do resetPoolManager. The true atribute means that not broke the actual connections.

    public void setJdbcUrl( String jdbcUrl )
    { 
        dmds.setJdbcUrl( jdbcUrl ); 
        this.resetPoolManager( false );
//      System.err.println("setting jdbcUrl: " + jdbcUrl + " [dmds@" + C3P0ImplUtils.identityToken( dmds ) + "]"); 
//      if (jdbcUrl == null)
//      new Exception("*** NULL SETTER ***").printStackTrace();
    }
Change connection pool at runtime

cxf client code

	public static void main(String[] args) {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.getInInterceptors().add(new LoggingInInterceptor());
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		factory.setServiceClass(es.depontevedra.soa.facturae.search.FacturaeSearch.class);
		factory.setAddress("http://HOST:PORT/serviciows/servicio?wsdl");
		HelloWorld client = (HelloWorld ) factory.create();
		 
		List<EstadoFactura> reply = client.setHi("Hola");
		System.out.println("Size: " + reply.size());
	}
cxf client code

WSO2 proxy con secuencias

Tenemos un WS que tienen tres operaciones insertar, consultar(query) y actualizar. Cuando damos de alta, no devuelve todos los datos que quisieramos. Muchos de estos datos se encuentran en la consulta. Lo que vamos a hacer, es, en un mismo proxy, realizar dos llamadas: insertar y consultar. Elmensaje de salida sera un compendio de las dos acciones.

1.- Consumidor del BUS de WSO2 realiza una llamada de inserccion.
2.- El proxy realiza la llamada de inserccion, recupera el xml resultante.
3.- El proxy recupera datos del xml resultante.
4.- El proxy crea un nuevo xml de peticion de consulta.
5.- El proxy lanza la consulta y recupera el xml de respuesta.
6.- El proxy recupera datos del xml de respuesta del apartado 5 y 3
7.- El proxy crea y envia un xml de respuesta para la llamada 1.

para todo esto necesitamos dar de alta:
– Endpoint
– Secuencias
– Proxy

Definicion del Endpoint

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud">
   <address uri="http://host:port/pepe/crudws" format="soap11">
      <suspendOnFailure>
         <progressionFactor>1.0</progressionFactor>
      </suspendOnFailure>
      <markForSuspension>
         <retriesBeforeSuspension>0</retriesBeforeSuspension>
         <retryDelay>0</retryDelay>
      </markForSuspension>
   </address>
</endpoint>

Definicion del proxy

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="pepe.crud.proxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target faultSequence="fault" endpoint="pepe.crud">
<!-- definimos una secuendcia de entrada. Aqui vamos a indicar que queremos hacer -->
      <inSequence>
<!-- Recuperamos el tipo de operacion que se esta ejecutando. Pueden ser: insertRegisty, updateRegistry, queryRegistry -->
         <property name="Operation" expression="get-property('Action')"/>
<!-- filtramos por el resultado de la operacion. Si es igual al patron regex=".*newRegistry" -->
         <filter source="get-property('Operation')" regex=".*newRegistry">
            <then>
<!-- incvocamos la secuencia añadir -->
               <sequence key="crud.addRegistry.sequence"/>
            </then>
            <else>
<!-- Sino es la operacion de añadir, continuamos por aqui -->
               <send>
<!-- enviamos al WebService la peticion-->
                  <endpoint key="wspepe.crud"/>
               </send>
            </else>
         </filter>
      </inSequence>
<!-- Tratamos la respuesta del servidor -->
      <outSequence>
         <filter source="get-property('Operation')" regex=".*newRegistry">
            <then>
<!-- Si era una operacion de insercion en registro. Realizamos la siguiente secuencia de operaciones. -->
               <sequence key="crud.outRegistry.sequence"/>
            </then>
            <else>
<!-- Sino, logeamos -->
               <log level="full">
                  <property name="Operation" expression="get-property('Operation')"/>
               </log>
            </else>
         </filter>
<!-- enviamos el mensaje a nuestro consumidor -->
         <send buildmessage="true"/>
      </outSequence>
   </target>
   <publishWSDL key="conf:/WSDL/crud.crudws/crudWS.wsdl">
      <resource location="typeapplicant.xsd"
                key="conf:/WSDL/crud.crudws/typeapplicant.xsd"/>
      <resource location="typeattachment.xsd"
                key="conf:/WSDL/crud.crudws/typeattachment.xsd"/>
      <resource location="typecommon.xsd"
                key="conf:/WSDL/crud.crudws/typecommon.xsd"/>
      <resource location="typecrud.xsd"
                key="conf:/WSDL/crud.crudws/typecrud.xsd"/>
   </publishWSDL>
   <description/>
</proxy>

Definicion de las secuencias

<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.addRegistry.sequence">
<!-- logeamos -->
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia ADD"/>
   </log>
   <!-- invocamos a otro endpoint  -->
   <send receive="crud.queryRegistry.sequence" buildmessage="true">
      <endpoint key="pepe.crudws"/>
   </send>
</sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.outRegistry.sequence">
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia OUT"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="RegistryCode" expression="get-property('RegistryCode')"/>
      <property xmlns:ns="http://org.apache.synapse/xsd" name="IdRegistry" expression="get-property('IdRegistry')"/>
   </log>
</sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.queryRegistry.sequence">
   <!-- Obtenemos los datos del alta del nuevo registro para poder realizar la consulta  -->
   <property name="IdRegistry" expression="$body/ns6:RIResponse/body/idcrud" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" />
   <property name="RegistryCode" expression="$body/ns6:RIResponse/body/crudcode" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" />
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia QUERY 1"/>
      <property name="RegistryCode" expression="get-property('RegistryCode')" xmlns:ns="http://org.apache.synapse/xsd" />
      <property name="IdRegistry" expression="get-property('IdRegistry')" xmlns:ns="http://org.apache.synapse/xsd" />
   </log>
   <!-- creamos un xml a medida para enviar al endpoint -->
   <payloadFactory media-type="xml">
      <format>
         <reg:RQRequest xmlns:reg="http://ws.pepe.com/crudws" xmlns:reg1="http://ws.pepe.com/types/crud">
            <header xmlns="" version="0"/>
            <body xmlns="">
               <crudcode>$1</crudcode>
               <input>1</input>
            </body>
         </reg:RQRequest>
      </format>
      <args>
         <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('RegistryCode')" evaluator="xml"/>
      </args>
   </payloadFactory>
   <!-- enviamos el xml creado al endpoint -->
   <header name="Action" value="http://ws.pepe.com/crudws/queryRegistry"/>
   <send>
      <endpoint key="pepe.crudws"/>
   </send>
   <log level="full">
      <property name="SEQ" value="Accediendo a la secuencia QUERY 2"/>
   </log>
</sequence>

Este codigo ha sido elaborado por Rafael Udaondo. Con su permiso he publicado esta entrada.

WSO2 proxy con secuencias

CXF jaxb send string as CData

From http://cxf.547215.n5.nabble.com/CXF-jaxb-send-string-as-CData-td5524523.html
Finalmente no he necesitado usarlo, pero lo guardo por si algún día…

public class CdataWriterInterceptor extends AbstractPhaseInterceptor<Message> { 

        public CdataWriterInterceptor() { 
                super(Phase.PRE_STREAM); 
                addAfter(AttachmentOutInterceptor.class.getName()); 
        } 

        @Override 
        public void handleMessage(Message message) { 
                message.put("disable.outputstream.optimization", Boolean.TRUE); 
                XMLStreamWriter writer = 
StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class)); 
                message.setContent(XMLStreamWriter.class, new CDataXMLStreamWriter(writer)); 
        } 
} 
public class CDataXMLStreamWriter extends DelegatingXMLStreamWriter { 

        private String currentElementName; 

        public CDataXMLStreamWriter(XMLStreamWriter del) { 
                super(del); 
        } 

        @Override 
        public void writeCharacters(String text) throws XMLStreamException { 
                boolean useCData = checkIfCDATAneededForCurrentElement(); 
                if (useCData) { 
                        System.out.println("WritingCData" + text); 
                        super.writeCData(text); 
                }else { 
                super.writeCharacters(text); 
                } 
        } 

        private boolean checkIfCDATAneededForCurrentElement() { 
                if("MessageBody".equals(currentElementName)) return true; 
                return false; 
        } 

        public void writeStartElement(String prefix, String local, String 
uri) throws XMLStreamException { 
                currentElementName = local; 
                super.writeStartElement(prefix, local, uri); 
        } 
}
CXF jaxb send string as CData