001: /*
002: * $Id: AbstractXStreamTransformer.java 11236 2008-03-06 23:48:23Z tcarlson $
003: * --------------------------------------------------------------------------------------
004: * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
005: *
006: * The software in this package is published under the terms of the CPAL v1.0
007: * license, a copy of which has been included with this distribution in the
008: * LICENSE.txt file.
009: */
010:
011: package org.mule.module.xml.transformer;
012:
013: import org.mule.api.transformer.TransformerException;
014: import org.mule.config.i18n.MessageFactory;
015: import org.mule.transformer.AbstractMessageAwareTransformer;
016:
017: import com.thoughtworks.xstream.XStream;
018:
019: import java.util.ArrayList;
020: import java.util.HashMap;
021: import java.util.List;
022: import java.util.Map;
023:
024: import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicReference;
025:
026: /**
027: * <code>AbstractXStreamTransformer</code> is a base class for all XStream based
028: * transformers. It takes care of creating and configuring the XStream parser.
029: */
030:
031: public abstract class AbstractXStreamTransformer extends
032: AbstractMessageAwareTransformer {
033: private final AtomicReference/* XStream */xstream = new AtomicReference();
034: private volatile String driverClassName = XStreamFactory.XSTREAM_XPP_DRIVER;
035: private volatile Map aliases = null;
036: private volatile List converters = null;
037:
038: public final XStream getXStream() throws TransformerException {
039: XStream instance = (XStream) xstream.get();
040:
041: if (instance == null) {
042: try {
043: instance = new XStreamFactory(driverClassName, aliases,
044: converters).getInstance();
045: if (!xstream.compareAndSet(null, instance)) {
046: instance = (XStream) xstream.get();
047: }
048: } catch (Exception e) {
049: throw new TransformerException(
050: MessageFactory
051: .createStaticMessage("Unable to initialize XStream"),
052: e);
053: }
054: }
055:
056: return instance;
057: }
058:
059: public Object clone() throws CloneNotSupportedException {
060: AbstractXStreamTransformer clone = (AbstractXStreamTransformer) super
061: .clone();
062: clone.setDriverClassName(driverClassName);
063:
064: if (aliases != null) {
065: clone.setAliases(new HashMap(aliases));
066: }
067:
068: if (converters != null) {
069: clone.setConverters(new ArrayList(converters));
070: }
071:
072: return clone;
073: }
074:
075: public String getDriverClassName() {
076: return driverClassName;
077: }
078:
079: public void setDriverClassName(String driverClassName) {
080: this .driverClassName = driverClassName;
081: // force XStream instance update
082: this .xstream.set(null);
083: }
084:
085: public Map getAliases() {
086: return aliases;
087: }
088:
089: public void setAliases(Map aliases) {
090: this .aliases = aliases;
091: // force XStream instance update
092: this .xstream.set(null);
093: }
094:
095: public List getConverters() {
096: return converters;
097: }
098:
099: public void setConverters(List converters) {
100: this .converters = converters;
101: // force XStream instance update
102: this .xstream.set(null);
103: }
104:
105: protected boolean requiresCurrentEvent() {
106: return false;
107: }
108:
109: }
|