Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
TwoStageMapBeanAssembler |
|
| 1.5;1.5 |
1 | /* | |
2 | * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com | |
3 | * The software in this package is published under the terms of the CPAL v1.0 | |
4 | * license, a copy of which has been included with this distribution in the | |
5 | * LICENSE.txt file. | |
6 | */ | |
7 | package org.mule.config.spring.parsers.assembly; | |
8 | ||
9 | import org.mule.config.spring.MuleHierarchicalBeanDefinitionParserDelegate; | |
10 | import org.mule.config.spring.parsers.assembly.configuration.PropertyConfiguration; | |
11 | ||
12 | import org.springframework.beans.factory.config.BeanDefinition; | |
13 | import org.springframework.beans.factory.support.BeanDefinitionBuilder; | |
14 | ||
15 | /** | |
16 | * This is used by {@link org.mule.config.spring.parsers.delegate.MapDefinitionParserMutator} - it takes | |
17 | * a normal bean definition and re-packages it as a map (rather than individual values). The difference | |
18 | * between this and {@link org.mule.config.spring.parsers.assembly.AttributeMapBeanAssemblerFactory} is | |
19 | * that this allows child elements to generate the properties (it's an ugly consequence of the fact that | |
20 | * BDPs are called before nested children - this is a hack that gets "re-called" after the children to | |
21 | * complete the work). | |
22 | */ | |
23 | public class TwoStageMapBeanAssembler extends AbstractMapBeanAssembler | |
24 | { | |
25 | ||
26 | private TwoStageMapBeanAssemblerFactory.BeanAssemblerStore store; | |
27 | ||
28 | public TwoStageMapBeanAssembler(TwoStageMapBeanAssemblerFactory.BeanAssemblerStore store, | |
29 | PropertyConfiguration beanConfig, BeanDefinitionBuilder bean, | |
30 | PropertyConfiguration targetConfig, BeanDefinition target) | |
31 | { | |
32 | 0 | super(beanConfig, bean, targetConfig, target); |
33 | 0 | this.store = store; |
34 | 0 | } |
35 | ||
36 | /** | |
37 | * We overwrite this method to populate a map instead of inserting the definition. | |
38 | * However, the bean definition is not complete until all child elements have been | |
39 | * parsed - and that parsing happens after this routine is called. So on first | |
40 | * pass we set a flag in the definition. This is picked up by the main | |
41 | * driver loop ({@link org.mule.config.spring.MuleHierarchicalBeanDefinitionParserDelegate}) | |
42 | * and our enclosing bean definition parser is called again. At the same time, to | |
43 | * avoid complicating otherwise "normal" BDPs, we pass this assembler to a callback, | |
44 | * so that it can be called the second time in a more direct way. | |
45 | */ | |
46 | public void insertBeanInTarget(String oldName) | |
47 | { | |
48 | 0 | assertTargetPresent(); |
49 | ||
50 | 0 | if (MuleHierarchicalBeanDefinitionParserDelegate.testFlag(getBean().getBeanDefinition(), |
51 | MuleHierarchicalBeanDefinitionParserDelegate.MULE_POST_CHILDREN)) | |
52 | { | |
53 | 0 | insertDefinitionAsMap(oldName); |
54 | } | |
55 | else | |
56 | { | |
57 | // called for the first time, so set the flag and store this assembler for | |
58 | // later processing | |
59 | 0 | MuleHierarchicalBeanDefinitionParserDelegate.setFlag(getBean().getBeanDefinition(), |
60 | MuleHierarchicalBeanDefinitionParserDelegate.MULE_POST_CHILDREN); | |
61 | 0 | store.saveBeanAssembler(this); |
62 | } | |
63 | 0 | } |
64 | ||
65 | } |