1
2
3
4
5
6
7
8
9
10
11 package org.mule.transformers.xml;
12
13 import org.mule.config.i18n.MessageFactory;
14 import org.mule.transformers.AbstractEventAwareTransformer;
15 import org.mule.umo.transformer.TransformerException;
16
17 import com.thoughtworks.xstream.XStream;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicReference;
25
26
27
28
29
30
31 public abstract class AbstractXStreamTransformer extends AbstractEventAwareTransformer
32 {
33 private final AtomicReference
34 private volatile String driverClassName = XStreamFactory.XSTREAM_XPP_DRIVER;
35 private volatile Map aliases = null;
36 private volatile List converters = null;
37
38 public final XStream getXStream() throws TransformerException
39 {
40 XStream instance = (XStream) xstream.get();
41
42 if (instance == null)
43 {
44 try
45 {
46 instance = new XStreamFactory(driverClassName, aliases, converters).getInstance();
47 if (!xstream.compareAndSet(null, instance))
48 {
49 instance = (XStream)xstream.get();
50 }
51 }
52 catch (Exception e)
53 {
54 throw new TransformerException(MessageFactory.createStaticMessage("Unable to initialize XStream"), e);
55 }
56 }
57
58 return instance;
59 }
60
61 public Object clone() throws CloneNotSupportedException
62 {
63 AbstractXStreamTransformer clone = (AbstractXStreamTransformer) super.clone();
64 clone.setDriverClassName(driverClassName);
65
66 if (aliases != null)
67 {
68 clone.setAliases(new HashMap(aliases));
69 }
70
71 if (converters != null)
72 {
73 clone.setConverters(new ArrayList(converters));
74 }
75
76 return clone;
77 }
78
79 public String getDriverClassName()
80 {
81 return driverClassName;
82 }
83
84 public void setDriverClassName(String driverClassName)
85 {
86 this.driverClassName = driverClassName;
87
88 this.xstream.set(null);
89 }
90
91 public Map getAliases()
92 {
93 return aliases;
94 }
95
96 public void setAliases(Map aliases)
97 {
98 this.aliases = aliases;
99
100 this.xstream.set(null);
101 }
102
103 public List getConverters()
104 {
105 return converters;
106 }
107
108 public void setConverters(List converters)
109 {
110 this.converters = converters;
111
112 this.xstream.set(null);
113 }
114
115 protected boolean requiresCurrentEvent()
116 {
117 return false;
118 }
119
120 }