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 final ThreadLocal payloadContext = new ThreadLocal();
31 private final ThreadLocal propertiesContext = new ThreadLocal();
32
33
34
35
36
37
38
39
40 protected void initialise(UMOMessage message)
41 {
42 super.initialise(message);
43
44 if (message.getPayload() instanceof List)
45 {
46
47 List payload = new LinkedList((List) message.getPayload());
48 payloadContext.set(payload);
49
50 if (enableCorrelation != ENABLE_CORRELATION_NEVER)
51 {
52
53
54
55 final int groupSize = payload.size();
56 message.setCorrelationGroupSize(groupSize);
57 if (logger.isDebugEnabled())
58 {
59 logger.debug("java.util.List payload detected, setting correlation group size to "
60 + groupSize);
61 }
62 }
63 }
64 else
65 {
66 throw new IllegalArgumentException("The payload for this router must be of type java.util.List");
67 }
68
69
70
71 Map props = new HashMap();
72 for (Iterator iterator = message.getPropertyNames().iterator(); iterator.hasNext();)
73 {
74 String propertyKey = (String) iterator.next();
75 props.put(propertyKey, message.getProperty(propertyKey));
76 }
77
78 propertiesContext.set(props);
79 }
80
81
82 protected void cleanup()
83 {
84 payloadContext.set(null);
85 propertiesContext.set(null);
86 super.cleanup();
87 }
88
89
90
91
92 protected UMOMessage getMessagePart(UMOMessage message, UMOEndpoint endpoint)
93 {
94 List payloads = (List) payloadContext.get();
95
96 for (Iterator i = payloads.iterator(); i.hasNext();)
97 {
98 Object payload = i.next();
99 UMOMessage result = new MuleMessage(payload, (Map) propertiesContext.get());
100
101
102
103 if (endpoint.getFilter() == null || endpoint.getFilter().accept(result))
104 {
105 if (logger.isDebugEnabled())
106 {
107 logger.debug("Endpoint filter matched. Routing message over: "
108 + endpoint.getEndpointURI().toString());
109 }
110 i.remove();
111 return result;
112 }
113 }
114
115 return null;
116 }
117 }