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 elweb 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)
�