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

/*
 * 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();
	}
	
	
	
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to