I have created successfully a custom transformer that calls an external program. The
executable is searched relative to the servlet context path.
Its code is something like that (sorry is in spanish):
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Map;
import java.util.Properties;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.transformation.AbstractTransformer;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
import fcc.ima.modelo.Conexion;
import fcc.ima.util.VarsEntorno;
public class TransfListado extends AbstractTransformer {
public TransfListado() {
fabrica = (SAXTransformerFactory)TransformerFactory.newInstance();
formato.put(OutputKeys.METHOD, "xml");
formato.put(OutputKeys.ENCODING, "ISO-8859-1");
}
/**Averigua la ubicación de listado4
* @see
org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver,
java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters) */
public void setup(SourceResolver resolver, Map objectModel, String src,
Parameters par)
throws ProcessingException, SAXException, IOException
{
if (comando == null) {
File rutaBase = new
File(ObjectModelHelper.getContext(objectModel).getRealPath("informe/mostrar"));
// Si es Windows, anadimos extension .exe
comando = new File(rutaBase, "myexcecutable.exe")).toString();
}
}
/**Prepara para enviar datos a listado4*/
protected void setOutputStream(OutputStream out) throws IOException,
SAXException, TransformerConfigurationException {
handler = fabrica.newTransformerHandler();
handler.getTransformer().setOutputProperties(formato);
handler.setResult(new StreamResult(out));
setContentHandler(handler);
setLexicalHandler(handler);
}
/**Arranca el proceso y le envía todos los eventos SAX
* @see org.xml.sax.ContentHandler#startDocument() */
public void startDocument() throws SAXException {
try {
getLogger().debug("Arrancando listado4");
Map vars = VarsEntorno.getVars();
// Asegurarnos de q se usa el servidor de base de datos
adecuado
vars.put("INFORMIXSERVER", Conexion.instancia().getServidor());
proceso = Runtime.getRuntime().exec(comando,
VarsEntorno.getArray(vars));
setOutputStream(proceso.getOutputStream());
} catch (Exception e) {
throw new SAXException(e);
}
super.startDocument();
}
/**Después de haber enviado toda la información a listado4,
* se lee su salida estándar y se analiza con un [EMAIL PROTECTED] XMLReader}
* convencional para generar nuevos eventos SAX*/
public void endDocument() throws SAXException {
super.endDocument();
try {
// Analizo la salida de listado4
getLogger().debug("Leyendo resultado de listado4");
// Para q listado4 se entere de q no hay + datos
proceso.getOutputStream().close();
XMLReader analizador = XMLReaderFactory.createXMLReader();
analizador.setContentHandler(xmlConsumer);
analizador.parse(new InputSource(proceso.getInputStream()));
/*try {
proceso.waitFor();
} catch (InterruptedException e) {
getLogger().warn("esperando listado4", e);
}
int codigo = proceso.exitValue();
if (codigo != 0) {
String msj = "listado4 ha devuelto el código de error
"+codigo;
getLogger().error(msj);
throw new SAXException(msj);
}*/
getLogger().debug("listado4 terminado con éxito");
} catch (IOException ex) {
throw new SAXException(ex);
} finally {
proceso = null;
}
}
/**Comando a ejecutar*/
static protected String comando;
protected TransformerHandler handler;
protected SAXTransformerFactory fabrica;
/**Formato de entrada*/
protected Properties formato = new Properties();
protected Process proceso;
}
--------
David
-----Mensaje original-----
De: Jan Wielgus [mailto:[EMAIL PROTECTED]
Enviado el: martes, 13 de enero de 2004 18:12
Para: [EMAIL PROTECTED]
Asunto: Running external programs
Hello,
I have such an approach:
I use cocoon to manage documents in xml-format which are stored in a
database. A document can be converted to LaTeX-code and here begins
my problem. So, I get the proper LaTeX-code generated and I would
like to transform it to the PDF on the server side. So, I just want
to convert it using pdflatex. So the question is, how should i do
it? With CGI? I want to get a generated PDF document and download
it. Does anybody know, how could I do it?
Jan
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]