1
2
3
4
5
6
7
8
9
10
11 package org.mule.processor.chain;
12
13 import org.mule.api.MuleException;
14 import org.mule.api.construct.FlowConstruct;
15 import org.mule.api.processor.InterceptingMessageProcessor;
16 import org.mule.api.processor.MessageProcessor;
17 import org.mule.api.processor.MessageProcessorBuilder;
18 import org.mule.api.processor.MessageProcessorChain;
19
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.LinkedList;
23 import java.util.List;
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public class DefaultMessageProcessorChainBuilder extends AbstractMessageProcessorChainBuilder
38 {
39
40 public DefaultMessageProcessorChainBuilder()
41 {
42
43 }
44
45 public DefaultMessageProcessorChainBuilder(FlowConstruct flowConstruct)
46 {
47 this.flowConstruct = flowConstruct;
48 }
49
50
51
52
53
54
55
56
57
58
59
60
61 public MessageProcessorChain build() throws MuleException
62 {
63 LinkedList<MessageProcessor> tempList = new LinkedList<MessageProcessor>();
64
65
66 for (int i = processors.size() - 1; i >= 0; i--)
67 {
68 MessageProcessor processor = initializeMessageProcessor(processors.get(i));
69 if (processor instanceof InterceptingMessageProcessor)
70 {
71 InterceptingMessageProcessor interceptingProcessor = (InterceptingMessageProcessor) processor;
72
73 if (i + 1 < processors.size())
74 {
75
76 if (tempList.isEmpty())
77 {
78 interceptingProcessor.setListener(initializeMessageProcessor(processors.get(i + 1)));
79 }
80 else if (tempList.size() == 1)
81 {
82 interceptingProcessor.setListener(tempList.get(0));
83 }
84 else
85 {
86 final DefaultMessageProcessorChain chain = new DefaultMessageProcessorChain(
87 "(inner iterating chain) of " + name, new ArrayList<MessageProcessor>(tempList));
88 interceptingProcessor.setListener(chain);
89 }
90 }
91 tempList = new LinkedList<MessageProcessor>(Collections.singletonList(processor));
92 }
93 else
94 {
95
96
97 tempList.addFirst(initializeMessageProcessor(processor));
98 }
99 }
100
101
102
103 final DefaultMessageProcessorChain chain = new DefaultMessageProcessorChain(name,
104 new ArrayList<MessageProcessor>(tempList));
105
106
107
108 return new InterceptingChainLifecycleWrapper(chain, processors, "wrapper for " + name);
109 }
110
111 public DefaultMessageProcessorChainBuilder chain(MessageProcessor... processors)
112 {
113 for (MessageProcessor messageProcessor : processors)
114 {
115 this.processors.add(messageProcessor);
116 }
117 return this;
118 }
119
120 public DefaultMessageProcessorChainBuilder chain(List<MessageProcessor> processors)
121 {
122 if (processors != null)
123 {
124 this.processors.addAll(processors);
125 }
126 return this;
127 }
128
129 public DefaultMessageProcessorChainBuilder chain(MessageProcessorBuilder... builders)
130 {
131 for (MessageProcessorBuilder messageProcessorBuilder : builders)
132 {
133 this.processors.add(messageProcessorBuilder);
134 }
135 return this;
136 }
137
138 public DefaultMessageProcessorChainBuilder chainBefore(MessageProcessor processor)
139 {
140 this.processors.add(0, processor);
141 return this;
142 }
143
144 public DefaultMessageProcessorChainBuilder chainBefore(MessageProcessorBuilder builder)
145 {
146 this.processors.add(0, builder);
147 return this;
148 }
149 }