Hablemos primero un poco acerca de XML Gracias a los protocolos para conectar XML como XML-RPC,SOAP o RSS, XML sobrevivió al desastre de convertirse en un lenguaje que no aportara nada nuevo a lo existente (HTML), y que combinado con WSDL, JAVA y PHP obtenemos las herramientas más utilizadas en la red hoy en día: servicios.
XML es robusto, podemos modificar el fichero fácilmente sin que pierda su significado dramáticamente; podemos construir una estructura para moldear la forma en que se comunican nuestros servicios con los clientes y aplicaciones con diversas reglas, me gustaría que mirárais la documentación sobre XML, XML-RPC,SOAP,RSS,SAX,DOM, JDOM y WSDL que he puesto aquí (de la UGR , y también en un comprido manuales_comunicacion.rar para tenerlo en local) ya que se explican conceptos fundamentales, como el standalone de xml (para decir si la estructura del árbol documento [DOM] se construye sólo con un fichero o por medio de varios, etc.), o lo nuevo de XML que son los namespace para que dentro del nombre de la etiqueta se pueda incrustar un diccionario: <dic:alumno>…</dic:alumno>, etc.; también, indicando donde está mediante <Nombre xmlns=”url_del_diccionario_nombre”>…
Sabiendo que DTD y un esquema XSD definen de la misma forma la estructura de un XML, estos últimos XSD son los más utilizados hoy en día, porque es realmente sencillo (al menos cuando estuve construyendo zenphp me costó mucho tener reglas DTD válidas para el generador de aplicaciones php a partir de un xml) hacer dichas reglas usando XML, ya que XSD se basa en un DTD ,son los diccionarios predefenidos que se van incrustando como las muñecas rusas.
El protocolo XML funciona normalmente a través del puerto HTTP (80) y dió lugar al XML-RPC, fué más famoso que SOAP porque éste había que introducirlo mediante un conjunto de reglas propias y era pesado de hacer, actualmente existen librerías que crean los envoltorios para enviar mensajes:
..embebiendo tipos en parámetros y estos en valores dando forma así a las peticiones y las respuestas de los servicios.
SOAP : es ligero, tiene pocas etiquetas y casi no pesan nada, es como la evolución de XML-RPC ,al fin y al cabo, es otro envoltorio para enviar mensajes por HTTP o SMTP , (Facebook lo usa)…
WSDL: además define reglas para un servicio web…mirar la documentación propuesta anteriormente para más información…
Para empezar, veremos como conectar Java con un WSDL y obtener resultados, siguiendo los pasos:
http://webservices.daehosting.com/services/
abrimos el servicio de fechas: http://webservices.daehosting.com/services/DatesService.wso y copiamos la dirección URL de la descripción de sus servicios ,que es el fichero WSDL [un XML] que necesitamos: http://webservices.daehosting.com/services/DatesService.wso?WSDL

Ahora que sabemos como comunicar servicios con esquemas XML veamos como utilizar Java para implementar una aplicación que haga lo que nuestro querido SOAP UI hace tan fácilmente en una serie de sencillos pasos:
http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl
si el tipo de Operación es SOAP en lugar de RPC, la acción SOAP la podemos leer en el editor SOAP UI en las propiedades de la Operación seleccionada
package EscribirXML.SOAP; import java.net.*; import java.io.*; /** * * @author */ public class ClienteSOAP { public final static String DEFAULT_SERVER = "http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl"; // = "http://www.schemaweb.info/webservices/soap/SchemaWebSoap.asmx?WSDL"; /* public final static String SOAP_ACTION = "http://www.schemaweb.info/webservices/methods/GetObjects";*/ public static void main(String[] args) { String server = DEFAULT_SERVER; try { URL u = new URL(server); URLConnection uc = u.openConnection(); HttpURLConnection connection = (HttpURLConnection) uc; connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("POST"); //connection.setRequestProperty("SOAPAction", SOAP_ACTION); OutputStream out = connection.getOutputStream(); Writer wout = new OutputStreamWriter(out); wout.write( "<soapenv:Envelope xmlns:xsi=\""+ "http://www.w3.org/2001/XMLSchema-instance\" "+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "+ "xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "+ "xmlns:wsd=\"http://wsdbfetch.ws.jdbfetch.ebi.ac.uk\">"+ "<soapenv:Header/>"+ "<soapenv:Body>"+ "<wsd:getSupportedDBs soapenv:encodingStyle=\""+ "http://schemas.xmlsoap.org/soap/encoding/\"/>"+ "</soapenv:Body>"+ "</soapenv:Envelope>"); wout.flush(); wout.close(); InputStream in = connection.getInputStream(); int c; System.err.println( "\n\nCONTESTACION\n\n"); while ((c = in.read()) != -1) System.out.write(c); in.close(); } catch (IOException e) { System.err.println("HA DADO UNA EXCEPCION"); System.err.println(e); } } // end main }

Por último vamos a probar un ejemplo del análisis sintáctico de un fichero XML a través del uso de un ParserDOM, abriendo el paquete DOM.Parsear y dentro el fichero “ParserDOM.java” sólo hemos de pasarle la ruta por línea de comandos del fichero y observar los resultados… (ver ejemplos con SAX del mismo proyecto de NetBeans proporcionado)…
El Modelo Objeto Documento de Java además de servir de analizador sintáctico con el método parse(), proporciona interfaces para manejar ficheros como árboles de datos, se obtiene con parsed.getDocument(), si no existen excepciones se trata, en otro caso es que el documento no ha pasado la validación, encontraremos información de prefijo, etc. dentro del árbol…
En este tutorial, vamos a ver cómo instalar y configurar NetBeans para trabajar tanto con Java como con PHP y crear nuestros primeros servicios, Pruebas de Unidad de las funciones de las clases,etc.
INSTALACIÓN de NetBeans
CREACIÓN del PRIMER PROYECTO CON NetBeans:
// //Web 2.0: Arquitectura Orientada a Servicios en Java //Primer Modelo: BSGModelo con la clase Prueba //@author Juan Belón Pérez //package es.ugr.battlegalactica; // //Clase con los 3 primeros ejercicios propuestos //@author Juan Belón Pérez // public class Prueba { // //Función principal. //Imprime por pantalla un mensaje fijo. //Dependiendo de si en los argumentos, separados por comas, //se usa el título Adama, se saluda a la persona de distinta forma //que si no se usa o se usa Piloto. //@param args la linea de argumentos del programa // public static void main(String[] args) { System.out.println("Prueba del modelo de datos BattleStarGallactica"); String todo =""; String[] nombres ; for (int i=0; i<args.length; i++){ todo += args[i]+" "; } System.out.println("Cadena de entrada: \n- -\n" + todo + "\n- -\n"); nombres = todo.split(","); for (int i=0; i<nombres.length; i++){ System.out.println(crearSaludoRespeto(nombres[i])); } } // //Utiliza los espacios para separar los títulos y las comas para separar //las personas. Devuelve un saludo con el respeto adecuado al rango. //@param String nombre //@return String // public static String crearSaludoRespeto(String nombre){ String saludo = ""; if (nombre==null) return "Hay alguien ahi?"; String[] partes = nombre.split(" "); if (partes.length>1){ if (partes[0].equalsIgnoreCase("adama")){ saludo = "Bienvenido, comandante " + partes[1]; } else if (partes[0].equalsIgnoreCase("piloto")) { saludo = "Bienvenido, piloto " + partes[1]; } else { //nombre compuesto saludo = "Bienvenido, civil " + nombre; } } else { //solo nombre, es un civil if (partes.length>0) saludo = "Bienvenido, civil " + nombre; else saludo = "Hay alguien ahi?"; } return saludo; } }
Prueba del modelo de datos BattleStarGallacticaCadena de entrada:- -Adama Juax,Piloto Migue,Sara,Jesús González- -Bienvenido, comandante JuaxBienvenido, piloto MigueBienvenido, civil SaraBienvenido, civil Jesús González
package es.ugr.battlegalactica; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; // ////@author webser22 // public class PruebaTest { public PruebaTest() { } @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() { } // //Test of main method, of class Prueba. // @Test public void testMain() { } // // Test of crearSaludoRespeto method, of class Prueba. // @Test public void testCrearSaludoRespeto() { System.out.println( "Probando la función crearSaludoRespeto de la clase Prueba"); assertEquals("Correcto", Prueba.crearSaludoRespeto(null), "Hay alguien ahi?"); assertEquals("Correcto", Prueba.crearSaludoRespeto("Adama Juax"), "Bienvenido, comandante Juax"); assertEquals("Correcto", Prueba.crearSaludoRespeto("Piloto Migue"), "Bienvenido, piloto Migue"); assertEquals("Correcto", Prueba.crearSaludoRespeto("Sara"), "Bienvenido, civil Sara"); assertEquals("Correcto", Prueba.crearSaludoRespeto("Jesús González"), "Bienvenido, civil Jesús González"); } }
Entonces probamos mediante el menú “Run -> Test ‘BSGModelo’ ” y ha de aparecer “passed” en el output y el mensaje “Probando la función crearSaludoRespeto de la clase Prueba” en la salida de los resultados de JUnit Results. ¿Para qué sirven las Pruebas de Unidad?
Y esto es todo, el fichero con el proyecto se puede descargar aquí, tiene la documentación generada (hay que actualizarla).
Para el que esté impaciente ,puede continuar por aprender cómo utilizar el editor NetBeans para PHP o bien volver al índice de este Curso de Arquitectura de Servicios en Java en comunicación con PHP.
Este curso consta de diferentes partes
Resumen: Otras Arquitecturas y metodologías SOA, ejercicios a realizar
Proponen: Departamento de Arquitectura y Tecnología de Computadores de la UGR
Dirección y Coordinación:
CASTILLO VALDIVIESO, PEDRO ÁNGEL (DIRECTOR) : pedro [en
] atc.ugr.es
GARCÍA SÁNCHEZ, PABLO (COORDINADOR): pgarcia[en
]atc.ugr.es
Profesorado:
CASTILLO VALDIVIESO, PEDRO ÁNGEL (Propio): pedro[en
]atc.ugr.es
GARCIA ARENAS, Mª ISABEL (Propio): maribel[en
]geneura.ugr.es
GARCÍA SÁNCHEZ, PABLO (Propio): pgarcia[en
]atc.ugr.es
GONZÁLEZ PEÑALVER, JESÚS (Propio) : jesus[en
]atc.ugr.es
LOPEZ MONTELLANO, MIGUEL ANGEL (Nacional)
Licencia del curso: GPL