Empece este blog para guardar los descubrimientos en programacion que hago cuando tengo un error y por mas que busco en san Google, no encuentro nada hasta despues de horas de andar buscando y horas de prueba y error. Si a alguien algun dia le sirve, que bueno. En general es para mi porque se me olvidan muchos de estos descubrimientos.

Tuesday, December 20, 2011

Eclipse Axis Error

Intentando generar un web service o un web service client utilizando el wizard de Eclipse, nos encontramos con el siguiente error:

Error when deploying Web service to Axis runtime axis-admin failed with {http://xml.apache.org/axis/}HTTP (404)Not found

San Google dijo que el problema es que estas intentando hacer un deploy cuando el server aun no ha levantado. Varias paginas web decian que la solucion sencilla era darle Next, Next, Next hasta que funcionara porque en teoria eventualmente tu server levantaria. Varios Next despues con el mismo error, varias paginas hablaban de un parche que se podia instalar que bruscamente mantenia tu start loopeando hasta que el server estuviera arriba. Esa solucion no me gusto.

Solucion sencillisima!!!:
Click en Window en la parte de arriba del Eclipse-----> clic en preferences----->escribe Axis------->clic en Axis2 Preferences----->pestaña Axis2 Runtime---->clic en Browse------>vete a la locacion de tu axis2 libs----> clic en Axis Emitter---->clic en Apply.

Si no tienes las librerias de Axis2, asegurate de bajarlas primero. Yo se que el wizard de Eclipse crea los web services y web service clients en Axis pero no se porque haciendo esto funciono en mi maquina y en la de mi compañera.

Eclipse bug fixed sin parche!

Thursday, December 15, 2011

Web service client con ADB databinding y xmlbeans databing con Axis2 Code Generator Eclipse

Al final de este articulo se encuentran dos ejemplos de como utilizar las clases generadas por el Axis2 Code Generator plugin para Eclipse. Primero discuto algunos errores que encontre en su uso.

Oh San Google, San Google como fallas!
Esta es una de esas veces donde me quise arrancar los pelos buscando como solucionar dos errores horripilosos de Axis2 cuando se genera Web clients.

Error 1:
org.apache.axis2.Axis Fault: org.apache.axis2.Databinding.ADBException: Unexpected subelement .....

En este primer error, San Google fue mas o menos de ayuda. Digo mas o menos porque lo unico que hizo fue confirmar que hay un bug en la generacion de clases con el Axis2 con Databinding ADB. Lo que sucede en este error (segun lo que lei) es que el ADB esta esperando que el xml request o response (debes encontrar en cual de los dos o si en los dos esta el error) envie un orden especifico "a,b,c" y el webservice esta retornando un orden "a,d,c" por ende, el Unexpected Subelement. No comprendi a cabalidad si el error es porque el orden del schema en el wsdl no corresponde, el bug es del ADB. Creo que lo mas correcto seria corregir el wsdl en el webservice, pero como en este caso nosotros solo consumiamos el webservice y no lo creamos, asi que no pudimos darnos el lujo de corregirlo.

Ya he utilizado el ADB databing antes y no me genero este error. Es el databing por default del Axis2 Code Generator y su codigo es mas sencillo.  (abajo un ejemplo).

Solucion: Asumo yo que se considera bug del ADB porque no deberia quejarse y solo recibir lo que se le envia. Por eso, la recomendacion general de San Google fue utilizar xmlbeans de Databinding.

Generamos nuevamente el codigo del cliente con el Axis2 Code Generator con databinding xmlbeans y todo parecia ir bien hasta que aparecio este error:

Error2:
ClassNotFoundException : Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system...
.TypeSystemHolder.
Make sure the generated binary files are on the classpath.



Todo San Google tenia la misma solucion: asegurate de agregar la clase TypeSystemHolder.class al classpath. Muy pocos decian como (porque agregar algo al classpath es lo mas sencillo del mundo, pero no para esto!). No intentes agregar la clase al classpath en ningun lado, no funciona. Una cosa que me enoja de los ejemplos y ayuditas del Axis2 es que todos son para Web dynamic projects! U_U...
Algunos mencionaban soluciones utilizando un WSDL2JAVA code generator (que en esencia es lo mismo que el Axis2 Code Generator) y utilizar un ANT script para copiar la disque clase al classpath. Lo triste es que todos decian: "copialo al build/classes" y los JAVA projects (que son los que generalmente uso para los webclients) no tienen esas carpetas!!! ¬_¬

Solucion sencillisima: click en build path ------> configure build path. En la pestaña de Source--->click en Add Folder----->agrega la carpeta resources que te creo el Axis2 que contiene el TypeSystemHolder.class y un monton de otras cosas mas. Agrega toda la carpeta, no agregues solo la subcarpeta con la clase. NO es necesario ningun xmlbeans.jar; que no te engañe Google!!!


Aqui los ejemplos (Son solo una idea o guia);

ADB Databing. 
Como menciones arriba, es el default y el mas "amigable" de usar.
   
        ExampleServiceStub service=null;   // Declara el servicestub primero 
        ExampleParameter param= new ExampleParameter(); //averigua que tipo de parametro espera el                         metodo que desea consumir. 
param.setA("A");
param.setB("B");
param.setC("C"); //....etc
       ExampleMethod method = new ExampleMethod(); //llena el parametro del metodo
method.setFunctionCall(param);
service = _servicePool.borrowService(_endPoint, _repositoryPath, _userName);
ExampleResponse functionresponse = service.function(method); //invoca la funcion
ExampleResponse response = functionresponse.getResponseMessage();

XmlBeans
Jamas imagine que el codigo de xmlbeans seria tan diferente. No es en si MUY diferente, pero sin una guia, definitivamente seria un reto.

        ExampleStub service = null;
        service = _servicePool.borrowService(_endPoint, _repositoryPath, _userName, _timeOut);    
        ExampleRequestDocument request = ExampleRequestDocument.Factory.newInstance(); //no utilices la palabra new aqui. Se instancia con un Factory.newInstance();
        ExampleParameterQuery param = request.addNewExampleRequest();
param.setA("A");
param.setB("B");
param.setC("C"); //...etc
        request.setParameter(param);
        ExampleResponseDocument response = service.getFunction(request);

Si esto te ayuda, me alegro mucho! A esta mente pollo que todo se le olvida le servira mucho!

Monday, November 28, 2011

C#, Llenar un Datagrid sin base de datos. (Unbound Datagrid)

Como siempre, mis posts son mas para mi que para nadie. Ya habia tenido el problema que tuve hoy, lo solucione, y hoy que me toco volver hacerlo, no me acordaba como hacerlo. De que estoy hablando? De llenar un datagrid sin un DataSource o un DataBinding. Odio que todas las ayudas de San Google muestren infinidad de paginas que la "unica" solucion es crear un DataTable manual y poblar el datagrid con dicho datatable siempre usando dataSource o dataBind.

Por suerte encontre un link muy util http://msdn.microsoft.com/en-us/library/5s3ce6k8.aspx (Tip: Las mejores palabra para el Seach es Unbound Datagrid). Para los que como yo no estan buscando algo tan explicito sino que va al grano a lo que estoy buscando, he aqui mi codigo:

DataGridView unboundGridExample;
unboundGridExample.ColumnCount = 1;
unboundGridExample.Columns[0].Name = "Postres Favoritos"; Es necesario establecer las columnas, de lo contrario no podras llenar rows (bueno, si tu sabes como, me avisas :P)
unboundGridExample.Rows.Add("Pastel de Chocolate");
unboundGridExample.Rows.Add("Flan de Caramelo");
unboundGridExample.Rows.Add("Oreo Truffles");
unboundGridExample.Rows.Add("Cherry Pie");
unboundGridExample.Rows.Add("Blueberry Cheesecake");

Y tada! no hay necesidad de mas nada! puedes guardar, modificar y recorrer tu grid igual como si estuviera bound con un dataSet! 

:)

Lo bueno es que la proxima vez que necesite hacer esto, tendre quien me recuerde!

Wednesday, October 12, 2011

Errores al commitear en el SVN

Hoy al intentar darle commit a un projecto al svn, el maravilloso svn te da esos errores horripilosos donde el detalle del error te deja mas confundido sin idea de por donde buscar.

El error decia lo siguiente:

org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locked dir
svn: Working copy 'C:\path' locked

El error dice: Se intento bloquear un directorio que ya esta bloqueado. C:\tu directorio bloqueado.

Esto se soluciona de la siguiente manera:
Al estar en la perspectiva TeamSynchronize,
darle clic derecho al projecto con el error ----> Team---->Cleanup.

Esto debe solucionar este error. 

Despues nos encontramos con otro de sus errores maravillosos. 
org.tigris.subversion.javahl.ClientException: Entry already exists
svn: 'C:\path' is already under version control

El error dice: La entrada ya existe en el svn. Tu directorio esta bajo control de version.

Esto es porque en las carpetas del projecto deben existir carpetas .svn que se fueron cuando se le da copy/paste a las carpetas. Esto es facil de obviar y se soluciona entrando a las carpetas del projecto y eliminando estas carpetas .svn. Con esta solucion hay que tener un poco mas de cuidado, no borres carpetas .svn sin saber cual es la que te esta dando el problema de commit. Si estas comiteando diversas carpetas del projecto, prueba ir comiteando una por una para encontrar cual es la carpeta en la que debes eliminar los .svn para que no elimines las carpetas .svn que si estan correctas. 

Feliz programacion. 

Thursday, October 6, 2011

CSV Reader

El dia de hoy aprendi mucho. Tengo tiempo de estar creando programas que lean archivos txt o csv desde hace un tiempo, pero nunca habia empezado el programa completamente de 0; siempre tuve referencias. Como el mismo problema con los Regex, la manipulacion de csv (que hasta hoy aprendi que significa Comma separated values) los hacia en archivos jsp, no en un java class. Aqui no hay mucha diferencia excepto la manipulacion del csv. Nunca antes necesite distinguir las cabeceras de las columnas del csv, solo habia utilizado el file.readLine() comun y corriente porque pues el nombre de las cabeceras no era requerido. En mi ultimo programa, estos eran de suma importancia. Hoy google si se porto bien conmigo (dado que el tema en general es sencillo) y encontre una excelente pagina que quiero dejar registrado.

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=CSV

Este pequeño tutorial requiere de la descarga de un javacsv2.1.zip (que encuentras el link de descarga en el mismo link anterior) para utilizar la libreria CsvReader. Muy util el tutorial y sencillo el tutorial y pues a continuar programando!!!



Wednesday, October 5, 2011

Java Regular Expression

Regular expressions, o comunmente conocidas como Regex siempre me han dado dolor de cabeza. No, este no es un tutorial de regex pq honestamente aun no las comprendo a plenitud.

Mi primer encuentro con los regex fue cuando se me solicito que en el ingreso de la direccion de una pagina web no se permitiera que el usuario ingresara aaaaaabbbbbbccccccc o 1111143333344444, entienden la idea.

Pues esto se puede hacer con iteradores sobre el string, pero se ve feo, poco creativo y enogorroso. En su lugar, le di un vistazo a las regex. Excelente. Las regex me permitian buscar patrones y de encontrarlo, saber que hacer con ellos. Hasta hay testers de regex online que te permiten revisar tu regex y compararlo con strings para ver si encuentras un patron.

Mi tester online favorito es  http://www.regular-expressions.info/javascriptexample.html

Ingenua y nueva en los regex, no sabia que habia distincion cuando lo utilizas en Java y en JavaScript. Busca testers para Java; si lo encuentras, pasalo que por mas google que hago, nada. Como era una pagina web, use javascript y no se dijo mas. Para Java la cosa cambia mucho y son pocos los sitios web que te ayudan a diferenciarlo.

Entonces, algunos de mis hallazgos.
En Java, los regex llevan por default el * y el $ en el string a comparar, lo cual busca tu patron en todo el string, en lugar en cualquier porcion del string que se encuentre tu patron.

Solucion:
agrega .* REGEX .* en tu expresion y voila! Esto permitira que tome el matches() si encontro patron en cualquier porcion del string.

Ejemplo:
    Pattern p = Pattern.compile(".*(\\w)\\1{3}.*") ;
    matcher m = p.matecher(String);
        if (m.matches()){
             aqui va tu codigo;
       }

NOTA: recuerda que la \\ es una \ de escape.

Eso fue un poco de dolor de cabeza.
Leyendo mas para ver si por fin entendia las regex (nope, aun no), encontre que los regex que pruebes en tu online tester para javascript funcionaran a la perfeccion en tu java class si utilizas el metodo find() en lugar de matches()

Ejemplo:

Pattern p2 = Pattern.compile("(\\w)\\1{2}");
Matcher m2 = p2.matcher(text);
if (m2.find()) {
tu codigo aqui;
}


Bueno, a mi me ayudo bastante! :)

NOTA: la primera solucion se mostro mas efectiva que el find(). Para su consideracion :P