• No results found

P30: Use of Network Analysis Technique for Prioritizing Project Portfolio: A Case Study

2. Theoretical Reference

� Es el que usaremos Cliente stand-alone � Es el que usaremos. Cliente stand-alone.

Modelo basado en J ava EE

� El cliente corre dentro de un servidor de aplicaciones J ava � El cliente corre dentro de un servidor de aplicaciones J ava

EE con soporte para J AX-WS.

� No veremos los detalles.

es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (1) package es.udc.ws.jaxwstutorial.client;

import es udc ws jaxwstutorial wsdl IncorrectTickerSymbolException; import es.udc.ws.jaxwstutorial.wsdl.IncorrectTickerSymbolException; import es.udc.ws.jaxwstutorial.wsdl.StockQuoteProvider; import es.udc.ws.jaxwstutorial.wsdl.StockQuoteProviderService; import es.udc.ws.jaxwstutorial.wsdl.TradePrice;p j import javax.xml.ws.BindingProvider; import javax.xml.ws.WebServiceRef; import java.util.ArrayList; import java.util.List; import java.text.MessageFormat; public class StockQuoteProviderClient {

public static StockQuoteProviderService stockQuoteProviderService = p

new StockQuoteProviderService();

public static void main (String args[]) {

es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (2) try {

if (args.length < 2) {

System err println(MessageFormat format("Usage: {0} System.err.println(MessageFormat.format("Usage: {0} stockQuoteProviderURL [tickerSymbol1 tickerSymbol2 ...]",

StockQuoteProviderClient.class.getName())); System.exit(-1);

}

String stockQuoteProviderURL = args[0];

Li t St i ti k S b l A Li t St i () List<String> tickerSymbols = new ArrayList<String>(); for (int i=1; i < args.length; i++) {

tickerSymbols.add(args[i]); } } StockQuoteProvider stockQuoteProvider = stockQuoteProviderService.getStockQuoteProviderPort(); ((BindingProvider)stockQuoteProvider).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, stockQuoteProviderURL); es.udc.ws.jaxwstutorial.client.StockQuoteProviderClient (y 3) List<TradePrice> tradePrices = stockQuoteProvider.getLastTradePrices(tickerSymbols); // Show results

for (int i=0; i<tradePrices.size(); i++) { System.out.println( MessageFormat format ( MessageFormat.format ( … …, tradePrices.get(i).getTickerSymbol(), …)); } catch (IncorrectTickerSymbolException e) {

System.out.println("Unable to get ticker symbol“ + e.getFaultInfo().getIncorrectTickerSymbol())); }

} } }

Comentarios

StockQuoteProviderService

� I nterfaz del servicio � I nterfaz del servicio

� Generada por el compilador de WSDL a J ava

� Su nombre coincide con el nombre del servicio declarado en

el fichero WSDL el fichero WSDL

Proporciona métodos get<PortType>

� Devuelven una instancia del stub/proxy del puerto � El proxy implementa el interfaz del puerto

(StockQuoteProvider en el ejemplo, generado por el compilador de WSDL a J ava).

El ejemplo recibe la URL de invocación del servicio por línea de

� El ejemplo recibe la URL de invocación del servicio por línea de

comandos y la fija modificando la propiedad

ENDPOINT_ADDRESS_PROPERTY del contexto de la petición.

� Hay otras propiedades (e g autenticación) � Hay otras propiedades (e.g. autenticación).

ws-jaxwstutorialservice.war

I ncluye

WEB-INF/lib

WEB INF/lib

I ncluye las librerías (ficheros .jar) de Metro

WEB-INF/classes

� Contiene las clases requeridas por el servicio (paquete

es.udc.ws.jaxwstutorial.wsdl) WEB INF/web xml

WEB-INF/web.xml

� Fichero de configuración de la aplicación web.

WEB-INF/sun-jaxws.xmlj

� Configuración de los Servicios Web de Metro.

web.xml (1)

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

xmlns="http://java sun com/xml/ns/j2ee" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <listener> <listener-class>

com sun xml ws transport http servlet WSServletContextListener com.sun.xml.ws.transport.http.servlet.WSServletContextListener

</listener-class> </listener>

<display-name>JAXWSTutorial Web Service</display-name> <servlet> <servlet-name>WSServlet</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup> </servlet>

web.xml (y 2)

<servlet-mapping> <servlet-name>WSServlet</servlet-name> <servlet name>WSServlet</servlet name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <session-config> i i 30 / i i <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

Comentarios (1)

� Se declara una clase Listener específica de Metro (las clases Listener son llamadas cuando una sesión se crea y se destruye).y y � Se declara el servlet WSServlet

� Forma parte de las librerías de Metro

WSS l t

WSServlet

� El servidor de aplicaciones Web le pasará todas las peticiones (tag servlet-mapping) dirigidas a las URLs

// / / / http://.../NombreAplicacionWeb/services/* <servlet-mapping> < l t >WSS l t</ l t > <servlet-name>WSServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>

� En este caso, asumiendo que instalemos la aplicación Web con el

nombre ws-jaxwstutorial-service, el cliente usará la URL

http://.../ws-jaxwstutorial- http://.../ws jaxwstutorial

service/services/StockQuoteProvider para acceder al

puerto StockQuoteProvider

Comentarios (y 2)

WSServlet (cont)

� El servlet invocará la operación correspondiente sobre el � El servlet invocará la operación correspondiente sobre el

service endpoint al que va dirigida la petición, y finalmente enviará una respuesta SOAP con el resultado de la operación

sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns='http://java sun com/xml/ns/jax-ws/ri/runtime' <endpoints xmlns= http://java.sun.com/xml/ns/jax ws/ri/runtime

version='2.0'>

<endpoint name='StockQuoteProvider' implementation= 'es.udc.ws.jaxwstutorial.service.StockQuoteProviderImpl'

url-pattern='/services/StockQuotesService'/> url pattern= /services/StockQuotesService /> </endpoints>

Comentarios

name

. Nombre del puerto.

implementation

Clase de implementación del puerto �

implementation

. Clase de implementación del puerto. �

urlpattern

. Tiene que concordar con el indicado en el

web xml web.xml.

3.5 Caso de estudio: diseño e

implementación de un servicio/cliente SOAP p

con J AX-WS

Estructura de paquetes del caso de estudio

es.udc.ws.movies Subsistema Movies client model service rest rest jaxws proxy wsdl wsdlutils xml

Visión de la estructura de paquetes en capas

Implementación del Servicio Interfaz de Usuario

Cliente Servidor

Implementación del Servicio Interfaz de Usuario es.udc.ws.movies.client es.udc.ws.movies.xml es.udc.ws.movies.service.jaxws es.udc.ws.movies.service.jaxws.wsdlutils Acceso al Servicio es.udc.ws.movies.service

es udc ws movies service jaxws proxy Lógica de Negocio es.udc.ws.movies.service.jaxws.proxy

es.udc.ws.movies.service.jaxws.wsdl es.udc.ws.movies.service.jaxws.proxy.ws

dlutils es.udc.ws.movies.model

� De forma similar al ejemplo J AXWSTutorial

es.udc.ws.movies.service.jaxws.wsdl: contiene las clases

e interfaces generadas por el compilador de WSDL a J ava. La implementación del servicio

(MovieInformationProviderJaxWSBindingImpl) está en

es udc ws movies service jaxws es.udc.ws.movies.service.jaxws

es.udc.ws.movies.service.jaxws [Capas de I mplementación del Servicio] (1)

MovieI nformationProviderJ AXWSBindingI mpl

+ findMoviesByReleaseDate(releaseDate : Calendar) : List<MovieI nformationWTO>y ( ) + addMovie(movieI nformation : MovieI nformationWTO) : Long

+ updateMovie(movieI nformation : MovieI nformationWTO) : void + removeMovie(identifier : Long) : void

MovieI nformationWTO - identifier : Long - title : String - runtime : short - releaseDate : Calendar - directorNames : List<String> - actorNames : List<String> - genres : List<String> - synopsis : String + Constructor + Métodos get/set

es.udc.ws.movies.service.jaxws.MovieI nformationProviderJ AXWSBindingI mpl [Capa de I mplementación del Servicio] (2)

MovieI nformationProviderJ AXWSBindingI mpl MovieI nformationProviderJ AXWSBindingI mpl es.udc.ws.movies.service.jaxws.wsdlutils es.udc.ws.movies.model

CommonWSDLTypeConversor MovieInformationFacade

CommonWSDLTypeConversor proporciona operaciones para facilitar

la conversión de “tipos del modelo” (los definidos en es udc ws movies service) la conversión de tipos del modelo (los definidos en es.udc.ws.movies.service) a/desde “tipos de la capa de implementación del servicio” (los definidos en es.udc.ws.movies.service.jaxws)

es.udc.ws.movies.service.jaxws.MovieI nformationProviderJ AXWSBindingI mpl [Capa de I mplementación del Servicio] (3)

package es.udc.ws.movies.service.jaxws; import es.udc.ws.movies.model.MovieInformationException; import es.udc.ws.movies.model.MovieInformationFacade; import es.udc.ws.movies.service.jaxws.wsdlutils.CommonWSDLTypeConversor; import es.udc.ws.util.exceptions.InstanceNotFoundException; //… @WebService( name = "MovieInformationProvider", serviceName = "MovieInformationProviderService", targetNamespace = "http://movies.ws.adoo.udc.es/" )

public class MovieInformationProviderJaxWSBindingImpl { @WebMethod(

operationName = "findMoviesByReleaseDate" )

public List<MovieInformationWTO> findMoviesByReleaseDate(Calendar releaseDate) { return CommonWSDLTypeConversor.toWSDL( MovieInformationFacade.getInstance(). findMoviesByReleaseDate(releaseDate)); findMoviesByReleaseDate(releaseDate)); }

es.udc.ws.movies.service.soap.wsdl.MovieI nformationProviderJ AXWSBindingI mpl [Capa de I mplementación del Servicio] (4)

@WebMethod(

operationName = "addMovie" )

public long addMovie(MovieInformationWTO movieInformation) throws MovieException { try { return MovieInformationFacade.getInstance().addMovie( CommonWSDLTypeConversor.fromWSDL(movieInformation)); } catch (MovieInformationException e) { throw CommonWSDLTypeConversor.toMovieException(e); } }

es.udc.ws.movies.service.soap.wsdl.MovieI nformationProviderJ AXWSBindingI mpl [Capa de I mplementación del Servicio] (5)

@WebMethod(

operationName = "updateMovie" )

public void updateMovie(MovieInformationWTO movieInformation) throws MovieNotFoundException, MovieException { try { MovieInformationFacade.getInstance().updateMovie( CommonWSDLTypeConversor.fromWSDL(movieInformation)); } catch (InstanceNotFoundException e) { throw CommonWSDLTypeConversor.toMovieNotFoundException(e); } catch (MovieInformationException e) { throw CommonWSDLTypeConversor.toMovieException(e); } }

es.udc.ws.movies.service.soap.wsdl.MovieI nformationProviderJ AXWSBindingI mpl [Capa de I mplementación del Servicio] (6)

@WebMethod(

operationName = "removeMovie" )

public void removeMovie(Long identifier) throws MovieNotFoundException { try { MovieInformationFacade.getInstance().removeMovie(identifier); } catch (InstanceNotFoundException e) { throw CommonWSDLTypeConversor.toMovieNotFoundException(e); } } } es.udc.ws.movies.service.MovieI nformationWTO [Capa de I mplementación del Servicio] (7)

package es udc ws movies service jaxws; package es.udc.ws.movies.service.jaxws; import javax.xml.bind.annotation.XmlElement; //

//…

public class MovieInformationWTO { @XmlElement(nillable = true) @XmlElement(nillable = true) protected List<String> actorNames; @XmlElement(nillable = true)

protected List<String> directorNames; protected List<String> directorNames; @XmlElement(nillable = true)

protected List<String> genres; protected Long identifier; protected Calendar releaseDate; //…

//…

public List<String> getActorNames() { if (actorNames == null) {

actorNames = new ArrayList<String>(); actorNames new ArrayList<String>(); }

return this.actorNames; }

es.udc.ws.movies.service.soap.wsdl.MovieI nformationWTO [Capa de I mplementación del Servicio] (8)

//…

public List<String> getGenres() { if (genres == null) { if (genres == null) {

genres = new ArrayList<String>(); }

return this.genres; }

}

public Long getIdentifier() { return identifier; }

}

public void setIdentifier(Long value) { this.identifier = value;

} }

public Calendar getReleaseDate() { return releaseDate;

} }

public void setReleaseDate(Calendar value) { this.releaseDate = value;

//… }

es.udc.ws.movies.service.soap.wsdl.MovieNotFoundException [Capa de I mplementación del Servicio] (9)

package es.udc.ws.movies.service.jaxws; import javax.xml.ws.WebFault;

@WebFault(name = "MovieNotFoundException", targetNamespace = "http://movies.ws.adoo.udc.es/")

public class MovieNotFoundException extends Exception { private MovieNotFoundExceptionInfo faultInfo;

public MovieNotFoundException(MovieNotFoundExceptionInfo faultInfo) {

this.faultInfo = faultInfo; }

public MovieNotFoundExceptionInfo getFaultInfo() { return faultInfo;

} }

es.udc.ws.movies.service.jaxws [Capas de I mplementación del Servicio] (10) �

Nótese que no usamos los tipos del modelo:

MovieWTO. No se utilizan enumerados.

Notar anotación XMLElement para elementos List. � Las operaciones declaran excepciones cuya información es

encapsulada en un objeto

xxxExceptionInfo

encapsulada en un objeto

xxxExceptionInfo

.

� De esta forma las clases generadas en el cliente a partir

del WSDL tendrán la misma estructura.

es.udc.ws.movies.service.jaxws [Capas de I mplementación del Servicio] (y 11)

Tener en la capa de implementación del servicio tipos