====== Componente Media con Streamed Content ====== En esta guía técnica vamos a explicar como utilizar el componente [[https://www.primefaces.org/showcase/ui/multimedia/media.xhtml| de Primefaces]] que obtiene los valores a mostrar mediante contenido en Stream de datos. Tenemos que tener encuenta varios escenarios, que tienen que ver con el ambito del componente que procesas las peticiones. Pero lo primero que tenemos que verificar la configuración en el fichero //components.xml// de la declaración del //context-filter primefacesResources//. La configuración correcta es: ===== Conversacion Temporal y Bean de Respaldo con Ambito Event o Page ===== En este caso estamos en el escenario, en el cual, las peticiones se hacen en [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/conversations.html|conversaciones temporales]] y el bean de respaldo tiene ambito [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/concepts.html#d0e3533|Event]] o [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/concepts.html#d0e3540|Page]]. Veamos la configuración del componente en la página //XHTML//. Your browser can't display pdf. El componente //// esta obteniendo el documento menidante la propiedad //document// del componente //primeFacesMediaBean//. Indicamos que el //player// es el que procesa documentos PDFs. Lo importante es el manejo de los contenidos en //stream// y no el tipo de contenido en sí. Veamos el código del bean de respaldo: package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.ResourceLoader; import org.jboss.seam.document.DocumentData.DocumentType; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; import es.um.atica.seam.document.GlobalDocumentStore; @Name( "primeFacesMediaBean" ) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_documento.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); GlobalDocumentStore.instance().saveData( DOCUMENT_NAME, new FundeWebDocumentData( "mi_documento", new DocumentType("pdf", DOCUMENT_MIMETYPE), document, false ) ); } public StreamedContent getDocument() { return (StreamedContent) ( (FundeWebDocumentData) GlobalDocumentStore.instance().getDocumentData( DOCUMENT_NAME ) ).getData(); } } En este caso, el componente tiene ámbito [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/concepts.html#d0e3533|Event]] y tenemos el método //obtenerDocumento()// que obtiene el documento que esta dentro de la carpeta //WEB-INF// del módulo Web. La forma de obtener el docuemnto o medio, es indiferente. En este método creamos una instancia de la clase //DefaultStreamedContent// que implementa la interface //StreamedContent//, todas de la líbrería PrimeFaces. Hay tres clases que implementan dicha interface, que son: * //ByteArrayContent//: donde el contenido es un objeto //byte[]//. * //DefaultStreamedContent//: donde el contenido es una instancia de una clase que implementa la interface //InputStream//. * //LazyDefaultStreamedContent//: clase abstracta, donde el contenido es una instancia de una clase que implementa la interface //InputStream//. Pero que se puede iniciar de forma //lazy//. Hay que definir el método //initializeStream()//. Para terminar con el método //obtenerDocumento()//, guardamos el objeto //StreamedContent// dentro del componente [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-seam-components/es/um/atica/seam/document/GlobalDocumentStore.html|GlobalDocumentStore]]. Un almacen de documentos de ambito sesión, que funciona de la siguiente manera: * Los documentos almacenados se borran automaticamente a los 60 segundos, aunque se puede especificar el tiempo de espurgo mendiante la propiedad //keepAlive//, al almacenar el documento. * Por defecto, cuando se recupera el documento del almacen, este se borra. Se puede modificar este comportamiento con la propiedad //removeAfterRetrieve// de la clse //FundeWebDocumentData//, por defecto su valor es //true//, por eso en el ejemplo pasamos el valor //false//, en el último parámetro del constructor. ===== Conversacion de Largo Recorrido y Bean de Respaldo con Ambito Event o Page ===== En este escenario podemos utilizar la estrategia anterior u otra diferente, donde almacenamos los documentos en [[http://docs.jboss.org/seam/2.3.1.Final/api/org/jboss/seam/document/DocumentStore.html\DocumenStore]]. Este es un almacen de documentos de ámbito [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/conversations.html|conversación]], por lo que todos los documentos son destruidos al eliminarse la conversación,a diferencia del [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-seam-components/es/um/atica/seam/document/GlobalDocumentStore.html|GlobalDocumentStore]]. Veamos la configuración del componente en la página //XHTML//. Your browser can't display pdf. Veamos el código del bean de respaldo: package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.core.ResourceLoader; import org.jboss.seam.document.DocumentData.DocumentType; import org.jboss.seam.document.DocumentStore; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); DocumentStore.instance().saveData( DOCUMENT_NAME, new FundeWebDocumentData( "mi_docuemnto", new DocumentType("pdf", DOCUMENT_MIMETYPE), document) ); } public StreamedContent getDocumento() { return (StreamedContent) ( (FundeWebDocumentData) DocumentStore.instance().getDocumentData( DOCUMENT_NAME ) ).getData(); } } ===== Conversacion temporal y Bean de Respaldo con Ambito Conversacion ===== En este caso utilizamos una estrategia similar a [[:fdw2.0:fundeweb2.0:gt:componente_media_streamedcontent#conversacion_temporal_y_bean_de_respaldo_con_ambito_event_o_page|la primera]]. ===== Conversacion de largo recorrido y Bean de Respaldo con Ambito Conversacion ===== En este caso utilizamos una estrategia similar a [[:fdw2.0:fundeweb2.0:gt:componente_media_streamedcontent#conversacion_de_largo_recorrido_y_bean_de_respaldo_con_ambito_event_o_page|la segunda]] o la siguiente: Veamos la configuración del componente en la página XHTML. Your browser can't display pdf. Veamos el código del bean de respaldo: package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.core.ResourceLoader; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) @Scope(ScopeType.CONVERSATION) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); } public StreamedContent getDocumento() { return document ; } } ===== Bean de Respaldo con Ambito Sesión o Aplicación ===== Veamos la configuración del componente en la página XHTML. Your browser can't display pdf. Veamos el código del bean de respaldo: package es.um.atica.portalfundeweb.backbeans; import org.jboss.seam.ScopeType; import org.jboss.seam.annotations.Create; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.jboss.seam.core.ResourceLoader; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; import es.um.atica.seam.document.FundeWebDocumentData; @Name( "primeFacesMediaBean" ) @Scope(ScopeType.SESSION) public class PrimeFacesMediaBean { private static final String DOCUMENT_NAME = "mi_docuemnto.pdf"; private static final String DOCUMENT_MIMETYPE = "application/pdf"; private StreamedContent document; public void obtenerDocumento() { document = new DefaultStreamedContent(ResourceLoader.instance().getResourceAsStream( "WEB-INF/" + DOCUMENT_NAME ), DOCUMENT_MIMETYPE, DOCUMENT_NAME); } public StreamedContent getDocumento() { return document ; } } ---- --- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 14/02/2019 08:47//