Return-Path: Delivered-To: apmail-cocoon-users-archive@www.apache.org Received: (qmail 71792 invoked from network); 21 Sep 2006 17:27:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 21 Sep 2006 17:27:10 -0000 Received: (qmail 5216 invoked by uid 500); 21 Sep 2006 17:27:06 -0000 Delivered-To: apmail-cocoon-users-archive@cocoon.apache.org Received: (qmail 5173 invoked by uid 500); 21 Sep 2006 17:27:06 -0000 Mailing-List: contact users-help@cocoon.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: users@cocoon.apache.org List-Id: Delivered-To: mailing list users@cocoon.apache.org Received: (qmail 5162 invoked by uid 99); 21 Sep 2006 17:27:06 -0000 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: neutral (hermes.apache.org: local policy) Received: from [193.252.22.20] (HELO smtp-msa-out12.orange.fr) (193.252.22.20) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 21 Sep 2006 10:27:06 -0700 Received: from [192.168.1.4] (AMontpellier-251-1-20-37.w81-251.abo.wanadoo.fr [81.251.82.37]) by mwinf1208.orange.fr (SMTP Server) with ESMTP id 91E0F1C00044 for ; Thu, 21 Sep 2006 19:26:43 +0200 (CEST) X-ME-UUID: 20060921172643597.91E0F1C00044@mwinf1208.orange.fr Message-ID: <4512CBFD.2010200@orcades.net> Date: Thu, 21 Sep 2006 19:29:33 +0200 From: Olivier User-Agent: Thunderbird 1.5.0.5 (X11/20060719) MIME-Version: 1.0 To: users@cocoon.apache.org Subject: Re: Free for use: SaveFilesTransformer References: <6DD7194CCE91BB44A41318EA7D06151070E007@pegasus.olympus.borgus.nl> In-Reply-To: <6DD7194CCE91BB44A41318EA7D06151070E007@pegasus.olympus.borgus.nl> Content-Type: multipart/mixed; boundary="------------070300050906070604020005" X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N --------------070300050906070604020005 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Geert Josten wrote: >> Really an intersting idea. But I'd not begin the transaction >> in setup(). >> What about startDocument()? >> > > And the rollback() at endDocument() as well (if necessary :). Though I > guess I would like to manage the transactions independantly altogether. > In actions fired with separate urls perhaps? > > ;-) > > Hum ... In fact the transaction id is the file url. IMHO endDocument is not called if an exeption occure in pipeline. See the transformer in attachment. Comment are very welcome ... --------------070300050906070604020005 Content-Type: text/x-java; name="TransactionalFileWriterTransformer.java" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="TransactionalFileWriterTransformer.java" /* * Created on 3 sept. 2005 * */ package net.orcades.cocoon.transformation; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; import net.orcades.cocoon.InvalidResourceException; import net.orcades.cocoon.transaction.FileManagerPool; import net.orcades.cocoon.transaction.ResourceManagerProcessingException; import org.apache.avalon.framework.parameters.ParameterException; import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; import org.apache.cocoon.environment.SourceResolver; import org.apache.cocoon.transformation.AbstractSAXTransformer; import org.apache.commons.transaction.file.FileResourceManager; import org.apache.commons.transaction.file.ResourceManagerException; import org.apache.excalibur.source.Source; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; import org.xml.sax.Attributes; import org.xml.sax.SAXException; /** * @author olivier nouguier * */ public class TransactionalFileWriterTransformer extends AbstractSAXTransformer { /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#configure(org.apache.avalon.framework.configuration.Configuration) */ private FileResourceManager fileManager; private XMLSerializer serializer; private Object txId; /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#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 { super.setup(resolver, objectModel, src, par); try { Source source = null; try { source = resolver.resolveURI(par.getParameter("dest-dir")); String destDir = new URI(source.getURI()).getPath(); fileManager = FileManagerPool.getInstance().getFileResourceManager(destDir, getLogger(), par.getParameterAsBoolean("debug-fine", true)); if(par.getParameterAsBoolean("reset", false)){ fileManager.recover(); } if(fileManager.resourceExists(src)){ File file = new File(fileManager.getStoreDir() + File.separator + src); if(file.isDirectory()){ fileManager=null; txId=null; throw new InvalidResourceException("IS_A_DIRECTORY"); } } fileManager.startTransaction(src); txId = src; OutputStream outputStream = fileManager.writeResource(txId, src); serializer = new XMLSerializer(); OutputFormat outputFormat = new OutputFormat(); outputFormat.setMethod(par.getParameter("method", "xml")); outputFormat.setEncoding(par.getParameter("encoding", "ISO-8859-1")); outputFormat.setIndent(par.getParameterAsInteger("indenting", 1)); serializer.setOutputFormat(outputFormat); serializer.setOutputByteStream(outputStream); } finally { if(source!=null) resolver.release(source); } } catch (ParameterException e) { throw new ProcessingException(e); } catch (ResourceManagerException e) { throw new ResourceManagerProcessingException(src, e); } catch (MalformedURLException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#startDocument() */ public void startDocument() throws SAXException { super.startDocument(); serializer.startDocument(); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String uri, String name, String raw, Attributes attr) throws SAXException { super.startElement(uri, name, raw, attr); serializer.startElement(uri, name, raw, attr); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#startCDATA() */ public void startCDATA() throws SAXException { super.startCDATA(); serializer.startCDATA(); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#characters(char[], * int, int) */ public void characters(char[] buff, int start, int length) throws SAXException { super.characters(buff, start, length); serializer.characters(buff, start, length); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#endCDATA() */ public void endCDATA() throws SAXException { super.endCDATA(); serializer.endCDATA(); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#endElement(java.lang.String, * java.lang.String, java.lang.String) */ public void endElement(String uri, String name, String raw) throws SAXException { super.endElement(uri, name, raw); serializer.endElement(uri, name, raw); } /* * (non-Javadoc) * * @see org.apache.cocoon.transformation.AbstractSAXTransformer#endDocument() */ public void endDocument() throws SAXException { super.endDocument(); serializer.endDocument(); try { fileManager.commitTransaction(txId); fileManager = null; txId = null; } catch (ResourceManagerException e) { throw new SAXException(e); } } public void recycle() { serializer = null; if (fileManager != null) { Object sadTxId = txId; FileResourceManager sadFileManager = fileManager; txId = null; fileManager = null; if(sadTxId!=null) try { sadFileManager.rollbackTransaction(sadTxId); } catch (ResourceManagerException e) { e.printStackTrace(); } } super.recycle(); } } --------------070300050906070604020005 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscribe@cocoon.apache.org For additional commands, e-mail: users-help@cocoon.apache.org --------------070300050906070604020005--