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.springframework.beans.factory.config.BeanDefinition; 10 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 11 import org.w3c.dom.Attr; 12 13 /** 14 * Bean Assembler provides a high-level interface to constructing beans. It encapsulates all 15 * the "smart" logic about collections, maps, references, etc. 16 * 17 * <p>A bean assembly contains a bean (the thing we are constructing), a target (where we put the 18 * bean once it is ready) and appropriate configuration information (there is a configuration 19 * for both bean and target, but currently they are set to the same instance by the classes that 20 * use this). 21 */ 22 public interface BeanAssembler 23 { 24 25 public BeanDefinitionBuilder getBean(); 26 public BeanDefinition getTarget(); 27 28 /** 29 * Add a property defined by an attribute to the bean we are constructing. 30 * 31 * <p>Since an attribute value is always a string, we don't have to deal with complex types 32 * here - the only issue is whether or not we have a reference. References are detected 33 * by explicit annotation or by the "-ref" at the end of an attribute name. We do not 34 * check the Spring repo to see if a name already exists since that could lead to 35 * unpredictable behaviour. 36 * (see {@link org.mule.config.spring.parsers.assembly.configuration.PropertyConfiguration}) 37 * @param attribute The attribute to add 38 */ 39 void extendBean(Attr attribute); 40 41 /** 42 * Allow direct access to bean for more complex cases 43 * 44 * @param newName The property name to add 45 * @param newValue The property value to add 46 * @param isReference If true, a bean reference is added (and newValue must be a String) 47 */ 48 void extendBean(String newName, Object newValue, boolean isReference); 49 50 /** 51 * Add a property defined by an attribute to the parent of the bean we are constructing. 52 * 53 * <p>This is unusual. Normally you want {@link #extendBean(org.w3c.dom.Attr)}. 54 * @param attribute The attribute to add 55 */ 56 void extendTarget(Attr attribute); 57 58 /** 59 * Allow direct access to target for more complex cases 60 * 61 * @param newName The property name to add 62 * @param newValue The property value to add 63 * @param isReference If true, a bean reference is added (and newValue must be a String) 64 */ 65 void extendTarget(String newName, Object newValue, boolean isReference); 66 67 void extendTarget(String oldName, String newName, Object newValue); 68 69 /** 70 * Insert the bean we have built into the target (typically the parent bean). 71 * 72 * <p>This is the most complex case because the bean can have an arbitrary type. 73 * @param oldName The identifying the bean (typically element name). 74 */ 75 void insertBeanInTarget(String oldName); 76 77 void insertSingletonBeanInTarget(String propertyName, String singletonName); 78 79 /** 80 * Copy the properties from the bean we have been building into the target (typically 81 * the parent bean). In other words, the bean is a facade for the target. 82 * 83 * <p>This assumes that the source bean has been constructed correctly (ie the decisions about 84 * what is ignored, a map, a list, etc) have already been made. All it does (apart from a 85 * direct copy) is merge collections with those on the target when necessary. 86 */ 87 void copyBeanToTarget(); 88 89 /** 90 * Set a flag on the bean - this is used to communicate with 91 * {@link org.mule.config.spring.MuleHierarchicalBeanDefinitionParserDelegate} 92 * 93 * @param flag The flag to set 94 */ 95 void setBeanFlag(String flag); 96 97 }