From ffaac0ecf3e7cec69ed556a3e7e4aa226ae181f4 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 18 Apr 2014 13:23:05 +0200 Subject: [PATCH] Polishing --- .../aop/framework/CglibAopProxy.java | 12 +- .../NestedConfigurationClassTests.java | 103 +++++++++++++++++- .../tests/sample/beans/Employee.java | 10 -- .../support/ObjectToStringConverter.java | 3 +- .../metadata/HsqlTableMetaDataProvider.java | 7 +- .../PostgresTableMetaDataProvider.java | 13 ++- .../jdbc/object/StoredProcedure.java | 4 +- .../incrementer/DerbyMaxValueIncrementer.java | 5 +- .../SqlServerMaxValueIncrementer.java | 32 ++++-- .../SybaseAnywhereMaxValueIncrementer.java | 4 +- .../SybaseMaxValueIncrementer.java | 20 ++-- .../AbstractHttpMessageConverter.java | 11 +- 12 files changed, 164 insertions(+), 60 deletions(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java index e08640904fc..227dfddfded 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CglibAopProxy.java @@ -260,7 +260,7 @@ final class CglibAopProxy implements AopProxy, Serializable { if (!Object.class.equals(method.getDeclaringClass()) && !Modifier.isStatic(method.getModifiers()) && Modifier.isFinal(method.getModifiers())) { logger.warn("Unable to proxy method [" + method + "] because it is final: " + - "All calls to this method via a proxy will be routed directly to the proxy."); + "All calls to this method via a proxy will NOT be routed to the target instance."); } } } @@ -594,7 +594,7 @@ final class CglibAopProxy implements AopProxy, Serializable { */ private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable { - private AdvisedSupport advised; + private final AdvisedSupport advised; public DynamicAdvisedInterceptor(AdvisedSupport advised) { this.advised = advised; @@ -611,8 +611,8 @@ final class CglibAopProxy implements AopProxy, Serializable { oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } - // May be null Get as late as possible to minimize the time we - // "own" the target, in case it comes from a pool. + // May be null. Get as late as possible to minimize the time we + // "own" the target, in case it comes from a pool... target = getTarget(); if (target != null) { targetClass = target.getClass(); @@ -817,8 +817,8 @@ final class CglibAopProxy implements AopProxy, Serializable { // of the target type. If so we know it never needs to have return type // massage and can use a dispatcher. // If the proxy is being exposed, then must use the interceptor the - // correct one is already configured. If the target is not static cannot - // use a Dispatcher because the target can not then be released. + // correct one is already configured. If the target is not static, then + // cannot use a dispatcher because the target cannot be released. if (exposeProxy || !isStatic) { return INVOKE_TARGET; } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/NestedConfigurationClassTests.java b/spring-context/src/test/java/org/springframework/context/annotation/NestedConfigurationClassTests.java index f4957319d5c..f56510d2eba 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/NestedConfigurationClassTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/NestedConfigurationClassTests.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,19 +16,20 @@ package org.springframework.context.annotation; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; - import org.junit.Test; +import org.springframework.stereotype.Component; import org.springframework.tests.sample.beans.TestBean; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + /** * Tests ensuring that nested static @Configuration classes are automatically detected * and registered without the need for explicit registration or @Import. See SPR-8186. * * @author Chris Beams + * @author Juergen Hoeller * @since 3.1 */ public class NestedConfigurationClassTests { @@ -89,9 +90,40 @@ public class NestedConfigurationClassTests { assertThat(ctx.getBean("overrideBean", TestBean.class).getName(), is("override-s1")); } + @Test + public void twoLevelsInLiteMode() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.register(L0ConfigLight.class); + ctx.refresh(); + + ctx.getBean(L0ConfigLight.class); + ctx.getBean("l0Bean"); + + ctx.getBean(L0ConfigLight.L1ConfigLight.class); + ctx.getBean("l1Bean"); + + ctx.getBean(L0ConfigLight.L1ConfigLight.L2ConfigLight.class); + ctx.getBean("l2Bean"); + + // ensure that override order is correct + assertThat(ctx.getBean("overrideBean", TestBean.class).getName(), is("override-l0")); + } + + @Test + public void twoLevelsWithNoBeanMethods() { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + ctx.register(L0ConfigEmpty.class); + ctx.refresh(); + + ctx.getBean(L0ConfigEmpty.class); + ctx.getBean(L0ConfigEmpty.L1ConfigEmpty.class); + ctx.getBean(L0ConfigEmpty.L1ConfigEmpty.L2ConfigEmpty.class); + } + @Configuration static class L0Config { + @Bean public TestBean l0Bean() { return new TestBean("l0"); @@ -104,6 +136,7 @@ public class NestedConfigurationClassTests { @Configuration static class L1Config { + @Bean public TestBean l1Bean() { return new TestBean("l1"); @@ -116,6 +149,50 @@ public class NestedConfigurationClassTests { @Configuration protected static class L2Config { + + @Bean + public TestBean l2Bean() { + return new TestBean("l2"); + } + + @Bean + public TestBean overrideBean() { + return new TestBean("override-l2"); + } + } + } + } + + + @Component + static class L0ConfigLight { + + @Bean + public TestBean l0Bean() { + return new TestBean("l0"); + } + + @Bean + public TestBean overrideBean() { + return new TestBean("override-l0"); + } + + @Component + static class L1ConfigLight { + + @Bean + public TestBean l1Bean() { + return new TestBean("l1"); + } + + @Bean + public TestBean overrideBean() { + return new TestBean("override-l1"); + } + + @Component + protected static class L2ConfigLight { + @Bean public TestBean l2Bean() { return new TestBean("l2"); @@ -130,8 +207,22 @@ public class NestedConfigurationClassTests { } + @Component + static class L0ConfigEmpty { + + @Component + static class L1ConfigEmpty { + + @Component + protected static class L2ConfigEmpty { + } + } + } + + @Configuration static class S1Config extends L0Config { + @Override @Bean public TestBean overrideBean() { @@ -139,4 +230,4 @@ public class NestedConfigurationClassTests { } } -} \ No newline at end of file +} diff --git a/spring-context/src/test/java/org/springframework/tests/sample/beans/Employee.java b/spring-context/src/test/java/org/springframework/tests/sample/beans/Employee.java index 7bed71f394b..40301c7a24b 100644 --- a/spring-context/src/test/java/org/springframework/tests/sample/beans/Employee.java +++ b/spring-context/src/test/java/org/springframework/tests/sample/beans/Employee.java @@ -1,4 +1,3 @@ - /* * Copyright 2002-2012 the original author or authors. * @@ -17,19 +16,10 @@ package org.springframework.tests.sample.beans; -import org.springframework.tests.sample.beans.TestBean; - public class Employee extends TestBean { private String co; - /** - * Constructor for Employee. - */ - public Employee() { - super(); - } - public String getCompany() { return co; } diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToStringConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToStringConverter.java index 37be40401e3..420183b3e0c 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToStringConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/ObjectToStringConverter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 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. @@ -20,6 +20,7 @@ import org.springframework.core.convert.converter.Converter; /** * Simply calls {@link Object#toString()} to convert a source Object to a String. + * * @author Keith Donald * @since 3.0 */ diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/HsqlTableMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/HsqlTableMetaDataProvider.java index 3020a58ee00..1ef669a904b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/HsqlTableMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/HsqlTableMetaDataProvider.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. @@ -20,8 +20,9 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; /** - * The HSQL specific implementation of the {@link TableMetaDataProvider}. - * Supports a feature for retreiving generated keys without the JDBC 3.0 getGeneratedKeys support. + * The HSQL specific implementation of {@link TableMetaDataProvider}. + * Supports a feature for retrieving generated keys without the JDBC 3.0 + * {@code getGeneratedKeys} support. * * @author Thomas Risberg * @since 2.5 diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java index 000ffc40c70..da5cc30f181 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/PostgresTableMetaDataProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 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. @@ -20,8 +20,9 @@ import java.sql.DatabaseMetaData; import java.sql.SQLException; /** - * The PostgreSQL specific implementation of the {@link org.springframework.jdbc.core.metadata.TableMetaDataProvider}. - * Suports a feature for retreiving generated keys without the JDBC 3.0 getGeneratedKeys support. + * The PostgreSQL specific implementation of {@link TableMetaDataProvider}. + * Supports a feature for retrieving generated keys without the JDBC 3.0 + * {@code getGeneratedKeys} support. * * @author Thomas Risberg * @since 2.5 @@ -38,7 +39,10 @@ public class PostgresTableMetaDataProvider extends GenericTableMetaDataProvider return true; } else { - logger.warn("PostgreSQL does not support getGeneratedKeys or INSERT ... RETURNING in version " + getDatabaseVersion()); + if (logger.isWarnEnabled()) { + logger.warn("PostgreSQL does not support getGeneratedKeys or INSERT ... RETURNING in version " + + getDatabaseVersion()); + } return false; } } @@ -47,4 +51,5 @@ public class PostgresTableMetaDataProvider extends GenericTableMetaDataProvider public String getSimpleQueryForGetGeneratedKey(String tableName, String keyColumnName) { return "RETURNING " + keyColumnName; } + } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java b/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java index 2fc21917c56..c359b49f2c0 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/object/StoredProcedure.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. @@ -16,8 +16,8 @@ package org.springframework.jdbc.object; -import java.util.Map; import java.util.HashMap; +import java.util.Map; import javax.sql.DataSource; import org.springframework.dao.DataAccessException; diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/DerbyMaxValueIncrementer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/DerbyMaxValueIncrementer.java index 39c5245e27f..75b4e10d202 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/DerbyMaxValueIncrementer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/DerbyMaxValueIncrementer.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. @@ -20,7 +20,6 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; - import javax.sql.DataSource; import org.springframework.dao.DataAccessException; @@ -51,7 +50,7 @@ import org.springframework.jdbc.support.JdbcUtils; * is rolled back, the unused values will never be served. The maximum hole size in * numbering is consequently the value of cacheSize. * - * HINT: Since Derby supports the JDBC 3.0 {@code getGeneratedKeys} method, + * HINT: Since Derby supports the JDBC 3.0 {@code getGeneratedKeys} method, * it is recommended to use IDENTITY columns directly in the tables and then utilizing * a {@link org.springframework.jdbc.support.KeyHolder} when calling the with the * {@code update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)} diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SqlServerMaxValueIncrementer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SqlServerMaxValueIncrementer.java index ddcbae69298..a864fec5be5 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SqlServerMaxValueIncrementer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SqlServerMaxValueIncrementer.java @@ -1,16 +1,32 @@ +/* + * 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. + * 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.jdbc.support.incrementer; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import javax.sql.DataSource; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.Statement; -import java.sql.ResultSet; -import java.sql.SQLException; - /** * {@link DataFieldMaxValueIncrementer} that increments the maximum value of a given SQL Server table * with the equivalent of an auto-increment column. Note: If you use this class, your Derby key @@ -32,8 +48,8 @@ import java.sql.SQLException; * is rolled back, the unused values will never be served. The maximum hole size in * numbering is consequently the value of cacheSize. * - * HINT: Since Microsoft SQL Server supports the JDBC 3.0 {@code getGeneratedKeys} method, - * it is recommended to use IDENTITY columns directly in the tables and then using a + * HINT: Since Microsoft SQL Server supports the JDBC 3.0 {@code getGeneratedKeys} + * method, it is recommended to use IDENTITY columns directly in the tables and then using a * {@link org.springframework.jdbc.core.simple.SimpleJdbcInsert} or utilizing * a {@link org.springframework.jdbc.support.KeyHolder} when calling the with the * {@code update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)} diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java index ec863daff15..726fdb5fa43 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.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. @@ -40,7 +40,7 @@ import javax.sql.DataSource; * is rolled back, the unused values will never be served. The maximum hole size in * numbering is consequently the value of cacheSize. * - * HINT: Since Sybase Anywhere supports the JDBC 3.0 {@code getGeneratedKeys} method, + * HINT: Since Sybase Anywhere supports the JDBC 3.0 {@code getGeneratedKeys} method, * it is recommended to use IDENTITY columns directly in the tables and then using a * {@link org.springframework.jdbc.core.simple.SimpleJdbcInsert} or utilizing * a {@link org.springframework.jdbc.support.KeyHolder} when calling the with the diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java index eeb20c00008..6c86bc9435b 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.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. @@ -16,17 +16,17 @@ package org.springframework.jdbc.support.incrementer; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import javax.sql.DataSource; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.Statement; -import java.sql.ResultSet; -import java.sql.SQLException; - /** * {@link DataFieldMaxValueIncrementer} that increments * the maximum value of a given Sybase SQL Server table @@ -49,7 +49,7 @@ import java.sql.SQLException; * is rolled back, the unused values will never be served. The maximum hole size in * numbering is consequently the value of cacheSize. * - * HINT: Since Sybase supports the JDBC 3.0 {@code getGeneratedKeys} method, + * HINT: Since Sybase supports the JDBC 3.0 {@code getGeneratedKeys} method, * it is recommended to use IDENTITY columns directly in the tables and then using a * {@link org.springframework.jdbc.core.simple.SimpleJdbcInsert} or utilizing * a {@link org.springframework.jdbc.support.KeyHolder} when calling the with the @@ -133,8 +133,8 @@ public class SybaseMaxValueIncrementer extends AbstractColumnMaxValueIncrementer } /** - * Statement to use to increment the "sequence" value. Can be overridden by sub-classes. - * @return The SQL statement to use + * Statement to use to increment the "sequence" value. Can be overridden by subclasses. + * @return the SQL statement to use */ protected String getIncrementStatement() { return "insert into " + getIncrementerName() + " values()"; diff --git a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java index 680225e928a..3f3f3a8341d 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/AbstractHttpMessageConverter.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. @@ -163,11 +163,12 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv HttpHeaders headers = outputMessage.getHeaders(); if (headers.getContentType() == null) { + MediaType contentTypeToUse = contentType; if (contentType == null || contentType.isWildcardType() || contentType.isWildcardSubtype()) { - contentType = getDefaultContentType(t); + contentTypeToUse = getDefaultContentType(t); } - if (contentType != null) { - headers.setContentType(contentType); + if (contentTypeToUse != null) { + headers.setContentType(contentTypeToUse); } } if (headers.getContentLength() == -1) { @@ -227,7 +228,7 @@ public abstract class AbstractHttpMessageConverter implements HttpMessageConv /** * Abstract template method that writes the actual body. Invoked from {@link #write}. * @param t the object to write to the output message - * @param outputMessage the message to write to + * @param outputMessage the HTTP output message to write to * @throws IOException in case of I/O errors * @throws HttpMessageNotWritableException in case of conversion errors */