1
2
3
4
5
6
7
8
9
10
11 package org.mule.config.spring.factories;
12
13 import org.mule.api.AnnotatedObject;
14 import org.mule.api.MuleContext;
15 import org.mule.api.NameableObject;
16 import org.mule.api.context.MuleContextAware;
17 import org.mule.api.processor.MessageProcessor;
18 import org.mule.api.processor.MessageProcessorBuilder;
19 import org.mule.api.processor.ProcessingStrategy;
20 import org.mule.processor.AsyncDelegateMessageProcessor;
21 import org.mule.processor.chain.DefaultMessageProcessorChainBuilder;
22
23 import java.util.Collections;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.concurrent.ConcurrentHashMap;
27
28 import javax.xml.namespace.QName;
29
30 import org.springframework.beans.factory.FactoryBean;
31
32 public class AsyncMessageProcessorsFactoryBean implements FactoryBean, MuleContextAware, NameableObject, AnnotatedObject
33 {
34
35 protected MuleContext muleContext;
36
37 protected List messageProcessors;
38 protected ProcessingStrategy processingStrategy;
39 protected String name;
40 private final Map<QName, Object> annotations = new ConcurrentHashMap<QName, Object>();
41
42 public Class getObjectType()
43 {
44 return MessageProcessor.class;
45 }
46
47 public void setMessageProcessors(List messageProcessors)
48 {
49 this.messageProcessors = messageProcessors;
50 }
51
52 public Object getObject() throws Exception
53 {
54 DefaultMessageProcessorChainBuilder builder = new DefaultMessageProcessorChainBuilder();
55 builder.setName("'async' child chain");
56
57 for (Object processor : messageProcessors)
58 {
59 if (processor instanceof MessageProcessor)
60 {
61 builder.chain((MessageProcessor) processor);
62 }
63 else if (processor instanceof MessageProcessorBuilder)
64 {
65 builder.chain((MessageProcessorBuilder) processor);
66 }
67 else
68 {
69 throw new IllegalArgumentException(
70 "MessageProcessorBuilder should only have MessageProcessor's or MessageProcessorBuilder's configured");
71 }
72 }
73 AsyncDelegateMessageProcessor delegate = new AsyncDelegateMessageProcessor(builder.build(),
74 processingStrategy, name);
75 delegate.setAnnotations(getAnnotations());
76 return delegate;
77 }
78
79 public boolean isSingleton()
80 {
81 return false;
82 }
83
84 public void setMuleContext(MuleContext context)
85 {
86 this.muleContext = context;
87 }
88
89 public String getName()
90 {
91 return name;
92 }
93
94 public void setName(String name)
95 {
96 this.name = name;
97 }
98
99 public void setProcessingStrategy(ProcessingStrategy processingStrategy)
100 {
101 this.processingStrategy = processingStrategy;
102 }
103
104 public final Object getAnnotation(QName name)
105 {
106 return annotations.get(name);
107 }
108
109 public final Map<QName, Object> getAnnotations()
110 {
111 return Collections.unmodifiableMap(annotations);
112 }
113
114 public synchronized final void setAnnotations(Map<QName, Object> newAnnotations)
115 {
116 annotations.clear();
117 annotations.putAll(newAnnotations);
118 }
119 }