3.3 parsers sax con jaxpfbellas/teaching/is-2001-2002/tema3apartado3.3.pdfintroducción (y 3) n ¿...

41
3.3 Parsers SAX con JAXP

Upload: hoangnhan

Post on 04-Jul-2019

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

3.3 Parsers SAX con JAXP

Page 2: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Introducción (1)

n Un parser XML permite comprobar que el documento está bien formado y acceder a los datos

n Si además el parser es validante, permite validar el documento (usando su DTD o similar)

n Dos tipos de parsersn SAX

n Simple API for XMLn Es un pequeño framework basado en eventosn El programador proporciona uno o varios objetos callback a los

que el parser llamará cada vez que ocurra un evento de interés (apertura de un tag, cierre de un tag, un error, etc.)

n DOMn Document Object Modeln Construye una representación (un árbol) en memoria del

documenton El programador puede acceder a los datos del documento

recorriendo el árbol

Page 3: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Introducción (2)

n Las APIs de SAX y DOM están estandarizadas y existen un gran número de implementaciones para distintos lenguajes (C++, Java, etc.)n Ej.: Apache Software Foundation proporciona Crimson (SAX

y DOM sólo para Java), Xerces (SAX y DOM) y Xalan (XSL)n En el caso de Java, familia de paquete org.xml.sax y org.w3c.dom (básicamente contienen interfaces y clases abstractas)

n Lo que no está estandarizado es cómo crear instancias de los parsers

n ¿ Qué es JAXP ?n Java API for XML Processingn Formará parte de J2SE 1.4n Familia de paquetes java.xml.{parsers, transform}

Page 4: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Introducción (y 3)

n ¿ Qué es JAXP ? (cont)n Define un API para trabajar con parsers SAX, DOM y

transformaciones XSLn Proporciona factorías para crear instancias de parses y

transformadores XSL de manera portable

n Existen un gran número de implementaciones que proporcionan adaptadores para JAXPn Ej.: Crimson, Xerces y Xalan

n Sun proporciona una implementación de JAXP para versiones anteriores a J2SE 1.4n Incluye las APIs org.xml.sax, org.w3c.dom y javax.xml.{parsers, transform}

n Incluye Crimson y Xalan como implementaciones por defecton Se pueden usar otras implementaciones vía configuración

Page 5: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Continuación del ejemplo

n Objetivon Construir una sencilla aplicación de administración que

permita insertar información sobre películas en la BD

n Para que el ejemplo sea sencillon La fachada de administración no insertará los datos en la

BD, sino que los imprimirá en System.outn La aplicación de administración será un simple comando que

se ejecuta desde una shell, y que recibe como parámetro la URI del documento XML con los datos de las películas

n En este apartadon Construiremos la infraestructura básica de la aplicaciónn La estrategia de parsing será redefiniblen Proporcionaremos una implementación con SAX

n Y en el siguiente apartado, una implementación DOM

Page 6: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Estrategia de inserción en la BD (1)

n Estrategia 1: cada vez que tengamos los datos completos de una película (evento </movie>), la insertamos en la BDn Demasiadas transacciones (e invocaciones remotas en una

arquitectura en 3 capas) en caso de haya un elevado número de películas

n Estrategia 2: cada vez que tengamos los datos completos de una película (evento </movie>), la insertamos en una lista, y cuando se termine de parsear el fichero (evento </movies>), insertamos todas las películas de la lista en la BDn Si hay muchas películas, problemas de memoria en el cliente

y transacción demasiado grande (y gran cantidad de datos transferidos en la invocación remota en una arquitectura en 3 capas)

Page 7: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Estrategia de inserción en la BD (y 2)

n Los problemas de las dos anteriores estrategias son especialmente ciertos en aplicaciones en los que muchos threads parsean documento XML (no es el caso del ejemplo)

n Estrategia 3: Idem 2, pero cada vez que la lista tiene “k” elementos, vaciamos la lista a la BDn Cuando se termine de parsear el fichero, vaciamos la lista si

tenía algún elemento n Solución eficienten Es la que usaremos

n “k” será configurablen Si ocurre un error durante este proceso (error de parsing,

inserción en la BD, etc.), abortaremos la ejecución, informando de cuál fue la última película insertada satisfactoriamente

n En una aplicación real podría ser conveniente continuar y registrar en un log los problemas que ha habido

Page 8: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Estructura de paqueteses.udc.fbellas.j2ee.util.xml

shell

es.udc.fbellas.j2ee.xmltutorial.movies

controller

moviesadder

dom

sax

model

movie

vo

moviesadminfacade

delegate

Page 9: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.model.movie.voMovieVO

- movieIdentifier : Long- title : String- runtime : int- releaseDate : Calendar- directorNames : List- actorNames : List- genres : List- synopsis : String

+ MovieVO(...)+ getMovieIdentifier() : Long+ getTitle() : String+ setTitle(title : String) : void+ getRuntime() : int+ setRuntime(runtime : int) : void+ getReleaseDate() : Calendar+ setReleaseDate(releaseDate : Calendar) : void+ getDirectorNames() : List+ setDirectorNames(directorNames : List) : void+ getActorNames() : List+ setActorNames(actorNames : List) : void+ getGenres() : List+ setGenres(genres : List) : void+ getSynopsis() : String+ setSynopsis(synopsis : String) : void+ toString() : String

Serializable(from io)

<<Interface>>

Page 10: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.model.moviesadminfacade.delegate

M o viesAdministrat ionFacadeDelegate

+ MoviesAdministrationFacadeDelegate()

+ addMovies(listOfMovies : List) : void

Page 11: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder

MoviesAdder

+ setMoviesBlockSize(moviesBlockSize : int) : void+ addMovies(xmlDocumentURI : String) : void

<<Interface>>MoviesAdderFactory

- MoviesAdderFactory()<<static>> + getMoviesAdder() : MoviesAdder

<<instantiate>>

ConfigurationParametersManager( f r o m c o n f i g u r a t i o n )

<<use>>

Page 12: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.shell

AddMovies

<<static>> + main(args : String[]) : void

MoviesAdder(from moviesadder)

<<Interface>>MoviesAdderFactory(from moviesadder)

<<use>> <<use>>

Page 13: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.saxVisión global

SAXMoviesAdder

- moviesBlockSize : int

+ SAXMoviesAdder()

MoviesAdder

(from moviesadder)

<<Interface>>

MoviesContentHandler

<<instantiate>>

DefaultErrorHandler

(from xml)

<<instantiate>>

Page 14: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.SAXMoviesAdder (1)

package es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax;

import javax.xml.parsers.SAXParserFactory;import javax.xml.parsers.SAXParser;import org.xml.sax.XMLReader;import org.xml.sax.SAXException;

import es.udc.fbellas.j2ee.util.xml.DefaultErrorHandler;import es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.

MoviesAdder;import es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.

MoviesAdderException;

public class SAXMoviesAdder implements MoviesAdder {

private int moviesBlockSize;

public void setMoviesBlockSize(int moviesBlockSize) {this.moviesBlockSize = moviesBlockSize;

}

Page 15: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.SAXMoviesAdder (2)

public void addMovies(String xmlDocumentURI) throws MoviesAdderException {

ElementHandlerContext context = new ElementHandlerContext(moviesBlockSize);

try {

/* Get a SAX parser factory. */SAXParserFactory saxParserFactory =

SAXParserFactory.newInstance();

/* Enable validation. */saxParserFactory.setValidating(true);

/* * Create a SAX parser instance and use it to parse the * document. */SAXParser saxParser = saxParserFactory.newSAXParser();XMLReader xmlReader = saxParser.getXMLReader();

xmlReader.setErrorHandler(new DefaultErrorHandler());xmlReader.setContentHandler(new MoviesContentHandler(context));xmlReader.parse(xmlDocumentURI);

Page 16: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.SAXMoviesAdder (y 3)

} catch (SAXException e) {

Exception encapsulatedException = e.getException();

if (encapsulatedException != null) { // InternalErrorException or// model exception

throw new MoviesAdderException(context.getLastInsertedMovieTitle(), encapsulatedException);

} else { // Parsing exceptionthrow new MoviesAdderException(

context.getLastInsertedMovieTitle(), e);}

} catch (Exception e) { // ParserConfigurationException or // IOException

throw new MoviesAdderException(context.getLastInsertedMovieTitle(), e);

}

}

}

Page 17: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Comentarios (1)

javax.xml.parsers.SAXParserFactory

javax.xml.parsers.SAXParser

<<instantiate>>

<<interface>>org.xml.sax.XMLReader

<<instantiate>>

<<interface>>org.xml.sax.ErrorHandler

<<interface>>org.xml.sax.ContentHandler

<<use>> <<use>>

Page 18: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Comentarios (2)

n javax.xml.parsers.SAXParserFactoryn Factoría abstractan El programador obtiene una factoría concreta con el método

estático newInstancen La documentación JavaDoc documenta varias formas de

especificar el nombre de la clase concreta de la factorían Ej.: Definir la propiedad javax.xml.parsers.SAXParserFactory=<nombreClaseConcreta> en el fichero $JAVA_HOME/lib/javax.properties

n Si no se especifica ninguna, por defecto, devuelve una dependiente del sistema

n La factoría concreta no tiene porque ser thread-safen Por tanto, en un entorno multi-thread, cada thread necesita

crear su propia factorían Obsérvese que el código de SAXMoviesAdder es, en

consecuencia, thread-safe

Page 19: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Comentarios (y 3)

n javax.xml.parsers.SAXParserFactory (cont)n Permite configurar determinados aspectos globales de los

parsers que crearán Ej.: saxParserFactory.setValidating(true)

n org.xml.sax.XMLReadern Permite parsear el documento XMLn Antes es preciso establecer gestores de eventos

n Gestor de erroresn Clase que implementa org.xml.sax.ErrorHandler

n Gestor de eventos de contenido (apertura de tag, cierre de tag, etc.)n Clase que implementa org.xml.sax.ContentHandler

Page 20: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

org.xml.sax.ErrorHandler

public interface ErrorHandler {

public void warning(SAXParseException exception) throws SAXException;

public void error(SAXParseException exception) throws SAXException;

public void fatalError(SAXParseException exception) throws SAXException;

}

Page 21: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Comentarios

n org.xml.sax.SAXParseException es una subclase de org.xml.sax.SAXException que contienen Un mensaje descriptivon Información sobre la localización del error

(org.xml.sax.Locator)n Opcionalmente, una excepción encapsulada

n Cada vez que el parsing encuentra un error llama al método correspondiente

n Si el método devuelve SAXParseException, la ejecución del parser terminan XMLReader.parse devuelve la excepción

n Tipos de erroresn Warnings y errores: algo no es conforme al DTDn Errores fatales: el documento no está bien formado

Page 22: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.util.xml.DefaultErrorHandler

public class DefaultErrorHandler implements ErrorHandler {

public void warning(SAXParseException exception) throws SAXException {throw exception;

}

public void error(SAXParseException exception) throws SAXException {throw exception;

}

public void fatalError(SAXParseException exception) throws SAXException {throw exception;

}

}

Page 23: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

org.xml.sax.ContentHandler

public interface ContentHandler {

public void setDocumentLocator(Locator locator);

public void startDocument() throws SAXException;

public void endDocument() throws SAXException;

public void startElement(String namespaceURI, String localName,String qualifiedName, Attributes attributes) throws SAXException;

public void endElement(String namespaceURI, String localName,String qualifiedName) throws SAXException;

public void characters(char[] chars, int start, int length)throws SAXException;

// Otros métodos ...

}

Page 24: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Comentarios

n La transparencia anterior sólo muestra los métodos que más se usan

n startElement y endElement incluyen información sobre espacios de nombresn Nuestros documentos no usan espacios de nombres

n characteresn El parser nos informa del texto de un elemento de tipo #PCDATA

n El parser puede necesitar llamar a este método varias veces para un elemento dado

n Para facilitar la implementación de la interfaz ContentHandlern es.udc.fbellas.j2ee.util.xml.DefaultContentHandler

proporciona una implementación vacía de todos los métodosn Un ContentHandler específico puede extender de

DefaultContentHandler y redefinir los métodos que le interese

Page 25: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Implementación de un ContentHandler

n Implementación directan Los métodos startElement, endElement y characters suelen

tener muchos if para contemplar todos los elementos

n La implementación termina siendo grande y difícil de mantener

n En el ejemplo se ha aplicado el patrón Strategy para procesar los eventosn Se ha definido el interfaz ElementHandler, con operaciones para

los eventos de interés (apetura de tag, cierre de tag, etc.)n Existe un ElementHandler concreto para cada tipo de elemento

(movie, director, actor, etc.)n Todos ElementHandlers necesitan compartir información

n El MovieVO actualn La lista de MovieVOs

n El título de la última película insertada en la BDn Etc.

n Compartirán un mismo ElementHandlerContext

Page 26: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax (1)

SAXMov iesAdde r

- mov iesB lockS ize : i n t

+ SAXMov iesAdder ( )

Mov iesAdder

( f rom moviesadder)

<< In te r face>>

E lementHand le rCon tex t

- loca to r : Loca to r

- last InsertedMovieTi t le : Str ing

- cu r ren tMov ieVO : Mov ieVO

- mov iesB lockS ize : i n t

- cu r ren tL is tOfMov ieVOs : L i s t

- f acade : Mov iesAdmin is t ra t i onFacadeDe lega te

+ E lemen tHand le rCon tex t (mov iesB lockS i ze : i n t )

+ ge tLoca to r ( ) : Loca to r

+ se tLoca to r ( loca to r : Loca to r ) : vo id

+ getLast Inser tedMovieT i t le ( ) : S t r ing

+ ge tCur ren tMov ieVO() : Mov ieVO

+ se tCur ren tMov ieVO(cur ren tMov ieVO : Mov ieVO) : vo id

+ addCurrentMov ieVOToLis t ( ) : vo id

+ f lushL is tOfMov ieVOs() : vo id

< < i n s t a n t i a t e > >

E l e m e n t H a n d l e r

- con tex t : E lemen tHand le rCon tex t

+ E lemen tHand le r ( con tex t : E lemen tHand le rCon tex t )

# ge tCon tex t ( ) : E lemen tHand le rCon tex t

+ s ta r tE lement (a t t r ibu tes : A t t r ibu tes) : vo id

+ endElement ( ) : vo id

+ charac ters(chars : char [ ] , s tar t : in t , length : in t ) : vo id

Mov iesCon ten tHand le r

- e lementHand le rs : Map

- e lemen tLoca lNameForCharac te rs : S t r i ng

- con tex t : E lemen tHand le rCon tex t

+ Mov iesCon ten tHand le r ( con tex t : E lemen tHand le rCon tex t )

< < i n s t a n t i a t e > >

1..n1..n

Defaul tErrorHandler

(from xml)< < i n s t a n t i a t e > >

Page 27: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax (y 2)

E l e m e n t H a n d l e r

A c t o r E l e m e n t H a n d l e r

+ A c t o r E l e m e n t H a n d l e r ( c o n t e x t : E l e m e n t H a n d l e r C o n t e x t )

D i r e c t o r E l e m e n t H a n d l e r

+ D i r e c t o r E l e m e n t H a n d l e r ( c o n t e x t : E l e m e n t H a n d l e r C o n t e x t )

G e n r e E l e m e n t H a n d l e r C o n t e x t

+ G e n r e E l e m e n t H a n d l e r C o n t e x t ( c o n t e x t : E l e m e n t H a n d l e r C o n t e x t )

M o v i e E l e m e n t H a n d l e r

+ M o v i e E l e m e n t H a n d l e r ( c o n t e x t : E l e m e n t H a n d l e r C o n t e x t )

S y n o p s i s E l e m e n t H a n d l e r

+ S y n o p s i s E l e m e n t H a n d l e r ( c o n t e x t : E l e m e n t H a n d l e r C o n t e x t )

Page 28: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MoviesContentHandler (1)

public class MoviesContentHandler extends DefaultContentHandler {

private Map elementHandlers;private String elementLocalNameForCharacters;private ElementHandlerContext context;

public MoviesContentHandler(ElementHandlerContext context) {

this.context = context; elementHandlers = new HashMap();

elementHandlers.put("movies", new ElementHandler(context));elementHandlers.put("movie", new MovieElementHandler(context));elementHandlers.put("director",

new DirectorElementHandler(context));elementHandlers.put("actor", new ActorElementHandler(context));elementHandlers.put("genre", new GenreElementHandler(context));elementHandlers.put("synopsis",

new SynopsisElementHandler(context));

}

Page 29: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MoviesContentHandler (2)

public void setDocumentLocator(Locator locator) { context.setLocator(locator);

}

public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes attributes) throws SAXException {

elementLocalNameForCharacters = localName; getElementHandler(localName).startElement(attributes);

}

public void endElement(String namespaceURI, String localName,String qualifiedName) throws SAXException {

getElementHandler(localName).endElement();

}

Page 30: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MoviesContentHandler (y 3)

public void characters(char[] chars, int start, int length) throws SAXException {

getElementHandler(elementLocalNameForCharacters).characters(chars, start, length);

}

public void endDocument() throws SAXException { context.flushListOfMovieVOs();

}

private ElementHandler getElementHandler(String elementLocalName) {return (ElementHandler) elementHandlers.get(elementLocalName);

}

}

Page 31: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.ElementHandler

public class ElementHandler {

private ElementHandlerContext context;

public ElementHandler(ElementHandlerContext context) {this.context = context;

}

protected ElementHandlerContext getContext() {return context;

}

public void startElement(Attributes attributes) throws SAXException {}

public void endElement() throws SAXException {}

public void characters(char[] chars, int start, int length) throws SAXException {}

}

Page 32: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MovieElementHandler (1)

public class MovieElementHandler extends ElementHandler {

public MovieElementHandler (ElementHandlerContext context) {super(context);

}

public void startElement(Attributes attributes) throws SAXException {

/* Get attribute values. */String title = attributes.getValue("", "title");String runtimeAsString = attributes.getValue("", "runtime");String releaseDayAsString = attributes.getValue("",

"releaseDay");String releaseMonthAsString = attributes.getValue("",

"releaseMonth");String releaseYearAsString = attributes.getValue("",

"releaseYear");

n NOTA: n El primer parámetro de Attributes.getValue es la URI del espacio de nombresn Especificamos “” dado que no usamos espacios de nombres

Page 33: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MovieElementHandler (2)

/* * Convert string values into their true types, and validate if* necessary. ** NOTE: Release date is not fully validaded.*/

int runtime = validateRuntime(runtimeAsString);int releaseDay = Integer.parseInt(releaseDayAsString);int releaseMonth = Integer.parseInt(releaseMonthAsString);int releaseYear = Integer.parseInt(releaseYearAsString);Calendar releaseDate = Calendar.getInstance();releaseDate.set(Calendar.DAY_OF_MONTH, releaseDay);releaseDate.set(Calendar.MONTH,

Calendar.JANUARY + releaseMonth - 1);releaseDate.set(Calendar.YEAR, releaseYear);

Page 34: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MovieElementHandler (3)

/* * Create a MovieVO with the above values and set it as the* current MovieVO.*/

MovieVO movieVO = new MovieVO(new Long(-1), title, runtime,releaseDate, new ArrayList(), new ArrayList(), new ArrayList(), "");

getContext().setCurrentMovieVO(movieVO);

}

public void endElement() throws SAXException {getContext().addCurrentMovieVOToList();

}

Page 35: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.MovieElementHandler (y 4)

private int validateRuntime(String runtime) throws SAXParseException {

try {

int runtimeAsInt = Integer.parseInt(runtime);

if ( runtimeAsInt <= 0) {throw new NumberFormatException();

}

return runtimeAsInt;

} catch (NumberFormatException e) {throw new SAXParseException(

"'runtime' must be an integer > 0",getContext().getLocator());

}

}

}

Page 36: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.DirectorElementHandler

public class DirectorElementHandler extends ElementHandler {

public DirectorElementHandler (ElementHandlerContext context) {super(context);

}

public void startElement(Attributes attributes) throws SAXException {

String name = attributes.getValue("", "name");getContext().getCurrentMovieVO().getDirectorNames().add(name);

}

}

n ActorElementHandler y GenreElementHandler se implementan de forma análoga

Page 37: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.SynopsisElementHandler

public class SynopsisElementHandler extends ElementHandler {

private StringBuffer synopsisBuffer;

public SynopsisElementHandler (ElementHandlerContext context) {super(context);

}

public void startElement(Attributes attributes) throws SAXException { synopsisBuffer = new StringBuffer();

}

public void endElement() throws SAXException {getContext().getCurrentMovieVO().

setSynopsis(synopsisBuffer.toString());}

public void characters(char[] chars, int start, int length) throws SAXException { synopsisBuffer.append(chars, start, length);

}

}

Page 38: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.ElementHandlerContext (1)

public class ElementHandlerContext {

private Locator locator;private String lastInsertedMovieTitle;private MovieVO currentMovieVO;private int moviesBlockSize;private List currentListOfMovieVOs;private MoviesAdministrationFacadeDelegate

moviesAdministrationFacadeDelegate;

public ElementHandlerContext(int moviesBlockSize) { this.moviesBlockSize = moviesBlockSize;currentListOfMovieVOs = new ArrayList();

}

// Varios métodos get/set ...

public void addCurrentMovieVOToList() throws SAXParseException {currentListOfMovieVOs.add(currentMovieVO);if (currentListOfMovieVOs.size() == moviesBlockSize) {

flushListOfMovieVOs(); }

}

Page 39: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

es.udc.fbellas.j2ee.xmltutorial.movies.controller.moviesadder.sax.ElementHandlerContext (y 2)

public void flushListOfMovieVOs() throws SAXParseException {

try {

if (moviesAdministrationFacadeDelegate == null) {moviesAdministrationFacadeDelegate =

new MoviesAdministrationFacadeDelegate();}

moviesAdministrationFacadeDelegate.addMovies(currentListOfMovieVOs);

currentListOfMovieVOs.clear();lastInsertedMovieTitle = currentMovieVO.getTitle();

} catch (InternalErrorException e) { throw new SAXParseException("", locator, e);

}

}

}

Page 40: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Gestión de excepciones (1)

n La única manera de detener el proceso de parsing cuando se detecta un error esn Lanzando SAXParseException, yn Usando un ErrorHandler al estilo de DefaultErrorHandler

n En el ejemplo se ha seguido el siguiente convenion Lanzar SAXParseException sin excepción encapsulada

cuando es un error de parsing que no es posible especificar con el DTD (ej.: runtime no válido)

n Lanzar SAXParseException con mensaje “” cuando hay un problema con la fachada de administración, y con la excepción correspondiente encapsulada

n El parser lanzará SAXParseException si el documento no está bien formado o no es válidon No encapsulada excepción

Page 41: 3.3 Parsers SAX con JAXPfbellas/teaching/is-2001-2002/Tema3Apartado3.3.pdfIntroducción (y 3) n ¿ Qué es JAXP ? (cont) n Define un API para trabajar con parsers SAX, DOM y transformaciones

Gestión de excepciones (y 2)

n Observar la última parte del código de SAXMoviesAddern En caso de problemas, se lanza una excepción MoviesAdderException

n Indica el título de la última película insertada satisfactoriamente (null si no se insertó ninguna)

n Encapsula una excepción, que puede ser:n Instancia directa de SAXException

n Sólo llevará mensaje asociadon Sólo puede ocurrir en el siguiente apartado (DOM)

n SAXParseExceptionn Sólo llevará mensaje asociado e información sobre ubicación

n IOException: error de entrada/salidan Otra excepción (InternalErrorException o una excepción

específica del modelo)

n Echar un vistazo an es.udc.fbellas.j2ee.xmltutorial.movies.shell.AddMovies