You are on page 1of 14

GRADO

PRUEBA DE EVALUACIÓN CONTINUA
APLICACIONES DISTRIBUIDAS
WS | ENUNCIADO Y ORIENTACIONES PARA SU DESARROLLO

2012-2013

|Dr. Rafael Pastor Vargas
GRADO EN INGENIERÍA EN TECNOLOGÍAS DE LA INFORMACIÓN
UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA

APLICACIONES DISTRIBUIDAS 1. entre otras cosas. Esta información puede ser usada por otros elementos en el proceso de desarrollo de código java (el propio compilador) para añadir “elementos ejecutables” (código adicional. Por tanto. se debe consultar el siguiente enlace: http://jax-ws. Las “anotaciones” (http://devel. Para ello se va a implementar la funcionalidad del servicio usando dos tecnologías específicas diferentes basadas en la arquitectura SOA. Para una revisión completa de las anotaciones disponibles en JAX-WS.WebService.net/jaxws-ea3/docs/annotations.html Para la parte práctica.net/) que permite procesar la información SOAP de los mensajes sin necesidad de un directorio de servicios. Posteriormente.es/2010/08/utilizacion-de-jaxb-para-mapear-clases. se puede partir de varias premisas a la hora de desarrollar un servicio pero la más habitual es partir de una clase/interface que implemente/defina las operaciones que publicará el servicio Web (a esta clase/interface se le denomina POJO. se deben añadir “anotaciones” a la clase para indicar el comportamiento del servicio Web. y que están asociadas a las tecnologías se servicios Web: - Servicios SOAP. UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 2 . que es un API de procesamiento XML que permite hacer este trabajo automáticamente.jws. Es un estándar basado en XML.) a la aplicación.WebParam.OBJETIVOS La segunda parte consiste en realizar un sistema distribuido basado en tecnología de servicios Web que permita ejecutar un generador de señales y obtener los valores de tiempo y calculados por dicho generador. En el caso de JAX-WS. Para esto se emplea JAXB. y todos los mensajes involucrados en el proceso de uso/búsqueda/consumo/gestión de procesos están basados en el estándar SOAP (http://www.net/) Para el proceso de desarrollo.com.java.blogspot.org/programming/languages/java/tutorial/java/javaOO/annotations.html El procedimiento de desarrollo es bastante directo.appdist. existe un API específico denominado JAX-WS (http://jax-ws.w3. etc.html) permiten añadir información al código Java sin interferir en el propio código. mediante anotaciones.jws. import javax. se debe leer el siguiente enlace: http://ingmmurillo.grados. se va a definir una interface que define las operaciones del servicio JAX-WS (como un objeto POJO): package es. Este API fue diseñado originalmente por Sun (ahora Oracle) e implementada en su pila de servicios Web llamada Metro (http://metro. que interface/clase define al servicio web (@WebService) o qué métodos conforman el conjunto de operaciones del servicio (@WebMethod).noip. En este caso es necesario definir un “mapeo” de las clases de usuario a un formato XML que se pueda usar desde SOAP (recuerde que SOAP es básicamente XML). se procederá a “anotar” la clase para indicar las propiedades del servicio SOAP. las anotaciones permiten definir.ws.trabajos. Fue el primer estándar para publicar y consumir servicios Web.java.. import javax.uned. En el caso de Java. una vez desarrollada la clase que implementan las operaciones del servicio.scc.java.org/TR/soap/). Plain Old Java Object). Para más detalles. pero puede ocurrir que los parámetros de las operaciones puedan ser elementos complejos. ficheros XML. como clases definidas por el usuario.

java.net/nonav/documentation/latest/jax-rs. Al contrario que SOAP.edu. Para más detalles. Roy Fielding en su tesis doctoral.fing. por ejemplo el contenedor Jersey (http://jersey.scc.trabajos.model.html.net/) entre otros. public OperationInfo isRunning().wordpress. y básicamente consiste en emplear el modelo de comunicación web tradicional (el protocolo HTTP) para identificar/consumir servicios Web. JavaScript Object Notation (JSON).data. Existen varias implementaciones de este API. . Rafael Pastor Vargas import es.data. @WebService public interface SignalGeneratorWS { public OperationInfo start().appdist.com/2010/07/26/servicios-web-2-%C2%BFque-es-rest/ http://www.org/en/jsr/detail?id=311). public OperationInfo stop(). REST (REpresentational State Transfer) no es un protocolo.scc.model. define el servicio Web y dispone de una anotación especial para nombrar el argumento de la operación setSignalParameters().signal. donde se explican todas las anotaciones del estándar con ejemplos de su uso.html) sigue cuatro principios de diseño fundamentales: . Fue ideada por el Dr. que manejan recursos: o POST para crear un recurso en el servicio o GET para obtener un recurso o PUT para cambiar el estado de un recurso o actualizarlo o DELETE para borrar un recurso .OperationInfo.uned.model.data.Permite la transferencia de cualquier tipo de información codificada en varios formatos: texto.infoq.uned.Expone las operaciones del servicio como URI’s (modelo general de identificación de recursos. Al igual que JAX-WS.SignalData.|Dr. etc. Igual que antes. public SignalParameters getSignalParameters(). el cual la especificación de URL es la más conocida y usada). public void setSignalParameters( @WebParam(name="signal_parameters")SignalParameters signal_parameters). sino una forma más simple que SOAP para crear servicios Web (más bien. para el caso de Java. se puede decir que es una arquitectura de desarrollo).java. import es.scc. existe un API de referencia para la implementación de dichos servicios: JAX-RS (http://jcp.com/articles/rest-introduction http://eamodeorubio.com/noticias/java/314-introduccion-a-los-servicios-webrestful.trabajos.signal. public SignalData getSignalValue().dosideas.trabajos.uned. } Se puede observar que la interface. JAX-RS dispone de sus propias anotaciones para definir el contrato del servicio y las operaciones/recursos que ofrece. UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 3 . XML.Se emplean los métodos HTTP de manera explícita para realizar las operaciones del servicio.SignalParameters.No mantiene el estado de las peticiones . Un servicio web creado sobre los principios de REST se denomina servicio web RESTful.grados.appdist. consultar el enlace de la implementación de referencia Jersey: http://jersey.uy/inco/grupos/lins/seminario/2010/Introduccion_WS-REST. Se recomienda leer los siguientes enlaces para comprender los fundamentos de REST: http://www.appdist. - Servicio REST.signal.pdf Básicamente REST (http://www.grados.grados. import es.

scc.data.model. Véase el apartado de consideraciones de desarrollo para conocer cómo se debe realizar la implementación del objeto de servicio SOAP. public interface RESTSignalGenerator { public OperationInfo start(). SignalData y SignalParameters. Véase el apartado de consideraciones de desarrollo para conocer cómo se debe realizar la implementación del servidor SOAP. define el formato de información que el servicio/operación espera en los parámetros de la invocación al método HTTP correspondiente (texto.model.trabajos.scc.ws. JSON.grados.grados.grados.scc.trabajos.appdist.ws. import es.signal. public SignalParameters getSignalParameters(). La clase que implementa dicho servidor se debe llamar WSServer y debe estar ubicada en el paquete es. y su utilización en la clase cliente.model. Se deben desarrollar los siguientes elementos: 1) Implementación de la interface del servicio SOAP (JAX-WS) definida anteriormente (se debe mantener tanto el nombre. se va a definir una interface que define las operaciones del servicio JAX-RS (como un objeto POJO).trabajos.scc.SignalParameters.signal.grados. se proporcionan en el espacio virtual del curso.OperationInfo.trabajos.appdist.trabajos.scc.signal.appdist.trabajos.uned. 2) Desarrollo de un servidor que actúe como contenedor del servicio SOAP y exponga dicho servicio para ser consumido por clientes. JSON. public void setSignalParameters(SignalParameters signal_parameters).uned.uned. Véase el apartado de consideraciones de desarrollo para obtener detalles sobre la generación del código que representa al servicio Web.ws.scc.scc.). UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 4 . define el método HTTP de acceso a la operación o @Produces.uned. Para esta parte práctica. como el paquete donde está definida dicha interface).uned.uned.uned. La clase que implementa el servicio SOAP debe emplear la clase SignalGeneratorThread (definida en el paquete es.signal. y al igual que en la parte anterior.appdist.SignalData.appdist.jar.server.data.grados.model) para la gestión de la ejecución parada del generador aleatorio.trabajos.scc.data.) o @Consumes. import es.appdist. a cuya implementación se le deberán añadir las anotaciones JAX-RS correspondientes: package es.APLICACIONES DISTRIBUIDAS Las anotaciones más importantes son: o @Path. La clase que implementa dicha interface se debe denominar SignalGeneratorWSImpl y debe estar incluida en el paquete es. import es.appdist. etc. public OperationInfo isRunning().grados. XML.appdist.uned.grados. La clase se deberá denominar WSClient y deberá estar definida en el paquete es. public OperationInfo stop(). XML. 3) Desarrollo de un cliente que consuma los servicios definidos por la clase que implementa el servicio y que estará disponible a través del servidor del punto 2. define el formato de información que el servicio/operación enviará en la llamada al método HTTP correspondiente (texto.ws.soap. public SignalData getSignalValue().trabajos. etc. y están implementadas en el fichero SignalModel. } En las dos interfaces se usan las clases OperationInfo. define el URI relativo de acceso al servicio/operación o @Method.grados.

html) Otros enlaces interesantes que se deben revisar..apache.org/) ya que proporciona un entorno de ejecución e implementaciones de las APIs.adictosaltrabajo.grados.html. Como se ha comentado anteriormente. La clase que implementa dicho servidor se debe llamar y RESTWSServer debe estar ubicada en el paquete es. 5) Desarrollo de un servidor que actúe como contenedor del servicio REST y exponga dicho servicio para ser consumido por clientes.server.ws.trabajos.apache.1 Detalles de desarrollo en la implementación del objeto de servicio SOAP. La clase se deberá denominar RESTClient y deberá estar definida en el paquete es. Rafael Pastor Vargas 4) Implementación de la interface del servicio REST definida anteriormente (se debe mantener tanto el nombre.jar. 2. se recomienda que se lean los ejemplos que están ubicados en la documentación del producto: 1) Escribir/Publicar/Consumir un servicio JAX-WS con CXF (http://cxf. pero debería funcionar con cualquiera superior) desde la web de cxf: http://cxf.ws. se debe usar la clase SignalGeneratorThread para desarrollar el objeto que implementa el servicio SOAP (JAX-WS).uned. Es importante descargarse la distribución CXF (la versión empleada es la 2.scc.rest.trabajos.org/download.html) 2) Conceptos básicos de JAX-RS (http://cxf.apache.signal.appdist.org/docs/a-simple-jax-wsservice.2.scc. 2. 6) Desarrollo de un cliente que consuma los servicios definidos por la clase que implementa el servicio REST y que estará disponible a través del servidor del punto 5. son los siguientes: http://www. La clase que implementa el servicio REST debe emplear la clase SignalGeneratorThread (definida en el paquete es.grados.scc.com/tutoriales/tutoriales. Se proporciona en el entorno virtual el código de ambas clases (SignalGeneratorThread.appdist. Véase el apartado de consideraciones de desarrollo para conocer cómo se debe realizar la implementación del servidor REST.appdist.javamexico. y debe tener las anotaciones necesarias para marcar la clase como un servicio Web. Para la compilación/ejecución de los elementos de esta parte. La clase que implementa dicha interface se debe denominar RESTSignalGeneratorWSImpl y debe estar incluida en el paquete es.model) para la gestión de la ejecución parada del generador aleatorio. Al implementar la interface correspondiente (que ya está anotada como @WebService) automáticamente se define como servicio Web. se va a emplear Apache CXF (http://cxf.org/blogs/mariogarcia/servicios_web_con_apache_cxf_utilizando_jaxws_y_jaxrs http://www.|Dr. pero es necesario añadir UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 5 .grados.CONSIDERACIONES DE DESARROLLO Para el desarrollo de esta parte. En particular.scc.uned.php?pagina=jaxwscxf (incluye la configuración de CXF en Eclipse y como crear clientes de servicios web a través de su WDSL). Véase el apartado de consideraciones de desarrollo para obtener detalles sobre el uso del protocolo HTTP para el consumo de los recursos/operaciones del servicio REST.uned.apache.uned.client.6. Esta clase y la clase SignalGenerator asociada están incluidas en el fichero SignalModel.trabajos. La clase que implementa el servicio se denomina SignalGeneratorWSImpl. como el paquete donde está definida dicha interface).appdist. SignalGenerator). tanto de JAX-WS como de JAX-RS.org/docs/jax-rs-basics. Véase el apartado de consideraciones de desarrollo para conocer cómo se debe realizar la implementación del objeto de servicio REST. hay que añadir los ficheros jar correspondientes a esta distribución (o configurar el IDE de manera adecuada).

Enter 'yes' to exit.jetty. Igual que se ha hecho anteriormente.ws..APLICACIONES DISTRIBUIDAS el código asociado para identificar el punto de publicación del servicio Web (que permite conocer su WDSL.grados.eclipse. Al ejecutar el servidor SOAP..service.ws. deberían mostrarse unas líneas parecidas a estas: Starting Server 28-nov-2012 21:23:55 org. es necesario usar las anotaciones de JAX-WS para indicar esto.publish(address.endpoint.ContextHandler{.grados.SignalGeneratorWS". quedando la definición de la clase así: @WebService(endpointInterface = "es. SignalGeneratorWSImpl implementor = new SignalGeneratorWSImpl(sampleTime).server.2 Detalles de desarrollo en la implementación del servidor SOAP. y el punto de invocación de las operaciones por parte del cliente).appdist.null} Server ready. el servidor SOAP debe quedar ejecutándose.handler.e.trabajos.j.es/}SignalGenerator from class es.4.eclipse.AbstractConnector doStart INFO: Started SelectChannelConnector@localhost:9000 STARTING 28-nov-2012 21:23:56 org.server. es muy sencillo usar las funcionalidades de CXF para que ejecute un contenedor de servicios JAX-WS. Por tanto. se necesita indicar que interface define el conjunto de operaciones del servicio (propiedad endpointInterface) y el nombre a través del cual se accederá al servicio (serviceName). serviceName = "SignalGenerator") public class SignalGeneratorWSImpl implements SignalGeneratorWS { … Las implementaciones de los métodos de la interface SignalGeneratorWS se deberán realizar de manera equivalente a la parte anterior desarrollada. se deberá añadir la anotación a la clase SignalGeneratorWSImpl. Endpoint. Se puede ver que solo se necesita indicar la dirección de publicación (address) y la clase que implementa el servicio SOAP (se le pasa al constructor de la clase el tiempo asociado a la tarea definida en la clase SignalGeneratorThread.jetty.scc.ServerImpl initDestination INFO: Setting the server's publish address to be http://localhost:9000/SignalGenerator 28-nov-2012 21:23:56 org.scc..ReflectionServiceFactoryBean buildServiceFromClass INFO: Creating Service {http://ws.h.server. así que podemos “redefinir” la anotación e indicar un conjunto de propiedades de la anotación.grados.cxf.trabajos. se debería poder visualizar el documento WDSL de definición del servicio en el siguiente enlace: http://localhost:9000/SignalGenerator?wsdl UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 6 . Para ello se puede usar un mecanismo de entrada/salida que compruebe si el servidor debe parar o no. De nuevo. En este caso.trabajos.v20111024 28-nov-2012 21:23:56 org.uned. String address = "http://localhost:9000/SignalGenerator".Server doStart INFO: jetty-7.SignalGeneratorWS 28-nov-2012 21:23:55 org. implementor). Una vez que el servidor SOAP está ejecutándose.scc.apache.uned. El código necesario (que se puede encontrar en la documentación de CXF) es el siguiente.s. y publique en una URL conocida el servicio. En el caso del servidor SOAP. Las anotaciones permiten la herencia.appdist.5. pero el estudiante puede desarrollarlo de otra forma).factory.jetty.eclipse. 2..ContextHandler startContext INFO: started o.apache.cxf.appdist.uned.

Rafael Pastor Vargas En la siguiente figura se puede ver el contenido del fichero WDSL. 2.jst. Una vez que se han generado las clases.html) o Netbeans (http://netbeans. se debe usar el enlace de acceso al fichero WDSL y usar alguno de los siguientes mecanismos: 1) Usar los asistentes del IDE de desarrollo para generar las clases que representan al servicio. Se pueden ver las opciones de las que dispone la utilidad en el siguiente enlace: http://cxf.eclipse. // Get service reference SignalGeneratorWS service = new SignalGeneratorWSProxy(). Simplemente se debe instanciar y llamar al método adecuado. UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 7 . ya que genera las clases dentro del propio proyecto. Client 1: Java Class in Java SE Application). Puede consultar los siguientes enlaces para ver como se hace en Eclipse (http://help. Para ello.eclipse.ws.html.html.org/kb/docs/websvc/jax-ws.|Dr.3 Detalles de desarrollo en la implementación del cliente SOAP.start().org/docs/wsdl-to-java. sección Consuming the Web Service.doc. para poder usar el servicio web se debe usar la clase Proxy generada. Este comando generará las clases Java necesarias (que representan al servicio Web) que se deben incorporarse al proyecto en el que se defina el cliente (importándolas o copiándolas directamente en el directorio donde se ubiquen las fuentes dl proyecto). El primer paso para desarrollar el cliente SOAP es obtener la “representación” del servicio como clases Java. Se recomienda el uso de la primera opción.cxf.apache.org/indigo/index. 2) Usando la utilidad wdsl2java que viene con la distribución de CXF.jsp?topic=%2Forg.user%2Ftasks%2Fcreate _client. que se debería llamar SignalGeneratorWSProxy. OperationInfo info = service.

@Path("isrunning") @Get SignalData getSignalValue(). para invocar la operación start() del servicio REST se deberá usar el siguiente URI relativo: “SignalGenerator/start”. SignalGenerator). void setSignalParameters(SignalPara meters signal_parameters). se debe emplear la clase auxiliar ClientGUI incorporándola en el código del cliente SOAP (mediante las clases que sean necesarias). es necesario que la clase cliente (o una auxiliar) implemente la interface ClientPlot.APLICACIONES DISTRIBUIDAS Para probar el funcionamiento del servidor SOAP.4 Detalles de desarrollo en la implementación del objeto de servicio REST. Recuérdese que. la siguiente anotación: @Path("SignalGenerator") public class RESTSignalGeneratorWSImpl implements RESTSignalGenerator{ De esta forma. la implementación asociada a la clase RESTSignalGeneratorWSImpl. @Path("getParams") @Get @Path("setParams") @Post @Get No es indicarlo No es indicarlo No es indicarlo No es indicarlo No es indicarlo No es indicarlo necesario @Produces({"text/xml"}) necesario @Produces({"text/xml"}) necesario @Produces({"text/xml"}) necesario @Produces({"text/xml"}) necesario @Produces({"text/xml"}) necesario @Produces({"text/xml"}) Finalmente. @Path("stop") @Get OperationInfo isRunning(). @POST. Opración/Recurso @Path Método @Consumes @Produces HTTP OperationInfo start(). que se comentan a continuación: UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 8 . se verán ejemplos de URI’s absolutas para el uso del servicio REST. Esta clase y la clase SignalGenerator asociada están incluidas en el fichero SignalModel. En la siguiente sección. debe definir las funciones de la interface y por tanto hay que anotar las operaciones como URI’s usando la anotación @Path. En la siguiente tabla se muestra cuales son los valores de las anotaciones para las operaciones. El procedimiento es similar al desarrollado en la parte anterior. @PUT. Para ello se debe añadir al principio de la definición de la clase. y consiste en cuatro pasos sencillos. una vez desarrollado el servidor. @Path("get") @Get SignalParameters getSignalParameters(). Se proporciona en el entorno virtual el código de ambas clases (SignalGeneratorThread. 2. La creación del servidor REST con CXF es muy sencilla. Como se ha comentado anteriormente. 2. y debe tener las anotaciones necesarias para marcar la clase como un servicio REST. de nuevo. La clase que implementa el servicio se denomina RESTSignalGeneratorWSImpl. se debe usar la clase SignalGeneratorThread para desarrollar el objeto que implementa el servicio REST (JAX-RS). @DELETE) y que información consumirá/producirá (@Consumes. @Path("start") OperationInfo stop(). es necesario anotar el @Path asociado al propio servicio (todos los @Path definidos en las operaciones son relativos al @Path del servicio). definir que método se usará para invocar la operación (@GET. En este caso. para emplear esta función. @Produces).5 Detalles de desarrollo en la implementación del servidor REST.jar.

Al arrancar el servidor REST deberían mostrarse las líneas de información sobre el servidor.jetty.create(). // Start JAX-RS Server sf.server. solo es necesario codificar la clase RESTWSServer con un método main() que contenga las líneas anteriores.AbstractConnector doStart INFO: Started SelectChannelConnector@localhost:9002 STARTING 29-nov-2012 16:13:28 org.cxf.4. // Create absolute Path sf. un navegador web).jetty.handler.setResourceClasses(RESTSignalGeneratorWSImpl.eclipse.eclipse. Una sesión de trabajo típica sería: 1) Arrancar el generador de señales: http://localhost:9002/SignalGenerator/start 2) Obtener el valor de la señal: http://localhost:9002/SignalGenerator/get 3) Comprobar si el generador está ejecutándose: http://localhost:9002/SignalGenerator/isrunning 4) Parar el generador de señales: http://localhost:9002/SignalGenerator/stop UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 9 .jetty.class).v20111024 29-nov-2012 16:13:28 org. // Set REST implementor class sf. Por tanto.|Dr.setAddress("http://localhost:9002/").server. generadas por CXF (Jetty): 29-nov-2012 16:13:28 org.ContextHandler{.null} Una vez que se ejecute el servidor REST.5.Server doStart INFO: jetty-7.s.ServerImpl initDestination INFO: Setting the server's publish address to be http://localhost:9002/ 29-nov-2012 16:13:28 org.ContextHandler startContext INFO: started o.e.h.j. Rafael Pastor Vargas // Create the JAX-RS Server with CXF JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean().server. se pueden invocar las operaciones del servicio usando cualquier cliente HTTP (por ejemplo.eclipse.endpoint.apache.

org/docs/jax-rs-client-api. A modo de ejemplo.cxf.ResponseReader). y se pueden ver un ejemplo de uso en el siguiente enlace: http://cxf. que permite al desarrollador no tener que ocuparse de los detalles de implementación del protocolo HTTP y le facilita el desarrollo de clientes REST. se deben implementar los diferentes métodos que se invocarán desde la interface GUI proprocionada. se puede convertir a un objeto de la clase correspondiente haciendo una conversión directa (cast). Para usar ambas clases (WebClient y ResponseReader) es necesario instanciar dos objetos asociados en cada clase.html (sección CXF WebClient API). La clase WebClient está definida en el paquete org.cxf.apache.6 Detalles de desarrollo en la implementación del cliente REST.APLICACIONES DISTRIBUIDAS 5) Comprobar el estado del generador: http://localhost:9002/SignalGenerator/isrunning 2.singletonList(reader)). Para obtener los valores de los resultados complejos (se entienden por complejos. public boolean startGenerator(){ // Set the class associated to the incoming XML entity form REST service UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 10 .Collections.apache. donde REST_SERVICE representa el (http://localhost:9002/SignalGenerator). al ser anotado para producir XML). esto es. punto de publicación del servicio Una vez hecho esto (en el constructor de la clase cliente o en la propia definición de los atributos de dich clase).apache. un cliente que permite realizar operaciones HTTP.create(REST_SERVICE. CXF dispone de una clase denominada WebClient. Una vez que se dispone de esa entidad XML.client.client. las clases Java definidas por el desarrollador distintas a los tipos primitivos de java) de las invocaciones a los métodos REST. Esta clase es la responsable de “representar” el resultado obtenido de una invocación REST como una entidad XML (que es lo que envía el método de servicio. WebClient client = WebClient. se muestra el código asociado a una de esas funciones y como se realiza la invocación REST y la obtención del dato de la invocación con el objeto OperationInfo (proporcionado en el curso virtual). es necesario usar la clase ResponseReader (ubicada en el paquete org. de la siguiente forma: ResponseReader reader = new ResponseReader().jaxrs. Cualquier servicio REST se puede consumir usando un cliente Web.jaxrs.

// Get the XML entity in response and cast to class OperationInfo i = (OperationInfo)r. 3. System. La estructura del código para el resto de métodos del cliente son similares. El procedimiento es similar al desarrollado en apartados anteriores. // Call the REST method Response r = client.|Dr. // Set relative path to REST method // REST_PATH_START = "start". client. de nuevo.. que se encuentra disponible en el entorno virtual. se debe probar la ejecución de los servidores SOAP y REST.getEntity(). y se debe modificar lo necesario adaptándolo a la estructura del método REST del servidor (la clase esperada y el @PATH del método.setEntityClass(OperationInfo. se debe emplear la clase auxiliar ClientGUI incorporándola en el código del cliente REST (mediante las clases que sean necesarias). Rafael Pastor Vargas } reader.out. En primer lugar se debe ejecutar el servidor. básicamente). // Set type of data received client. usando los desarrollos de los clientes SOAP y REST. Para probar el funcionamiento del servidor REST.type("application/xml").PRUEBAS Una vez desarrolladas las clases necesarias.class).replacePath(REST_PATH_START). tal y como se muestra en la siguiente figura. A continuación se muestra el ejemplo desarrollado por el equipo docente. return i. Recuérdese que. es necesario que la clase cliente (o una auxiliar) implemente la interface ClientPlot.isOk().println("Response: " + i.getMessage()). para emplear esta función. Ejecución de los servidores SOAP y REST UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 11 .get().

llamar al método start() del objeto remoto) se debe pulsar el botón correspondiente.APLICACIONES DISTRIBUIDAS Si todo es correcto. A continuación se deben ejecutar los clientes. tomando sendos pantallazos de los 1) SOAP Server. Figura 3. Para arrancar el generador de señales (es decir. En la figura 5 se muestra una ejecución de una señal sinusoidal de frecuencia 0.5). Figura 5. Si todo es correcto. Figura 4. UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 12 . Se puede ver el aspecto inicial en la figura 4. debería mostrar un mensaje indicando que está disponible para gestionar conexiones de clientes (tal y como aparece en la figura anterior). Aspecto inicial del GUI de prueba. Pantallazo mostrado el fichero WSDL del servicio SOAP generado automáticamente (http://localhost:9000/SignalGenerator?wsdl) 2) REST Server. se debe comprobar que los servidores están ofreciendo los respectivos servicios. debería mostrar el interface gráfico (GUI) desarrollado por el equipo docente (en ambos caos) y que permite probar la funcionalidad pedida. En este punto. Ejecución de los clientes SOAP y REST.05 Hz y amplitud 10. Pantallazos de una sesión de trabajo (descritos al final del apartado 2. Ejemplo de ejecución del cliente. tal y como se muestra en la siguiente figura.

6.Cambiar la amplitud de la señal a 5 (usando el botón Apply) . los subdirectorios asociados).Parar el generador.Tomar un pantallazo de la GUI cuando el tiempo llegue a los tres minutos (se deberá incluir en la documentación) .2\lib.|Dr. En este fichero deben aparecer los siguientes ficheros/subdirectorios: - Las clases compiladas y empaquetadas en tres ficheros jar: o WS_Services. Debe contener las clases correspondientes al cliente SOAP. Debe contener las clases correspondientes a los servidores SOAP y REST.\lib\apache-cxf-2.5 segundos).1 (usando el botón Apply) . . usando el botón Stop. pero en los scripts de ejecución se deberán referenciar en el classpath con el path . mínimo (0.Tomar un pantallazo de la GUI cuando el tiempo llegue al minuto (se deberá incluir en la documentación) . solo deberá copiar esas librerías a esa localización. .Cambiar el tipo de señal a cuadrada (usando el botón Apply) .Tomar un pantallazo de la GUI cuando el tiempo llegue a los tres minutos y medio (se deberá incluir en la documentación) .1 segundos) y medio (aproximadamente 0. . Se deben incluir en dicho directorio. .Parar el generador. no es necesario incluirlas (debido al gran tamaño que tienen).INFORME Cómo informe del trabajo se debe entregar un fichero zip en la pestaña de Evaluación del curso virtual en aLF. o WS_SOAP_Client. De esta forma. . todas los ficheros jar que se empleen en la ejecución de los servidores/clientes SOAP y REST. o WS_REST_Client. con una amplitud de 1 y una frecuencia de 10. usando el botón Start. 4. Rafael Pastor Vargas Pruebas a desarrollar (con ambos clientes): .jar.jar..Tomar un pantallazo de la GUI cuando el tiempo llegue a los dos minutos (se deberá incluir en la documentación) . El fichero debe llamarse “Nombre_Alumno”.zip. sin usar acentos y usando guiones bajos (_) en vez de espacios en blanco entre nombre y apellidos.Cambiar el tipo de señal a triangular (usando el botón Apply) .Cambiar el tipo de señal a sinusoidal. Debe contener las clases correspondientes al cliente REST. UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 13 . usando el botón Stop.Comprobar el efecto del slider inferior del GUI modificando los valores y utilizando los valores máximo (1 segundo).Arrancar el generador. Deben estar situados en el directorio lib del fichero zip. usando el botón Start.jar. para que el equipo docente pueda probar la solución del alumno.Tomar un pantallazo de la GUI cuando el tiempo llegue a los dos minutos y medio (se deberá incluir en la documentación) .Arrancar el cliente.Cambiar la frecuencia de la señal a 0. donde Nombre_Alumno debe contener el nombre completo del estudiante. Intentar explicar cuál es el efecto que produce en la representación de la onda y porque ocurre. - Los ficheros fuentes de las clases generadas situados en el directorio sources. manteniendo la estructura de paquetes (esto es. En el caso de las librerías CXF.

Estos scripts deben estar situados en la raíz del fichero comprimido y deben considerar los paths relativos al subdirectorio lib al ejecutar dichos scripts (tenga en cuenta además. txt o pdf) con la arquitectura desarrollada y comentarios sobre los problemas encontrados durante el desarrollo y prueba de los servidores/clientes SOAP/REST.APLICACIONES DISTRIBUIDAS - Documento en formato texto (puede ser word. - Guiones de trabajo (scripts) para poder ejecutar las aplicaciones cliente y servidor. el path relativo a las librerías CXF y adicionales). UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA 14 . Este documento debe estar situado en el directorio doc del fichero zip. tanto de SOAP como REST (usando los ficheros jar del directorio lib). Además se deben incluir los pantallazos/comentarios pedidos en la parte de pruebas.