INT-3258: Reduce #xpath Missing Log Entries

JIRA: https://jira.springsource.org/browse/INT-3258
This commit is contained in:
Artem Bilan
2014-01-09 14:36:54 +02:00
committed by Gary Russell
parent d4ade73cfb
commit 2fb0707465
2 changed files with 88 additions and 2 deletions

View File

@@ -18,8 +18,10 @@ package org.springframework.integration.config.xml;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -77,6 +79,8 @@ public abstract class AbstractIntegrationNamespaceHandler implements NamespaceHa
private final NamespaceHandlerDelegate delegate = new NamespaceHandlerDelegate();
private static final Set<Integer> registriesProcessed = new HashSet<Integer>();
@Override
public final BeanDefinition parse(Element element, ParserContext parserContext) {
@@ -199,6 +203,8 @@ public abstract class AbstractIntegrationNamespaceHandler implements NamespaceHa
}
private void registerBuiltInBeans(ParserContext parserContext) {
int registryId = System.identityHashCode(parserContext.getRegistry());
String jsonPathBeanName = "jsonPath";
boolean alreadyRegistered = false;
if (parserContext.getRegistry() instanceof ListableBeanFactory) {
@@ -207,7 +213,7 @@ public abstract class AbstractIntegrationNamespaceHandler implements NamespaceHa
else {
alreadyRegistered = parserContext.getRegistry().isBeanNameInUse(jsonPathBeanName);
}
if (!alreadyRegistered) {
if (!alreadyRegistered && !registriesProcessed.contains(registryId)) {
Class<?> jsonPathClass = null;
try {
jsonPathClass = ClassUtils.forName("com.jayway.jsonpath.JsonPath", parserContext.getReaderContext().getBeanClassLoader());
@@ -230,7 +236,7 @@ public abstract class AbstractIntegrationNamespaceHandler implements NamespaceHa
else {
alreadyRegistered = parserContext.getRegistry().isBeanNameInUse(xpathBeanName);
}
if (!alreadyRegistered) {
if (!alreadyRegistered && !registriesProcessed.contains(registryId)) {
Class<?> xpathClass = null;
try {
xpathClass = ClassUtils.forName(IntegrationNamespaceUtils.BASE_PACKAGE + ".xml.xpath.XPathUtils",
@@ -246,6 +252,7 @@ public abstract class AbstractIntegrationNamespaceHandler implements NamespaceHa
}
}
registriesProcessed.add(registryId);
this.doRegisterBuiltInBeans(parserContext);
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright 2014 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.integration.config;
import org.apache.commons.logging.Log;
import org.junit.Test;
import org.mockito.Mockito;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.beans.factory.xml.NamespaceHandler;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlReaderContext;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.integration.config.xml.IntegrationNamespaceHandler;
import org.springframework.integration.test.util.TestUtils;
/**
* @author Artem Bilan
* @since 3.0
*/
public class IntegrationNamespaceHandlerTests {
@Test
public void testRegisterBuiltInBeansOnlyOnce() {
NamespaceHandler namespaceHandler = new IntegrationNamespaceHandler();
Log log = Mockito.spy(TestUtils.getPropertyValue(namespaceHandler, "logger", Log.class));
DirectFieldAccessor dfa = new DirectFieldAccessor(namespaceHandler);
dfa.setPropertyValue("logger", log);
GenericApplicationContext testApplicationContext = TestUtils.createTestApplicationContext();
XmlReaderContext readerContext = Mockito.mock(XmlReaderContext.class);
BeanDefinitionReader beanDefinitionReader = Mockito.mock(XmlBeanDefinitionReader.class);
DirectFieldAccessor bDefReaderDfa = new DirectFieldAccessor(beanDefinitionReader);
bDefReaderDfa.setPropertyValue("registry", testApplicationContext);
DirectFieldAccessor readerContextDfa = new DirectFieldAccessor(readerContext);
readerContextDfa.setPropertyValue("reader", beanDefinitionReader);
Element element = Mockito.mock(Element.class);
Mockito.when(element.getAttributeNS("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation"))
.thenReturn("http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd");
Document document = Mockito.mock(Document.class);
Mockito.when(element.getOwnerDocument()).thenReturn(document);
Mockito.when(document.getDocumentElement()).thenReturn(element);
for (int i = 0; i < 3; i++) {
try {
namespaceHandler.parse(element, new ParserContext(readerContext, null));
}
catch (NullPointerException e) {
//ignore it as it is out of scope of this test.
}
}
Mockito.verify(log).debug("SpEL function '#xpath' isn't registered: there is no spring-integration-xml.jar on the classpath.");
}
}