diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index 12b304666c..b987fb56c8 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -87,10 +87,10 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA } } + private int autoGrowCollectionLimit = Integer.MAX_VALUE; - /** The wrapped object */ - private Object object; + private Object wrappedObject; private String nestedPath = ""; @@ -204,23 +204,23 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA public void setWrappedInstance(Object object, String nestedPath, Object rootObject) { Assert.notNull(object, "Target object must not be null"); if (object.getClass() == javaUtilOptionalClass) { - this.object = OptionalUnwrapper.unwrap(object); + this.wrappedObject = OptionalUnwrapper.unwrap(object); } else { - this.object = object; + this.wrappedObject = object; } this.nestedPath = (nestedPath != null ? nestedPath : ""); - this.rootObject = (!"".equals(this.nestedPath) ? rootObject : this.object); + this.rootObject = (!"".equals(this.nestedPath) ? rootObject : this.wrappedObject); this.nestedPropertyAccessors = null; - this.typeConverterDelegate = new TypeConverterDelegate(this, this.object); + this.typeConverterDelegate = new TypeConverterDelegate(this, this.wrappedObject); } public final Object getWrappedInstance() { - return this.object; + return this.wrappedObject; } public final Class getWrappedClass() { - return (this.object != null ? this.object.getClass() : null); + return (this.wrappedObject != null ? this.wrappedObject.getClass() : null); } /** @@ -303,7 +303,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA catch (NotReadablePropertyException ex) { throw new NotWritablePropertyException(getRootClass(), this.nestedPath + propertyName, "Cannot access indexed value in property referenced " + - "in indexed property path '" + propertyName + "'", ex); + "in indexed property path '" + propertyName + "'", ex); } // Set value for last key. String key = tokens.keys[tokens.keys.length - 1]; @@ -318,7 +318,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA else { throw new NullValueInNestedPathException(getRootClass(), this.nestedPath + propertyName, "Cannot access indexed value in property referenced " + - "in indexed property path '" + propertyName + "': returned null"); + "in indexed property path '" + propertyName + "': returned null"); } } if (propValue.getClass().isArray()) { @@ -367,8 +367,8 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA catch (NullPointerException ex) { throw new InvalidPropertyException(getRootClass(), this.nestedPath + propertyName, "Cannot set element with index " + index + " in List of size " + - size + ", accessed using property path '" + propertyName + - "': List does not support filling up gaps with null elements"); + size + ", accessed using property path '" + propertyName + + "': List does not support filling up gaps with null elements"); } } list.add(convertedValue); @@ -405,7 +405,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA else { throw new InvalidPropertyException(getRootClass(), this.nestedPath + propertyName, "Property referenced in indexed property path '" + propertyName + - "' is neither an array nor a List nor a Map; returned value was [" + propValue + "]"); + "' is neither an array nor a List nor a Map; returned value was [" + propValue + "]"); } } @@ -451,7 +451,7 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA } pv.getOriginalPropertyValue().conversionNecessary = (valueToApply != originalValue); } - ph.setValue(object, valueToApply); + ph.setValue(this.wrappedObject, valueToApply); } catch (TypeMismatchException ex) { throw ex; @@ -953,10 +953,9 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA tokens.actualName = (actualName != null ? actualName : propertyName); tokens.canonicalName = tokens.actualName; if (!keys.isEmpty()) { - tokens.canonicalName += - PROPERTY_KEY_PREFIX + - StringUtils.collectionToDelimitedString(keys, PROPERTY_KEY_SUFFIX + PROPERTY_KEY_PREFIX) + - PROPERTY_KEY_SUFFIX; + tokens.canonicalName += PROPERTY_KEY_PREFIX + + StringUtils.collectionToDelimitedString(keys, PROPERTY_KEY_SUFFIX + PROPERTY_KEY_PREFIX) + + PROPERTY_KEY_SUFFIX; tokens.keys = StringUtils.toStringArray(keys); } return tokens; @@ -965,8 +964,8 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA @Override public String toString() { StringBuilder sb = new StringBuilder(getClass().getName()); - if (this.object != null) { - sb.append(": wrapping object [").append(ObjectUtils.identityToString(this.object)).append("]"); + if (this.wrappedObject != null) { + sb.append(": wrapping object [").append(ObjectUtils.identityToString(this.wrappedObject)).append("]"); } else { sb.append(": no wrapped object set"); diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java index 7131651c6e..437a450c61 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -48,6 +48,19 @@ import java.beans.PropertyDescriptor; */ public interface BeanWrapper extends ConfigurablePropertyAccessor { + /** + * Specify a limit for array and collection auto-growing. + *

Default is unlimited on a plain BeanWrapper. + * @since 4.1 + */ + void setAutoGrowCollectionLimit(int autoGrowCollectionLimit); + + /** + * Return the limit for array and collection auto-growing. + * @since 4.1 + */ + int getAutoGrowCollectionLimit(); + /** * Return the bean instance wrapped by this object, if any. * @return the bean instance, or {@code null} if none set @@ -78,15 +91,4 @@ public interface BeanWrapper extends ConfigurablePropertyAccessor { */ PropertyDescriptor getPropertyDescriptor(String propertyName) throws InvalidPropertyException; - /** - * Specify a limit for array and collection auto-growing. - *

Default is unlimited on a plain BeanWrapper. - */ - void setAutoGrowCollectionLimit(int autoGrowCollectionLimit); - - /** - * Return the limit for array and collection auto-growing. - */ - int getAutoGrowCollectionLimit(); - } diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java index 6625cc1aa4..6615661d4b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -136,7 +136,30 @@ public class BeanWrapperImpl extends AbstractNestablePropertyAccessor implements @Override public void setWrappedInstance(Object object, String nestedPath, Object rootObject) { super.setWrappedInstance(object, nestedPath, rootObject); - setIntrospectionClass(getWrappedInstance().getClass()); + setIntrospectionClass(getWrappedClass()); + } + + /** + * Set the class to introspect. + * Needs to be called when the target object changes. + * @param clazz the class to introspect + */ + protected void setIntrospectionClass(Class clazz) { + if (this.cachedIntrospectionResults != null && this.cachedIntrospectionResults.getBeanClass() != clazz) { + this.cachedIntrospectionResults = null; + } + } + + /** + * Obtain a lazily initializted CachedIntrospectionResults instance + * for the wrapped object. + */ + private CachedIntrospectionResults getCachedIntrospectionResults() { + Assert.state(getWrappedInstance() != null, "BeanWrapper does not hold a bean instance"); + if (this.cachedIntrospectionResults == null) { + this.cachedIntrospectionResults = CachedIntrospectionResults.forClass(getWrappedClass()); + } + return this.cachedIntrospectionResults; } /** @@ -155,30 +178,6 @@ public class BeanWrapperImpl extends AbstractNestablePropertyAccessor implements return this.acc; } - /** - * Set the class to introspect. - * Needs to be called when the target object changes. - * @param clazz the class to introspect - */ - protected void setIntrospectionClass(Class clazz) { - if (this.cachedIntrospectionResults != null && - !clazz.equals(this.cachedIntrospectionResults.getBeanClass())) { - this.cachedIntrospectionResults = null; - } - } - - /** - * Obtain a lazily initializted CachedIntrospectionResults instance - * for the wrapped object. - */ - private CachedIntrospectionResults getCachedIntrospectionResults() { - Assert.state(getWrappedInstance() != null, "BeanWrapper does not hold a bean instance"); - if (this.cachedIntrospectionResults == null) { - this.cachedIntrospectionResults = CachedIntrospectionResults.forClass(getWrappedClass()); - } - return this.cachedIntrospectionResults; - } - /** * Convert the given value for the specified property to the latter's type. diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java index 6a0f737e60..e4dbef0d3e 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SpringBeanJobFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -72,8 +72,8 @@ public class SpringBeanJobFactory extends AdaptableJobFactory implements Schedul @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { Object job = super.createJobInstance(bundle); - BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(job); - if (isEligibleForPropertyPopulation(bw.getWrappedInstance())) { + if (isEligibleForPropertyPopulation(job)) { + BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(job); MutablePropertyValues pvs = new MutablePropertyValues(); if (this.schedulerContext != null) { pvs.addPropertyValues(this.schedulerContext); diff --git a/spring-context/src/main/java/org/springframework/scheduling/config/ExecutorBeanDefinitionParser.java b/spring-context/src/main/java/org/springframework/scheduling/config/ExecutorBeanDefinitionParser.java index 1448b3e4aa..98a4684314 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/config/ExecutorBeanDefinitionParser.java +++ b/spring-context/src/main/java/org/springframework/scheduling/config/ExecutorBeanDefinitionParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2016 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. @@ -61,9 +61,6 @@ public class ExecutorBeanDefinitionParser extends AbstractSingleBeanDefinitionPa return; } String prefix = "java.util.concurrent.ThreadPoolExecutor."; - if (builder.getRawBeanDefinition().getBeanClassName().contains("backport")) { - prefix = "edu.emory.mathcs.backport." + prefix; - } String policyClassName; if (rejectionPolicy.equals("ABORT")) { policyClassName = prefix + "AbortPolicy"; diff --git a/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java b/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java index d655a84e55..7ed6bef329 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/scheduling/config/TaskExecutorFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 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.scheduling.config; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; +import java.util.concurrent.RejectedExecutionHandler; + import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; @@ -27,8 +27,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.util.StringUtils; /** - * FactoryBean for creating ThreadPoolTaskExecutor instances, choosing - * between the standard concurrent and the backport-concurrent variant. + * {@link FactoryBean} for creating {@link ThreadPoolTaskExecutor} instances, + * primarily used behind the XML task namespace. * * @author Mark Fisher * @author Juergen Hoeller @@ -41,13 +41,13 @@ public class TaskExecutorFactoryBean implements private Integer queueCapacity; - private Object rejectedExecutionHandler; + private RejectedExecutionHandler rejectedExecutionHandler; private Integer keepAliveSeconds; private String beanName; - private TaskExecutor target; + private ThreadPoolTaskExecutor target; public void setPoolSize(String poolSize) { @@ -58,7 +58,7 @@ public class TaskExecutorFactoryBean implements this.queueCapacity = queueCapacity; } - public void setRejectedExecutionHandler(Object rejectedExecutionHandler) { + public void setRejectedExecutionHandler(RejectedExecutionHandler rejectedExecutionHandler) { this.rejectedExecutionHandler = rejectedExecutionHandler; } @@ -73,28 +73,25 @@ public class TaskExecutorFactoryBean implements @Override - public void afterPropertiesSet() throws Exception { - BeanWrapper bw = new BeanWrapperImpl(ThreadPoolTaskExecutor.class); - determinePoolSizeRange(bw); + public void afterPropertiesSet() { + this.target = new ThreadPoolTaskExecutor(); + determinePoolSizeRange(); if (this.queueCapacity != null) { - bw.setPropertyValue("queueCapacity", this.queueCapacity); + this.target.setQueueCapacity(this.queueCapacity); } if (this.keepAliveSeconds != null) { - bw.setPropertyValue("keepAliveSeconds", this.keepAliveSeconds); + this.target.setKeepAliveSeconds(this.keepAliveSeconds); } if (this.rejectedExecutionHandler != null) { - bw.setPropertyValue("rejectedExecutionHandler", this.rejectedExecutionHandler); + this.target.setRejectedExecutionHandler(this.rejectedExecutionHandler); } if (this.beanName != null) { - bw.setPropertyValue("threadNamePrefix", this.beanName + "-"); - } - this.target = (TaskExecutor) bw.getWrappedInstance(); - if (this.target instanceof InitializingBean) { - ((InitializingBean) this.target).afterPropertiesSet(); + this.target.setThreadNamePrefix(this.beanName + "-"); } + this.target.afterPropertiesSet(); } - private void determinePoolSizeRange(BeanWrapper bw) { + private void determinePoolSizeRange() { if (StringUtils.hasText(this.poolSize)) { try { int corePoolSize; @@ -108,15 +105,15 @@ public class TaskExecutorFactoryBean implements "Lower bound of pool-size range must not exceed the upper bound"); } if (this.queueCapacity == null) { - // no queue-capacity provided, so unbounded + // No queue-capacity provided, so unbounded if (corePoolSize == 0) { - // actually set 'corePoolSize' to the upper bound of the range - // but allow core threads to timeout - bw.setPropertyValue("allowCoreThreadTimeOut", true); + // Actually set 'corePoolSize' to the upper bound of the range + // but allow core threads to timeout... + this.target.setAllowCoreThreadTimeOut(true); corePoolSize = maxPoolSize; } else { - // non-zero lower bound implies a core-max size range + // Non-zero lower bound implies a core-max size range... throw new IllegalArgumentException( "A non-zero lower bound for the size range requires a queue-capacity value"); } @@ -127,8 +124,8 @@ public class TaskExecutorFactoryBean implements corePoolSize = value; maxPoolSize = value; } - bw.setPropertyValue("corePoolSize", corePoolSize); - bw.setPropertyValue("maxPoolSize", maxPoolSize); + this.target.setCorePoolSize(corePoolSize); + this.target.setMaxPoolSize(maxPoolSize); } catch (NumberFormatException ex) { throw new IllegalArgumentException("Invalid pool-size value [" + this.poolSize + "]: only single " + @@ -155,10 +152,8 @@ public class TaskExecutorFactoryBean implements @Override - public void destroy() throws Exception { - if (this.target instanceof DisposableBean) { - ((DisposableBean) this.target).destroy(); - } + public void destroy() { + this.target.destroy(); } }