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
oIngeniería Informática Univ. Rey Juan Carlos
Curso 2010-2011
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
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
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
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
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
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
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
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)
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
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
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
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...)
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
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
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
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
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
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
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
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
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
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
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*()
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()
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
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);
}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);
}
}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 ;
}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);
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);
}
}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
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 ());
(...) }
}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
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");
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 ));
}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;
}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);
(...)
}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
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");
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);
}
}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);
}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
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
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
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() {...}
(...)
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) { (...)
}
}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 ;
}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
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}
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
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
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 ;
} }
}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);
}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
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
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 ;
}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
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
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 ; }
} (...) }
}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
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, ...
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
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
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
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
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
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);
}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
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...
Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet
¿Preguntas?
Referencias
¿Preguntas?
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.
Introducción Programando los Objetos del Dominio Programando la Aplicación Web Extensiones de Restlet
¿Preguntas?
Referencias