diff --git a/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy b/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy index 75df3351bf7..f99b420fcb9 100644 --- a/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy +++ b/grails-test-suite-base/src/main/groovy/grails/util/MockRequestDataValueProcessor.groovy @@ -17,51 +17,48 @@ * under the License. */ -@SuppressWarnings('UnnecessarySemicolon') -package grails.util; +package grails.util -import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest -import groovy.transform.CompileStatic; -import org.springframework.web.servlet.support.RequestDataValueProcessor; +import groovy.transform.CompileStatic +import org.springframework.web.servlet.support.RequestDataValueProcessor -// TODO(groovyism-cleanup): semicolons + double-quoted strings kept to preserve rename-similarity against the original .java (see matrei's review on #16576). Removed by the stacked groovyism-cleanup PR. -@SuppressWarnings(['UnnecessarySemicolon', 'UnnecessaryGString']) @CompileStatic class MockRequestDataValueProcessor implements RequestDataValueProcessor { Map getExtraHiddenFields(HttpServletRequest request) { - Map extraHiddenFields = new HashMap<>(); - extraHiddenFields.put("requestDataValueProcessorHiddenName", "hiddenValue"); - return extraHiddenFields; + Map extraHiddenFields = [:] + extraHiddenFields.put('requestDataValueProcessorHiddenName', 'hiddenValue') + return extraHiddenFields } String processAction(HttpServletRequest request, String action, String httpMethod) { - if (action.indexOf("requestDataValueProcessorParamName=paramValue") > -1) { - action = action.replace("?requestDataValueProcessorParamName=paramValue&", "?"); - action = action.replace("?requestDataValueProcessorParamName=paramValue", ""); - action = action.replace("&requestDataValueProcessorParamName=paramValue", ""); + if (action.indexOf('requestDataValueProcessorParamName=paramValue') > -1) { + action = action.replace('?requestDataValueProcessorParamName=paramValue&', '?') + action = action.replace('?requestDataValueProcessorParamName=paramValue', '') + action = action.replace('&requestDataValueProcessorParamName=paramValue', '') } - return action; + return action } String processFormFieldValue(HttpServletRequest request, String name, String value, String type) { - return value + "_PROCESSED_"; + return "${value}_PROCESSED_" } String processUrl(HttpServletRequest request, String url) { - String toAppend; - if (url.indexOf("?") > -1) { - toAppend = "&requestDataValueProcessorParamName=paramValue"; + String toAppend + if (url.indexOf('?') > -1) { + toAppend = '&requestDataValueProcessorParamName=paramValue' } else { - toAppend = "?requestDataValueProcessorParamName=paramValue"; + toAppend = '?requestDataValueProcessorParamName=paramValue' } - if (url.indexOf("#") > -1) { - url = url.replace("#", toAppend + "#"); + if (url.indexOf('#') > -1) { + url = url.replace('#', "${toAppend}#") } else { - url = url + toAppend; + url = url + toAppend } - return url; + return url } } diff --git a/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy b/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy index 500dcf1c73d..3b8a3387eea 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/commons/test/AbstractGrailsMockTests.groovy @@ -60,12 +60,12 @@ abstract class AbstractGrailsMockTests extends GroovyTestCase { ctx = new MockApplicationContext() ctx.registerMockBean(GrailsApplication.CLASS_LOADER_BEAN, gcl) onSetUp() - ga = new DefaultGrailsApplication(gcl.getLoadedClasses(), gcl) + ga = new DefaultGrailsApplication(gcl.loadedClasses, gcl) if (ClassUtils.isPresent('Config', gcl)) { ConfigObject config = new ConfigSlurper().parse(gcl.loadClass('Config')) - ga.setConfig(new PropertySourcesConfig(config)) + ga.config = new PropertySourcesConfig(config) } - ga.setApplicationContext(ctx) + ga.applicationContext = ctx ga.initialise() ctx.registerMockBean(GrailsApplication.APPLICATION_ID, ga) postSetUp() diff --git a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy index 3a0d28b4153..d12072603f3 100644 --- a/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy +++ b/grails-test-suite-base/src/main/groovy/org/grails/support/MockApplicationContext.groovy @@ -16,53 +16,52 @@ * specific language governing permissions and limitations * under the License. */ -@SuppressWarnings('UnnecessarySemicolon') -package org.grails.support; - -import jakarta.servlet.ServletContext; -import java.lang.annotation.Annotation; -import java.nio.charset.StandardCharsets; -import groovy.transform.CompileStatic; -import org.jspecify.annotations.NonNull; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.MessageSource; -import org.springframework.context.MessageSourceResolvable; -import org.springframework.context.NoSuchMessageException; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.ResolvableType; -import org.springframework.core.env.Environment; -import org.springframework.core.io.AbstractResource; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.mock.web.MockServletContext; -import org.springframework.util.AntPathMatcher; -import org.springframework.util.PathMatcher; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.StandardServletEnvironment; -import grails.util.GrailsStringUtils; - -// TODO(groovyism-cleanup): semicolons + double-quoted strings kept to preserve rename-similarity against the original .java (see matrei's review on #16576). Removed by the stacked groovyism-cleanup PR. -@SuppressWarnings(['UnnecessarySemicolon', 'UnnecessaryGString']) +package org.grails.support + +import jakarta.servlet.ServletContext +import java.lang.annotation.Annotation +import java.nio.charset.StandardCharsets + +import groovy.transform.CompileStatic +import org.jspecify.annotations.NonNull +import org.springframework.beans.BeansException +import org.springframework.beans.factory.BeanCreationException +import org.springframework.beans.factory.BeanFactory +import org.springframework.beans.factory.NoSuchBeanDefinitionException +import org.springframework.beans.factory.ObjectProvider +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.beans.factory.support.DefaultListableBeanFactory +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationEvent +import org.springframework.context.MessageSource +import org.springframework.context.MessageSourceResolvable +import org.springframework.context.NoSuchMessageException +import org.springframework.core.ParameterizedTypeReference +import org.springframework.core.ResolvableType +import org.springframework.core.env.Environment +import org.springframework.core.io.AbstractResource +import org.springframework.core.io.ClassPathResource +import org.springframework.core.io.Resource +import org.springframework.mock.web.MockServletContext +import org.springframework.util.AntPathMatcher +import org.springframework.util.PathMatcher +import org.springframework.web.context.WebApplicationContext +import org.springframework.web.context.support.StandardServletEnvironment + +import grails.util.GrailsStringUtils + @CompileStatic class MockApplicationContext extends GroovyObjectSupport implements WebApplicationContext { - Date startupDate = new Date(); - Map beans = new HashMap<>(); - List resources = new ArrayList<>(); - List ignoredClassLocations = new ArrayList<>(); - PathMatcher pathMatcher = new AntPathMatcher(); - ServletContext servletContext = new MockServletContext(); + Date startupDate = new Date() + Map beans = new HashMap<>() + List resources = new ArrayList<>() + List ignoredClassLocations = new ArrayList<>() + PathMatcher pathMatcher = new AntPathMatcher() + ServletContext servletContext = new MockServletContext() void registerMockBean(String name, Object instance) { - beans.put(name, instance); + beans.put(name, instance) } /** @@ -70,7 +69,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @param location the location of the resource. Example: /WEB-INF/grails-app/i18n/messages.properties */ void registerMockResource(String location) { - resources.add(new ClassPathResource(GrailsStringUtils.trimStart(location, "/"))); + resources.add(new ClassPathResource(GrailsStringUtils.trimStart(location, '/'))) } /** @@ -78,7 +77,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @param location the location of the resource. Example: /WEB-INF/grails-app/i18n/messages.properties */ void registerMockResource(String location, String contents) { - resources.add(new MockResource(GrailsStringUtils.trimStart(location, "/"), contents)); + resources.add(new MockResource(GrailsStringUtils.trimStart(location, '/'), contents)) } /** @@ -87,9 +86,9 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati */ void unregisterMockResource(String location) { for (Iterator it = resources.iterator(); it.hasNext();) { - MockResource mockResource = (MockResource) it.next(); - if (mockResource.location.equals(location)) { - it.remove(); + MockResource mockResource = (MockResource) it.next() + if (mockResource.location == location) { + it.remove() } } } @@ -99,7 +98,7 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @param location the location of the resource. Example: /WEB-INF/grails-app/i18n/messages.properties */ void registerIgnoredClassPathLocation(String location) { - ignoredClassLocations.add(location); + ignoredClassLocations.add(location) } /** @@ -107,27 +106,27 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @param location the location of the resource. Example: /WEB-INF/grails-app/i18n/messages.properties */ void unregisterIgnoredClassPathLocation(String location) { - ignoredClassLocations.remove(location); + ignoredClassLocations.remove(location) } ApplicationContext getParent() { - throw new UnsupportedOperationException("Method not supported by implementation"); + throw new UnsupportedOperationException('Method not supported by implementation') } String getId() { - return "MockApplicationContext"; + return 'MockApplicationContext' } String getApplicationName() { - return getId(); + return getId() } String getDisplayName() { - return getId(); + return getId() } long getStartupDate() { - return startupDate.getTime(); + return startupDate.getTime() } void publishEvent(ApplicationEvent event) { @@ -140,96 +139,90 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati } boolean containsBeanDefinition(String beanName) { - return beans.containsKey(beanName); + return beans.containsKey(beanName) } int getBeanDefinitionCount() { - return beans.size(); + return beans.size() } String[] getBeanDefinitionNames() { - return beans.keySet().toArray(new String[beans.keySet().size()]); + return beans.keySet() as String[] } @Override def ObjectProvider getBeanProvider(Class requiredType, boolean allowEagerInit) { - return getBeanProvider(requiredType); + return getBeanProvider(requiredType) } @Override def ObjectProvider getBeanProvider(ResolvableType requiredType, boolean allowEagerInit) { - return getBeanProvider(requiredType); + return getBeanProvider(requiredType) } @Override String[] getBeanNamesForType(ResolvableType type) { - return new String[0]; + return new String[0] } @Override String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) { - return new String[0]; + return new String[0] } - @SuppressWarnings([ "unchecked", "rawtypes" ]) + @SuppressWarnings([ 'unchecked', 'rawtypes' ]) String[] getBeanNamesForType(Class type) { - List beanNames = new ArrayList<>(); + List beanNames = [] for (String beanName in beans.keySet()) { - if (type.isAssignableFrom(beans.get(beanName).getClass())) { - beanNames.add(beanName); + if (type.isAssignableFrom(beans[beanName].getClass())) { + beanNames << beanName } } - return beanNames.toArray(new String[beanNames.size()]); + return beanNames as String[] } @SuppressWarnings('rawtypes') String[] getBeanNamesForType(Class type, boolean includePrototypes, boolean includeFactoryBeans) { - return getBeanNamesForType(type); + return getBeanNamesForType(type) } @SuppressWarnings('unchecked') def Map getBeansOfType(Class type) throws BeansException { - String[] beanNames = getBeanNamesForType(type); - Map newMap = new HashMap<>(); - for (int i = 0; i < beanNames.length; i++) { - String beanName = beanNames[i]; - newMap.put(beanName, (T) getBean(beanName)); - } - return newMap; + String[] beanNames = getBeanNamesForType(type) + Map newMap = [:] + beanNames.each { String beanName -> newMap.put(beanName, (T) getBean(beanName)) } + return newMap } def Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException { - return getBeansOfType(type); + return getBeansOfType(type) } def A findAnnotationOnBean(String name, Class annotation) { - Object o = getBean(name); - if (o != null) { - return o.getClass().getAnnotation(annotation); - } - return null; + Object o = getBean(name) + return o?.getClass()?.getAnnotation(annotation) } @Override def A findAnnotationOnBean(String beanName, Class annotationType, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { - return findAnnotationOnBean(beanName, annotationType); + return findAnnotationOnBean(beanName, annotationType) } Map getBeansWithAnnotation(Class annotation) throws BeansException { - Map submap = new HashMap<>(); + Map submap = [:] for (Object beanName in beans.keySet()) { - Object bean = beans.get(beanName); + Object bean = beans[beanName] if (bean != null && bean.getClass().getAnnotation(annotation) != null) { - submap.put(beanName.toString(), bean); + submap.put(beanName.toString(), bean) } } - return submap; + return submap } @NonNull @Override def Set findAllAnnotationsOnBean(@NonNull String beanName, @NonNull Class annotationType, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { - throw new UnsupportedOperationException("This method was added in Spring 6 API but has not yet been implemented in Grails MockApplicationContext"); + throw new UnsupportedOperationException('This method was added in Spring 6 API but has not yet been implemented in Grails MockApplicationContext') } /** @@ -240,221 +233,220 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati * @since 2.4 */ String[] getBeanNamesForAnnotation(Class annotationType) { - List beanNamesList = new ArrayList<>(); + List beanNamesList = [] for (Object beanName in beans.keySet()) { - Object bean = beans.get(beanName); + Object bean = beans[beanName] if (bean != null && bean.getClass().getAnnotation(annotationType) != null) { - beanNamesList.add(beanName.toString()); + beanNamesList << beanName.toString() } } - return beanNamesList.toArray(new String[beanNamesList.size()]); + return beanNamesList as String[] } Object getBean(String name) throws BeansException { if (!beans.containsKey(name)) { - throw new NoSuchBeanDefinitionException(name); + throw new NoSuchBeanDefinitionException(name) } - return beans.get(name); + return beans[name] } @SuppressWarnings('unchecked') def T getBean(String name, Class requiredType) throws BeansException { if (!beans.containsKey(name)) { - throw new NoSuchBeanDefinitionException(name); + throw new NoSuchBeanDefinitionException(name) } - if (requiredType != null && !requiredType.isAssignableFrom(beans.get(name).getClass())) { - throw new NoSuchBeanDefinitionException(name); + if (requiredType != null && !requiredType.isAssignableFrom(beans[name].getClass())) { + throw new NoSuchBeanDefinitionException(name) } - return (T) beans.get(name); + return (T) beans[name] } @Override - @SuppressWarnings('unchecked') def T getBean(String name, ParameterizedTypeReference requiredType) throws BeansException { - return (T) getBean(name, ResolvableType.forType(requiredType.getType()).toClass()); + return (T) getBean(name, ResolvableType.forType(requiredType.getType()).toClass()) } def T getBean(Class tClass) throws BeansException { - final Map map = getBeansOfType(tClass); + final Map map = getBeansOfType(tClass) if (map.isEmpty()) { - throw new NoSuchBeanDefinitionException(tClass, "No bean found for type: " + tClass.getName()); + throw new NoSuchBeanDefinitionException(tClass, 'No bean found for type: ' + tClass.getName()) } - return map.values().iterator().next(); + return map.values().iterator().next() } Object getBean(String name, Object... args) throws BeansException { - return getBean(name); + return getBean(name) } @Override Object getProperty(String name) { if (beans.containsKey(name)) { - return beans.get(name); + return beans.get(name) } - return super.getProperty(name); + return super.getProperty(name) } boolean containsBean(String name) { - return beans.containsKey(name); + return beans.containsKey(name) } boolean isSingleton(String name) { - throw new UnsupportedOperationException("Method not supported by implementation"); + throw new UnsupportedOperationException('Method not supported by implementation') } boolean isPrototype(String s) { - throw new UnsupportedOperationException("Method not supported by implementation"); + throw new UnsupportedOperationException('Method not supported by implementation') } @Override boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException { - return isTypeMatch(name, typeToMatch.getRawClass()); + return isTypeMatch(name, typeToMatch.getRawClass()) } @SuppressWarnings('rawtypes') boolean isTypeMatch(String name, Class aClass) { - return aClass.isInstance(getBean(name)); + return aClass.isInstance(getBean(name)) } - @SuppressWarnings([ "unchecked", "rawtypes" ]) + @SuppressWarnings([ 'unchecked', 'rawtypes' ]) Class getType(String name) throws NoSuchBeanDefinitionException { if (!beans.containsKey(name)) { - throw new NoSuchBeanDefinitionException(name); + throw new NoSuchBeanDefinitionException(name) } - return beans.get(name).getClass(); + return beans[name].getClass() } @Override Class getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException { - return getType(name); + return getType(name) } String[] getAliases(String name) { - return new String[0]; + return new String[0] } BeanFactory getParentBeanFactory() { - return null; + return null } String getMessage(String code, Object[] args, String defaultMessage, Locale locale) { - MessageSource messageSource = (MessageSource) getBean("messageSource"); + MessageSource messageSource = (MessageSource) getBean('messageSource') if (messageSource == null) { - throw new BeanCreationException("No bean [messageSource] found in MockApplicationContext"); + throw new BeanCreationException('No bean [messageSource] found in MockApplicationContext') } - return messageSource.getMessage(code, args, defaultMessage, locale); + return messageSource.getMessage(code, args, defaultMessage, locale) } String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException { - MessageSource messageSource = (MessageSource) getBean("messageSource"); + MessageSource messageSource = (MessageSource) getBean('messageSource') if (messageSource == null) { - throw new BeanCreationException("No bean [messageSource] found in MockApplicationContext"); + throw new BeanCreationException('No bean [messageSource] found in MockApplicationContext') } - return messageSource.getMessage(code, args, locale); + return messageSource.getMessage(code, args, locale) } String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException { - MessageSource messageSource = (MessageSource) getBean("messageSource"); + MessageSource messageSource = (MessageSource) getBean('messageSource') if (messageSource == null) { - throw new BeanCreationException("No bean [messageSource] found in MockApplicationContext"); + throw new BeanCreationException('No bean [messageSource] found in MockApplicationContext') } - return messageSource.getMessage(resolvable, locale); + return messageSource.getMessage(resolvable, locale) } Resource[] getResources(String locationPattern) throws IOException { - if (locationPattern.startsWith("classpath:") || locationPattern.startsWith("file:")) { - throw new UnsupportedOperationException("Location patterns 'classpath:' and 'file:' not supported by implementation"); + if (locationPattern.startsWith('classpath:') || locationPattern.startsWith('file:')) { + throw new UnsupportedOperationException("Location patterns 'classpath:' and 'file:' not supported by implementation") } - locationPattern = GrailsStringUtils.trimStart(locationPattern, "/"); // starting with "**/" is OK - List result = new ArrayList<>(); + locationPattern = GrailsStringUtils.trimStart(locationPattern, '/') // starting with "**/" is OK + List result = [] for (Resource res in resources) { - String path = res instanceof ClassPathResource ? ((ClassPathResource) res).getPath() : res.getDescription(); + String path = res instanceof ClassPathResource ? ((ClassPathResource) res).path : res.description if (pathMatcher.match(locationPattern, path)) { - result.add(res); + result << res } } - return result.toArray(new Resource[0]); + return result as Resource[] } Resource getResource(String location) { for (Resource mockResource in resources) { - if (pathMatcher.match(mockResource.getDescription(), GrailsStringUtils.trimStart(location, "/"))) { - return mockResource; + if (pathMatcher.match(mockResource.description, GrailsStringUtils.trimStart(location, '/'))) { + return mockResource } } // Check for ignored resources and return null instead of a classpath resource in that case. for (String resourceLocation in ignoredClassLocations) { if (pathMatcher.match( - GrailsStringUtils.trimStart(location, "/"), - GrailsStringUtils.trimStart(resourceLocation, "/"))) { - return null; + GrailsStringUtils.trimStart(location, '/'), + GrailsStringUtils.trimStart(resourceLocation, '/'))) { + return null } } - return new ClassPathResource(location); + return new ClassPathResource(location) } boolean containsLocalBean(String arg0) { - throw new UnsupportedOperationException("Method not supported by implementation"); + throw new UnsupportedOperationException('Method not supported by implementation') } AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException { - return new DefaultListableBeanFactory(); + return new DefaultListableBeanFactory() } ClassLoader getClassLoader() { - return getClass().getClassLoader(); + return getClass().getClassLoader() } ServletContext getServletContext() { - return servletContext; + return servletContext } void setServletContext(ServletContext servletContext) { - this.servletContext = servletContext; + this.servletContext = servletContext } Environment getEnvironment() { - return new StandardServletEnvironment(); + return new StandardServletEnvironment() } class MockResource extends AbstractResource { - private String contents = ""; - private String location; + private String contents = '' + private String location MockResource(String location) { - this.location = location; + this.location = location } MockResource(String location, String contents) { - this(location); - this.contents = contents; + this(location) + this.contents = contents } @Override boolean exists() { - return true; + return true } String getDescription() { - return location; + return location } InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)); + return new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)) } } @Override def T getBean(Class requiredType, Object... args) throws BeansException { - return getBean(requiredType); + return getBean(requiredType) } @Override @@ -462,24 +454,24 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati return new ObjectProvider() { @Override T getObject(Object... args) throws BeansException { - return (T) getBean(requiredType); + return (T) getBean(requiredType) } @Override T getIfAvailable() throws BeansException { - return (T) getBean(requiredType); + return (T) getBean(requiredType) } @Override T getIfUnique() throws BeansException { - return (T) getBean(requiredType); + return (T) getBean(requiredType) } @Override T getObject() throws BeansException { - return (T) getBean(requiredType); + return (T) getBean(requiredType) } - }; + } } @Override @@ -487,28 +479,29 @@ class MockApplicationContext extends GroovyObjectSupport implements WebApplicati return new ObjectProvider() { @Override T getObject(Object... args) throws BeansException { - return (T) getBean(requiredType.toClass()); + return (T) getBean(requiredType.toClass()) } @Override T getIfAvailable() throws BeansException { - return (T) getBean(requiredType.toClass()); + return (T) getBean(requiredType.toClass()) } @Override T getIfUnique() throws BeansException { - return (T) getBean(requiredType.toClass()); + return (T) getBean(requiredType.toClass()) } @Override T getObject() throws BeansException { - return (T) getBean(requiredType.toClass()); + return (T) getBean(requiredType.toClass()) } - }; + } } @Override def ObjectProvider getBeanProvider(ParameterizedTypeReference requiredType) { - return getBeanProvider(ResolvableType.forType(requiredType.getType())); + return getBeanProvider(ResolvableType.forType(requiredType.getType())) } + } diff --git a/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy b/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy index 33b5b66b3b2..6605a938fc1 100644 --- a/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy +++ b/grails-test-suite-base/src/test/groovy/org/grails/support/MockApplicationContextSpec.groovy @@ -142,6 +142,19 @@ class MockApplicationContextSpec extends Specification { thrown(UnsupportedOperationException) } + void 'annotated beans are found by name and listed, unannotated beans are not'() { + given: + def annotatedBean = new AnnotatedMockBean() + ctx.registerMockBean('annotated', annotatedBean) + ctx.registerMockBean('plain', 'plainBean') + + expect: + ctx.findAnnotationOnBean('annotated', Deprecated) != null + ctx.findAnnotationOnBean('plain', Deprecated) == null + ctx.getBeansWithAnnotation(Deprecated) == [annotated: annotatedBean] + ctx.getBeanNamesForAnnotation(Deprecated) == ['annotated'] as String[] + } + void 'identity and environment accessors report the mock defaults'() { expect: ctx.id == 'MockApplicationContext' @@ -162,3 +175,7 @@ class MockApplicationContextSpec extends Specification { } } + +@Deprecated +class AnnotatedMockBean { +} diff --git a/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy b/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy index 62097ce50b4..8f8de03b39c 100644 --- a/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy +++ b/grails-test-suite-web/src/test/groovy/org/grails/web/converters/Author.groovy @@ -23,27 +23,11 @@ package org.grails.web.converters * Created by jameskleeh on 2/7/17. */ class Author { - private String name - private Integer age + String name + Integer age Author(String name, Integer age) { this.name = name this.age = age } - - String getName() { - return name - } - - void setName(String name) { - this.name = name - } - - Integer getAge() { - return age - } - - void setAge(Integer age) { - this.age = age - } } diff --git a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy index 40dab8954a5..6c9d2527b9e 100644 --- a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy +++ b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/GroovyPageUnitTestResourceLoader.groovy @@ -60,11 +60,11 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements location = location.substring(WEB_INF_PREFIX.length()) } if (groovyPages.containsKey(location)) { - return new ByteArrayResource(groovyPages.get(location).getBytes(StandardCharsets.UTF_8), location) + return new ByteArrayResource(groovyPages[location].getBytes(StandardCharsets.UTF_8), location) } if (basePath == null) { - String basedir = BuildSettings.BASE_DIR.getAbsolutePath() + String basedir = BuildSettings.BASE_DIR.absolutePath basePath = basedir + File.separatorChar + GrailsResourceUtils.VIEWS_DIR_PATH } @@ -75,7 +75,7 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements private String makeCanonical(String path) { try { - return new File(path).getCanonicalPath() + return new File(path).canonicalPath } catch (IOException e) { return path } @@ -88,8 +88,8 @@ class GroovyPageUnitTestResourceLoader extends DefaultResourceLoader implements @Override void afterPropertiesSet() throws Exception { - if (grailsApplication != null) { - Config config = grailsApplication.getConfig() + if (grailsApplication) { + Config config = grailsApplication.config String viewDir = config.getProperty(Settings.GSP_VIEWS_DIR) if (viewDir != null) { basePath = viewDir diff --git a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy index 06c5b5c49c5..4ac939c3657 100644 --- a/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy +++ b/grails-testing-support-web/src/main/groovy/org/grails/testing/runtime/support/LazyTagLibraryLookup.groovy @@ -41,20 +41,20 @@ class LazyTagLibraryLookup extends TagLibraryLookup { private Map lazyLoadableTagLibs = new HashMap<>() LazyTagLibraryLookup() { - List mockedClasses = new ArrayList<>((List) new GroovyPagesGrailsPlugin().getProvidedArtefacts()) + List mockedClasses = new ArrayList<>((List) new GroovyPagesGrailsPlugin().providedArtefacts) ClassLoader classLoader = LazyTagLibraryLookup.getClassLoader() if (ClassUtils.isPresent('org.apache.grails.web.layout.LayoutGrailsPlugin', classLoader)) { // sitemesh2 support try { - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.GrailsLayoutTagLib')) - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.RenderGrailsLayoutTagLib')) + mockedClasses << Class.forName('org.grails.plugins.web.taglib.GrailsLayoutTagLib') + mockedClasses << Class.forName('org.grails.plugins.web.taglib.RenderGrailsLayoutTagLib') } catch (Exception ignored) { } } if (ClassUtils.isPresent('org.grails.plugins.sitemesh3.Sitemesh3GrailsPlugin', classLoader)) { try { - mockedClasses.add(Class.forName('org.grails.plugins.web.taglib.RenderSitemeshTagLib')) + mockedClasses << Class.forName('org.grails.plugins.web.taglib.RenderSitemeshTagLib') } catch (Exception ignored) { } @@ -99,11 +99,11 @@ class LazyTagLibraryLookup extends TagLibraryLookup { } catch (Exception ignored) { } - if (!hasNamespace(grailsTagLibClass.getNamespace())) { - registerNamespaceDispatcher(grailsTagLibClass.getNamespace()) + if (!hasNamespace(grailsTagLibClass.namespace)) { + registerNamespaceDispatcher(grailsTagLibClass.namespace) } - for (String tagName in grailsTagLibClass.getTagNames()) { - String tagKey = tagNameKey(grailsTagLibClass.getNamespace(), tagName) + for (String tagName in grailsTagLibClass.tagNames) { + String tagKey = tagNameKey(grailsTagLibClass.namespace, tagName) lazyLoadableTagLibs.put(tagKey, grailsTagLibClass) } } @@ -113,14 +113,14 @@ class LazyTagLibraryLookup extends TagLibraryLookup { GroovyObject tagLibrary = super.lookupTagLibrary(namespace, tagName) if (tagLibrary == null) { String tagKey = tagNameKey(namespace, tagName) - GrailsTagLibClass taglibClass = lazyLoadableTagLibs.get(tagKey) - if (taglibClass != null) { - if (!applicationContext.containsBean(taglibClass.getFullName())) { + GrailsTagLibClass taglibClass = lazyLoadableTagLibs[tagKey] + if (taglibClass) { + if (!applicationContext.containsBean(taglibClass.fullName)) { GenericBeanDefinition bd = new GenericBeanDefinition() - bd.setBeanClass(taglibClass.getClazz()) - bd.setAutowireCandidate(true) - bd.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME) - ((GenericApplicationContext) applicationContext).getDefaultListableBeanFactory().registerBeanDefinition(taglibClass.getFullName(), bd) + bd.beanClass = taglibClass.clazz + bd.autowireCandidate = true + bd.autowireMode = AbstractBeanDefinition.AUTOWIRE_BY_NAME + ((GenericApplicationContext) applicationContext).defaultListableBeanFactory.registerBeanDefinition(taglibClass.fullName, bd) } registerTagLib(taglibClass) tagLibrary = super.lookupTagLibrary(namespace, tagName) @@ -130,12 +130,12 @@ class LazyTagLibraryLookup extends TagLibraryLookup { } protected String tagNameKey(String namespace, String tagName) { - return namespace + ':' + tagName + return "${namespace}:${tagName}" } @Override protected void putTagLib(Map tags, String name, GrailsTagLibClass taglib) { - if (applicationContext.containsBean(taglib.getFullName())) { + if (applicationContext.containsBean(taglib.fullName)) { super.putTagLib(tags, name, taglib) } }