diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/AbstractRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/AbstractRegionParser.java index 92265a90..4a8f28a1 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/AbstractRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/AbstractRegionParser.java @@ -31,7 +31,6 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedArray; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.data.gemfire.GemfireUtils; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -111,8 +110,8 @@ abstract class AbstractRegionParser extends AbstractSingleBeanDefinitionParser { } ParsingUtils.setPropertyValue(element, regionBuilder, "name"); - ParsingUtils.setPropertyValue(element, regionBuilder, "ignore-if-exists", "lookupEnabled"); ParsingUtils.setPropertyValue(element, regionBuilder, "data-policy"); + ParsingUtils.setPropertyValue(element, regionBuilder, "ignore-if-exists", "lookupEnabled"); ParsingUtils.setPropertyValue(element, regionBuilder, "persistent"); ParsingUtils.setPropertyValue(element, regionBuilder, "shortcut"); @@ -121,37 +120,13 @@ abstract class AbstractRegionParser extends AbstractSingleBeanDefinitionParser { regionBuilder.addDependsOn(element.getAttribute("disk-store-ref")); } - ParsingUtils.parseOptionalRegionAttributes(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseSubscription(parserContext, element, regionAttributesBuilder); + ParsingUtils.parseOptionalRegionAttributes(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseSubscription(element, parserContext, regionAttributesBuilder); ParsingUtils.parseStatistics(element, regionAttributesBuilder); - ParsingUtils.parseMembershipAttributes(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseExpiration(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseEviction(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseCompressor(parserContext, element, regionAttributesBuilder); - - String enableGateway = element.getAttribute("enable-gateway"); - String hubId = element.getAttribute("hub-id"); - - // Factory will enable gateway if it is not set and hub-id is set. - if (StringUtils.hasText(enableGateway)) { - if (GemfireUtils.isGemfireVersion7OrAbove()) { - log.warn("'enable-gateway' has been deprecated since Gemfire 7.0"); - } - } - - ParsingUtils.setPropertyValue(element, regionBuilder, "enable-gateway"); - - if (StringUtils.hasText(hubId)) { - if (GemfireUtils.isGemfireVersion7OrAbove()) { - log.warn("'hub-id' has been deprecated since Gemfire 7.0"); - } - if (!CollectionUtils.isEmpty(DomUtils.getChildElementsByTagName(element, "gateway-sender"))) { - parserContext.getReaderContext().error("specifying both 'hub-id' and 'gateway-sender' is invalid", - element); - } - } - - ParsingUtils.setPropertyValue(element, regionBuilder, "hub-id"); + ParsingUtils.parseMembershipAttributes(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseExpiration(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseEviction(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseCompressor(element, parserContext, regionAttributesBuilder); parseCollectionOfCustomSubElements(element, parserContext, regionBuilder, AsyncEventQueue.class.getName(), "async-event-queue", "asyncEventQueues"); @@ -164,15 +139,15 @@ abstract class AbstractRegionParser extends AbstractSingleBeanDefinitionParser { for (Element subElement : subElements) { if (subElement.getLocalName().equals("cache-listener")) { regionBuilder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } else if (subElement.getLocalName().equals("cache-loader")) { regionBuilder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } else if (subElement.getLocalName().equals("cache-writer")) { regionBuilder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } } @@ -233,7 +208,7 @@ abstract class AbstractRegionParser extends AbstractSingleBeanDefinitionParser { ManagedArray array = new ManagedArray(className, subElements.size()); for (Element subElement : subElements) { - array.add(ParsingUtils.parseRefOrNestedCustomElement(parserContext, subElement, builder)); + array.add(ParsingUtils.parseRefOrNestedCustomElement(subElement, parserContext, builder)); } builder.addPropertyValue(propertyName, array); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/AsyncEventQueueParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/AsyncEventQueueParser.java index 80bc5576..411e098b 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/AsyncEventQueueParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/AsyncEventQueueParser.java @@ -96,8 +96,9 @@ class AsyncEventQueueParser extends AbstractSingleBeanDefinitionParser { private void parseAsyncEventListener(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { Element asyncEventListenerElement = DomUtils.getChildElementByTagName(element, "async-event-listener"); - Object asyncEventListener = ParsingUtils.parseRefOrSingleNestedBeanDeclaration(parserContext, - asyncEventListenerElement, builder); + Object asyncEventListener = ParsingUtils.parseRefOrSingleNestedBeanDeclaration(asyncEventListenerElement, + parserContext, + builder); builder.addPropertyValue("asyncEventListener", asyncEventListener); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/CacheParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/CacheParser.java index af26c7c4..cd278496 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/CacheParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/CacheParser.java @@ -93,7 +93,7 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { for (Element txListener : txListeners) { transactionListeners.add(ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, txListener, builder)); + txListener, parserContext, builder)); } builder.addPropertyValue("transactionListeners", transactionListeners); @@ -103,7 +103,7 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { if (txWriter != null) { builder.addPropertyValue("transactionWriter", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, txWriter, builder)); + txWriter, parserContext, builder)); } Element gatewayConflictResolver = DomUtils.getChildElementByTagName(element, "gateway-conflict-resolver"); @@ -111,7 +111,7 @@ class CacheParser extends AbstractSingleBeanDefinitionParser { if (gatewayConflictResolver != null) { ParsingUtils.throwExceptionIfNotGemfireV7(element.getLocalName(), "gateway-conflict-resolver", parserContext); builder.addPropertyValue("gatewayConflictResolver", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, gatewayConflictResolver, builder)); + gatewayConflictResolver, parserContext, builder)); } parseDynamicRegionFactory(element, builder); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/ClientRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/ClientRegionParser.java index 62d7fd5b..724c4bee 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/ClientRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/ClientRegionParser.java @@ -84,11 +84,11 @@ class ClientRegionParser extends AbstractRegionParser { mergeRegionTemplateAttributes(element, parserContext, regionBuilder, regionAttributesBuilder); - ParsingUtils.parseOptionalRegionAttributes(parserContext, element, regionAttributesBuilder); + ParsingUtils.parseOptionalRegionAttributes(element, parserContext, regionAttributesBuilder); ParsingUtils.parseStatistics(element, regionAttributesBuilder); - ParsingUtils.parseExpiration(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseEviction(parserContext, element, regionAttributesBuilder); - ParsingUtils.parseCompressor(parserContext, element, regionAttributesBuilder); + ParsingUtils.parseExpiration(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseEviction(element, parserContext, regionAttributesBuilder); + ParsingUtils.parseCompressor(element, parserContext, regionAttributesBuilder); regionBuilder.addPropertyValue("attributes", regionAttributesBuilder.getBeanDefinition()); @@ -101,15 +101,15 @@ class ClientRegionParser extends AbstractRegionParser { if ("cache-listener".equals(subElementLocalName)) { regionBuilder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } else if ("cache-loader".equals(subElementLocalName)) { regionBuilder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } else if ("cache-writer".equals(subElementLocalName)) { regionBuilder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, subElement, regionBuilder)); + subElement, parserContext, regionBuilder)); } else if ("key-interest".equals(subElementLocalName)) { interests.add(parseKeyInterest(subElement, parserContext)); @@ -149,8 +149,9 @@ class ClientRegionParser extends AbstractRegionParser { private Object parseKeyInterest(Element keyInterestElement, ParserContext parserContext) { BeanDefinitionBuilder keyInterestBuilder = BeanDefinitionBuilder.genericBeanDefinition(KeyInterest.class); - keyInterestBuilder.addConstructorArgValue(ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, - keyInterestElement, keyInterestBuilder, "key-ref")); + keyInterestBuilder.addConstructorArgValue(ParsingUtils.parseRefOrNestedBeanDeclaration(keyInterestElement, + parserContext, + keyInterestBuilder, "key-ref")); parseCommonInterestAttributes(keyInterestElement, keyInterestBuilder); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/FunctionServiceParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/FunctionServiceParser.java index 43a30115..94dcf867 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/FunctionServiceParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/FunctionServiceParser.java @@ -57,7 +57,7 @@ class FunctionServiceParser extends AbstractSimpleBeanDefinitionParser { if (functionElement != null) { builder.addPropertyValue("functions", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, functionElement, builder)); + functionElement, parserContext, builder)); } } diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/GatewaySenderParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/GatewaySenderParser.java index 00f57f01..07a764ff 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/GatewaySenderParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/GatewaySenderParser.java @@ -75,14 +75,14 @@ class GatewaySenderParser extends AbstractSimpleBeanDefinitionParser { if (eventFilterElement != null) { builder.addPropertyValue("eventFilters", ParsingUtils.parseRefOrNestedBeanDeclaration( - parserContext, eventFilterElement, builder)); + eventFilterElement, parserContext, builder)); } Element eventSubstitutionFilterElement = DomUtils.getChildElementByTagName(element, "event-substitution-filter"); if (eventSubstitutionFilterElement != null) { builder.addPropertyValue("eventSubstitutionFilter", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, eventSubstitutionFilterElement, builder)); + eventSubstitutionFilterElement, parserContext, builder)); } ParsingUtils.parseTransportFilters(element, parserContext, builder); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/GemfireNamespaceHandler.java b/src/main/java/org/springframework/data/gemfire/config/xml/GemfireNamespaceHandler.java index 6038b781..599b9fb3 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/GemfireNamespaceHandler.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/GemfireNamespaceHandler.java @@ -49,6 +49,8 @@ class GemfireNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("local-region", new LocalRegionParser()); registerBeanDefinitionParser("local-region-template", new LocalRegionParser()); registerBeanDefinitionParser("lookup-region", new LookupRegionParser()); + registerBeanDefinitionParser("lucene-index", new LuceneIndexParser()); + registerBeanDefinitionParser("lucene-service", new LuceneServiceParser()); registerBeanDefinitionParser("partitioned-region", new PartitionedRegionParser()); registerBeanDefinitionParser("partitioned-region-template", new PartitionedRegionParser()); registerBeanDefinitionParser("pool", new PoolParser()); diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java index 2c7dff69..900b8a73 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/LookupRegionParser.java @@ -60,7 +60,7 @@ class LookupRegionParser extends AbstractRegionParser { ParsingUtils.setPropertyValue(element, builder, "cloning-enabled"); ParsingUtils.setPropertyValue(element, builder, "eviction-maximum"); ParsingUtils.setPropertyValue(element, builder, "name"); - ParsingUtils.parseExpiration(parserContext, element, builder); + ParsingUtils.parseExpiration(element, parserContext, builder); parseCollectionOfCustomSubElements(element, parserContext, builder, AsyncEventQueue.class.getName(), "async-event-queue", "asyncEventQueues"); @@ -71,22 +71,23 @@ class LookupRegionParser extends AbstractRegionParser { Element cacheListenerElement = DomUtils.getChildElementByTagName(element, "cache-listener"); if (cacheListenerElement != null) { - builder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration(parserContext, - cacheListenerElement, builder)); + builder.addPropertyValue("cacheListeners", ParsingUtils.parseRefOrNestedBeanDeclaration( + cacheListenerElement, parserContext, + builder)); } Element cacheLoaderElement = DomUtils.getChildElementByTagName(element, "cache-loader"); if (cacheLoaderElement != null) { builder.addPropertyValue("cacheLoader", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, cacheLoaderElement, builder)); + cacheLoaderElement, parserContext, builder)); } Element cacheWriterElement = DomUtils.getChildElementByTagName(element, "cache-writer"); if (cacheWriterElement != null) { builder.addPropertyValue("cacheWriter", ParsingUtils.parseRefOrSingleNestedBeanDeclaration( - parserContext, cacheWriterElement, builder)); + cacheWriterElement, parserContext, builder)); } if (!subRegion) { diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/LuceneIndexParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/LuceneIndexParser.java new file mode 100644 index 00000000..a7078b31 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/xml/LuceneIndexParser.java @@ -0,0 +1,74 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.data.gemfire.config.xml; + +import java.util.Arrays; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.gemfire.search.lucene.LuceneIndexFactoryBean; +import org.springframework.util.StringUtils; +import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; + +/** + * Spring XML {@link AbstractSingleBeanDefinitionParser parser} for the {@link LuceneIndexFactoryBean} bean definition. + * + * @author John Blum + * @see org.springframework.beans.factory.support.BeanDefinitionBuilder + * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser + * @see org.springframework.data.gemfire.search.lucene.LuceneIndexFactoryBean + * @since 1.1.0 + */ +class LuceneIndexParser extends AbstractSingleBeanDefinitionParser { + + /** + * @inheritDoc + */ + @Override + protected Class> getBeanClass(Element element) { + return LuceneIndexFactoryBean.class; + } + + /** + * @inheritDoc + */ + @Override + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { + super.doParse(element, parserContext, builder); + + ParsingUtils.setCacheReference(element, builder); + ParsingUtils.setPropertyValue(element, builder, "name", "indexName"); + ParsingUtils.setPropertyValue(element, builder, "destroy"); + ParsingUtils.setPropertyReference(element, builder, "lucene-service-ref", "luceneService"); + ParsingUtils.setPropertyReference(element, builder, "region-ref", "region"); + ParsingUtils.setPropertyValue(element, builder, "region-path"); + + Optional.ofNullable(element.getAttribute("fields")).filter(StringUtils::hasText).ifPresent((fields) -> { + builder.addPropertyValue("fields", Arrays.stream(fields.split(",")) + .map(String::trim).collect(Collectors.toList())); + }); + + Optional.ofNullable(DomUtils.getChildElementByTagName(element, "field-analyzers")) + .ifPresent((fieldAnalyzersElement) -> builder.addPropertyValue("fieldAnalyzers", + ParsingUtils.parseRefOrSingleNestedBeanDeclaration(fieldAnalyzersElement, parserContext, builder))); + } +} diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/LuceneServiceParser.java b/src/main/java/org/springframework/data/gemfire/config/xml/LuceneServiceParser.java new file mode 100644 index 00000000..dfe92182 --- /dev/null +++ b/src/main/java/org/springframework/data/gemfire/config/xml/LuceneServiceParser.java @@ -0,0 +1,52 @@ +/* + * Copyright 2016 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.springframework.data.gemfire.config.xml; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.data.gemfire.search.lucene.LuceneServiceFactoryBean; +import org.w3c.dom.Element; + +/** + * Spring XML {@link AbstractSingleBeanDefinitionParser parser} for a {@link LuceneServiceFactoryBean} bean definition. + * + * @author John Blum + * @see org.springframework.beans.factory.support.BeanDefinitionBuilder + * @see org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser + * @see org.springframework.data.gemfire.search.lucene.LuceneServiceFactoryBean + * @since 1.1.0 + */ +class LuceneServiceParser extends AbstractSingleBeanDefinitionParser { + + /** + * @inheritDoc + */ + @Override + protected Class> getBeanClass(Element element) { + return LuceneServiceFactoryBean.class; + } + + /** + * @inheritDoc + */ + @Override + protected void doParse(Element element, BeanDefinitionBuilder builder) { + super.doParse(element, builder); + ParsingUtils.setCacheReference(element, builder); + } +} diff --git a/src/main/java/org/springframework/data/gemfire/config/xml/ParsingUtils.java b/src/main/java/org/springframework/data/gemfire/config/xml/ParsingUtils.java index 5fd6e29e..1c74b884 100644 --- a/src/main/java/org/springframework/data/gemfire/config/xml/ParsingUtils.java +++ b/src/main/java/org/springframework/data/gemfire/config/xml/ParsingUtils.java @@ -40,12 +40,21 @@ import org.springframework.util.xml.DomUtils; import org.w3c.dom.Element; /** - * Utilities used by the Spring Data GemFire XML Namespace parsers. + * Utilities used by the Spring Data GemFire XML Namespace Parsers. * * @author Costin Leau * @author David Turanski * @author Lyndon Adams * @author John Blum + * @see org.springframework.beans.factory.config.BeanDefinition + * @see org.springframework.beans.factory.config.RuntimeBeanReference + * @see org.springframework.beans.factory.support.BeanDefinitionBuilder + * @see org.springframework.beans.factory.support.ManagedList + * @see org.springframework.beans.factory.xml.ParserContext + * @see org.springframework.core.Conventions + * @see org.springframework.util.xml.DomUtils + * @see org.w3c.dom.Element + * @since 1.0.0 */ abstract class ParsingUtils { @@ -111,30 +120,8 @@ abstract class ParsingUtils { setPropertyValue(builder, source, propertyName, false); } - /** - * Utility method handling parsing of nested definition of the type: - * - *
- *- * - * or - * - *- *
- *- * - * @param element the XML element. - * @return Bean reference or nested Bean definition. - */ - static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element, - BeanDefinitionBuilder builder) { - return parseRefOrNestedBeanDeclaration(parserContext, element, builder, "ref", false); - } + static Object getBeanReference(Element element, ParserContext parserContext, String refAttributeName) { - static Object getBeanReference(ParserContext parserContext, Element element, String refAttributeName) { String refAttributeValue = element.getAttribute(refAttributeName); Object returnValue = null; @@ -151,27 +138,61 @@ abstract class ParsingUtils { return returnValue; } - static Object parseRefOrNestedCustomElement(ParserContext parserContext, Element element, + static Object parseRefOrNestedCustomElement(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - Object beanRef = ParsingUtils.getBeanReference(parserContext, element, "bean"); + + Object beanRef = ParsingUtils.getBeanReference(element, parserContext, "bean"); + return (beanRef != null ? beanRef : parserContext.getDelegate().parseCustomElement( element, builder.getBeanDefinition())); } - static Object parseRefOrSingleNestedBeanDeclaration(ParserContext parserContext, Element element, + /** + * Utility method handling parsing of nested bean definition of the type: + * + *- * - *- *
+ *+ * + * or + * + *+ *
+ *+ * + * @param element the XML element. + * @return Bean reference or nested Bean definition. + */ + static Object parseRefOrNestedBeanDeclaration(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - return parseRefOrNestedBeanDeclaration(parserContext, element, builder, "ref", true); + + return parseRefOrNestedBeanDeclaration(element, parserContext, builder, "ref", false); } - static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element, + static Object parseRefOrNestedBeanDeclaration(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, String refAttributeName) { - return parseRefOrNestedBeanDeclaration(parserContext, element, builder, refAttributeName, false); + + return parseRefOrNestedBeanDeclaration(element, parserContext, builder, refAttributeName, false); } - static Object parseRefOrNestedBeanDeclaration(ParserContext parserContext, Element element, + static Object parseRefOrSingleNestedBeanDeclaration(Element element, ParserContext parserContext, + BeanDefinitionBuilder builder) { + + return parseRefOrNestedBeanDeclaration(element, parserContext, builder, "ref", true); + } + + static Object parseRefOrSingleNestedBeanDeclaration(Element element, ParserContext parserContext, + BeanDefinitionBuilder builder, String refAttributeName) { + + return parseRefOrNestedBeanDeclaration(element, parserContext, builder, refAttributeName, true); + } + + static Object parseRefOrNestedBeanDeclaration(Element element, ParserContext parserContext, BeanDefinitionBuilder builder, String refAttributeName, boolean single) { - Object beanReference = getBeanReference(parserContext, element, refAttributeName); + Object beanReference = getBeanReference(element, parserContext, refAttributeName); if (beanReference != null) { return beanReference; @@ -182,8 +203,8 @@ abstract class ParsingUtils { // parse nested bean definition if (childElements.size() == 1) { - return parserContext.getDelegate().parsePropertySubElement(childElements.get(0), - builder.getRawBeanDefinition()); + return parserContext.getDelegate().parsePropertySubElement( + childElements.get(0), builder.getRawBeanDefinition()); } else { // TODO also triggered when there are no child elements; need to change the message... @@ -194,7 +215,7 @@ abstract class ParsingUtils { } } - ManagedList+ * + *+ *