1
2
3
4
5
6
7
8
9
10 package org.mule.config.spring.parsers.specific;
11
12 import org.mule.api.config.MuleProperties;
13 import org.mule.config.spring.parsers.generic.OptionalChildDefinitionParser;
14 import org.mule.retry.async.AsynchronousRetryTemplate;
15
16 import org.apache.commons.lang.StringUtils;
17 import org.springframework.beans.factory.config.BeanDefinition;
18 import org.springframework.beans.factory.config.BeanDefinitionHolder;
19 import org.springframework.beans.factory.config.RuntimeBeanReference;
20 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
21 import org.springframework.beans.factory.xml.ParserContext;
22 import org.w3c.dom.Element;
23
24
25
26
27 public class RetryPolicyDefinitionParser extends OptionalChildDefinitionParser
28 {
29 boolean asynchronous = false;
30
31 public RetryPolicyDefinitionParser()
32 {
33 super("retryPolicyTemplate");
34 }
35
36 public RetryPolicyDefinitionParser(Class clazz)
37 {
38 super("retryPolicyTemplate", clazz);
39 }
40
41 @Override
42 protected boolean isChild(Element element, ParserContext parserContext, BeanDefinitionBuilder builder)
43 {
44 if (getParentBeanName(element).equals(MuleProperties.OBJECT_MULE_CONFIGURATION))
45 {
46 element.setAttribute(ATTRIBUTE_ID, MuleProperties.OBJECT_DEFAULT_RETRY_POLICY_TEMPLATE);
47 return false;
48 }
49 else
50 {
51 return true;
52 }
53 }
54
55 @Override
56 protected void preProcess(Element element)
57 {
58 super.preProcess(element);
59
60
61 asynchronous = !Boolean.parseBoolean(element.getAttribute("blocking"));
62 element.removeAttribute("blocking");
63
64
65 if (StringUtils.isNotEmpty(element.getAttribute("asynchronous")))
66 {
67 asynchronous = Boolean.parseBoolean(element.getAttribute("asynchronous"));
68 element.removeAttribute("asynchronous");
69 return;
70 }
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 @Override
96 protected void parseChild(Element element, ParserContext parserContext, BeanDefinitionBuilder builder)
97 {
98 super.parseChild(element, parserContext, builder);
99
100 if (asynchronous)
101 {
102
103 BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(AsynchronousRetryTemplate.class);
104
105 String asynchWrapperName = parserContext.getReaderContext().generateBeanName(bdb.getBeanDefinition());
106
107 String retryPolicyName = getBeanName(element);
108 bdb.addConstructorArgReference(retryPolicyName);
109
110 BeanDefinitionHolder holder = new BeanDefinitionHolder(bdb.getBeanDefinition(), asynchWrapperName);
111 registerBeanDefinition(holder, parserContext.getRegistry());
112
113
114 BeanDefinition parent = parserContext.getRegistry().getBeanDefinition(getParentBeanName(element));
115 parent.getPropertyValues().addPropertyValue(getPropertyName(element), new RuntimeBeanReference(asynchWrapperName));
116 }
117 }
118 }