Utilización de solucionadores en un contexto J2EE

Cuando se cargan artefactos en un contexto Java™ 2 Platform, Enterprise Edition (J2EE), debería tener en cuenta las implicaciones especiales que se aplican cuando se cargan recursos de artefactos de despliegue local.

Acerca de esta tarea

La carga de recursos locales, a través de Class.getResource y Class.getResourceAsStream procedentes de artefactos de despliegue J2EE como, por ejemplo, los EAR, WAR y los archivos JAR de biblioteca, puede conllevar problemas a la hora de cargar los artefactos XML relacionados. La carga de un recurso local inicial utilizando estos mecanismos resultará satisfactoria pero los artefactos cargados a partir del recurso inicial normalmente fallarán al cargarse sin ninguna consideración específica.

He aquí un ejemplo de la carga de documentos en el tiempo de ejecución desde una hoja de estilo utilizando la función fn:doc de XPath. En este caso, el comportamiento predeterminado es resolver documentos basados en el URI base del contexto estático.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
		<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  
		<xsl:variable name="names" select="doc('names.xml')"/>
	
		<xsl:template name="loadnames">
				<xsl:copy-of select="$names"/>
	</xsl:template>
	
</xsl:stylesheet>
Si se carga con el código Java siguiente en un entorno J2EE:
// create the factory
XFactory factory = XFactory.newInstance();

// load the XSLT file from a local resource within a J2EE deployment artifact
StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));

// Create an XSL transform executable
XSLTExecutable xslTransform = factory.prepareXSLT(source);
        
// Create the result
Result result = new StreamResult(new ByteArrayOutputStream());
        
// Create a dynamic context specifying the XSLT initial template
XDynamicContext dc = factory.newDynamicContext();
dc.setXSLTInitialTemplate(new QName("loadnames"));
        
// Execute the transformation
xslTransform.execute(dc, result);
recibirá el error siguiente:
IXJXE0364W: FATAL ERROR:  IXJXE0774E: [ERR 0693][ERR FODC0005] 
La serie 'names.xml' del URI no se correlaciona con ningún documento disponible.

El motivo de este error es que al cargar el artefacto XML inicial (doc.xsl), no se ha establecido un contenido estático para el URI base. En este caso, el procesador se replegará para buscar en el directorio de trabajo actual, lo que no tiene ningún sentido en un entorno J2EE.

Hay tres posibles formas de corregir esta situación. Estas son las dos primeras:
  • Establecer el URI base en el contexto estático.
    Si se realiza un ajuste para establecer el URI base en un contexto estático, el resultado sería similar al del ejemplo siguiente:
    // create the factory
    XFactory factory = XFactory.newInstance();
            
    // set the baseURI in the static context
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    XStaticContext staticContext = factory.newStaticContext();
    staticContext.setBaseURI(dataURL.toString());
    
    // load the XSLT file from a local resource within a J2EE deployment artifact        
    StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));
    
    // Create an XSL transform executable
    XSLTExecutable xslTransform = factory.prepareXSLT(source, staticContext);
            
    // Create the result
    Result result = new StreamResult(new ByteArrayOutputStream());
    
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
  • Cargar el recurso de un forma que permita que el procesador conozca el URI base.
    Si se realiza un ajuste para cargar el recurso de forma que permita al procesador conocer el URI base pasando el URL absoluto al constructor StreamSource, el resultado sería similar al del ejemplo siguiente:
    // Create the factory
    XFactory factory = XFactory.newInstance();
            
    // Create the source from a URL
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    StreamSource source = new StreamSource(dataURL.toString());
    
    // Create an XSL transform executable for the expression
    XSLTExecutable xslTransform = factory.prepareXSLT(source);
            
    // Create the result
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
            
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
Estos dos enfoques descritos funcionarán bien cuando todos los artefactos XML estén en una sola unidad de despliegue J2EE, pero fallarán si los artefactos XML se dividen en unidades de despliegue J2EE porque no hay un solo URI base para todos los artefactos XML.

Para control completamente la carga de artefactos XML para que den soporte a casos en que los artefactos se hayan dispersado en diversas unidades de despliegue, utilice los solucionadores para controlar completamente el comportamiento de carga.

Procedimiento

Implementación de los solucionadores correspondientes y registro de los mismos en el contexto estático o dinámico adecuado.

Estas recomendaciones de carga de artefactos XML se aplican en un contexto J2EE para todos los artefactos que reciben soporte de los solucionadores como, por ejemplo, los documentos XML (fn:doc(), document()), las hojas de estilo (xsl:include, xsl:import), el texto sin analizar y los esquemas XML (esquema de importación XSLT).


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_resolvers_j2ee
File name: txml_resolvers_j2ee.html