Interacción entre Aplicaciones con xml: Intercambio de documentos e invocación remota



Documentos relacionados
USANDO SERVLETS EN UN SERVIDOR WEB RESIN

Ejemplos de Servlet y JSP Web Application Development

Modelo de Objetos Distribuidos

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

envía al browser. El browser despliega el archivo.

Manual del Protocolo XML-RPC de Mensajería Negocios

Manual de referencia para la invocación de WebServices con Aduanas (SMS v3.0)

Java RMI. las RPC de Java. Parte I. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

Práctica 4: Java Remote Method Invocation (RMI)

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Técnicas Avanzadas de Testing Automatizado

NIVEL 16: ESTRUCTURAS N-ARIAS RECURSIVAS Aplicaciones Web, Html y Servlets. ISIS1206 Estructuras de Datos

Apéndice C. Clases del sistema.

Federico Peinado

Práctica 5: Common Object Request Broker Architecture CORBA

Conexión de Mysql con NetBeans

11. Algunas clases estándar de Java (II)

Manual de referencia de sistema para la invocación de Web Services con Aduanas (SMS v3.1.12)

Multitarea en Java. Rafa Caballero - UCM

Práctica 2: Java Remote Method Invocation (RMI)

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

GESTIÓN DE EXCEPCIONES EN JAVA. CAPTURA CON BLOQUES TRY CATCH Y FINALLY. EJEMPLOS RESUELTOS. (CU00927C)

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Cada vez que la misma computadora solicita una página pg con un browser, junto con la solicitud el browser envía la cookie al servidor.

Introducción al lenguaje Java

Java Servlets. Luis Fernando Llana Díaz. 17 de abril de Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Introducción Entorno de ejecución Referencias Descripción del servicio

Sockets en Java. Prof. Wílmer Pereira Universidad Simón Bolívar

Elementos léxicos del lenguaje de programación Java

Práctica sobre compartición de instancias remotas.

Arquitectura Cliente/Servidor. Invocación de Métodos Remotos RMI: Remote Method Invocation. Llamadas a Métodos Remotos

Metodología y Tecnología de la Programación

El lenguaje de programación Java

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

Requisitos. Universidad ORT Arquitectura de Software

Modulo conexión Cliente WS DGI

Web Tier en JAVA. Nicolás Troncoso Carrère. Valparaíso, ILI 258 Departamento de Informática Universidad Técnica Federico Santa María

Curso Java Web (JSP's/Servlets)

Servlets. Unidad: 4 Laboratorio de Programación. Universidad Nacional de la Patagonia Austral Unidad Académica Río Gallegos

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Objetivo de aprendizaje del tema

Diseño y Evaluación de Configuraciones. Componentes software para cargar el sistema

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

APLICACIONES MÓVILES NATIVAS. Sesión 8: Arquitectura de las aplicaciones Android

CORBA desde Java. Diego Sevilla Ruiz Sistemas Distribuidos. 1. Introducción

Laboratorio de Aplicaciones Telemáticas Ingeniería Técnica de Telecomunicación Especialidad en Telemática

Sockets en Java. La Creatividad proviene de un conflicto de ideas. Uso de Sockets

Java en 2 horas. Rodrigo Santamaría

Para leer la entrada de consola, lo primero que se hace es construir un Scanner que este asociado al flujo de entrada estándar System.

Examen de Prácticas de Programación Ingeniería Informática

1. Visión general de RMI

Clases Java para comunicaciones en red

Clase. geniería de la Computación. Departamento de Ciencias e Ing. Diego C. Martínez - DCIC-UNS

Práctica 4 PROGRAMACIÓN WEB CON SERVLETS Y JSP. 1. Introducción a JSP... 2

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

James Gosling, creador de Java

ISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA

Programación Orientada a Objetos. Java: Excepciones

GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

Aquí se declaran los. Aquí se declaran los métodos de la clase. *Atributos de la clase

Interacción entre Aplicaciones: objetos distribuidos e invocación remota

Cliente/Servidor en Java

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

Primer Parcial Septiembre 5 de 2009

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

CONTENIDO. Serialización. Carga dinamica de stubs RMI AVANZADO. Callbacks. Carga dinámica de Stubs

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Introducción - por qué usarlas?(1)

Estructura de las Aplicaciones Orientadas a Objetos El patrón Modelo-Vista-Controlador (MVC)

2. Estructura de un programa en Java

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

SAX Parser. Ing. Augusto Dobeslao Herández López (Bases de Datos en XML)

Introducción a JAX-WS Web Services

JavaScript. Contenidos. Introducción El lenguaje Validación de formularios. Programación en Internet DLSI - Universidad de Alicante 1

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Ingeniería del Software Arquitectura Física en 3 niveles

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Desarrollo de Sistemas Software Basados en Servicios y Componentes

8. Sentencia return y métodos

Introducción Descripción del servicio

15. Parámetros o argumentos

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

Tema 3. Test Driven Development

PROGRAMACION DISTRIBUIDA MobileTracker: Ejemplo de implementación con RMI

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Práctica III: Streams, Readers y Writers

Modulo 1 El lenguaje Java

1. Creación del repositorio

Universidad ORT - Arquitecturas de Software sobre plataforma JEE Web Services (parte 1)

FSD Práctica Invocación Remota: JavaRMI. Estudio Previo. Información

Introducción a Java LSUB. 15 de enero de 2015 GSYC

10. Algunas clases estándar de Java (I)

Tema 2. El lenguaje de programación Java. Arrays y cadenas

Seguridad de la aplicación para servlets y JSP (página activas java)

PROGRAMACION DISTRIBUIDA

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

Se ha confeccionado una aplicación sencilla para poder probar el interfaz de gestión explotación de MEGA, Modelo Estandarizado de Gestión de Agua.

Transcripción:

Interacción entre Aplicaciones con xml: Intercambio de documentos e invocación remota Una vez conocido el soporte que ofrecen analizadores de xml como SAX o DOM con independencia del lenguaje de programación, o JDOM en el caso de Java, se van a explorar las opciones para el diseño de una aplicación que utiliza xml para intercambiar datos e invocar acciones en procesos remotos, de la misma o distinta organización o empresa. Se pueden encontrar dos casos: 1) En ocasiones el objetivo de la aplicación es generar un documento comercial en un formato estipulado por alguna comunidad de negocios (por ejemplo las redes interbancarias), organismo internacional (como EDIFACT de las Naciones Unidas) o proveedor grande que impone un formato a sus proveedores (también llamado "integración de empresas", como en la industria del automóvil, aviación, comunicaciones, etc.). En este caso, se ha de complicar el programa que construye y manipula el documento xml para que la entrada o salida cumplan con el formato xml especificado. 2) En otras ocasiones, se puede utilizar xml como formato de codificación y serialización de datos para invocar funciones o métodos remotos entre sistemas diversos. Son aplicables en situaciones en que también se podría usar Corba. En este caso, la programación puede ser muy simple (y notar poco que los objetos están separados), a cambio de delegar el formato y la estructura de los datos a serializadores y deserializadores automáticos. Caso 1 Para la tienda de muebles se ha creado una clase Stock que sirve para tratar de forma sencilla el stock de un producto: Stock.java public class Stock { String nombre; int num; int precio; public Stock(String no, int nu, int pr) { // constructor con precio y num nombre = no; num = nu; precio = pr; public Stock(String no) { this (no, 0, 0); void show(string op) { // constructor sólo con nombre System.out.println(" stock op="+op+" nom="+nombre+" num="+num+" precio="+precio); void supply(int nu, int pr) { num += nu; precio = pr; int order(int nu) { if (nu == 0) return num; // número de unidades en stock if (nu <= num) { num -= nu; return precio*nu; // importe total else return -1; El código siguiente lee y genera árboles xml utilizando JDOM para implementar las operaciones de la tienda de muebles. TiendaWebApp.java import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import org.jdom.input.*; import org.jdom.output.*; import org.jdom.*; 1

public class TiendaWebApp { private static int op_id = 0; // contador identificadores operación private static int grantotal = 0; // total ventas acumulado private static boolean debug = false; private static String _u = "juan", _pass = "nauj"; private static Stock[] stock = { new Stock("mesas"), new Stock("sillas"), new Stock("lámparas") ; private static Element listado; private String Usuari = new String("pablo"); private String Clau = new String("casa"); public static void main(string[] args) { PrintStream out = System.out; FileOutputStream outf; PrintStream p; String comanda, nomcamp, valor; boolean idok = false, opok = false; listado = new Element("list"); for(int f=0; f<args.length; f++) { if (debug) out.println("hay " + stock[0].order(0) + " mesas, " + stock[1].order(0) + " sillas, " + stock[2].order(0) + " lámparas."); try { // cargar el árbol!!! SAXBuilder builder = new SAXBuilder(false); // sin validación Document doc = builder.build(new File(args[f])); Element root = doc.getrootelement(); // Obtener elemento root String u = root.getattributevalue("u"); String pass = root.getattributevalue("pass"); if (u!= null && u.equals(_u) && pass.equals(_pass)) idok = true; String op = root.getattributevalue("name"); // respuesta: Element r = new Element("res"); r.addattribute("name", op); Document rr = new Document( r ); if (op.equals("supply")) { // in: t_objeto, precio, unidades; out: ok error List l = root.getchildren("item"); if (debug) out.println("item: "+l.size()+" elementos"); for(iterator i = l.iterator(); i.hasnext(); ) { Element prod = (Element) i.next(); int precio = Integer.parseInt(prod.getAttributeValue("precio")); int uds = Integer.parseInt(prod.getAttributeValue("unidades")); int id = Integer.parseInt(prod.getAttributeValue("id")); stock[id].supply(uds,precio); else if (!idok) { r.addcontent("identificaci n err nea"); else if (op.equals("order")) { int preciototal = 0; List l = root.getchildren("item"); if (debug) out.println("item: "+l.size()+" elementos"); if (l.size() > 0) { 2

op_id++; // asignar op_id r.addcontent( new Element("Order").addAttribute("id",Integer.toString(op_id))); for(iterator i = l.iterator(); i.hasnext(); ) { Element prod = (Element) i.next(); int uds = Integer.parseInt(prod.getAttributeValue("unidades")); int id = Integer.parseInt(prod.getAttributeValue("id")); int precio = stock[id].order(uds); preciototal += precio; Element e = (Element) prod.clone(); e.addattribute("preciototal",integer.tostring(precio)); r.getchild("order").addcontent(e); r.getchild("order").addcontent( new Element("total").setText(Integer.toString(precioTotal)) ); Element e = (Element) r.getchild("order").clone(); listado.addcontent(e); // guardar en listado hist rico grantotal += preciototal; else if (op.equals("list")) { r.addcontent(listado); r.addcontent( new Element ("total").settext(integer.tostring(grantotal)) ); if (! opok) r.addcontent("operación errónea"); XMLOutputter outxml = new XMLOutputter(); outxml.output(r, out); catch (Exception e) { e.printstacktrace(); El código anterior puede convertirse en un servlet con unos pequeños cambios: TiendaWebServlet.java import javax.servlet.*; import javax.servlet.http.*;... public class TiendaWebServlet extends HttpServlet { private /*static*/ int op_id = 0; // contador identificadores operación... public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { // antes main res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); BufferedReader in = req.getreader(); El servlet anterior colocado en Tomcat (Linux o Windows) funciona tal como se muestra en el siguiente ejemplo donde se miran los pedidos (List), se suministran muebles (Supply), se hace un pedido (Order), y finalmente se pide un listado de pedidos (List). 3

telnet tiendamuebles.upc.es 8080 Content-Length: 61 <?xml version="1.0"?> <op name="list" u="juan" pass="nauj" /> Date: Tue, 10 Dec 2000 23:25:36 GMT <res name="list"><list /><total>0</total></res> telnet tiendamuebles.upc.es 8080 Content-Length: 180 <?xml version="1.0"?> <op name="supply"> <item precio="123456" unidades="60" id="0">mesa comedor haya</item> <item precio="13457" unidades="200" id="1">silla cocina nogal</item> </op> Date: Tue, 10 Dec 2000 23:27:00 GMT <res name="supply" /> telnet tiendamuebles.upc.es 8080 Content-Length: 166 <?xml version="1.0"?> <op name="order" u="juan" pass="nauj"> <item unidades="1" id="0">mesa comedor haya</item> <item unidades="4" id="1">silla cocina nogal</item> </op> Date: Tue, 10 Dec 2000 23:27:40 GMT <res name="order"><order id="1"><item unidades="1" id="0" preciototal="123456">mesa comedor haya</item><item unidades="4" id="1" preciototal="53828">silla cocina nogal</item><total>177284</total></order></res> telnet tiendamuebles.upc.es 8080 Content-Length: 61 4

<?xml version="1.0"?> <op name="list" u="juan" pass="nauj" /> Date: Tue, 12 Dec 2000 23:28:56 GMT <res name="list"><list /><total>177284</total></res> Caso 2 Se puede utilizar el servidor Tomcat, instalando el servicio SOAP, que puede obtenerse en http://xml.apache.org Tomando un ejemplo mínimo pueden verse los pasos necesarios para programar un servidor, para describir el servicio, para programar un cliente, y para desplegar (instalar y poner en marcha) el servicio. TiendaWeb.java (servidor) import org.apache.soap.util.xml.*; public class TiendaWeb { float precio = 10.0F; public float verprecio (String producto) { return precio; El servicio ha de describirse en un fichero xml aparte: tienda.xml <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn:precio-producto"> <isd:provider type="java" scope="application" methods="verprecio"> <isd:java class="tiendaweb"/> </isd:provider> </isd:service> verprecio.java (cliente) import java.net.*; import java.util.*; import org.apache.soap.util.xml.*; import org.apache.soap.*; import org.apache.soap.rpc.*; public class verprecio { static XMLParserLiaison xpl = new XercesParserLiaison (); public static void main (String[] args) throws Exception { if (args.length!= 2 && (args.length!= 3!args[0].startsWith("-"))){ System.err.println ("Usage: java " + verprecio.class.getname () + " [-encodingstyleuri] SOAP-router-URL producto"); System.exit (1); int offset = 3 - args.length; // procesar argumentos String encodingstyleuri = args.length == 3? args[0].substring(1) : Constants.NS_URI_SOAP_ENC; 5

String producto = args[2 - offset]; Call call = new Call (); // Construir llamada call.settargetobjecturi ("urn:precio-producto"); call.setmethodname ("verprecio"); call.setencodingstyleuri(encodingstyleuri); Vector params = new Vector (); params.addelement (new Parameter("producto", String.class, producto, null)); call.setparams (params); // Invocación: action URI vacío. El rpc router de XML-SOAP no lo mira Response resp = call.invoke (/* router URL */ url, /* actionuri */ "" ); if (resp.generatedfault ()) { // Detectar fallos en la respuesta Fault fault = resp.getfault (); System.out.println ("Ouch, the call failed: "); System.out.println (" Fault Code = " + fault.getfaultcode ()); System.out.println (" Fault String = " + fault.getfaultstring ()); else { Parameter result = resp.getreturnvalue (); System.out.println (result.getvalue ()); Para instalarlo hay que utilizar el servicio para gestionar aplicaciones instalables en el servidor de SOAP (en este caso Tomcat+SOAP): > java org.apache.soap.server.servicemanagerclient Usage: java org.apache.soap.server.servicemanagerclient url operation arguments where url is the Apache-SOAP router's URL whose services are managed operation and arguments are: deploy deployment-descriptor-file.xml list query service-name undeploy service-name Para desplegar el servicio anterior de tienda sencilla (en una línea): > java org.apache.soap.server.servicemanagerclient http://localhost:8080/soap/servlet/rpcrouter deploy tienda.xml Esta implementación de SOAP permite 3 estilos de codificación (serialización): codificación SOAP v1.1, XML Literal, y XMI. XMI (a partir de Java 1.2.2) serializa y deserializa automáticamente cualquier objeto (tal como ocurre en RMI). La codificación SOAP tiene soporte para multitud de tipos: tipos primitivos, String, JavaBeans, vectores, enumeraciones, arrays de 1 dimensión de estos tipos. Para otros tipos hay que escribir nuevos serializadores/deserializadores. La codificación literal permite enviar elementos XML como parámetros. La implementación de SOAP en Apache funciona sobre transporte HTTP o SMTP (por correo) 6