List of usage examples for org.springframework.beans.factory.support ManagedMap setMergeEnabled
public void setMergeEnabled(boolean mergeEnabled)
From source file:com.bstek.dorado.spring.MapEntryShortCutDecorator.java
@SuppressWarnings({ "unchecked", "rawtypes" }) public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) { AbstractBeanDefinition beanDef = (AbstractBeanDefinition) definition.getBeanDefinition(); MutablePropertyValues propertyValues = (beanDef.getPropertyValues() == null) ? new MutablePropertyValues() : beanDef.getPropertyValues(); ManagedMap map = null; boolean firstPropertyValue = propertyValues.getPropertyValue(property) == null; if (!firstPropertyValue) { map = (ManagedMap) (propertyValues.getPropertyValue(property).getValue()); } else {//from w w w . j a va 2 s . co m map = new ManagedMap(); map.setSource(node); map.setMergeEnabled(true); propertyValues.addPropertyValue(property, map); beanDef.setPropertyValues(propertyValues); } Element el = (Element) node; String key = el.getAttribute("key"); String value = el.getAttribute("value"); String valueRef = el.getAttribute("value-ref"); Object entryValue = null; if (StringUtils.isNotEmpty(value)) { entryValue = value; } else if (StringUtils.isNotEmpty(valueRef)) { RuntimeBeanReference ref = new RuntimeBeanReference(valueRef); ref.setSource(parserContext.getReaderContext().extractSource(el)); entryValue = ref; } else { Element beanEl = DomUtils.getChildElementByTagName(el, "bean"); if (beanEl != null) { entryValue = parserContext.getDelegate().parseBeanDefinitionElement(beanEl); } } if (supportsMultiKey && StringUtils.isNotEmpty(key)) { for (String k : StringUtils.split(key, KEY_DELIM)) { map.put(k, entryValue); } } else { map.put(key, entryValue); } return definition; }
From source file:de.acosix.alfresco.utility.common.spring.PropertyAlteringBeanFactoryPostProcessor.java
protected Object handleMapValues(final PropertyValue configuredValue) { final Object value; LOGGER.debug(//from w ww . ja v a2s . c o m "[{}] Map of values / bean reference names has been configured - treating property {} of {} as <map>", this.beanName, this.propertyName, this.targetBeanName); final ManagedMap<Object, Object> map = new ManagedMap<>(); if (this.merge && configuredValue != null) { final Object configuredValueDefinition = configuredValue.getValue(); if (configuredValueDefinition instanceof ManagedMap<?, ?>) { final ManagedMap<?, ?> oldMap = (ManagedMap<?, ?>) configuredValueDefinition; map.setKeyTypeName(oldMap.getKeyTypeName()); map.setValueTypeName(oldMap.getValueTypeName()); map.setMergeEnabled(oldMap.isMergeEnabled()); map.setSource(oldMap.getSource()); map.putAll(oldMap); LOGGER.debug("[{}] Merged existing map values: {}", this.beanName, oldMap); } } Map<Object, Object> valuesToMap; if (this.valueMap != null) { LOGGER.debug("[{}] Map of configured values for {} of {}: ", this.beanName, this.propertyName, this.targetBeanName, this.valueMap); valuesToMap = this.valueMap; } else { LOGGER.debug("[{}] Map of configured bean reference names for {} of {}: ", this.beanName, this.propertyName, this.targetBeanName, this.beanReferenceNameMap); valuesToMap = new HashMap<>(); for (final Entry<Object, String> beanReferenceEntry : this.beanReferenceNameMap.entrySet()) { valuesToMap.put(beanReferenceEntry.getKey(), new RuntimeBeanReference(beanReferenceEntry.getValue())); } } LOGGER.debug("[{}] Putting new entries into map for {} of {}", this.beanName, this.propertyName, this.targetBeanName); map.putAll(valuesToMap); if (!map.isMergeEnabled() && this.mergeParent) { LOGGER.debug("[{}] Enabling \"merge\" for <map> on {} of {}", this.beanName, this.propertyName, this.targetBeanName); } map.setMergeEnabled(map.isMergeEnabled() || this.mergeParent); value = map; return value; }
From source file:org.eclipse.gemini.blueprint.blueprint.config.internal.BlueprintParser.java
/** * Parse a map element.//from ww w.j a v a 2 s . com */ public Map<?, ?> parseMapElement(Element mapEle, BeanDefinition bd) { String defaultKeyType = mapEle.getAttribute(BeanDefinitionParserDelegate.KEY_TYPE_ATTRIBUTE); String defaultValueType = mapEle.getAttribute(BeanDefinitionParserDelegate.VALUE_TYPE_ATTRIBUTE); List<Element> entryEles = DomUtils.getChildElementsByTagName(mapEle, BeanDefinitionParserDelegate.ENTRY_ELEMENT); ManagedMap<Object, Object> map = new ManagedMap<Object, Object>(entryEles.size()); map.setSource(extractSource(mapEle)); map.setKeyTypeName(defaultKeyType); map.setValueTypeName(defaultValueType); map.setMergeEnabled(parseMergeAttribute(mapEle)); for (Element entryEle : entryEles) { // Should only have one value child element: ref, value, list, etc. // Optionally, there might be a key child element. NodeList entrySubNodes = entryEle.getChildNodes(); Element keyEle = null; Element valueEle = null; for (int j = 0; j < entrySubNodes.getLength(); j++) { Node node = entrySubNodes.item(j); if (node instanceof Element) { Element candidateEle = (Element) node; if (DomUtils.nodeNameEquals(candidateEle, BeanDefinitionParserDelegate.KEY_ELEMENT)) { if (keyEle != null) { error("<entry> element is only allowed to contain one <key> sub-element", entryEle); } else { keyEle = candidateEle; } } else { // Child element is what we're looking for. if (valueEle != null) { error("<entry> element must not contain more than one value sub-element", entryEle); } else { valueEle = candidateEle; } } } } // Extract key from attribute or sub-element. Object key = null; boolean hasKeyAttribute = entryEle.hasAttribute(BeanDefinitionParserDelegate.KEY_ATTRIBUTE); boolean hasKeyRefAttribute = entryEle.hasAttribute(BeanDefinitionParserDelegate.KEY_REF_ATTRIBUTE); if ((hasKeyAttribute && hasKeyRefAttribute) || ((hasKeyAttribute || hasKeyRefAttribute)) && keyEle != null) { error("<entry> element is only allowed to contain either " + "a 'key' attribute OR a 'key-ref' attribute OR a <key> sub-element", entryEle); } if (hasKeyAttribute) { key = buildTypedStringValueForMap(entryEle.getAttribute(BeanDefinitionParserDelegate.KEY_ATTRIBUTE), defaultKeyType, entryEle); } else if (hasKeyRefAttribute) { String refName = entryEle.getAttribute(BeanDefinitionParserDelegate.KEY_REF_ATTRIBUTE); if (!StringUtils.hasText(refName)) { error("<entry> element contains empty 'key-ref' attribute", entryEle); } RuntimeBeanReference ref = new RuntimeBeanReference(refName); ref.setSource(extractSource(entryEle)); key = ref; } else if (keyEle != null) { key = parseKeyElement(keyEle, bd, defaultKeyType); } else { error("<entry> element must specify a key", entryEle); } // Extract value from attribute or sub-element. Object value = null; boolean hasValueAttribute = entryEle.hasAttribute(BeanDefinitionParserDelegate.VALUE_ATTRIBUTE); boolean hasValueRefAttribute = entryEle.hasAttribute(BeanDefinitionParserDelegate.VALUE_REF_ATTRIBUTE); if ((hasValueAttribute && hasValueRefAttribute) || ((hasValueAttribute || hasValueRefAttribute)) && valueEle != null) { error("<entry> element is only allowed to contain either " + "'value' attribute OR 'value-ref' attribute OR <value> sub-element", entryEle); } if (hasValueAttribute) { value = buildTypedStringValueForMap( entryEle.getAttribute(BeanDefinitionParserDelegate.VALUE_ATTRIBUTE), defaultValueType, entryEle); } else if (hasValueRefAttribute) { String refName = entryEle.getAttribute(BeanDefinitionParserDelegate.VALUE_REF_ATTRIBUTE); if (!StringUtils.hasText(refName)) { error("<entry> element contains empty 'value-ref' attribute", entryEle); } RuntimeBeanReference ref = new RuntimeBeanReference(refName); ref.setSource(extractSource(entryEle)); value = ref; } else if (valueEle != null) { value = parsePropertySubElement(valueEle, bd, defaultValueType); } else { error("<entry> element must specify a value", entryEle); } // Add final key and value to the Map. map.put(key, value); } return map; }
From source file:org.kuali.rice.krad.datadictionary.DictionaryBeanFactoryPostProcessor.java
/** * Iterates through the map values and calls helpers to process the value * * @param mapVal the set to process/*from w w w . java 2 s.co m*/ * @param propertyName name of the property which has the map value * @param nestedBeanStack stack of bean containers which contains the map property */ protected void visitMap(Map<?, ?> mapVal, String propertyName, Stack<BeanDefinitionHolder> nestedBeanStack) { boolean isMergeEnabled = false; if (mapVal instanceof ManagedMap) { isMergeEnabled = ((ManagedMap) mapVal).isMergeEnabled(); } ManagedMap newMap = new ManagedMap(); newMap.setMergeEnabled(isMergeEnabled); for (Map.Entry entry : mapVal.entrySet()) { Object key = entry.getKey(); Object val = entry.getValue(); if (isStringValue(val)) { val = processMapStringPropertyValue(propertyName, mapVal, getString(val), key, nestedBeanStack, beanProcessors); } else { val = visitPropertyValue(propertyName, val, nestedBeanStack); } newMap.put(key, val); } mapVal.clear(); mapVal.putAll(newMap); }
From source file:org.kuali.rice.krad.datadictionary.parse.CustomSchemaParser.java
/** * Parses a list of elements into a map of beans/standard content. * * @param grandChildren - The list of beans/content in a bean property * @param child - The property tag for the parent. * @param parent - The parent bean that the tag is nested in. * @param parserContext - Provided information and functionality regarding current bean set. * @return A managedSet of the nested content. *//* ww w. j a v a2 s . c om*/ protected ManagedMap parseMap(ArrayList<Element> grandChildren, Element child, BeanDefinitionBuilder parent, ParserContext parserContext) { ManagedMap map = new ManagedMap(); String merge = child.getAttribute("merge"); if (merge != null) { map.setMergeEnabled(Boolean.valueOf(merge)); } for (int j = 0; j < grandChildren.size(); j++) { Object key = findKey(grandChildren.get(j), parent, parserContext); Object value = findValue(grandChildren.get(j), parent, parserContext); map.put(key, value); } return map; }
From source file:org.kuali.rice.krad.datadictionary.uif.UifBeanFactoryPostProcessor.java
/** * Processes a top level (non nested) bean definition for expressions * * <p>/*from w w w .ja va 2s.co m*/ * A bean that is non nested (or top of a collection) will hold all the expressions for the graph. A new * expression graph is initialized and expressions are collected as the bean and all its children are processed. * The expression graph is then set as a property on the top bean definition * </p> * * @param beanName name of the bean to process * @param beanDefinition bean definition to process * @param beanFactory factory holding all the bean definitions * @param processedBeanNames set of bean names that have already been processed */ protected void processBeanDefinition(String beanName, BeanDefinition beanDefinition, ConfigurableListableBeanFactory beanFactory, Set<String> processedBeanNames) { Class<?> beanClass = getBeanClass(beanDefinition, beanFactory); if ((beanClass == null) || !UifDictionaryBean.class.isAssignableFrom(beanClass) || processedBeanNames.contains(beanName)) { return; } // process bean definition and all nested definitions for expressions ManagedMap<String, String> expressionGraph = new ManagedMap<String, String>(); MutablePropertyValues pvs = beanDefinition.getPropertyValues(); if (pvs.contains(UifPropertyPaths.EXPRESSION_GRAPH)) { expressionGraph = (ManagedMap<String, String>) pvs.getPropertyValue(UifPropertyPaths.EXPRESSION_GRAPH) .getValue(); if (expressionGraph == null) { expressionGraph = new ManagedMap<String, String>(); } } expressionGraph.setMergeEnabled(false); processNestedBeanDefinition(beanName, beanDefinition, "", expressionGraph, beanFactory, processedBeanNames); // add property for expression graph pvs = beanDefinition.getPropertyValues(); pvs.addPropertyValue(UifPropertyPaths.EXPRESSION_GRAPH, expressionGraph); }
From source file:org.kuali.rice.krad.datadictionary.uif.UifBeanFactoryPostProcessor.java
@SuppressWarnings("unchecked") protected void visitMap(String propertyName, Map<String, String> parentExpressionGraph, Map<String, String> expressionGraph, Map<?, ?> mapVal, ConfigurableListableBeanFactory beanFactory, Set<String> processedBeanNames) { boolean isMergeEnabled = false; if (mapVal instanceof ManagedMap) { isMergeEnabled = ((ManagedMap) mapVal).isMergeEnabled(); }//from w w w. ja v a 2 s. co m ManagedMap newMap = new ManagedMap(); newMap.setMergeEnabled(isMergeEnabled); for (Map.Entry entry : mapVal.entrySet()) { Object key = entry.getKey(); Object val = entry.getValue(); String keyStr = getStringValue(key); String elemPropertyName = propertyName + "['" + keyStr + "']"; if (hasExpression(val)) { String strValue = getStringValue(val); expressionGraph.put(elemPropertyName, strValue); } else { // process map value bean definition as a top level bean if ((val instanceof BeanDefinition) || (val instanceof BeanDefinitionHolder)) { String beanName = null; BeanDefinition beanDefinition; if (val instanceof BeanDefinition) { beanDefinition = (BeanDefinition) val; } else { beanDefinition = ((BeanDefinitionHolder) val).getBeanDefinition(); beanName = ((BeanDefinitionHolder) val).getBeanName(); } processBeanDefinition(beanName, beanDefinition, beanFactory, processedBeanNames); } newMap.put(key, val); } if (isMergeEnabled && parentExpressionGraph.containsKey(elemPropertyName)) { parentExpressionGraph.remove(elemPropertyName); } } if (!isMergeEnabled) { // clear any expressions that match the property minus key Map<String, String> adjustedParentExpressionGraph = new HashMap<String, String>(); for (Map.Entry<String, String> parentExpression : parentExpressionGraph.entrySet()) { if (!parentExpression.getKey().startsWith(propertyName + "[")) { adjustedParentExpressionGraph.put(parentExpression.getKey(), parentExpression.getValue()); } } parentExpressionGraph.clear(); parentExpressionGraph.putAll(adjustedParentExpressionGraph); } mapVal.clear(); mapVal.putAll(newMap); }
From source file:org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.java
/** * Parse a map element./*from w ww . j a v a 2 s . c om*/ */ public Map<Object, Object> parseMapElement(Element mapEle, @Nullable BeanDefinition bd) { String defaultKeyType = mapEle.getAttribute(KEY_TYPE_ATTRIBUTE); String defaultValueType = mapEle.getAttribute(VALUE_TYPE_ATTRIBUTE); List<Element> entryEles = DomUtils.getChildElementsByTagName(mapEle, ENTRY_ELEMENT); ManagedMap<Object, Object> map = new ManagedMap<>(entryEles.size()); map.setSource(extractSource(mapEle)); map.setKeyTypeName(defaultKeyType); map.setValueTypeName(defaultValueType); map.setMergeEnabled(parseMergeAttribute(mapEle)); for (Element entryEle : entryEles) { // Should only have one value child element: ref, value, list, etc. // Optionally, there might be a key child element. NodeList entrySubNodes = entryEle.getChildNodes(); Element keyEle = null; Element valueEle = null; for (int j = 0; j < entrySubNodes.getLength(); j++) { Node node = entrySubNodes.item(j); if (node instanceof Element) { Element candidateEle = (Element) node; if (nodeNameEquals(candidateEle, KEY_ELEMENT)) { if (keyEle != null) { error("<entry> element is only allowed to contain one <key> sub-element", entryEle); } else { keyEle = candidateEle; } } else { // Child element is what we're looking for. if (nodeNameEquals(candidateEle, DESCRIPTION_ELEMENT)) { // the element is a <description> -> ignore it } else if (valueEle != null) { error("<entry> element must not contain more than one value sub-element", entryEle); } else { valueEle = candidateEle; } } } } // Extract key from attribute or sub-element. Object key = null; boolean hasKeyAttribute = entryEle.hasAttribute(KEY_ATTRIBUTE); boolean hasKeyRefAttribute = entryEle.hasAttribute(KEY_REF_ATTRIBUTE); if ((hasKeyAttribute && hasKeyRefAttribute) || ((hasKeyAttribute || hasKeyRefAttribute)) && keyEle != null) { error("<entry> element is only allowed to contain either " + "a 'key' attribute OR a 'key-ref' attribute OR a <key> sub-element", entryEle); } if (hasKeyAttribute) { key = buildTypedStringValueForMap(entryEle.getAttribute(KEY_ATTRIBUTE), defaultKeyType, entryEle); } else if (hasKeyRefAttribute) { String refName = entryEle.getAttribute(KEY_REF_ATTRIBUTE); if (!StringUtils.hasText(refName)) { error("<entry> element contains empty 'key-ref' attribute", entryEle); } RuntimeBeanReference ref = new RuntimeBeanReference(refName); ref.setSource(extractSource(entryEle)); key = ref; } else if (keyEle != null) { key = parseKeyElement(keyEle, bd, defaultKeyType); } else { error("<entry> element must specify a key", entryEle); } // Extract value from attribute or sub-element. Object value = null; boolean hasValueAttribute = entryEle.hasAttribute(VALUE_ATTRIBUTE); boolean hasValueRefAttribute = entryEle.hasAttribute(VALUE_REF_ATTRIBUTE); boolean hasValueTypeAttribute = entryEle.hasAttribute(VALUE_TYPE_ATTRIBUTE); if ((hasValueAttribute && hasValueRefAttribute) || ((hasValueAttribute || hasValueRefAttribute)) && valueEle != null) { error("<entry> element is only allowed to contain either " + "'value' attribute OR 'value-ref' attribute OR <value> sub-element", entryEle); } if ((hasValueTypeAttribute && hasValueRefAttribute) || (hasValueTypeAttribute && !hasValueAttribute) || (hasValueTypeAttribute && valueEle != null)) { error("<entry> element is only allowed to contain a 'value-type' " + "attribute when it has a 'value' attribute", entryEle); } if (hasValueAttribute) { String valueType = entryEle.getAttribute(VALUE_TYPE_ATTRIBUTE); if (!StringUtils.hasText(valueType)) { valueType = defaultValueType; } value = buildTypedStringValueForMap(entryEle.getAttribute(VALUE_ATTRIBUTE), valueType, entryEle); } else if (hasValueRefAttribute) { String refName = entryEle.getAttribute(VALUE_REF_ATTRIBUTE); if (!StringUtils.hasText(refName)) { error("<entry> element contains empty 'value-ref' attribute", entryEle); } RuntimeBeanReference ref = new RuntimeBeanReference(refName); ref.setSource(extractSource(entryEle)); value = ref; } else if (valueEle != null) { value = parsePropertySubElement(valueEle, bd, defaultValueType); } else { error("<entry> element must specify a value", entryEle); } // Add final key and value to the Map. map.put(key, value); } return map; }