Friday, April 29, 2011

Modificar los tipos de datos de un Wsdl por codigo.

Si quieres modificar los tipos de datos de un WSDL usa la implememtacion de la especificacion JSWDL llamada  wsdl4j

javax.wsdl.xml.WSDLWriter wsdlWriter= javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter();

        javax.wsdl.xml.WSDLReader wsdlReader = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader();

        Definition wsdlDefinition =(Definition) wsdlReader.readWSDL(wsdlfile);

//elimina el esquema de datos antiguo
javax.wsdl.Types type=wsdlDefinition.getTypes();

for (Object e : type.getExtensibilityElements()) {

            if (e instanceof com.ibm.wsdl.extensions.schema.SchemaImpl) {
                //schema = (com.ibm.wsdl.extensions.schema.SchemaImpl)e;
                //TODO:erase all schema
                type.getExtensibilityElements().remove(e);
                break;
            }
        }
//importa el el nuevo esquema de tipo de datos
       com.ibm.wsdl.extensions.schema.SchemaImpl schema;
          
            schema = (com.ibm.wsdl.extensions.schema.SchemaImpl) wsdlDefinition.getExtensionRegistry()
            .createExtension(javax.wsdl.Types.class, new QName("http://www.w3.org/2001/XMLSchema", "schema"));
          
            //com.ibm.wsdl.extensions.schema.SchemaImpl schema = new com.ibm.wsdl.extensions.schema.SchemaImpl();
            SchemaReference schemaReference  = new SchemaReferenceImpl();
          
            schemaReference.setSchemaLocationURI("http://localhost:8000/allTypes2.xsd");
          
            schema.addInclude(schemaReference);
            type.addExtensibilityElement(schema);
   
       
     
        wsdlDefinition.addNamespace(ns, nameSpace);
       
        File file2 = new File("newwsdl.wsdl");
        BufferedWriter output;
        try {
            output = new BufferedWriter(new FileWriter(file2));
            wsdlWriter.writeWSDL(wsdlDefinition, output);
            output.close();
           
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Crear una estructura de Map dentro de otra

Si quieres trabajar con una estructura compleja de un Map dentro de otra, usando generic, se realiza de la siguiente manera:

//definicion
Map <javax.xml.namespace.QName , Map < javax.xml.namespace.QName,String>> mapaComplejo;
//y lo inicializamos
mapaSimple=new HashMap<javax.xml.namespace.QName,String>();
mapaSimple.put(new QName("part"),"type");
//inicializamos mapa complejo
mapaComplejo = new HashMap <javax.xml.namespace.QName , Map<javax.xml.namespace.QName,String>>();
mapaComplejo.put(msg.getQName(), mapaSimple);

Tuesday, April 19, 2011

Compilando apache Ode 1.3.5 con Maven 3, error. Usa Maven 2

En la version 1.3.3 de Apache ODE el compilador es una herramienta muy util para comprobar que hacemos las cosas bien. Lo malo que hay un bug. en la versión 1.3.3, no se muy bien porque, cuando recibes un mensaje y ese mismo mensaje lo usa para invocar a otro WS se arma un lio con los mensajes SOAP y mete dos HEAD en vez de una. Asi que sin mas te bajas la version 1.3.5 y funciona correctamente.
Pues no es así, cuando ejecutas el compilador BPELC.bat lanza un error que no encuentra una clases
Caused by: java.lang.ClassNotFoundException: org.apache.ode.tools.bpelc.cline.BpelC
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: org.apache.ode.tools.bpelc.cline.BpelC.  Program will exit.


Esto es debido a que cuando abres el jar de ode-bpel-compiler-1.3.5.jar ves que esta sin compilar las clases que estan dentro. Así que te bajas las fuentes e intentas compilar com Maven 3. Craso error. No compila porque no se que libreria, tiene por dependencia,  eso creo yo, la 1.0-incubating-M7b woden.pom que en todos los repositorios que he buscado no lo he encontrado. Como era la 1º vez que uso Maven 3, he pensado que no estaba soportado para Maven 3, así que voy a probar con Maven 2. Yo pensaba que era una tonteria, ya que he leido que solo ha cambiado internamente y que no hay diferencia. Pues con Maven 2 ha compilado perfectamente.