• No se han encontrado resultados

Arquitectura del Software

N/A
N/A
Protected

Academic year: 2021

Share "Arquitectura del Software"

Copied!
73
0
0

Texto completo

(1)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Arquitectura del Software

– Tema 7 –

El Entorno de Programación Restlet

Sergio Saugar [email protected]

5

o

Ingeniería Informática Univ. Rey Juan Carlos

Curso 2010-2011

(2)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

El Entorno de Programación Restlet

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(3)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

El Entorno de Programación Restlet

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(4)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

El Entorno de Programación Restlet

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(5)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

El Entorno de Programación Restlet

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(6)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(7)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Descripción

Creado por Jerome Louvel (Noelios Technologies) Restlet es un framework

Desarrollado en Java Software libre

Provee un buen mapeo de los principios de REST

(8)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Desarrollado como respuesta a:

Necesidad de un framework simple para construir aplicaciones web RESTful

Limitaciones de los Servlets (Greg Wilkins)

No existe una clara separación entre aspectos del protocolo y de la aplicación

No aprovechan características propias de HTTP, a no ser que

lo contemplen los diseñadores de aplicaciones

(9)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Nota:

Estas transparencias han sido desarrolladas en base a:

Restlet First Steps y Restlet Tutorial (1.1) [Noelios Technologies(2011)]

Charla S.Landis de Overstock.com [Landis(2007)]

Ejemplo: Correo Interno Facebook (Tema 6)

(10)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(11)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Características[Noelios Technologies(2011)]

Los conceptos principales de la arquitectura REST tienen sus correspondientes clases Java (UniformInterface, Resource, Representation, Connector...)

Se pueden implementar clientes y servidores de una aplicación

utilizando la misma API

(12)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Características

Ofrece un mecanismo de Templates para realizar un

enrutamiento sencillo entre los distintos elementos de nuestra aplicación. Los parámetros de las plantillas son codificados en la solicitud como atributos

Ofrece un servicio de Tunneling que permite, entre otras cosas,

que los browsers puedan emitir cualquier método HTTP

encapsulándolo dentro de un método POST. Transparente de

cara a la aplicación

(13)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Introducción

Características

Ofrece la funcionalidad completa de un servidor web

Provee varios conectores (Apache HTTP, HTTPS, JDBC...)

Soporta distintas representaciones (XML, HTML, ...)

Maneja distintos esquemas de seguridad (Basic, Digest,

Amazon S3, OAuth...)

(14)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(15)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Características

Arquitectura del Entorno Restlet

Arquitectura del Entorno Restlet

Arquitectura del Framework

- API Genérica (Restlet API) - Plugin de soporte para

implentaciones alternativas (SPI) - Implementación de Referencia (Noelios Engine)

- Integración con tecnologías externas

(JDBC, JSON, gestores plantillas...)

- Aplicaciones

(16)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(17)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Programación de Objetos del Dominio

Diseño

Diseñaremos/Programaremos los objetos propios del dominio de nuestra aplicación (a gusto del consumidor)

Seguiremos el ejemplo del Correo Interno de Facebook

En nuestro ejemplo, el diseño es trivial y no será comentado

Programaremos los objetos del dominio en Java

(18)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Programación de Objetos del Dominio

Ejemplo: Correo Interno Facebook Usuarios

Mailbox Folders

Ofrecidas por el sistema: Recibidos, Enviados, Borradores Emails

Almacenamiento externo

Además, necesitaremos almacenamiento: Storage

(19)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Programación de los Objetos del Dominio

Ejemplo: Correo Interno Facebook

(20)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(21)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando la Aplicación Web

Clase Restlet

Provee el interfaz uniforme para todas las subclases Get, Put, Post, Delete

Ofrece el contexto software (atributos, logger, parámetros,...) Implementa el ciclo de vida

Sus subclases implementan cómo se deben procesar

concretamente las peticiones

(22)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando la Aplicación Web

Jerarquía de Clases

(23)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Clase Resource

Es el último manejador dentro del pipeline

Es el lugar dónde se integran los objetos del dominio de la aplicación Web

Bases de datos, beans, agentes, interacciones, otros servicios, etc.

Típicamente es creado por un Finder

Selecciona/Negocia las posibles variantes de una representación

Puede ser compartido entre diversas llamadas; por lo tanto,

habrá que tener cuidado si tenemos multithread

(24)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Clase Resource

Permitir los métodos que se vayan a utilizar: allow*() Sólo GET está activo por defecto

Programar tratamiento a los métodos:

Reutilizando negociación de contenido:

represent(Variant) (GET)

acceptRepresentation(Representation) (POST), storeRepresentation(Representation) (PUT), removeRepresentation() (DELETE),

Implementando una negociación de contenido propia

handle*()

(25)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Clase Resource

Las llamadas se despachan dinámicamente a los métodos handle*() mediante introspección

Dar soporte a un nuevo método (MOVE):

Permitir allowMove()

Añadir handleMove()

(26)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: Diagrama de Clases

(27)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: BaseResource

 

public Representation represent ( Variant variant ) throwsResourceException {

Representation rep =null;

BaseEntity resource = getStorage(). getEntity (getRequest (). getResourceRef(). toString ());

if ( resource !=null) {

// Obtiene la representación XML de la entidad String stringRep = resource. serializar ();

// Genera una representación adecuada a la variante // seleccionada .

if ( variant . getMediaType().equals(MediaType.TEXT_XML)) { // Envia la representación XML directamente

rep =newStringRepresentation(stringRep , MediaType.TEXT_XML);



}



(28)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: BaseResource

 

else if ( variant . getMediaType().equals(MediaType.TEXT_HTML)) { // Aplicar la transformación XML −> XHTML

// StringWriter output = new StringWriter();

// TransformerFactory tFactory = // TransformerFactory.newInstance ();

// ...

// rep = new StringRepresentation(output. toString (), // MediaType.APPLICATION_XHTML_XML);

} else {

// No es una de las representaciones que puedo ofrecer , // debió existir un error en la negociación de contenido .

throw newResourceException(Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);

}



}



(29)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: BaseResource

 

else {

// El objeto no está en el almacenamiento

throw newResourceException(Status.CLIENT_ERROR_NOT_FOUND);

} return rep ;



}



(30)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: UsersResource

 

public booleanallowPost () { return true;

}

public void acceptRepresentation ( Representation entity ) throwsResourceException {

// Capturar la información . Viene formateada como un formulario, // pares atributo −valor

try {

Form form =newForm(entity);

String nombreUsuario = form.getFirstValue("name");

Users users = (Users) getStorage (). getEntity (getRequest (). getResourceRef() . toString ());

Mailbox mailbox = users.addUser(nombreUsuario);

 

(31)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: UsersResource

 

// Si todo va bien , envía : (201 −− Created) getResponse(). setStatus (Status . SUCCESS_CREATED);

// Location header:

getResponse().setLocationRef(mailbox. getUri ());

}

catch(Exception e) {

getResponse(). setStatus (Status . CLIENT_ERROR_BAD_REQUEST);

}



}



(32)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: MailboxResource http://www.facebook.com/users/{userId}/mail/

Metodo Contenido Repres. Acción Codigo

GET Lista de folders XML, HTML Devuelve una lis- ta de los folders definidos por el usuario {userId}

200 - OK, 406 - Not Acceptable

POST Representación del Folder XML, HTML Crea un folder de correo con nom- bre determinado

201 - Created + Location, 403 - Forbidden

PUT n/a 405 - Method Not

Allowed

DELETE n/a 405 - Method Not

Allowed

(33)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: MailboxResource

 

public void acceptRepresentation ( Representation entity ) throwsResourceException {

try {

// Creamos una nueva carpeta, con el nombre que viene especificado // en el POST

Form form =newForm(entity);

String nombreMailbox = form.getFirstValue("name");

Mailbox mailbox = (Mailbox) getStorage (). getEntity (getRequest (). getResourceRef() . toString (). toString ());

Folder folder = mailbox.addFolder(nombreMailbox);

// Si todo va bien , envía : (201 −− Created) getResponse(). setStatus (Status . SUCCESS_CREATED);

// Location header:

getResponse().setLocationRef( folder . getUri ());

(...) }



}



(34)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: FolderResource

http://www.facebook.com/users/{userId}/mail/{folderId}/

Metodo Contenido Repres. Acción Codigo

GET Lista mensajes XML, HTML Devuelve una lista de los mensajes conteni- dos en el folder {folde- rId}

200 - OK, 406 - Not Acceptable

POST Mensaje XML, HTML Si {folderId} es “Envia- dos” se envía el mensaje al usuario indicado en el campo destinatario. Se crea mensaje en envia- dos

201 - Created + Loca- tion, 403 - Forbidden

PUT n/a 405 - Method Not Allo-

wed

DELETE Elimina el folder {fol-

derId} del usuario {use- rId} sólo si fue creado por el usuario y no tie-

200 - OK, 403 - Forbid- den

(35)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: FolderResource

 

public void acceptRepresentation ( Representation entity ) throwsResourceException {

Folder folder = (Folder) getStorage (). getEntity (getRequest (). getResourceRef() . getBaseRef()

. toString ());

try {

// Se obtiene de las " plantillas " del router

String remitente = (String) getRequest (). getAttributes (). get(" userId " );

// Hay que leer el correo que nos envía , viene como pares atributo −valor.

Form form =newForm(entity);

String destinatario = form. getFirstValue (" destinatario " );

String asunto = form. getFirstValue ("asunto");

String cuerpo = form. getFirstValue ("cuerpo");

 

(36)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: FolderResource

 

Email email =newEmail(folder, remitente , destinatario , asunto, cuerpo);

folder . addEmail(email);

if ( folder . getName().equals(Users.ENVIADOS)) {

Folder destinatarioFolder = (Folder) Storage . getInstance () . getEntity (getRequest (). getResourceRef()

. getBaseRef() . toString ()

. replace ( remitente , destinatario )

. replace (Users . ENVIADOS, Users.RECIBIDOS));

destinatarioFolder . addEmail(newEmail( destinatarioFolder , remitente ,

destinatario , asunto, cuerpo ));



}



(37)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: FolderResource

 

// Si todo va bien , envía : (201 −− Created) getResponse(). setStatus (Status . SUCCESS_CREATED);

// Location header:

getResponse().setLocationRef(email . getUri ());

}

catch(Exception e) {

// Si saltan excepciones porque el destinatario no existe , // entonces :

getResponse(). setStatus (Status . CLIENT_ERROR_BAD_REQUEST);

} }

public booleanallowDelete () { return true;



}



(38)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: FolderResource

 

public void removeRepresentations() throwsResourceException {

Folder folder = (Folder) getStorage (). getEntity (getRequest (). getResourceRef() . getBaseRef()

. toString ());

if (!( folder . getName().equals(Users.BORRADORES)

|| folder . getName().equals(Users.ENVIADOS) || folder.getName() . equals (Users . RECIBIDOS))) {

if ( folder . isEmpty()) {

Mailbox mailbox = (Mailbox) getStorage (). getEntity ( folder . getMailbox ());

mailbox. delFolder ( folder );

getStorage (). delEntity ( folder . getUri ());

getResponse(). setStatus (Status . SUCCESS_NO_CONTENT);

} else {

getResponse(). setStatus (Status . CLIENT_ERROR_BAD_REQUEST);

(...)



}



(39)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: EmailResource

http://www.facebook.com/users/{userId}/mail/{folderId}/{mailId}

Metodo Contenido Repres. Acción Codigo

GET Representacion del correo XML, HTML Devuelve una re- presentación del correo {mailId}

200 - OK, 406 - Not Acceptable

POST n/a 405 - Method Not

Allowed PUT Representacion del correo XML,HTML Actualiza el co-

rreo, sólo si es bo- rrador

200 - OK, 400 - Bad Request

DELETE Elimina el correo

{mailId} de la carpeta {folde- rId} del usuario {userId}

200 - OK, 403 - Forbidden

(40)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: EmailResource

 

public booleanallowPut() { return true;

}

public void storeRepresentation ( Representation entity ) throwsResourceException {

Email email = (Email) getStorage (). getEntity (getRequest (). getResourceRef() . getBaseRef()

. toString ());

if (email . getFolder (). endsWith(Users.BORRADORES)) {

// Sólo dejamos modificar los correos que están almacenados como borrador // Hay que leer el correo que nos envía , viene como pares atributo −valor.

Form form =newForm(entity);

String destinatario = form. getFirstValue (" destinatario " );

String asunto = form. getFirstValue ("asunto");

String cuerpo = form. getFirstValue ("cuerpo");

 

(41)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: EmailResource

 

email . setDestinatario ( destinatario );

email . setAsunto(asunto);

email . setCuerpo(cuerpo);

// Notifica que la solicitud ha sido realizada . No necesita enviarse // ningún contenido .

getResponse(). setStatus (Status . SUCCESS_OK);

} else {

getResponse(). setStatus (Status . CLIENT_ERROR_BAD_REQUEST);

}



}



(42)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Programando los Recursos

Correo Interno Facebook – Ejemplo: EmailResource

 

public void removeRepresentations() throwsResourceException {

Email email = (Email) getStorage (). getEntity (getRequest (). getResourceRef() . getBaseRef(). toString ());

Folder folder = (Folder) getStorage (). getEntity (email . getFolder ());

folder . delEmail(email );

getStorage (). delEntity (email . getUri ());

// Notifica que la solicitud ha sido realizada . No necesita enviarse // ningún contenido .

getResponse(). setStatus (Status . SUCCESS_NO_CONTENT);



}



(43)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Trabajando con Representaciones

Clase Representation

(44)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Trabajando con Representaciones

Correo Interno Facebook – Ejemplo: Representaciones XML Una manera cómoda de trabajar con Representaciones XML en JAVA es utilizando JAXB

Permite anotar las clases

Genera esquemas a partir de anotaciones / clases anotadas a partir de esquemas

Serializa/Deserializa objetos JAVA a XML

(45)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Trabajando con Representaciones

Correo Interno Facebook – Ejemplo: Representaciones XML

(46)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Trabajando con Representaciones

Correo Interno Facebook – Ejemplo: Representaciones XML

 

@XmlRootElement(name = "email") public class EmailextendsBaseEntity {

private String folder ; private String remitente ; private String destinatario ; private String asunto;

private String cuerpo;

@XmlElement

public String getRemitente() {...}

@XmlElement

public String getDestinatario () {...}

@XmlElement

public String getAsunto() {...}

(...)

(47)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Trabajando con Representaciones

Correo Interno Facebook – Ejemplo: Representaciones XML

 

public String serializar () { try {

JAXBContext jc = JAXBContext.newInstance("urjc.arqsoftware.examples.webmail.data");

Marshaller m = jc. createMarshaller ();

m.setProperty( Marshaller . JAXB_FORMATTED_OUTPUT,true);

ByteArrayOutputStream output =newByteArrayOutputStream();

m.marshal(this, output );

returnoutput. toString ();

}

catch(JAXBException e) { (...)

}



}



(48)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Clases más relevantes

Correo Interno Facebook – Ejemplo: Representaciones XML

 

public static Object deserializar ( String s) { Object obj =null;

try {

JAXBContext jc = JAXBContext.newInstance("urjc.arqsoftware.examples.webmail.data");

Unmarshaller u = jc. createUnmarshaller ();

obj = u.unmarshal(newByteArrayInputStream(s.getBytes()));

}

catch(JAXBException e) { (...)

} return obj ;



}



(49)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Clase Router

Restlet para enrutamiento de llamadas hacia alguno de los recursos enlazados (normalmente otro Restlet)

attach(pattern, Restlet)

Crea una ruta basándose en el patrón de una URI. Se busca la

concordancia desde el principio de la referencia al recurso

(50)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Clase Router: Patrones de URI

Especificación de una template (plantilla)sobre la URI Ejemplos de patrones:

/users

/users/{user_id}/mail

/users/{user_id}/mail/{folder_id}

/users/{user_id}/mail/{folder_id}/{email_d}

(51)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Correo Interno Facebook – Ejemplo de Router

(52)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Clase Router

Se asigna una puntuación a cada ruta por cada llamada, dependiendo de varios factores.

Varios modos de enrutado soportados:

Best match (default) Round Robin Random match

First, Last and Custom match

(53)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Ejemplo de enrutado Custom

 

...

this. setRoutingMode(Router.CUSTOM);

...

@Overrideprotected Route getCustom(Request request,Response response) {

// A new router is created

Router router =newRouter(this.getContext ());

Source source =null;

if (!this. getRoutes (). isEmpty()) { // Local Routes ( if any) are served first RouteList list =this. getRoutes ();

for (Route r : list ) {

// Select the first route that matches

if ( r . getTemplate().match(request.getResourceRef(). getRelativeRef (). toString ())!=−1) { return r ;

} }



}



(54)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo a los Recursos

Ejemplo de enrutado Custom (cont.)

 

switch(source) { case INTERACTION:

router . attachDefault ( RestInteraction .class); break;

case AGENT:

router . attachDefault (RestAgent.class); break;

case RESOURCE:

router . attachDefault (RestResource.class); break;

case ACTION:

router . attachDefault (RestAction.class); break;

case EVENTCH:

router . attachDefault (RestEventChannel.class); break;

default: break;

}

// Return the router with the default route filled . return newRoute(router);



}



(55)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Generando la Aplicación

Clase Application

Contiene la lógica de cada aplicación

Tiene un Restlet raiz que gestiona las peticiones (Root) Ofrece diversos servicios, que pueden ser redefinidos:

connectorService: para gestionar los conectores cliente-servidor converterService: para convertir las entidades de los mensajes en objetos de más alto nivel

decoderService: para decodificar o descomprimir las entidades

de las peticiones automáticamente

(56)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Generando la Aplicación

Clase Application

metadataService: acceso al servicio de metadatos statusService: provee representaciones comunes para los códigos de estado

tunnelService: permite encapsular preferencias de

representaciones, o métodos HTTP en los parámetros de una

solicitud

(57)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Generando la Aplicación

Correo Interno Facebook – Ejemplo: Application detalle createRoot()

 

public synchronized Restlet createRoot() {

// En nuestro caso , devolveremos un router que redirigirá las peticiones // a los otros restlets .

Router router =newRouter(getContext().createChildContext ());

// Define una ruta para el recurso users router . attach("/users", UsersResource.class);

// Define una ruta para el recurso mailbox

router . attach("/users/{userId}/mail", MailboxResource.class);

// Define una ruta para el recurso folder

router . attach("/users/{userId}/mail/{ folderId }", FolderResource.class);

// Define una ruta para el recurso email

router . attach("/users/{userId}/mail/{ folderId }/{emailId}", EmailResource.class);

return router ;



}



(58)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Generando la Aplicación

Correo Interno Facebook – Ejemplo: Detalle aplicación

(59)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo al Sistema de Ficheros

Clase Directory

Finder para recursos del sistema de ficheros

Negociación automática de contenido similar al servidor Apache

Selecciona la mejor representación dependiendo de:

variantes disponibles

capacidades y preferencias del cliente

(60)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo al Sistema de Ficheros

Ejemplo de Aplicación: Servidor Web Estático

 

(...)

component.getClients (). add(Protocol.FILE);

Application application =newApplication(component.getContext()) {

@Override

public Restlet createRoot() {

Directory directory =newDirectory(getContext(), " file ://" + ROOT);

directory . setListingAllowed (true);

directory . setDeeplyAccessible (true);

return directory ; }

} (...) }



}



(61)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Accediendo al Sistema de Ficheros

Correo Interno Facebook – Ejemplo: Añadiendo directorio para

imágenes

(62)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Filtrando las Peticiones

Clase Filter

Impone semántica Antes/Después

Permite tratar/modificar la solicitud y reenviarla a otro Restlet Usos:

Enrutamiento (Router) Seguridad (Guard)

Tratamiento previo de los datos, conversión entre formatos del

cuerpo de la petición, ...

(63)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Filtrando las Peticiones

Correo Interno Facebook – Ejemplo: Restringiendo el acceso

(64)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Despliegue de Aplicaciones Restlet

Despliegue

Una vez Encapsulada la aplicación como un contenedor (jar o war), se puede ejecutar:

Como aplicación de cualquier contenedor estándar de Servlets Tomcat, Jetty

Como una aplicación stand-alone

Como un servicio nativo utilizando Java Service Wrapper

(65)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Despliegue de Aplicaciones Restlet: Stand-Alone

Clase VirtualHost

Enruta llamadas desde los conectores Servidor a distintos Restlets (aplicaciones)

Se definen en base a:

“hostRef” de la solicitud

“resourceRef” de la solicitud

Mantiene varias aplicaciones sobre el mismo servidor:

Misma dirección IP compartida por distintos nombres de dominio

Mismo nombre de dominio con balanceo de carga entre

distintas direcciones IP

(66)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Despliegue de Aplicaciones Restlet: Stand-Alone

Clase Component

Permite lanzar nuestra aplicación como stand-alone Gestiona VirtualHosts y Aplicaciones

Contiene un default host

Permite construir un sistema por capas

(67)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Despliegue de Aplicaciones Restlet: Stand-Alone

Correo Interno Facebook – Ejemplo: Componente

(68)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

La SuperClase Restlet Programando los Recursos Trabajando con Representaciones Accediendo a los Recursos Generando la Aplicación Accediendo al Sistema de Ficheros Filtrando las Peticiones Despliegue de Aplicaciones Restlet

Despliegue de Aplicaciones Restlet: Stand-Alone

Despliegue de Aplicaciones Restlet: Stand-Alone

Correo Interno Facebook – Ejemplo: Configuración del Componente

 

// Creamos un nuevo componente (servidor web) Component component =newComponent();

component.getClients (). add(Protocol.HTTP);

component.getServers().add(Protocol.HTTP, "localhost", 9090);

this. setContext(component.getContext().createChildContext ());

// Añadimos esta aplicación al componente dentro del Host por defecto component.getDefaultHost().attach(this);

// Intentamos lanzar el servidor web de esta aplicación try {

Storage . getInstance (). addEntity(newUsers("http:// localhost :9090" ));

component.start ();

}

catch(Exception e) {

System.err . println ("ERROR!!!␣El␣servidor␣no␣ha␣podido␣ser␣lanzado.");

e . printStackTrace (System.err );

System. exit (−1);



}



(69)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Outline

1 Introducción Características

Arquitectura del Entorno Restlet

2 Programando los Objetos del Dominio

3 Programando la Aplicación Web

4 Extensiones de Restlet

(70)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Extensiones

Algunas extensiones:

Varios conectores: HTTPS, Apache HTTP Client, SMTP, JDBC, FILE ...

Múltiples representaciones:

DOM, SAX, XPath, XSLT

Template Engine: Velocity, FreeMarker NIO, Apache Upload

Facilidad de integración con:

Struts, Spring, JSON, Hibernate, DB4O, GWT...

(71)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

¿Preguntas?

(72)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

S. Landis.

Restlet: Lightweight rest framework for java.

http://ebookdock.com/lightweight-rest-framework-for- java.html, 2007.

03/15/2007, (link revised on March 2011).

Noelios Technologies.

Restlet - lightweight rest framework for java.

http://www.restlet.org, 2011.

(73)

Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet

¿Preguntas?

Referencias

Arquitectura del Software

– Tema 7 –

El Entorno de Programación Restlet

Sergio Saugar [email protected]

5

o

Ingeniería Informática Univ. Rey Juan Carlos

Curso 2010-2011

Referencias

Documento similar

EVOLUCIÓN DE LA RESERVA DE NIEVE Y APORTACIONES EN EL ÁMBITO DE LA CONFEDERACIÓN HIDROGRÁFICA DEL MIÑO-SIL. Fecha del informe:

Se llega así a una doctrina de la autonomía en el ejercicio de los derechos que es, en mi opinión, cuanto menos paradójica: el paternalismo sería siempre una discriminación cuando

el PAtio de mi escuelA es un bosque de diversidAd Más allá de las pistas deportivas, ofrecer en el patio espacios alternativos de juego libre que estén en contacto con la

Puedes acceder a los lotes de libros, para clubes de lectura, que tienen la biblioteca pública y las bibliotecas municipales?. El club se encarga de recoger y devolver

Como ya hemos visto anteriormente resulta más efectivo prevenir los accidentes que intentar compensar posteriormente. Para poder llevar a cabo esta prevención la autora plantea como

Se consideran aprobadas con anterioridad las materias cursadas de acuerdo con el currículo regulado por la LOE con una calificación igual o superior a 5, que tengan

a) Uniformar, centralizar y consolidar la contabilidad pública, elaborar el balance general y determinar las normas contables que deben regir en el país. b) Llevar la

Más concretamente, y como caso de estudio, se analizará este concepto en relación a los parques temáticos y el componente emocional que estimula en los usuarios.. Figura 6: