diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java index b8082630322..549584f3f49 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java @@ -23,6 +23,7 @@ import java.lang.annotation.Target; import org.junit.Before; import org.junit.Test; + import org.springframework.aop.scope.ScopedObject; import org.springframework.aop.scope.ScopedProxyUtils; import org.springframework.beans.factory.FactoryBean; @@ -86,8 +87,7 @@ public class ConfigurationClassPostProcessorTests { */ @Test public void alreadyLoadedConfigurationClasses() { - beanFactory.registerBeanDefinition("unloadedConfig", new RootBeanDefinition(UnloadedConfig.class.getName(), - null, null)); + beanFactory.registerBeanDefinition("unloadedConfig", new RootBeanDefinition(UnloadedConfig.class.getName())); beanFactory.registerBeanDefinition("loadedConfig", new RootBeanDefinition(LoadedConfig.class)); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); pp.postProcessBeanFactory(beanFactory); @@ -126,56 +126,56 @@ public class ConfigurationClassPostProcessorTests { @Test public void postProcessorWorksWithComposedConfigurationWithAttributeOverridesUsingReflection() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - ComposedConfigurationWithAttributeOverridesClass.class); + ComposedConfigurationWithAttributeOverridesClass.class); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithComposedConfigurationWithAttributeOverridesUsingAsm() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - ComposedConfigurationWithAttributeOverridesClass.class.getName()); + ComposedConfigurationWithAttributeOverridesClass.class.getName()); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithComposedComposedConfigurationWithAttributeOverridesUsingReflection() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - ComposedComposedConfigurationWithAttributeOverridesClass.class); + ComposedComposedConfigurationWithAttributeOverridesClass.class); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithComposedComposedConfigurationWithAttributeOverridesUsingAsm() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - ComposedComposedConfigurationWithAttributeOverridesClass.class.getName()); + ComposedComposedConfigurationWithAttributeOverridesClass.class.getName()); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithMetaComponentScanConfigurationWithAttributeOverridesUsingReflection() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - MetaComponentScanConfigurationWithAttributeOverridesClass.class); + MetaComponentScanConfigurationWithAttributeOverridesClass.class); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithMetaComponentScanConfigurationWithAttributeOverridesUsingAsm() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - MetaComponentScanConfigurationWithAttributeOverridesClass.class.getName()); + MetaComponentScanConfigurationWithAttributeOverridesClass.class.getName()); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithMetaComponentScanConfigurationWithAttributeOverridesSubclassUsingReflection() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - SubMetaComponentScanConfigurationWithAttributeOverridesClass.class); + SubMetaComponentScanConfigurationWithAttributeOverridesClass.class); assertSupportForComposedAnnotation(beanDefinition); } @Test public void postProcessorWorksWithMetaComponentScanConfigurationWithAttributeOverridesSubclassUsingAsm() { RootBeanDefinition beanDefinition = new RootBeanDefinition( - SubMetaComponentScanConfigurationWithAttributeOverridesClass.class.getName()); + SubMetaComponentScanConfigurationWithAttributeOverridesClass.class.getName()); assertSupportForComposedAnnotation(beanDefinition); } @@ -208,8 +208,8 @@ public class ConfigurationClassPostProcessorTests { public void postProcessorDoesNotOverrideRegularBeanDefinitionsEvenWithScopedProxy() { RootBeanDefinition rbd = new RootBeanDefinition(TestBean.class); rbd.setResource(new DescriptiveResource("XML or something")); - BeanDefinitionHolder proxied = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(rbd, "bar"), - beanFactory, true); + BeanDefinitionHolder proxied = ScopedProxyUtils.createScopedProxy( + new BeanDefinitionHolder(rbd, "bar"), beanFactory, true); beanFactory.registerBeanDefinition("bar", proxied.getBeanDefinition()); beanFactory.registerBeanDefinition("config", new RootBeanDefinition(SingletonBeanConfig.class)); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); @@ -296,8 +296,7 @@ public class ConfigurationClassPostProcessorTests { RootBeanDefinition bd = new RootBeanDefinition(RepositoryInjectionBean.class); bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); beanFactory.registerBeanDefinition("annotatedBean", bd); - beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition( - ScopedProxyRepositoryConfiguration.class)); + beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition(ScopedProxyRepositoryConfiguration.class)); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); pp.postProcessBeanFactory(beanFactory); beanFactory.freezeConfiguration(); @@ -332,8 +331,7 @@ public class ConfigurationClassPostProcessorTests { RootBeanDefinition bd = new RootBeanDefinition(RepositoryFactoryBeanInjectionBean.class); bd.setScope(RootBeanDefinition.SCOPE_PROTOTYPE); beanFactory.registerBeanDefinition("annotatedBean", bd); - beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition( - RepositoryFactoryBeanConfiguration.class)); + beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition(RepositoryFactoryBeanConfiguration.class)); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); pp.postProcessBeanFactory(beanFactory); beanFactory.preInstantiateSingletons(); @@ -374,8 +372,7 @@ public class ConfigurationClassPostProcessorTests { @Test public void genericsBasedInjectionWithWildcardWithGenericExtendsMatch() { - beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition( - WildcardWithGenericExtendsConfiguration.class)); + beanFactory.registerBeanDefinition("configClass", new RootBeanDefinition(WildcardWithGenericExtendsConfiguration.class)); ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); pp.postProcessBeanFactory(beanFactory); @@ -574,7 +571,6 @@ public class ConfigurationClassPostProcessorTests { @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) public Repository stringRepo() { return new Repository() { - @Override public String toString() { return "Repository"; @@ -586,7 +582,6 @@ public class ConfigurationClassPostProcessorTests { @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) public Repository integerRepo() { return new Repository() { - @Override public String toString() { return "Repository"; diff --git a/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java b/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java index 11039d712cf..5c30764f63b 100644 --- a/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/EnumerablePropertySource.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. @@ -18,6 +18,7 @@ package org.springframework.core.env; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.util.Assert; /** @@ -53,22 +54,23 @@ public abstract class EnumerablePropertySource extends PropertySource { super(name, source); } + /** - * Return the names of all properties contained by the {@linkplain #getSource() - * source} object (never {@code null}). + * Return the names of all properties contained by the + * {@linkplain #getSource() source} object (never {@code null}). */ public abstract String[] getPropertyNames(); /** * Return whether this {@code PropertySource} contains a property with the given name. - *

This implementation checks for the presence of the given name within - * the {@link #getPropertyNames()} array. - * @param name the property to find + *

This implementation checks for the presence of the given name within the + * {@link #getPropertyNames()} array. + * @param name the name of the property to find */ @Override public boolean containsProperty(String name) { - Assert.notNull(name, "property name must not be null"); - for (String candidate : this.getPropertyNames()) { + Assert.notNull(name, "Property name must not be null"); + for (String candidate : getPropertyNames()) { if (candidate.equals(name)) { if (logger.isDebugEnabled()) { logger.debug(String.format("PropertySource [%s] contains '%s'", getName(), name)); diff --git a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java b/spring-core/src/main/java/org/springframework/core/env/PropertySource.java index aab278b895b..3fbdd045c79 100644 --- a/spring-core/src/main/java/org/springframework/core/env/PropertySource.java +++ b/spring-core/src/main/java/org/springframework/core/env/PropertySource.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. @@ -18,7 +18,9 @@ package org.springframework.core.env; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; /** * Abstract base class representing a source of name/value property pairs. The underlying @@ -55,12 +57,13 @@ import org.springframework.util.Assert; */ public abstract class PropertySource { - protected final Log logger = LogFactory.getLog(this.getClass()); + protected final Log logger = LogFactory.getLog(getClass()); protected final String name; protected final T source; + /** * Create a new {@code PropertySource} with the given name and source object. */ @@ -74,15 +77,15 @@ public abstract class PropertySource { /** * Create a new {@code PropertySource} with the given name and with a new {@code Object} * instance as the underlying source. - *

Often useful in testing scenarios when creating - * anonymous implementations that never query an actual source, but rather return - * hard-coded values. + *

Often useful in testing scenarios when creating anonymous implementations that + * never query an actual source but rather return hard-coded values. */ @SuppressWarnings("unchecked") public PropertySource(String name) { this(name, (T) new Object()); } + /** * Return the name of this {@code PropertySource} */ @@ -94,91 +97,75 @@ public abstract class PropertySource { * Return the underlying source object for this {@code PropertySource}. */ public T getSource() { - return source; + return this.source; } /** * Return whether this {@code PropertySource} contains the given name. - *

This implementation simply checks for a null return value - * from {@link #getProperty(String)}. Subclasses may wish to - * implement a more efficient algorithm if possible. + *

This implementation simply checks for a {@code null} return value + * from {@link #getProperty(String)}. Subclasses may wish to implement + * a more efficient algorithm if possible. * @param name the property name to find */ public boolean containsProperty(String name) { - return this.getProperty(name) != null; + return (getProperty(name) != null); } /** - * Return the value associated with the given name, {@code null} if not found. + * Return the value associated with the given name, + * or {@code null} if not found. * @param name the property to find * @see PropertyResolver#getRequiredProperty(String) */ public abstract Object getProperty(String name); - /** - * Return a hashcode derived from the {@code name} property of this {@code PropertySource} - * object. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((this.name == null) ? 0 : this.name.hashCode()); - return result; - } /** * This {@code PropertySource} object is equal to the given object if: *

    - *
  • they are the same instance - *
  • the {@code name} properties for both objects are equal + *
  • they are the same instance + *
  • the {@code name} properties for both objects are equal *
- * - *

No properties other than {@code name} are evaluated. + *

No properties other than {@code name} are evaluated. */ @Override public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (!(obj instanceof PropertySource)) - return false; - PropertySource other = (PropertySource) obj; - if (this.name == null) { - if (other.name != null) - return false; - } else if (!this.name.equals(other.name)) - return false; - return true; + return (this == obj || (obj instanceof PropertySource && + ObjectUtils.nullSafeEquals(this.name, ((PropertySource) obj).name))); + } + + /** + * Return a hash code derived from the {@code name} property + * of this {@code PropertySource} object. + */ + @Override + public int hashCode() { + return ObjectUtils.nullSafeHashCode(this.name); } /** * Produce concise output (type and name) if the current log level does not include - * debug. If debug is enabled, produce verbose output including hashcode of the + * debug. If debug is enabled, produce verbose output including the hash code of the * PropertySource instance and every name/value property pair. - * - * This variable verbosity is useful as a property source such as system properties + *

This variable verbosity is useful as a property source such as system properties * or environment variables may contain an arbitrary number of property pairs, * potentially leading to difficult to read exception and log messages. - * * @see Log#isDebugEnabled() */ @Override public String toString() { if (logger.isDebugEnabled()) { return String.format("%s@%s [name='%s', properties=%s]", - this.getClass().getSimpleName(), System.identityHashCode(this), this.name, this.source); + getClass().getSimpleName(), System.identityHashCode(this), this.name, this.source); + } + else { + return String.format("%s [name='%s']", getClass().getSimpleName(), this.name); } - - return String.format("%s [name='%s']", - this.getClass().getSimpleName(), this.name); } /** * Return a {@code PropertySource} implementation intended for collection comparison purposes only. - * *

Primarily for internal use, but given a collection of {@code PropertySource} objects, may be * used as follows: *

@@ -189,11 +176,9 @@ public abstract class PropertySource {
 	 * assert sources.contains(PropertySource.named("sourceB"));
 	 * assert !sources.contains(PropertySource.named("sourceC"));
 	 * }
- * * The returned {@code PropertySource} will throw {@code UnsupportedOperationException} * if any methods other than {@code equals(Object)}, {@code hashCode()}, and {@code toString()} * are called. - * * @param name the name of the comparison {@code PropertySource} to be created and returned. */ public static PropertySource named(String name) { @@ -209,7 +194,6 @@ public abstract class PropertySource { * {@code ApplicationContext}. In such cases, a stub should be used to hold the * intended default position/order of the property source, then be replaced * during context refresh. - * * @see org.springframework.context.support.AbstractApplicationContext#initPropertySources() * @see org.springframework.web.context.support.StandardServletEnvironment * @see org.springframework.web.context.support.ServletContextPropertySource @@ -221,7 +205,7 @@ public abstract class PropertySource { } /** - * Always return {@code null}. + * Always returns {@code null}. */ @Override public String getProperty(String name) { @@ -236,8 +220,7 @@ public abstract class PropertySource { static class ComparisonPropertySource extends StubPropertySource { private static final String USAGE_ERROR = - "ComparisonPropertySource instances are for collection comparison " + - "use only"; + "ComparisonPropertySource instances are for use with collection comparison only"; public ComparisonPropertySource(String name) { super(name); diff --git a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java b/spring-core/src/main/java/org/springframework/util/CollectionUtils.java index 85bcd71346b..edadd3ab909 100644 --- a/spring-core/src/main/java/org/springframework/util/CollectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/CollectionUtils.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. @@ -317,7 +317,7 @@ public abstract class CollectionUtils { * Enumeration elements must be assignable to the type of the given array. The array * returned will be a different instance than the array given. */ - public static A[] toArray(Enumeration enumeration, A[] array) { + public static A[] toArray(Enumeration enumeration, A[] array) { ArrayList elements = new ArrayList(); while (enumeration.hasMoreElements()) { elements.add(enumeration.nextElement());