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, February 14, 2012

Seteando la Variable JAVA_HOME

Ok, entonces mis amigos, siguiendo con el tema de los webservices:

La ultima vez comentaba de como crear el webservice client desde linea de comando. En mi compu no dio ningun problema y corrio a la perfeccion generando las clases del cliente. Al intentar generar las clases de la misma manera en la computadora del compañero nos lanzo un error. (No tengo el error exacto a mano, lo siento)

El error era: La variable JAVA_HOME no esta seteada o asignada. 

Pues google no ayudo mucho, probablemente porque todos asumen que deberia saber, pero yo no sabia y mis compañeros tampoco (Si, no estar solo te hace sentir mejor :P)

Aqui la solucion:
Clic en windows (si el icono de windows) ------> clic en Computer o Equipo (dependiendo del lenguaje de tu SO) -------> clic en properties o propiedades-----> configuracion avanzada de sistema-----tab de Opciones avanzadas----->clic en variable de entorno---->Busca la Java_home y das doble clic y en valor de la variable escribe la direccion (directory path) de donde tienes instalado tu JDK o JRE y voila!!

Bueno, a mi me lo explicaron y se me olvido y tuve que volver a preguntar, asi que si llegaste aqui buscando como hacer esto, espero te sirva como me servira a mi!
Saludos!

Monday, January 30, 2012

Web Service clients desde command line

Webservices, webservices, porque me dificultas tanto la vida? Esta bien, son un reto, son algo nuevo para mi y mantienen las cosas interesantes. Aunque me estoy quejando de webservices y realmente son los clients los que han sido dolores de cabeza. En el pasado escribi un post de como generar clientes en ADB y en xmlBeans con el Axis2 Code Generator Eclipse plugin. Al tener otro problema con estos clientes, tuve que irme por la solucion de clientes generados por linea de comando.

En general es muy sencillo. Estoy segura que hay mas informacion al respecto pero he aqui lo esencial.

Descargar las librerias de Axis2. Trata siempre de estar actualizando ya que Axis pasa corrigiendo bugs conocidos que probablemente sean los que te estan dando problemas.

Abres una consola DOS y navegas hasta llegar al directory donde tienes tus librerias Axis2. Navega hasta la carpeta bin. escribe el siguiente comando:
WSLD2JAVA -uri http://EndpointDelWebService?wsdl

Hay mas comandos que puedes agregar a esta sentencia para especificar databinding (ADB es el default en esta generacion tambien), ruta en donde poner las clases generadas, etc. Para mas informacion puedes buscar aqui: http://axis.apache.org/axis2/java/core/docs/reference.html

Navega en la carpeta bin y copia las tareas generadas (clases JAVA). Copia las clases en algun proyecto donde desees el webclient (En este caso no tenemos problemas poniendolo en un Java Project que te permite usar este .jar para cualquier proyecto que requiera usar ese cliente).

Siempre requeriras crear clases para consumir las clases generadas. En mi caso siempre necesito un ConectionStud manager y un PasswordCallbackHandler. Las clases son un poco bruscas a mi parecer ya que generan casi todo el codigo en una sola clase, pero si necesitas entrar al codigo para hacer cambios, el codigo generado es un poco mas facil de seguir y cambiar que las clases generadas por los Eclipse code generator plugins.

En una nota aparte, tambien tuvimos problemas con el policy del webservice. Por lo general, el policy va dentro del request cuando envias el user y password. En este caso tuvimos problemas porque el webservice nos retornaba que no encontraba el policy. Se tuvo que crear .xml que llevara el policy con el username de nuestro cliente para poder solucionar este problema. Ejemplo de Policy:


<?xml version="1.0" encoding="UTF-8"?>
<wsp:Policy wsu:Id="wss_username_token_service_policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsp:ExactlyOne>
<wsp:All>
<sp:SupportingTokens
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken>TuUserName</sp:WssUsernameToken>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
<ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
<ramp:user>TuUserName</ramp:user>
<ramp:passwordCallbackClass>package.claseDeTuCallBackHandler</ramp:passwordCallbackClass>
</ramp:RampartConfig>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>


Como puedes ver en el ejemplo, se utiliza ramparta para el manejo de autenticacion por lo que necesitaras el modulo rampart (yo utilizo el 1.4 aunque no es el ultimo) y agregar las librerias de rampart.

Para el uso de este, debes configurar apache.axis2.client.options en el ConectionStud Manager.
Aqui un pequeño ejemplo:


 ClientGeneradoStub result = new  ClientGeneradoStub  ();
 ServiceClient sc = result.getServiceClient();
 Options options = new Options();
 options.setUserName("TuUserName");
 options.setTo(new EndpointReference(endPoint));
 options.setProperty(RampartMessageData.KEY_RAMPART_POLICY,  loadPolicy(repositoryPath + "policy/policy.xml"));
 sc.setOptions(options);
 sc.engageModule("rampart");


  private static Policy loadPolicy(String xmlPath) throws Exception {
StAXOMBuilder builder = new StAXOMBuilder(xmlPath);
 return PolicyEngine.getPolicy(builder.getDocumentElement());
 }

Ahora, en el llamado al loadPolicy mandas el directorio en donde se encuentras tu archivo policy.xml (o como tu lo nombraste). Yo agregaba esto al directorio: "policy\\policy.xml" y funcionaba perfectamente. Sin embargo, una vez en produccion, el cliente se volvio a quejar que no encontraba el policy. Crei que el problema era de permisos de carpeta y no lei el policy porque no podia. El problema era de sintaxis. Un amable compañero descubrio que la sintaxis correcta era:   "policy/policy.xml". Mi sintaxis corria perfectamente en windows, pero la sintaxis del compañero corria en windows y linux y voila!

Bueno, ahi sigo con los exploits en el mundo de webservices. Espero esto te ayude!

Thursday, January 19, 2012

Error comun en Eclipse

ERROR: "resource is out of sync with the filesystem"


Odio este error, y a cada rato me salia y hasta hoy le dedique tiempito para preguntarle a san google. 


Solucion:
Para un error tan molesto, la solución es muy sencilla. Clic derecho-->clic refresh.


El refresh se podria poner de manera automática de la siguiente manera:
Clic en Window en el menu superior del Eclipse--->clic preferences--->clic General----->clic Workspace----> dentro de la ventana de workspace hacer clic en Refresh automatically.


Esto ayudara con estos molestos errores, sin embargo algunos no lo recomiendan por el hecho que en ocasiones un refresh significaría un build del workspace y se prefiere tener control manual de esto. 


Otro de los errores comunes de Eclipse es el siguiente:
ERROR: Problem ocurred while trying to save the state of the workbench. Could not write metadata for...


Por mas que busque, no encontre solución a este error. San google solo me informo que efectivamente es un bug de eclipse. Algunos mencionaban como solución el borrar el .metadata. Según lo que leí, esto lo que hará es borrar tus proyectos del eclipse pero no del disco, y lo único que tendrías es que volver importar los proyectos al eclipse. Esta no es una solución elegante, y no me he animado a probarla aun (talvez cuando tenga todo lo pendiente en el svn me anime). Si alguien cae por estos rumbos y conoce la verdadera solución, por favor comentar y compartir!!!!



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.