From 62a6c3733d995483d43ef9eb667ac672a7b84df6 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 29 Dec 2014 20:06:57 +0100 Subject: [PATCH] Polishing (cherry picked from commit e9d24d5) --- .../AnnotationBeanNameGenerator.java | 4 +-- .../ConfigurationClassEnhancer.java | 5 ++- .../AbstractApplicationEventMulticaster.java | 2 +- .../jmx/access/MBeanClientInterceptor.java | 33 ++++++++++--------- .../springframework/jmx/support/JmxUtils.java | 14 ++++---- .../core/BridgeMethodResolver.java | 21 ++++++------ .../http/client/ClientHttpRequest.java | 9 ++--- .../http/client/ClientHttpResponse.java | 11 ++++--- .../view/freemarker/FreeMarkerMacroTests.java | 6 ++-- .../view/freemarker/FreeMarkerViewTests.java | 27 ++++++++------- 10 files changed, 67 insertions(+), 65 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java index a3d0d725551..a0f8312aa77 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.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. @@ -139,7 +139,7 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { *

The default implementation simply builds a decapitalized version * of the short class name: e.g. "mypackage.MyJdbcDao" -> "myJdbcDao". *

Note that inner classes will thus have names of the form - * "outerClassName.innerClassName", which because of the period in the + * "outerClassName.InnerClassName", which because of the period in the * name may be an issue if you are autowiring by name. * @param definition the bean definition to build a bean name for * @return the default bean name (never {@code null}) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java index ea26af6fb88..fcc6818f15e 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java @@ -240,9 +240,8 @@ class ConfigurationClassEnhancer { /** * Enhance a {@link Bean @Bean} method to check the supplied BeanFactory for the * existence of this bean object. - * @throws Throwable as a catch-all for any exception that may be thrown when - * invoking the super implementation of the proxied method i.e., the actual - * {@code @Bean} method. + * @throws Throwable as a catch-all for any exception that may be thrown when invoking the + * super implementation of the proxied method i.e., the actual {@code @Bean} method */ public Object intercept(Object enhancedConfigInstance, Method beanMethod, Object[] beanMethodArgs, MethodProxy cglibMethodProxy) throws Throwable { diff --git a/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java b/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java index 6b847f49463..87d7c38f59f 100644 --- a/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java +++ b/spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java @@ -227,7 +227,7 @@ public abstract class AbstractApplicationEventMulticaster * for the given event type */ protected boolean supportsEvent( - ApplicationListener listener, Class eventType, Class sourceType) { + ApplicationListener listener, Class eventType, Class sourceType) { SmartApplicationListener smartListener = (listener instanceof SmartApplicationListener ? (SmartApplicationListener) listener : new GenericApplicationListenerAdapter(listener)); diff --git a/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java b/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java index 36894535ed3..158d0f75bc7 100644 --- a/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java +++ b/spring-context/src/main/java/org/springframework/jmx/access/MBeanClientInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 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. @@ -107,7 +107,7 @@ public class MBeanClientInterceptor private boolean useStrictCasing = true; - private Class managementInterface; + private Class managementInterface; private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); @@ -215,7 +215,7 @@ public class MBeanClientInterceptor * setters and getters for MBean attributes and conventional Java methods * for MBean operations. */ - public void setManagementInterface(Class managementInterface) { + public void setManagementInterface(Class managementInterface) { this.managementInterface = managementInterface; } @@ -223,7 +223,7 @@ public class MBeanClientInterceptor * Return the management interface of the target MBean, * or {@code null} if none specified. */ - protected final Class getManagementInterface() { + protected final Class getManagementInterface() { return this.managementInterface; } @@ -262,7 +262,7 @@ public class MBeanClientInterceptor this.invocationHandler = null; if (this.useStrictCasing) { // Use the JDK's own MBeanServerInvocationHandler, - // in particular for native MXBean support on Java 6. + // in particular for native MXBean support on Java 6+. if (JmxUtils.isMXBeanSupportAvailable()) { this.invocationHandler = new MBeanServerInvocationHandler(this.serverToUse, this.objectName, @@ -297,7 +297,7 @@ public class MBeanClientInterceptor MBeanOperationInfo[] operationInfo = info.getOperations(); this.allowedOperations = new HashMap(operationInfo.length); for (MBeanOperationInfo infoEle : operationInfo) { - Class[] paramTypes = JmxUtils.parameterInfoToTypes(infoEle.getSignature(), this.beanClassLoader); + Class[] paramTypes = JmxUtils.parameterInfoToTypes(infoEle.getSignature(), this.beanClassLoader); this.allowedOperations.put(new MethodCacheKey(infoEle.getName(), paramTypes), infoEle); } } @@ -531,7 +531,7 @@ public class MBeanClientInterceptor * is necessary */ protected Object convertResultValueIfNecessary(Object result, MethodParameter parameter) { - Class targetClass = parameter.getParameterType(); + Class targetClass = parameter.getParameterType(); try { if (result == null) { return null; @@ -549,7 +549,7 @@ public class MBeanClientInterceptor return convertDataArrayToTargetArray(array, targetClass); } else if (Collection.class.isAssignableFrom(targetClass)) { - Class elementType = GenericCollectionTypeResolver.getCollectionParameterType(parameter); + Class elementType = GenericCollectionTypeResolver.getCollectionParameterType(parameter); if (elementType != null) { return convertDataArrayToTargetCollection(array, targetClass, elementType); } @@ -565,7 +565,7 @@ public class MBeanClientInterceptor return convertDataArrayToTargetArray(array, targetClass); } else if (Collection.class.isAssignableFrom(targetClass)) { - Class elementType = GenericCollectionTypeResolver.getCollectionParameterType(parameter); + Class elementType = GenericCollectionTypeResolver.getCollectionParameterType(parameter); if (elementType != null) { return convertDataArrayToTargetCollection(array, targetClass, elementType); } @@ -581,8 +581,8 @@ public class MBeanClientInterceptor } } - private Object convertDataArrayToTargetArray(Object[] array, Class targetClass) throws NoSuchMethodException { - Class targetType = targetClass.getComponentType(); + private Object convertDataArrayToTargetArray(Object[] array, Class targetClass) throws NoSuchMethodException { + Class targetType = targetClass.getComponentType(); Method fromMethod = targetType.getMethod("from", array.getClass().getComponentType()); Object resultArray = Array.newInstance(targetType, array.length); for (int i = 0; i < array.length; i++) { @@ -592,11 +592,11 @@ public class MBeanClientInterceptor } @SuppressWarnings("unchecked") - private Collection convertDataArrayToTargetCollection(Object[] array, Class collectionType, Class elementType) + private Collection convertDataArrayToTargetCollection(Object[] array, Class collectionType, Class elementType) throws NoSuchMethodException { Method fromMethod = elementType.getMethod("from", array.getClass().getComponentType()); - Collection resultColl = CollectionFactory.createCollection(collectionType, Array.getLength(array)); + Collection resultColl = CollectionFactory.createCollection(collectionType, Array.getLength(array)); for (int i = 0; i < array.length; i++) { resultColl.add(ReflectionUtils.invokeMethod(fromMethod, null, array[i])); } @@ -608,6 +608,7 @@ public class MBeanClientInterceptor this.connector.close(); } + /** * Simple wrapper class around a method name and its signature. * Used as the key when caching methods. @@ -616,7 +617,7 @@ public class MBeanClientInterceptor private final String name; - private final Class[] parameterTypes; + private final Class[] parameterTypes; /** * Create a new instance of {@code MethodCacheKey} with the supplied @@ -624,9 +625,9 @@ public class MBeanClientInterceptor * @param name the name of the method * @param parameterTypes the arguments in the method signature */ - public MethodCacheKey(String name, Class[] parameterTypes) { + public MethodCacheKey(String name, Class[] parameterTypes) { this.name = name; - this.parameterTypes = (parameterTypes != null ? parameterTypes : new Class[0]); + this.parameterTypes = (parameterTypes != null ? parameterTypes : new Class[0]); } @Override diff --git a/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java b/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java index 1308f350876..a4f84b0dd0b 100644 --- a/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java +++ b/spring-context/src/main/java/org/springframework/jmx/support/JmxUtils.java @@ -145,7 +145,7 @@ public abstract class JmxUtils { * @return the parameter types as classes * @throws ClassNotFoundException if a parameter type could not be resolved */ - public static Class[] parameterInfoToTypes(MBeanParameterInfo[] paramInfo) throws ClassNotFoundException { + public static Class[] parameterInfoToTypes(MBeanParameterInfo[] paramInfo) throws ClassNotFoundException { return parameterInfoToTypes(paramInfo, ClassUtils.getDefaultClassLoader()); } @@ -157,12 +157,12 @@ public abstract class JmxUtils { * @return the parameter types as classes * @throws ClassNotFoundException if a parameter type could not be resolved */ - public static Class[] parameterInfoToTypes(MBeanParameterInfo[] paramInfo, ClassLoader classLoader) + public static Class[] parameterInfoToTypes(MBeanParameterInfo[] paramInfo, ClassLoader classLoader) throws ClassNotFoundException { - Class[] types = null; + Class[] types = null; if (paramInfo != null && paramInfo.length > 0) { - types = new Class[paramInfo.length]; + types = new Class[paramInfo.length]; for (int x = 0; x < paramInfo.length; x++) { types[x] = ClassUtils.forName(paramInfo[x].getType(), classLoader); } @@ -178,7 +178,7 @@ public abstract class JmxUtils { * @return the signature as array of argument types */ public static String[] getMethodSignature(Method method) { - Class[] types = method.getParameterTypes(); + Class[] types = method.getParameterTypes(); String[] signature = new String[types.length]; for (int x = 0; x < types.length; x++) { signature[x] = types[x].getName(); @@ -282,7 +282,7 @@ public abstract class JmxUtils { return null; } String mbeanInterfaceName = clazz.getName() + MBEAN_SUFFIX; - Class[] implementedInterfaces = clazz.getInterfaces(); + Class[] implementedInterfaces = clazz.getInterfaces(); for (Class iface : implementedInterfaces) { if (iface.getName().equals(mbeanInterfaceName)) { return iface; @@ -302,7 +302,7 @@ public abstract class JmxUtils { if (clazz == null || clazz.getSuperclass() == null) { return null; } - Class[] implementedInterfaces = clazz.getInterfaces(); + Class[] implementedInterfaces = clazz.getInterfaces(); for (Class iface : implementedInterfaces) { boolean isMxBean = iface.getName().endsWith(MXBEAN_SUFFIX); if (mxBeanAnnotationAvailable) { diff --git a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java index 1027d4dfc9d..62c33d1a798 100644 --- a/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.java +++ b/spring-core/src/main/java/org/springframework/core/BridgeMethodResolver.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. @@ -143,7 +143,7 @@ public abstract class BridgeMethodResolver { */ private static Method findGenericDeclaration(Method bridgeMethod) { // Search parent types for method that has same signature as bridge. - Class superclass = bridgeMethod.getDeclaringClass().getSuperclass(); + Class superclass = bridgeMethod.getDeclaringClass().getSuperclass(); while (superclass != null && !Object.class.equals(superclass)) { Method method = searchForMatch(superclass, bridgeMethod); if (method != null && !method.isBridge()) { @@ -153,8 +153,8 @@ public abstract class BridgeMethodResolver { } // Search interfaces. - Class[] interfaces = ClassUtils.getAllInterfacesForClass(bridgeMethod.getDeclaringClass()); - for (Class ifc : interfaces) { + Class[] interfaces = ClassUtils.getAllInterfacesForClass(bridgeMethod.getDeclaringClass()); + for (Class ifc : interfaces) { Method method = searchForMatch(ifc, bridgeMethod); if (method != null && !method.isBridge()) { return method; @@ -174,13 +174,13 @@ public abstract class BridgeMethodResolver { Method genericMethod, Method candidateMethod, Map typeVariableMap) { Type[] genericParameters = genericMethod.getGenericParameterTypes(); - Class[] candidateParameters = candidateMethod.getParameterTypes(); + Class[] candidateParameters = candidateMethod.getParameterTypes(); if (genericParameters.length != candidateParameters.length) { return false; } for (int i = 0; i < genericParameters.length; i++) { Type genericParameter = genericParameters[i]; - Class candidateParameter = candidateParameters[i]; + Class candidateParameter = candidateParameters[i]; if (candidateParameter.isArray()) { // An array type: compare the component type. Type rawType = GenericTypeResolver.getRawType(genericParameter, typeVariableMap); @@ -193,7 +193,7 @@ public abstract class BridgeMethodResolver { } } // A non-array type: compare the type itself. - Class resolvedParameter = GenericTypeResolver.resolveType(genericParameter, typeVariableMap); + Class resolvedParameter = GenericTypeResolver.resolveType(genericParameter, typeVariableMap); if (!candidateParameter.equals(resolvedParameter)) { return false; } @@ -206,7 +206,7 @@ public abstract class BridgeMethodResolver { * that of the supplied {@link Method}, then this matching {@link Method} is returned, * otherwise {@code null} is returned. */ - private static Method searchForMatch(Class type, Method bridgeMethod) { + private static Method searchForMatch(Class type, Method bridgeMethod) { return ReflectionUtils.findMethod(type, bridgeMethod.getName(), bridgeMethod.getParameterTypes()); } @@ -221,9 +221,8 @@ public abstract class BridgeMethodResolver { if (bridgeMethod == bridgedMethod) { return true; } - return Arrays.equals(bridgeMethod.getParameterTypes(), bridgedMethod.getParameterTypes()) && - bridgeMethod.getReturnType().equals(bridgedMethod.getReturnType()); + return (Arrays.equals(bridgeMethod.getParameterTypes(), bridgedMethod.getParameterTypes()) && + bridgeMethod.getReturnType().equals(bridgedMethod.getReturnType())); } - } diff --git a/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequest.java index 7137365507d..66319033b22 100644 --- a/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/ClientHttpRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 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. @@ -23,10 +23,11 @@ import org.springframework.http.HttpOutputMessage; import org.springframework.http.HttpRequest; /** - * Represents a client-side HTTP request. Created via an implementation of the {@link ClientHttpRequestFactory}. + * Represents a client-side HTTP request. + * Created via an implementation of the {@link ClientHttpRequestFactory}. * - *

A {@code HttpRequest} can be {@linkplain #execute() executed}, getting a {@link ClientHttpResponse} - * which can be read from. + *

A {@code ClientHttpRequest} can be {@linkplain #execute() executed}, + * receiving a {@link ClientHttpResponse} which can be read from. * * @author Arjen Poutsma * @since 3.0 diff --git a/spring-web/src/main/java/org/springframework/http/client/ClientHttpResponse.java b/spring-web/src/main/java/org/springframework/http/client/ClientHttpResponse.java index 438f8035bdf..7ec5be9bd2b 100644 --- a/spring-web/src/main/java/org/springframework/http/client/ClientHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/client/ClientHttpResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 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. @@ -23,10 +23,11 @@ import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpStatus; /** - * Represents a client-side HTTP response. Obtained via an calling of the {@link ClientHttpRequest#execute()}. + * Represents a client-side HTTP response. + * Obtained via an calling of the {@link ClientHttpRequest#execute()}. * - *

A {@code ClientHttpResponse} must be {@linkplain #close() closed}, typically in a - * {@code finally} block. + *

A {@code ClientHttpResponse} must be {@linkplain #close() closed}, + * typically in a {@code finally} block. * * @author Arjen Poutsma * @since 3.0 @@ -55,7 +56,7 @@ public interface ClientHttpResponse extends HttpInputMessage, Closeable { String getStatusText() throws IOException; /** - * Closes this response, freeing any resources created. + * Close this response, freeing any resources created. */ void close(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java index afb6cfc87ae..7c4b635afe0 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerMacroTests.java @@ -73,7 +73,7 @@ public class FreeMarkerMacroTests { // final Template expectedTemplate = new Template(); fc = new FreeMarkerConfigurer(); - fc.setTemplateLoaderPaths(new String[] { "classpath:/", "file://" + System.getProperty("java.io.tmpdir") }); + fc.setTemplateLoaderPaths("classpath:/", "file://" + System.getProperty("java.io.tmpdir")); fc.afterPropertiesSet(); wac.getDefaultListableBeanFactory().registerSingleton("freeMarkerConfigurer", fc); @@ -86,6 +86,7 @@ public class FreeMarkerMacroTests { response = new MockHttpServletResponse(); } + @Test public void testExposeSpringMacroHelpers() throws Exception { FreeMarkerView fv = new FreeMarkerView() { @@ -128,7 +129,8 @@ public class FreeMarkerMacroTests { try { fv.render(model, request, response); - } catch (Exception ex) { + } + catch (Exception ex) { assertTrue(ex instanceof ServletException); assertTrue(ex.getMessage().contains(FreeMarkerView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE)); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.java index 0131151f0e9..330399afcb9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/freemarker/FreeMarkerViewTests.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. @@ -23,10 +23,14 @@ import java.io.Writer; import java.util.HashMap; import java.util.Locale; import java.util.Map; - import javax.servlet.http.HttpServletResponse; +import freemarker.ext.servlet.AllHttpScopesHashModel; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; import org.junit.Test; + import org.springframework.context.ApplicationContextException; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; @@ -40,11 +44,6 @@ import org.springframework.web.servlet.view.AbstractView; import org.springframework.web.servlet.view.InternalResourceView; import org.springframework.web.servlet.view.RedirectView; -import freemarker.ext.servlet.AllHttpScopesHashModel; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; - import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; @@ -70,7 +69,7 @@ public class FreeMarkerViewTests { } catch (ApplicationContextException ex) { // Check there's a helpful error message - assertTrue(ex.getMessage().indexOf("FreeMarkerConfig") != -1); + assertTrue(ex.getMessage().contains("FreeMarkerConfig")); } } @@ -83,7 +82,7 @@ public class FreeMarkerViewTests { } catch (IllegalArgumentException ex) { // Check there's a helpful error message - assertTrue(ex.getMessage().indexOf("url") != -1); + assertTrue(ex.getMessage().contains("url")); } } @@ -94,7 +93,7 @@ public class FreeMarkerViewTests { WebApplicationContext wac = mock(WebApplicationContext.class); MockServletContext sc = new MockServletContext(); - Map configs = new HashMap(); + Map configs = new HashMap(); FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setConfiguration(new TestConfiguration()); configs.put("configurer", configurer); @@ -110,7 +109,7 @@ public class FreeMarkerViewTests { request.setAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE, new AcceptHeaderLocaleResolver()); HttpServletResponse response = new MockHttpServletResponse(); - Map model = new HashMap(); + Map model = new HashMap(); model.put("myattr", "myvalue"); fv.render(model, request, response); @@ -124,7 +123,7 @@ public class FreeMarkerViewTests { WebApplicationContext wac = mock(WebApplicationContext.class); MockServletContext sc = new MockServletContext(); - Map configs = new HashMap(); + Map configs = new HashMap(); FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setConfiguration(new TestConfiguration()); configs.put("configurer", configurer); @@ -141,7 +140,7 @@ public class FreeMarkerViewTests { HttpServletResponse response = new MockHttpServletResponse(); response.setContentType("myContentType"); - Map model = new HashMap(); + Map model = new HashMap(); model.put("myattr", "myvalue"); fv.render(model, request, response); @@ -185,7 +184,7 @@ public class FreeMarkerViewTests { @Override public Template getTemplate(String name, final Locale locale) throws IOException { if (name.equals("templateName") || name.equals("prefix_test_suffix")) { - return new Template(name, new StringReader("test")) { + return new Template(name, new StringReader("test"), this) { @Override public void process(Object model, Writer writer) throws TemplateException, IOException { assertEquals(Locale.US, locale);