From b4167be52d9187cc96feeb85307d5d1802f0992b Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Sat, 22 Nov 2014 16:08:28 +0100 Subject: [PATCH] GroovyBeanDefinitionReader consistently throws BeanDefinitionParsingException for invalid files of any name Issue: SPR-12435 --- .../groovy/GroovyBeanDefinitionReader.java | 6 ++--- .../groovy/GroovyApplicationContextTests.java | 22 ++++++++++++++++--- .../groovy/applicationContext-error.groovy | 6 +++++ .../context/groovy/beans.groovy | 6 +++++ 4 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 spring-context/src/test/java/org/springframework/context/groovy/applicationContext-error.groovy create mode 100644 spring-context/src/test/java/org/springframework/context/groovy/beans.groovy diff --git a/spring-beans-groovy/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionReader.java b/spring-beans-groovy/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionReader.java index 310751a3d57..adc231e091e 100644 --- a/spring-beans-groovy/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionReader.java +++ b/spring-beans-groovy/src/main/java/org/springframework/beans/factory/groovy/GroovyBeanDefinitionReader.java @@ -53,6 +53,7 @@ import org.springframework.beans.factory.xml.XmlReaderContext; import org.springframework.core.io.DescriptiveResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.EncodedResource; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** @@ -239,7 +240,7 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp int countBefore = getRegistry().getBeanDefinitionCount(); try { GroovyShell shell = new GroovyShell(getResourceLoader().getClassLoader(), binding); - shell.evaluate(encodedResource.getReader(), encodedResource.getResource().getFilename()); + shell.evaluate(encodedResource.getReader(), "beans"); } catch (Throwable ex) { throw new BeanDefinitionParsingException(new Problem("Error evaluating Groovy script: " + ex.getMessage(), @@ -282,10 +283,9 @@ public class GroovyBeanDefinitionReader extends AbstractBeanDefinitionReader imp try { Closure callable = null; Collection constructorArgs = null; - if (args != null && args.length > 0) { + if (!ObjectUtils.isEmpty(args)) { int index = args.length; Object lastArg = args[index-1]; - if (lastArg instanceof Closure) { callable = (Closure) lastArg; index--; diff --git a/spring-context/src/test/java/org/springframework/context/groovy/GroovyApplicationContextTests.java b/spring-context/src/test/java/org/springframework/context/groovy/GroovyApplicationContextTests.java index 3810d4b205e..9d7fdca1087 100644 --- a/spring-context/src/test/java/org/springframework/context/groovy/GroovyApplicationContextTests.java +++ b/spring-context/src/test/java/org/springframework/context/groovy/GroovyApplicationContextTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-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. @@ -16,16 +16,20 @@ package org.springframework.context.groovy; -import junit.framework.TestCase; +import org.junit.Test; +import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; import org.springframework.context.support.GenericGroovyApplicationContext; +import static org.junit.Assert.*; + /** * @author Jeff Brown * @author Juergen Hoeller */ -public class GroovyApplicationContextTests extends TestCase { +public class GroovyApplicationContextTests { + @Test public void testLoadingConfigFile() { GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext( "org/springframework/context/groovy/applicationContext.groovy"); @@ -35,6 +39,7 @@ public class GroovyApplicationContextTests extends TestCase { assertEquals("Grails", framework); } + @Test public void testLoadingMultipleConfigFiles() { GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext( "org/springframework/context/groovy/applicationContext2.groovy", @@ -49,6 +54,7 @@ public class GroovyApplicationContextTests extends TestCase { assertEquals("SpringSource", company); } + @Test public void testLoadingMultipleConfigFilesWithRelativeClass() { GenericGroovyApplicationContext ctx = new GenericGroovyApplicationContext(); ctx.load(GroovyApplicationContextTests.class, "applicationContext2.groovy", "applicationContext.groovy"); @@ -63,4 +69,14 @@ public class GroovyApplicationContextTests extends TestCase { assertEquals("SpringSource", company); } + @Test(expected = BeanDefinitionParsingException.class) + public void testConfigFileParsingError() { + new GenericGroovyApplicationContext("org/springframework/context/groovy/applicationContext-error.groovy"); + } + + @Test(expected = BeanDefinitionParsingException.class) + public void testConfigFileParsingErrorWhenNamedBeans() { + new GenericGroovyApplicationContext("org/springframework/context/groovy/beans.groovy"); + } + } diff --git a/spring-context/src/test/java/org/springframework/context/groovy/applicationContext-error.groovy b/spring-context/src/test/java/org/springframework/context/groovy/applicationContext-error.groovy new file mode 100644 index 00000000000..85a13f0ee2b --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/groovy/applicationContext-error.groovy @@ -0,0 +1,6 @@ +package org.springframework.context.groovy + +beans = { + framework String, 'Grails' + foo String, 'hello' +} diff --git a/spring-context/src/test/java/org/springframework/context/groovy/beans.groovy b/spring-context/src/test/java/org/springframework/context/groovy/beans.groovy new file mode 100644 index 00000000000..85a13f0ee2b --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/groovy/beans.groovy @@ -0,0 +1,6 @@ +package org.springframework.context.groovy + +beans = { + framework String, 'Grails' + foo String, 'hello' +}