Tabla de Contenidos

Componente Media con Streamed Content

En esta guía técnica vamos a explicar como utilizar el componente <p:media> 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:

	<web:context-filter name="primefacesResources" regex-url-pattern="/javax\.faces\.resource/dynamiccontent\.properties\.seam(;/.*\.pdf)?" />

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 conversaciones temporales y el bean de respaldo tiene ambito Event o Page.

Veamos la configuración del componente en la página XHTML.

    <p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" 
    	     width="100%" height="300px">Your browser can't display pdf.</p:media>

El componente <p:media> 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 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:

Para terminar con el método obtenerDocumento(), guardamos el objeto StreamedContent dentro del componente GlobalDocumentStore. Un almacen de documentos de ambito sesión, que funciona de la siguiente manera:

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 conversación, por lo que todos los documentos son destruidos al eliminarse la conversación,a diferencia del GlobalDocumentStore.

Veamos la configuración del componente en la página XHTML.

    <p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" 
    	     width="100%" height="300px">Your browser can't display pdf.
        <s:conversationId />
    </p:media>

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 la primera.

Conversacion de largo recorrido y Bean de Respaldo con Ambito Conversacion

En este caso utilizamos una estrategia similar a la segunda o la siguiente:

Veamos la configuración del componente en la página XHTML.

    <p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" 
    	     width="100%" height="300px">Your browser can't display pdf.
        <s:conversationId />
    </p:media>

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.

    <p:media value="#{primeFacesMediaBean.document}" cache="false" player="pdf" 
    	     width="100%" height="300px">Your browser can't display pdf.
    </p:media>

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 ;
	}
 
}

JUAN MIGUEL BERNAL GONZALEZ 14/02/2019 08:47