1
2
3
4
5
6
7
8
9
10
11 package org.mule.routing.outbound;
12
13 import org.mule.impl.MuleMessage;
14 import org.mule.umo.UMOMessage;
15 import org.mule.umo.endpoint.UMOEndpoint;
16
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.LinkedList;
20 import java.util.List;
21 import java.util.Map;
22
23
24
25
26
27
28 public class FilteringListMessageSplitter extends AbstractMessageSplitter
29 {
30 private static final ThreadLocal payloadContext = new ThreadLocal();
31 private static final ThreadLocal propertiesContext = new ThreadLocal();
32
33
34
35
36
37
38
39
40 protected void initialise(UMOMessage message)
41 {
42 if (message.getPayload() instanceof List)
43 {
44
45 List payload = new LinkedList((List) message.getPayload());
46 payloadContext.set(payload);
47
48 if (enableCorrelation != ENABLE_CORRELATION_NEVER)
49 {
50
51
52
53 final int groupSize = payload.size();
54 message.setCorrelationGroupSize(groupSize);
55 if (logger.isDebugEnabled())
56 {
57 logger.debug("java.util.List payload detected, setting correlation group size to "
58 + groupSize);
59 }
60 }
61 }
62 else
63 {
64 throw new IllegalArgumentException("The payload for this router must be of type java.util.List");
65 }
66
67
68
69 Map props = new HashMap();
70 for (Iterator iterator = message.getPropertyNames().iterator(); iterator.hasNext();)
71 {
72 String propertyKey = (String) iterator.next();
73 props.put(propertyKey, message.getProperty(propertyKey));
74 }
75 propertiesContext.set(props);
76 }
77
78
79
80
81 protected UMOMessage getMessagePart(UMOMessage message, UMOEndpoint endpoint)
82 {
83 List payloads = (List) payloadContext.get();
84
85 for (Iterator i = payloads.iterator(); i.hasNext();)
86 {
87 Object payload = i.next();
88 UMOMessage result = new MuleMessage(payload, (Map) propertiesContext.get());
89
90
91
92 if (endpoint.getFilter() == null || endpoint.getFilter().accept(result))
93 {
94 if (logger.isDebugEnabled())
95 {
96 logger.debug("Endpoint filter matched. Routing message over: "
97 + endpoint.getEndpointURI().toString());
98 }
99 i.remove();
100 return result;
101 }
102 }
103
104 return null;
105 }
106 }