View Javadoc

1   /*
2    * $Id: AsyncMessageProcessorsFactoryBean.java 22864 2011-09-05 17:18:46Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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 }