1
2
3
4
5
6
7
8
9
10 package org.mule.module.atom.transformers;
11
12 import org.mule.api.MuleEvent;
13 import org.mule.api.MuleMessage;
14 import org.mule.api.transformer.DataType;
15 import org.mule.api.transformer.TransformerException;
16 import org.mule.api.transport.OutputHandler;
17 import org.mule.config.i18n.CoreMessages;
18 import org.mule.expression.transformers.AbstractExpressionTransformer;
19 import org.mule.expression.transformers.ExpressionArgument;
20 import org.mule.transformer.types.DataTypeFactory;
21 import org.mule.util.StringUtils;
22
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.OutputStream;
26 import java.util.Date;
27
28 import javax.activation.DataHandler;
29
30 import org.apache.abdera.Abdera;
31 import org.apache.abdera.factory.Factory;
32 import org.apache.abdera.model.Category;
33 import org.apache.abdera.model.Element;
34 import org.apache.abdera.model.Entry;
35 import org.apache.abdera.model.Link;
36 import org.apache.abdera.model.Person;
37 import org.apache.abdera.parser.stax.FOMWriterOptions;
38
39 public class AtomEntryBuilderTransformer extends AbstractExpressionTransformer
40 {
41 private static final DataType<Entry> TYPE_ENTRY = DataTypeFactory.create(Entry.class);
42 private static final DataType<OutputHandler> TYPE_OUTPUT_HANDLER = DataTypeFactory.create(OutputHandler.class);
43
44 public AtomEntryBuilderTransformer()
45 {
46 setReturnDataType(TYPE_OUTPUT_HANDLER);
47 }
48
49 @Override
50 public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException
51 {
52 Factory factory = Abdera.getInstance().getFactory();
53 Entry entry = factory.newEntry();
54
55 for (ExpressionArgument arg: arguments)
56 {
57 if (arg.getName().equals("title"))
58 {
59 entry.setTitle(StringUtils.trimToEmpty((String) arg.evaluate(message)));
60 }
61 else if (arg.getName().equals("id"))
62 {
63 entry.setId(StringUtils.trimToEmpty((String) arg.evaluate(message)));
64 }
65 else if (arg.getName().equals("summary"))
66 {
67 entry.setSummary(StringUtils.trimToEmpty((String) arg.evaluate(message)));
68 }
69 else if (arg.getName().equals("content"))
70 {
71 Object content = arg.evaluate(message);
72 if (content instanceof DataHandler)
73 {
74 entry.setContent((DataHandler) content);
75 }
76 if (content instanceof Element)
77 {
78 entry.setContent((Element) content);
79 }
80 if (content instanceof String)
81 {
82 entry.setContent((String) content);
83 }
84 if (content instanceof InputStream)
85 {
86 entry.setContent((InputStream) content);
87 }
88 }
89 else if (arg.getName().equals("updated"))
90 {
91 Object date = arg.evaluate(message);
92 if (date instanceof Date)
93 {
94 entry.setUpdated((Date) date);
95 }
96 else
97 {
98 entry.setUpdated(date.toString());
99 }
100 }
101 else if (arg.getName().equals("edited"))
102 {
103 Object date = arg.evaluate(message);
104 if (date instanceof Date)
105 {
106 entry.setEdited((Date) date);
107 }
108 else
109 {
110 entry.setEdited(date.toString());
111 }
112 }
113 else if (arg.getName().equals("published"))
114 {
115 Object date = arg.evaluate(message);
116 if (date instanceof Date)
117 {
118 entry.setPublished((Date) date);
119 }
120 else
121 {
122 entry.setPublished(date.toString());
123 }
124 }
125 else if (arg.getName().equals("rights"))
126 {
127 entry.setRights((String) arg.evaluate(message));
128 }
129 else if (arg.getName().equals("draft"))
130 {
131 entry.setDraft((Boolean) arg.evaluate(message));
132 }
133 else if (arg.getName().equals("author"))
134 {
135 Object author = arg.evaluate(message);
136 if (author instanceof Person)
137 {
138 entry.addAuthor((Person) author);
139 }
140 else
141 {
142 entry.addAuthor(author.toString());
143 }
144 }
145 else if (arg.getName().equals("category"))
146 {
147 Object category = arg.evaluate(message);
148 if (category instanceof Category)
149 {
150 entry.addCategory((Category) category);
151 }
152 else
153 {
154 entry.addCategory(category.toString());
155 }
156 }
157 else if (arg.getName().equals("contributor"))
158 {
159 Object author = arg.evaluate(message);
160 if (author instanceof Person)
161 {
162 entry.addContributor((Person) author);
163 }
164 else
165 {
166 entry.addContributor(author.toString());
167 }
168 }
169 else if (arg.getName().equals("link"))
170 {
171 Object link = arg.evaluate(message);
172 if (link instanceof Link)
173 {
174 entry.addLink((Link) link);
175 }
176 else
177 {
178 entry.addLink(link.toString());
179 }
180 }
181 else
182 {
183 throw new TransformerException(CoreMessages.propertyHasInvalidValue("entry-property.name", arg.getName()), this);
184 }
185
186 }
187
188 if (TYPE_ENTRY.equals(getReturnDataType()))
189 {
190 return entry;
191 }
192 else if (TYPE_OUTPUT_HANDLER.equals(getReturnDataType()))
193 {
194 final Entry e = entry;
195 return new OutputHandler()
196 {
197 public void write(MuleEvent event, OutputStream out) throws IOException
198 {
199 FOMWriterOptions opts = new FOMWriterOptions();
200 opts.setCharset(event.getEncoding());
201 e.writeTo(out, opts);
202 }
203 };
204 }
205 else
206 {
207 return entry.toString();
208 }
209 }
210 }