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