Revisit Assert to avoid single-arg assert methods (with refined messages)
Issue: SPR-15196
This commit is contained in:
		
							parent
							
								
									768802fa96
								
							
						
					
					
						commit
						1b2dc3638f
					
				|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2012 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -27,6 +27,7 @@ import org.springframework.util.StringUtils; | ||||||
|  * Spring AOP {@link ClassFilter} implementation using AspectJ type matching. |  * Spring AOP {@link ClassFilter} implementation using AspectJ type matching. | ||||||
|  * |  * | ||||||
|  * @author Rod Johnson |  * @author Rod Johnson | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  * @since 2.0 |  * @since 2.0 | ||||||
|  */ |  */ | ||||||
| public class TypePatternClassFilter implements ClassFilter { | public class TypePatternClassFilter implements ClassFilter { | ||||||
|  | @ -76,17 +77,21 @@ public class TypePatternClassFilter implements ClassFilter { | ||||||
| 	 * or is recognized as invalid | 	 * or is recognized as invalid | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setTypePattern(String typePattern) { | 	public void setTypePattern(String typePattern) { | ||||||
| 		Assert.notNull(typePattern); | 		Assert.notNull(typePattern, "Type pattern must not be null"); | ||||||
| 		this.typePattern = typePattern; | 		this.typePattern = typePattern; | ||||||
| 		this.aspectJTypePatternMatcher = | 		this.aspectJTypePatternMatcher = | ||||||
| 				PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution(). | 				PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution(). | ||||||
| 				parseTypePattern(replaceBooleanOperators(typePattern)); | 				parseTypePattern(replaceBooleanOperators(typePattern)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Return the AspectJ type pattern to match. | ||||||
|  | 	 */ | ||||||
| 	public String getTypePattern() { | 	public String getTypePattern() { | ||||||
| 		return typePattern; | 		return this.typePattern; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Should the pointcut apply to the given interface or target class? | 	 * Should the pointcut apply to the given interface or target class? | ||||||
| 	 * @param clazz candidate target class | 	 * @param clazz candidate target class | ||||||
|  | @ -95,9 +100,7 @@ public class TypePatternClassFilter implements ClassFilter { | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean matches(Class<?> clazz) { | 	public boolean matches(Class<?> clazz) { | ||||||
| 		if (this.aspectJTypePatternMatcher == null) { | 		Assert.state(this.aspectJTypePatternMatcher != null, "No type pattern has been set"); | ||||||
| 			throw new IllegalStateException("No 'typePattern' has been set via ctor/setter."); |  | ||||||
| 		} |  | ||||||
| 		return this.aspectJTypePatternMatcher.matches(clazz); | 		return this.aspectJTypePatternMatcher.matches(clazz); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -108,9 +111,8 @@ public class TypePatternClassFilter implements ClassFilter { | ||||||
| 	 * <p>This method converts back to {@code &&} for the AspectJ pointcut parser. | 	 * <p>This method converts back to {@code &&} for the AspectJ pointcut parser. | ||||||
| 	 */ | 	 */ | ||||||
| 	private String replaceBooleanOperators(String pcExpr) { | 	private String replaceBooleanOperators(String pcExpr) { | ||||||
| 		pcExpr = StringUtils.replace(pcExpr," and "," && "); | 		String result = StringUtils.replace(pcExpr," and "," && "); | ||||||
| 		pcExpr = StringUtils.replace(pcExpr, " or ", " || "); | 		result = StringUtils.replace(result, " or ", " || "); | ||||||
| 		pcExpr = StringUtils.replace(pcExpr, " not ", " ! "); | 		return StringUtils.replace(result, " not ", " ! "); | ||||||
| 		return pcExpr; |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -54,7 +54,8 @@ public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyC | ||||||
| 	public void setBeanFactory(BeanFactory beanFactory) { | 	public void setBeanFactory(BeanFactory beanFactory) { | ||||||
| 		super.setBeanFactory(beanFactory); | 		super.setBeanFactory(beanFactory); | ||||||
| 		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { | 		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { | ||||||
| 			throw new IllegalStateException("Cannot use AdvisorAutoProxyCreator without a ConfigurableListableBeanFactory"); | 			throw new IllegalArgumentException( | ||||||
|  | 					"AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory); | ||||||
| 		} | 		} | ||||||
| 		initBeanFactory((ConfigurableListableBeanFactory) beanFactory); | 		initBeanFactory((ConfigurableListableBeanFactory) beanFactory); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -219,7 +219,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean | ||||||
| 	public void setBeanFactory(BeanFactory beanFactory) { | 	public void setBeanFactory(BeanFactory beanFactory) { | ||||||
| 		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { | 		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { | ||||||
| 			throw new IllegalArgumentException( | 			throw new IllegalArgumentException( | ||||||
| 					"AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory"); | 					"AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: " + beanFactory); | ||||||
| 		} | 		} | ||||||
| 		this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; | 		this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -102,12 +102,12 @@ public class CustomScopeConfigurer implements BeanFactoryPostProcessor, BeanClas | ||||||
| 				} | 				} | ||||||
| 				else if (value instanceof Class) { | 				else if (value instanceof Class) { | ||||||
| 					Class<?> scopeClass = (Class<?>) value; | 					Class<?> scopeClass = (Class<?>) value; | ||||||
| 					Assert.isAssignable(Scope.class, scopeClass); | 					Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class"); | ||||||
| 					beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass)); | 					beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass)); | ||||||
| 				} | 				} | ||||||
| 				else if (value instanceof String) { | 				else if (value instanceof String) { | ||||||
| 					Class<?> scopeClass = ClassUtils.resolveClassName((String) value, this.beanClassLoader); | 					Class<?> scopeClass = ClassUtils.resolveClassName((String) value, this.beanClassLoader); | ||||||
| 					Assert.isAssignable(Scope.class, scopeClass); | 					Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class"); | ||||||
| 					beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass)); | 					beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass)); | ||||||
| 				} | 				} | ||||||
| 				else { | 				else { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -762,7 +762,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp | ||||||
| 	@Override | 	@Override | ||||||
| 	public void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass) { | 	public void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass) { | ||||||
| 		Assert.notNull(requiredType, "Required type must not be null"); | 		Assert.notNull(requiredType, "Required type must not be null"); | ||||||
| 		Assert.isAssignable(PropertyEditor.class, propertyEditorClass); | 		Assert.notNull(propertyEditorClass, "PropertyEditor class must not be null"); | ||||||
| 		this.customEditors.put(requiredType, propertyEditorClass); | 		this.customEditors.put(requiredType, propertyEditorClass); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -44,14 +44,15 @@ class DefaultCacheInvocationContext<A extends Annotation> | ||||||
| 
 | 
 | ||||||
| 	private final CacheInvocationParameter[] allParameters; | 	private final CacheInvocationParameter[] allParameters; | ||||||
| 
 | 
 | ||||||
| 	public DefaultCacheInvocationContext(JCacheOperation<A> operation, | 
 | ||||||
| 			Object target, Object[] args) { | 	public DefaultCacheInvocationContext(JCacheOperation<A> operation, Object target, Object[] args) { | ||||||
| 		this.operation = operation; | 		this.operation = operation; | ||||||
| 		this.target = target; | 		this.target = target; | ||||||
| 		this.args = args; | 		this.args = args; | ||||||
| 		this.allParameters = operation.getAllParameters(args); | 		this.allParameters = operation.getAllParameters(args); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public JCacheOperation<A> getOperation() { | 	public JCacheOperation<A> getOperation() { | ||||||
| 		return this.operation; | 		return this.operation; | ||||||
|  | @ -94,17 +95,19 @@ class DefaultCacheInvocationContext<A extends Annotation> | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public <T> T unwrap(Class<T> cls) { | 	public <T> T unwrap(Class<T> cls) { | ||||||
| 		throw new IllegalArgumentException("Could not unwrap to '" + cls.getName() + "'"); | 		throw new IllegalArgumentException("Cannot unwrap to " + cls); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public String toString() { | 	public String toString() { | ||||||
| 		final StringBuilder sb = new StringBuilder("CacheInvocationContext{"); | 		StringBuilder sb = new StringBuilder("CacheInvocationContext{"); | ||||||
| 		sb.append("operation=").append(operation); | 		sb.append("operation=").append(this.operation); | ||||||
| 		sb.append(", target=").append(target); | 		sb.append(", target=").append(this.target); | ||||||
| 		sb.append(", args=").append(Arrays.toString(args)); | 		sb.append(", args=").append(Arrays.toString(this.args)); | ||||||
| 		sb.append(", allParameters=").append(Arrays.toString(allParameters)); | 		sb.append(", allParameters=").append(Arrays.toString(this.allParameters)); | ||||||
| 		sb.append('}'); | 		sb.append('}'); | ||||||
| 		return sb.toString(); | 		return sb.toString(); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -66,7 +66,7 @@ public class JCacheAspectSupport extends AbstractCacheInvoker implements Initial | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public void setCacheOperationSource(JCacheOperationSource cacheOperationSource) { | 	public void setCacheOperationSource(JCacheOperationSource cacheOperationSource) { | ||||||
| 		Assert.notNull(cacheOperationSource); | 		Assert.notNull(cacheOperationSource, "JCacheOperationSource must not be null"); | ||||||
| 		this.cacheOperationSource = cacheOperationSource; | 		this.cacheOperationSource = cacheOperationSource; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -80,7 +80,7 @@ public class JCacheAspectSupport extends AbstractCacheInvoker implements Initial | ||||||
| 	public void afterPropertiesSet() { | 	public void afterPropertiesSet() { | ||||||
| 		Assert.state(getCacheOperationSource() != null, "The 'cacheOperationSource' property is required: " + | 		Assert.state(getCacheOperationSource() != null, "The 'cacheOperationSource' property is required: " + | ||||||
| 				"If there are no cacheable methods, then don't use a cache aspect."); | 				"If there are no cacheable methods, then don't use a cache aspect."); | ||||||
| 		Assert.state(getErrorHandler() != null, "The 'errorHandler' is required"); | 		Assert.state(getErrorHandler() != null, "The 'errorHandler' property is required"); | ||||||
| 
 | 
 | ||||||
| 		this.cacheResultInterceptor = new CacheResultInterceptor(getErrorHandler()); | 		this.cacheResultInterceptor = new CacheResultInterceptor(getErrorHandler()); | ||||||
| 		this.cachePutInterceptor = new CachePutInterceptor(getErrorHandler()); | 		this.cachePutInterceptor = new CachePutInterceptor(getErrorHandler()); | ||||||
|  | @ -128,23 +128,23 @@ public class JCacheAspectSupport extends AbstractCacheInvoker implements Initial | ||||||
| 		BasicOperation operation = context.getOperation(); | 		BasicOperation operation = context.getOperation(); | ||||||
| 
 | 
 | ||||||
| 		if (operation instanceof CacheResultOperation) { | 		if (operation instanceof CacheResultOperation) { | ||||||
| 			return cacheResultInterceptor.invoke( | 			return this.cacheResultInterceptor.invoke( | ||||||
| 					(CacheOperationInvocationContext<CacheResultOperation>) context, adapter); | 					(CacheOperationInvocationContext<CacheResultOperation>) context, adapter); | ||||||
| 		} | 		} | ||||||
| 		else if (operation instanceof CachePutOperation) { | 		else if (operation instanceof CachePutOperation) { | ||||||
| 			return cachePutInterceptor.invoke( | 			return this.cachePutInterceptor.invoke( | ||||||
| 					(CacheOperationInvocationContext<CachePutOperation>) context, adapter); | 					(CacheOperationInvocationContext<CachePutOperation>) context, adapter); | ||||||
| 		} | 		} | ||||||
| 		else if (operation instanceof CacheRemoveOperation) { | 		else if (operation instanceof CacheRemoveOperation) { | ||||||
| 			return cacheRemoveEntryInterceptor.invoke( | 			return this.cacheRemoveEntryInterceptor.invoke( | ||||||
| 					(CacheOperationInvocationContext<CacheRemoveOperation>) context, adapter); | 					(CacheOperationInvocationContext<CacheRemoveOperation>) context, adapter); | ||||||
| 		} | 		} | ||||||
| 		else if (operation instanceof CacheRemoveAllOperation) { | 		else if (operation instanceof CacheRemoveAllOperation) { | ||||||
| 			return cacheRemoveAllInterceptor.invoke( | 			return this.cacheRemoveAllInterceptor.invoke( | ||||||
| 					(CacheOperationInvocationContext<CacheRemoveAllOperation>) context, adapter); | 					(CacheOperationInvocationContext<CacheRemoveAllOperation>) context, adapter); | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
| 			throw new IllegalArgumentException("Could not handle " + operation); | 			throw new IllegalArgumentException("Cannot handle " + operation); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,7 +43,6 @@ import org.springframework.core.io.Resource; | ||||||
| import org.springframework.core.io.ResourceLoader; | import org.springframework.core.io.ResourceLoader; | ||||||
| import org.springframework.core.io.support.PropertiesLoaderUtils; | import org.springframework.core.io.support.PropertiesLoaderUtils; | ||||||
| import org.springframework.scheduling.SchedulingException; | import org.springframework.scheduling.SchedulingException; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| import org.springframework.util.CollectionUtils; | import org.springframework.util.CollectionUtils; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -105,6 +104,7 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe | ||||||
| 	private static final ThreadLocal<DataSource> configTimeNonTransactionalDataSourceHolder = | 	private static final ThreadLocal<DataSource> configTimeNonTransactionalDataSourceHolder = | ||||||
| 			new ThreadLocal<>(); | 			new ThreadLocal<>(); | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Return the ResourceLoader for the currently configured Quartz Scheduler, | 	 * Return the ResourceLoader for the currently configured Quartz Scheduler, | ||||||
| 	 * to be used by ResourceLoaderClassLoadHelper. | 	 * to be used by ResourceLoaderClassLoadHelper. | ||||||
|  | @ -210,7 +210,6 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe | ||||||
| 	 * @see #setQuartzProperties | 	 * @see #setQuartzProperties | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setSchedulerFactoryClass(Class<? extends SchedulerFactory> schedulerFactoryClass) { | 	public void setSchedulerFactoryClass(Class<? extends SchedulerFactory> schedulerFactoryClass) { | ||||||
| 		Assert.isAssignable(SchedulerFactory.class, schedulerFactoryClass); |  | ||||||
| 		this.schedulerFactoryClass = schedulerFactoryClass; | 		this.schedulerFactoryClass = schedulerFactoryClass; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -30,8 +30,6 @@ import org.junit.rules.ExpectedException; | ||||||
| 
 | 
 | ||||||
| import org.springframework.cache.Cache; | import org.springframework.cache.Cache; | ||||||
| import org.springframework.cache.jcache.AbstractJCacheTests; | import org.springframework.cache.jcache.AbstractJCacheTests; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| import org.springframework.util.ReflectionUtils; |  | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.*; | import static org.junit.Assert.*; | ||||||
| import static org.mockito.BDDMockito.*; | import static org.mockito.BDDMockito.*; | ||||||
|  | @ -46,7 +44,7 @@ public class CacheResolverAdapterTests extends AbstractJCacheTests { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void resolveSimpleCache() { | 	public void resolveSimpleCache() throws Exception { | ||||||
| 		DefaultCacheInvocationContext<?> dummyContext = createDummyContext(); | 		DefaultCacheInvocationContext<?> dummyContext = createDummyContext(); | ||||||
| 		CacheResolverAdapter adapter = new CacheResolverAdapter(getCacheResolver(dummyContext, "testCache")); | 		CacheResolverAdapter adapter = new CacheResolverAdapter(getCacheResolver(dummyContext, "testCache")); | ||||||
| 		Collection<? extends Cache> caches = adapter.resolveCaches(dummyContext); | 		Collection<? extends Cache> caches = adapter.resolveCaches(dummyContext); | ||||||
|  | @ -56,7 +54,7 @@ public class CacheResolverAdapterTests extends AbstractJCacheTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void resolveUnknownCache() { | 	public void resolveUnknownCache() throws Exception { | ||||||
| 		DefaultCacheInvocationContext<?> dummyContext = createDummyContext(); | 		DefaultCacheInvocationContext<?> dummyContext = createDummyContext(); | ||||||
| 		CacheResolverAdapter adapter = new CacheResolverAdapter(getCacheResolver(dummyContext, null)); | 		CacheResolverAdapter adapter = new CacheResolverAdapter(getCacheResolver(dummyContext, null)); | ||||||
| 
 | 
 | ||||||
|  | @ -66,7 +64,7 @@ public class CacheResolverAdapterTests extends AbstractJCacheTests { | ||||||
| 
 | 
 | ||||||
| 	protected CacheResolver getCacheResolver(CacheInvocationContext<? extends Annotation> context, String cacheName) { | 	protected CacheResolver getCacheResolver(CacheInvocationContext<? extends Annotation> context, String cacheName) { | ||||||
| 		CacheResolver cacheResolver = mock(CacheResolver.class); | 		CacheResolver cacheResolver = mock(CacheResolver.class); | ||||||
| 		final javax.cache.Cache cache; | 		javax.cache.Cache cache; | ||||||
| 		if (cacheName == null) { | 		if (cacheName == null) { | ||||||
| 			cache = null; | 			cache = null; | ||||||
| 		} | 		} | ||||||
|  | @ -78,9 +76,8 @@ public class CacheResolverAdapterTests extends AbstractJCacheTests { | ||||||
| 		return cacheResolver; | 		return cacheResolver; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	protected DefaultCacheInvocationContext<?> createDummyContext() { | 	protected DefaultCacheInvocationContext<?> createDummyContext() throws Exception { | ||||||
| 		Method method = ReflectionUtils.findMethod(Sample.class, "get", String.class); | 		Method method = Sample.class.getMethod("get", String.class); | ||||||
| 		Assert.notNull(method); |  | ||||||
| 		CacheResult cacheAnnotation = method.getAnnotation(CacheResult.class); | 		CacheResult cacheAnnotation = method.getAnnotation(CacheResult.class); | ||||||
| 		CacheMethodDetails<CacheResult> methodDetails = | 		CacheMethodDetails<CacheResult> methodDetails = | ||||||
| 				new DefaultCacheMethodDetails<>(method, cacheAnnotation, "test"); | 				new DefaultCacheMethodDetails<>(method, cacheAnnotation, "test"); | ||||||
|  | @ -93,7 +90,7 @@ public class CacheResolverAdapterTests extends AbstractJCacheTests { | ||||||
| 	static class Sample { | 	static class Sample { | ||||||
| 
 | 
 | ||||||
| 		@CacheResult | 		@CacheResult | ||||||
| 		private Object get(String id) { | 		public Object get(String id) { | ||||||
| 			return null; | 			return null; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -145,19 +145,19 @@ public abstract class CacheOperation implements BasicOperation { | ||||||
| 		private String condition = ""; | 		private String condition = ""; | ||||||
| 
 | 
 | ||||||
| 		public void setName(String name) { | 		public void setName(String name) { | ||||||
| 			Assert.hasText(name); | 			Assert.hasText(name, "Name must not be empty"); | ||||||
| 			this.name = name; | 			this.name = name; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setCacheName(String cacheName) { | 		public void setCacheName(String cacheName) { | ||||||
| 			Assert.hasText(cacheName); | 			Assert.hasText(cacheName, "Cache name must not be empty"); | ||||||
| 			this.cacheNames = Collections.singleton(cacheName); | 			this.cacheNames = Collections.singleton(cacheName); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setCacheNames(String... cacheNames) { | 		public void setCacheNames(String... cacheNames) { | ||||||
| 			this.cacheNames = new LinkedHashSet<>(cacheNames.length); | 			this.cacheNames = new LinkedHashSet<>(cacheNames.length); | ||||||
| 			for (String cacheName : cacheNames) { | 			for (String cacheName : cacheNames) { | ||||||
| 				Assert.hasText(cacheName, "Cache name must be non-null if specified"); | 				Assert.hasText(cacheName, "Cache name must be non-empty if specified"); | ||||||
| 				this.cacheNames.add(cacheName); | 				this.cacheNames.add(cacheName); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -167,7 +167,7 @@ public abstract class CacheOperation implements BasicOperation { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setKey(String key) { | 		public void setKey(String key) { | ||||||
| 			Assert.notNull(key); | 			Assert.notNull(key, "Key must not be null"); | ||||||
| 			this.key = key; | 			this.key = key; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -188,22 +188,22 @@ public abstract class CacheOperation implements BasicOperation { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setKeyGenerator(String keyGenerator) { | 		public void setKeyGenerator(String keyGenerator) { | ||||||
| 			Assert.notNull(keyGenerator); | 			Assert.notNull(keyGenerator, "KeyGenerator name must not be null"); | ||||||
| 			this.keyGenerator = keyGenerator; | 			this.keyGenerator = keyGenerator; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setCacheManager(String cacheManager) { | 		public void setCacheManager(String cacheManager) { | ||||||
| 			Assert.notNull(cacheManager); | 			Assert.notNull(cacheManager, "CacheManager name must not be null"); | ||||||
| 			this.cacheManager = cacheManager; | 			this.cacheManager = cacheManager; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setCacheResolver(String cacheResolver) { | 		public void setCacheResolver(String cacheResolver) { | ||||||
| 			Assert.notNull(this.cacheManager); | 			Assert.notNull(cacheResolver, "CacheResolver name must not be null"); | ||||||
| 			this.cacheResolver = cacheResolver; | 			this.cacheResolver = cacheResolver; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public void setCondition(String condition) { | 		public void setCondition(String condition) { | ||||||
| 			Assert.notNull(condition); | 			Assert.notNull(condition, "Condition must not be null"); | ||||||
| 			this.condition = condition; | 			this.condition = condition; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -143,7 +143,7 @@ class ComponentScanAnnotationParser { | ||||||
| 			switch (filterType) { | 			switch (filterType) { | ||||||
| 				case ANNOTATION: | 				case ANNOTATION: | ||||||
| 					Assert.isAssignable(Annotation.class, filterClass, | 					Assert.isAssignable(Annotation.class, filterClass, | ||||||
| 							"An error occurred while processing a @ComponentScan ANNOTATION type filter: "); | 							"@ComponentScan ANNOTATION type filter requires an annotation type"); | ||||||
| 					@SuppressWarnings("unchecked") | 					@SuppressWarnings("unchecked") | ||||||
| 					Class<Annotation> annotationType = (Class<Annotation>) filterClass; | 					Class<Annotation> annotationType = (Class<Annotation>) filterClass; | ||||||
| 					typeFilters.add(new AnnotationTypeFilter(annotationType)); | 					typeFilters.add(new AnnotationTypeFilter(annotationType)); | ||||||
|  | @ -153,7 +153,7 @@ class ComponentScanAnnotationParser { | ||||||
| 					break; | 					break; | ||||||
| 				case CUSTOM: | 				case CUSTOM: | ||||||
| 					Assert.isAssignable(TypeFilter.class, filterClass, | 					Assert.isAssignable(TypeFilter.class, filterClass, | ||||||
| 							"An error occurred while processing a @ComponentScan CUSTOM type filter: "); | 							"@ComponentScan CUSTOM type filter requires a TypeFilter implementation"); | ||||||
| 					TypeFilter filter = BeanUtils.instantiateClass(filterClass, TypeFilter.class); | 					TypeFilter filter = BeanUtils.instantiateClass(filterClass, TypeFilter.class); | ||||||
| 					ParserStrategyUtils.invokeAwareMethods( | 					ParserStrategyUtils.invokeAwareMethods( | ||||||
| 							filter, this.environment, this.resourceLoader, this.registry); | 							filter, this.environment, this.resourceLoader, this.registry); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -39,7 +39,6 @@ import org.springframework.context.Lifecycle; | ||||||
| import org.springframework.context.LifecycleProcessor; | import org.springframework.context.LifecycleProcessor; | ||||||
| import org.springframework.context.Phased; | import org.springframework.context.Phased; | ||||||
| import org.springframework.context.SmartLifecycle; | import org.springframework.context.SmartLifecycle; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Default implementation of the {@link LifecycleProcessor} strategy. |  * Default implementation of the {@link LifecycleProcessor} strategy. | ||||||
|  | @ -70,7 +69,10 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setBeanFactory(BeanFactory beanFactory) { | 	public void setBeanFactory(BeanFactory beanFactory) { | ||||||
| 		Assert.isInstanceOf(ConfigurableListableBeanFactory.class, beanFactory); | 		if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { | ||||||
|  | 			throw new IllegalArgumentException( | ||||||
|  | 					"DefaultLifecycleProcessor requires a ConfigurableListableBeanFactory: " + beanFactory); | ||||||
|  | 		} | ||||||
| 		this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; | 		this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -126,7 +126,7 @@ public class DateTimeFormatterFactory { | ||||||
| 	 * @param style two characters from the set {"S", "M", "L", "F", "-"} | 	 * @param style two characters from the set {"S", "M", "L", "F", "-"} | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setStylePattern(String style) { | 	public void setStylePattern(String style) { | ||||||
| 		Assert.isTrue(style != null && style.length() == 2); | 		Assert.isTrue(style != null && style.length() == 2, "Style pattern must consist of two characters"); | ||||||
| 		this.dateStyle = convertStyleCharacter(style.charAt(0)); | 		this.dateStyle = convertStyleCharacter(style.charAt(0)); | ||||||
| 		this.timeStyle = convertStyleCharacter(style.charAt(1)); | 		this.timeStyle = convertStyleCharacter(style.charAt(1)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2012 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -55,7 +55,7 @@ class WebLogicClassLoaderAdapter { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public WebLogicClassLoaderAdapter(ClassLoader classLoader) { | 	public WebLogicClassLoaderAdapter(ClassLoader classLoader) { | ||||||
| 		Class<?> wlGenericClassLoaderClass = null; | 		Class<?> wlGenericClassLoaderClass; | ||||||
| 		try { | 		try { | ||||||
| 			wlGenericClassLoaderClass = classLoader.loadClass(GENERIC_CLASS_LOADER_NAME); | 			wlGenericClassLoaderClass = classLoader.loadClass(GENERIC_CLASS_LOADER_NAME); | ||||||
| 			this.wlPreProcessorClass = classLoader.loadClass(CLASS_PRE_PROCESSOR_NAME); | 			this.wlPreProcessorClass = classLoader.loadClass(CLASS_PRE_PROCESSOR_NAME); | ||||||
|  | @ -66,12 +66,14 @@ class WebLogicClassLoaderAdapter { | ||||||
| 			this.wlGenericClassLoaderConstructor = wlGenericClassLoaderClass.getConstructor( | 			this.wlGenericClassLoaderConstructor = wlGenericClassLoaderClass.getConstructor( | ||||||
| 					this.getClassFinderMethod.getReturnType(), ClassLoader.class); | 					this.getClassFinderMethod.getReturnType(), ClassLoader.class); | ||||||
| 		} | 		} | ||||||
| 		catch (Exception ex) { | 		catch (Throwable ex) { | ||||||
| 			throw new IllegalStateException( | 			throw new IllegalStateException( | ||||||
| 					"Could not initialize WebLogic LoadTimeWeaver because WebLogic 10 API classes are not available", ex); | 					"Could not initialize WebLogic LoadTimeWeaver because WebLogic 10 API classes are not available", ex); | ||||||
| 		} | 		} | ||||||
| 		Assert.isInstanceOf(wlGenericClassLoaderClass, classLoader, | 		if (!wlGenericClassLoaderClass.isInstance(classLoader)) { | ||||||
| 				"ClassLoader must be instance of [" + wlGenericClassLoaderClass.getName() + "]"); | 			throw new IllegalArgumentException( | ||||||
|  | 					"ClassLoader must be an instance of [" + wlGenericClassLoaderClass.getName() + "]: " + classLoader); | ||||||
|  | 		} | ||||||
| 		this.classLoader = classLoader; | 		this.classLoader = classLoader; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -87,7 +89,7 @@ class WebLogicClassLoaderAdapter { | ||||||
| 		catch (InvocationTargetException ex) { | 		catch (InvocationTargetException ex) { | ||||||
| 			throw new IllegalStateException("WebLogic addInstanceClassPreProcessor method threw exception", ex.getCause()); | 			throw new IllegalStateException("WebLogic addInstanceClassPreProcessor method threw exception", ex.getCause()); | ||||||
| 		} | 		} | ||||||
| 		catch (Exception ex) { | 		catch (Throwable ex) { | ||||||
| 			throw new IllegalStateException("Could not invoke WebLogic addInstanceClassPreProcessor method", ex); | 			throw new IllegalStateException("Could not invoke WebLogic addInstanceClassPreProcessor method", ex); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -106,8 +108,9 @@ class WebLogicClassLoaderAdapter { | ||||||
| 		catch (InvocationTargetException ex) { | 		catch (InvocationTargetException ex) { | ||||||
| 			throw new IllegalStateException("WebLogic GenericClassLoader constructor failed", ex.getCause()); | 			throw new IllegalStateException("WebLogic GenericClassLoader constructor failed", ex.getCause()); | ||||||
| 		} | 		} | ||||||
| 		catch (Exception ex) { | 		catch (Throwable ex) { | ||||||
| 			throw new IllegalStateException("Could not construct WebLogic GenericClassLoader", ex); | 			throw new IllegalStateException("Could not construct WebLogic GenericClassLoader", ex); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -33,7 +33,7 @@ public class ClassWithComplexConstructor { | ||||||
| 
 | 
 | ||||||
| 	@Autowired | 	@Autowired | ||||||
| 	public ClassWithComplexConstructor(Dependency dependency) { | 	public ClassWithComplexConstructor(Dependency dependency) { | ||||||
| 		Assert.notNull(dependency); | 		Assert.notNull(dependency, "No Dependency bean injected"); | ||||||
| 		this.dependency = dependency; | 		this.dependency = dependency; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -42,7 +42,8 @@ public class ClassWithComplexConstructor { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void method() { | 	public void method() { | ||||||
| 		Assert.isTrue(this.selfReference != this && AopUtils.isCglibProxy(this.selfReference)); | 		Assert.state(this.selfReference != this && AopUtils.isCglibProxy(this.selfReference), | ||||||
|  | 				"Self reference must be a CGLIB proxy"); | ||||||
| 		this.dependency.method(); | 		this.dependency.method(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -1250,7 +1250,7 @@ public class ConfigurationClassPostProcessorTests { | ||||||
| 
 | 
 | ||||||
| 		@PostConstruct | 		@PostConstruct | ||||||
| 		public void validate() { | 		public void validate() { | ||||||
| 			Assert.notNull(provider); | 			Assert.notNull(provider, "No ServiceBeanProvider injected"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1291,7 +1291,7 @@ public class ConfigurationClassPostProcessorTests { | ||||||
| 
 | 
 | ||||||
| 		@PostConstruct | 		@PostConstruct | ||||||
| 		public void validate() { | 		public void validate() { | ||||||
| 			Assert.notNull(provider); | 			Assert.notNull(provider, "No ServiceBeanProvider injected"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1403,7 +1403,7 @@ public class ConfigurationClassPostProcessorTests { | ||||||
| 	static class DependingFoo { | 	static class DependingFoo { | ||||||
| 
 | 
 | ||||||
| 		DependingFoo(BarArgument bar) { | 		DependingFoo(BarArgument bar) { | ||||||
| 			Assert.notNull(bar); | 			Assert.notNull(bar, "No BarArgument injected"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2012 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -72,7 +72,8 @@ public class Service implements ApplicationContextAware, MessageSourceAware, Dis | ||||||
| 		Thread thread = new Thread() { | 		Thread thread = new Thread() { | ||||||
| 			@Override | 			@Override | ||||||
| 			public void run() { | 			public void run() { | ||||||
| 				Assert.isTrue(applicationContext.getBean("messageSource") instanceof StaticMessageSource); | 				Assert.state(applicationContext.getBean("messageSource") instanceof StaticMessageSource, | ||||||
|  | 						"Invalid MessageSource bean"); | ||||||
| 				try { | 				try { | ||||||
| 					applicationContext.getBean("service2"); | 					applicationContext.getBean("service2"); | ||||||
| 					// Should have thrown BeanCreationNotAllowedException | 					// Should have thrown BeanCreationNotAllowedException | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -355,6 +355,7 @@ public class DateTimeFormattingTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | 	@SuppressWarnings("deprecation") | ||||||
| 	public void testBindInstantFromJavaUtilDate() throws Exception { | 	public void testBindInstantFromJavaUtilDate() throws Exception { | ||||||
| 		MutablePropertyValues propertyValues = new MutablePropertyValues(); | 		MutablePropertyValues propertyValues = new MutablePropertyValues(); | ||||||
| 		propertyValues.add("instant", new Date(109, 9, 31, 12, 0)); | 		propertyValues.add("instant", new Date(109, 9, 31, 12, 0)); | ||||||
|  |  | ||||||
|  | @ -240,7 +240,7 @@ public class SpringValidatorAdapterTests { | ||||||
| 			else { | 			else { | ||||||
| 				context.disableDefaultConstraintViolation(); | 				context.disableDefaultConstraintViolation(); | ||||||
| 				context.buildConstraintViolationWithTemplate(message) | 				context.buildConstraintViolationWithTemplate(message) | ||||||
| 						.addNode(field) | 						.addPropertyNode(field) | ||||||
| 						.addConstraintViolation(); | 						.addConstraintViolation(); | ||||||
| 				return false; | 				return false; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -59,7 +59,7 @@ public class Constants { | ||||||
| 	 * @throws IllegalArgumentException if the supplied {@code clazz} is {@code null} | 	 * @throws IllegalArgumentException if the supplied {@code clazz} is {@code null} | ||||||
| 	 */ | 	 */ | ||||||
| 	public Constants(Class<?> clazz) { | 	public Constants(Class<?> clazz) { | ||||||
| 		Assert.notNull(clazz); | 		Assert.notNull(clazz, "Class must not be null"); | ||||||
| 		this.className = clazz.getName(); | 		this.className = clazz.getName(); | ||||||
| 		Field[] fields = clazz.getFields(); | 		Field[] fields = clazz.getFields(); | ||||||
| 		for (Field field : fields) { | 		for (Field field : fields) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2013 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -47,9 +47,9 @@ public abstract class ParameterizedTypeReference<T> { | ||||||
| 	protected ParameterizedTypeReference() { | 	protected ParameterizedTypeReference() { | ||||||
| 		Class<?> parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(getClass()); | 		Class<?> parameterizedTypeReferenceSubclass = findParameterizedTypeReferenceSubclass(getClass()); | ||||||
| 		Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass(); | 		Type type = parameterizedTypeReferenceSubclass.getGenericSuperclass(); | ||||||
| 		Assert.isInstanceOf(ParameterizedType.class, type); | 		Assert.isInstanceOf(ParameterizedType.class, type, "Type must be a parameterized type"); | ||||||
| 		ParameterizedType parameterizedType = (ParameterizedType) type; | 		ParameterizedType parameterizedType = (ParameterizedType) type; | ||||||
| 		Assert.isTrue(parameterizedType.getActualTypeArguments().length == 1); | 		Assert.isTrue(parameterizedType.getActualTypeArguments().length == 1, "Number of type arguments must be 1"); | ||||||
| 		this.type = parameterizedType.getActualTypeArguments()[0]; | 		this.type = parameterizedType.getActualTypeArguments()[0]; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -408,7 +408,10 @@ abstract class SerializableTypeWrapper { | ||||||
| 		private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException { | 		private void readObject(ObjectInputStream inputStream) throws IOException, ClassNotFoundException { | ||||||
| 			inputStream.defaultReadObject(); | 			inputStream.defaultReadObject(); | ||||||
| 			this.method = ReflectionUtils.findMethod(this.declaringClass, this.methodName); | 			this.method = ReflectionUtils.findMethod(this.declaringClass, this.methodName); | ||||||
| 			Assert.state(Type.class == this.method.getReturnType() || Type[].class == this.method.getReturnType()); | 			if (this.method.getReturnType() != Type.class && this.method.getReturnType() != Type[].class) { | ||||||
|  | 				throw new IllegalStateException( | ||||||
|  | 						"Invalid return type on deserialized method - needs to be Type or Type[]: " + this.method); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -23,15 +23,15 @@ import java.util.List; | ||||||
| import joptsimple.OptionSet; | import joptsimple.OptionSet; | ||||||
| import joptsimple.OptionSpec; | import joptsimple.OptionSpec; | ||||||
| 
 | 
 | ||||||
| import org.springframework.util.Assert; |  | ||||||
| 
 |  | ||||||
| /** | /** | ||||||
|  * {@link CommandLinePropertySource} implementation backed by a JOpt {@link OptionSet}. |  * {@link CommandLinePropertySource} implementation backed by a JOpt {@link OptionSet}. | ||||||
|  * |  * | ||||||
|  * <h2>Typical usage</h2> |  * <h2>Typical usage</h2> | ||||||
|  |  * | ||||||
|  * Configure and execute an {@code OptionParser} against the {@code String[]} of arguments |  * Configure and execute an {@code OptionParser} against the {@code String[]} of arguments | ||||||
|  * supplied to the {@code main} method, and create a {@link JOptCommandLinePropertySource} |  * supplied to the {@code main} method, and create a {@link JOptCommandLinePropertySource} | ||||||
|  * using the resulting {@code OptionSet} object: |  * using the resulting {@code OptionSet} object: | ||||||
|  |  * | ||||||
|  * <pre class="code"> |  * <pre class="code"> | ||||||
|  * public static void main(String[] args) { |  * public static void main(String[] args) { | ||||||
|  *     OptionParser parser = new OptionParser(); |  *     OptionParser parser = new OptionParser(); | ||||||
|  | @ -44,7 +44,7 @@ import org.springframework.util.Assert; | ||||||
|  * |  * | ||||||
|  * See {@link CommandLinePropertySource} for complete general usage examples. |  * See {@link CommandLinePropertySource} for complete general usage examples. | ||||||
|  * |  * | ||||||
|  * <p>Requires JOpt version 4.3 or higher. Tested against JOpt up until 4.6. |  * <p>Requires JOpt Simple version 4.3 or higher. Tested against JOpt up until 5.0. | ||||||
|  * |  * | ||||||
|  * @author Chris Beams |  * @author Chris Beams | ||||||
|  * @author Juergen Hoeller |  * @author Juergen Hoeller | ||||||
|  | @ -98,7 +98,7 @@ public class JOptCommandLinePropertySource extends CommandLinePropertySource<Opt | ||||||
| 		List<?> argValues = this.source.valuesOf(name); | 		List<?> argValues = this.source.valuesOf(name); | ||||||
| 		List<String> stringArgValues = new ArrayList<>(); | 		List<String> stringArgValues = new ArrayList<>(); | ||||||
| 		for (Object argValue : argValues) { | 		for (Object argValue : argValues) { | ||||||
| 			stringArgValues.add(argValue instanceof String ? (String) argValue : argValue.toString()); | 			stringArgValues.add(argValue.toString()); | ||||||
| 		} | 		} | ||||||
| 		if (stringArgValues.isEmpty()) { | 		if (stringArgValues.isEmpty()) { | ||||||
| 			return (this.source.has(name) ? Collections.emptyList() : null); | 			return (this.source.has(name) ? Collections.emptyList() : null); | ||||||
|  | @ -111,8 +111,7 @@ public class JOptCommandLinePropertySource extends CommandLinePropertySource<Opt | ||||||
| 		List<?> argValues = this.source.nonOptionArguments(); | 		List<?> argValues = this.source.nonOptionArguments(); | ||||||
| 		List<String> stringArgValues = new ArrayList<>(); | 		List<String> stringArgValues = new ArrayList<>(); | ||||||
| 		for (Object argValue : argValues) { | 		for (Object argValue : argValues) { | ||||||
| 			Assert.isInstanceOf(String.class, argValue, "Argument values must be of type String"); | 			stringArgValues.add(argValue.toString()); | ||||||
| 			stringArgValues.add((String) argValue); |  | ||||||
| 		} | 		} | ||||||
| 		return (stringArgValues.isEmpty() ? Collections.emptyList() : | 		return (stringArgValues.isEmpty() ? Collections.emptyList() : | ||||||
| 				Collections.unmodifiableList(stringArgValues)); | 				Collections.unmodifiableList(stringArgValues)); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -49,9 +49,9 @@ import java.util.function.Supplier; | ||||||
|  * |  * | ||||||
|  * @author Keith Donald |  * @author Keith Donald | ||||||
|  * @author Juergen Hoeller |  * @author Juergen Hoeller | ||||||
|  |  * @author Sam Brannen | ||||||
|  * @author Colin Sampaleanu |  * @author Colin Sampaleanu | ||||||
|  * @author Rob Harrop |  * @author Rob Harrop | ||||||
|  * @author Sam Brannen |  | ||||||
|  * @since 1.1.2 |  * @since 1.1.2 | ||||||
|  */ |  */ | ||||||
| public abstract class Assert { | public abstract class Assert { | ||||||
|  | @ -66,6 +66,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if {@code expression} is {@code false} | 	 * @throws IllegalArgumentException if {@code expression} is {@code false} | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void isTrue(boolean expression, Supplier<String> messageSupplier) { | 	public static void isTrue(boolean expression, Supplier<String> messageSupplier) { | ||||||
| 		if (!expression) { | 		if (!expression) { | ||||||
|  | @ -87,17 +88,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert a boolean expression, throwing an {@code IllegalArgumentException} |  | ||||||
| 	 * if the expression evaluates to {@code false}. |  | ||||||
| 	 * <pre class="code">Assert.isTrue(i > 0);</pre> |  | ||||||
| 	 * @param expression a boolean expression |  | ||||||
| 	 * @throws IllegalArgumentException if {@code expression} is {@code false} |  | ||||||
| 	 */ |  | ||||||
| 	public static void isTrue(boolean expression) { |  | ||||||
| 		isTrue(expression, "[Assertion failed] - this expression must be true"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that an object is {@code null}. | 	 * Assert that an object is {@code null}. | ||||||
| 	 * <pre class="code"> | 	 * <pre class="code"> | ||||||
|  | @ -107,6 +97,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the object is not {@code null} | 	 * @throws IllegalArgumentException if the object is not {@code null} | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void isNull(Object object, Supplier<String> messageSupplier) { | 	public static void isNull(Object object, Supplier<String> messageSupplier) { | ||||||
| 		if (object != null) { | 		if (object != null) { | ||||||
|  | @ -127,16 +118,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that an object is {@code null}. |  | ||||||
| 	 * <pre class="code">Assert.isNull(value);</pre> |  | ||||||
| 	 * @param object the object to check |  | ||||||
| 	 * @throws IllegalArgumentException if the object is not {@code null} |  | ||||||
| 	 */ |  | ||||||
| 	public static void isNull(Object object) { |  | ||||||
| 		isNull(object, "[Assertion failed] - the object argument must be null"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that an object is not {@code null}. | 	 * Assert that an object is not {@code null}. | ||||||
| 	 * <pre class="code"> | 	 * <pre class="code"> | ||||||
|  | @ -146,6 +127,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the object is {@code null} | 	 * @throws IllegalArgumentException if the object is {@code null} | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void notNull(Object object, Supplier<String> messageSupplier) { | 	public static void notNull(Object object, Supplier<String> messageSupplier) { | ||||||
| 		if (object == null) { | 		if (object == null) { | ||||||
|  | @ -166,16 +148,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that an object is not {@code null}. |  | ||||||
| 	 * <pre class="code">Assert.notNull(clazz);</pre> |  | ||||||
| 	 * @param object the object to check |  | ||||||
| 	 * @throws IllegalArgumentException if the object is {@code null} |  | ||||||
| 	 */ |  | ||||||
| 	public static void notNull(Object object) { |  | ||||||
| 		notNull(object, "[Assertion failed] - this argument is required; it must not be null"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that the given String is not empty; that is, | 	 * Assert that the given String is not empty; that is, | ||||||
| 	 * it must not be {@code null} and not the empty String. | 	 * it must not be {@code null} and not the empty String. | ||||||
|  | @ -187,6 +159,7 @@ public abstract class Assert { | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @see StringUtils#hasLength | 	 * @see StringUtils#hasLength | ||||||
| 	 * @throws IllegalArgumentException if the text is empty | 	 * @throws IllegalArgumentException if the text is empty | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void hasLength(String text, Supplier<String> messageSupplier) { | 	public static void hasLength(String text, Supplier<String> messageSupplier) { | ||||||
| 		if (!StringUtils.hasLength(text)) { | 		if (!StringUtils.hasLength(text)) { | ||||||
|  | @ -209,19 +182,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that the given String is not empty; that is, |  | ||||||
| 	 * it must not be {@code null} and not the empty String. |  | ||||||
| 	 * <pre class="code">Assert.hasLength(name);</pre> |  | ||||||
| 	 * @param text the String to check |  | ||||||
| 	 * @see StringUtils#hasLength |  | ||||||
| 	 * @throws IllegalArgumentException if the text is empty |  | ||||||
| 	 */ |  | ||||||
| 	public static void hasLength(String text) { |  | ||||||
| 		hasLength(text, |  | ||||||
| 				"[Assertion failed] - this String argument must have length; it must not be null or empty"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that the given String contains valid text content; that is, it must not | 	 * Assert that the given String contains valid text content; that is, it must not | ||||||
| 	 * be {@code null} and must contain at least one non-whitespace character. | 	 * be {@code null} and must contain at least one non-whitespace character. | ||||||
|  | @ -233,6 +193,7 @@ public abstract class Assert { | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @see StringUtils#hasText | 	 * @see StringUtils#hasText | ||||||
| 	 * @throws IllegalArgumentException if the text does not contain valid text content | 	 * @throws IllegalArgumentException if the text does not contain valid text content | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void hasText(String text, Supplier<String> messageSupplier) { | 	public static void hasText(String text, Supplier<String> messageSupplier) { | ||||||
| 		if (!StringUtils.hasText(text)) { | 		if (!StringUtils.hasText(text)) { | ||||||
|  | @ -255,19 +216,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that the given String contains valid text content; that is, it must not |  | ||||||
| 	 * be {@code null} and must contain at least one non-whitespace character. |  | ||||||
| 	 * <pre class="code">Assert.hasText(name, "'name' must not be empty");</pre> |  | ||||||
| 	 * @param text the String to check |  | ||||||
| 	 * @see StringUtils#hasText |  | ||||||
| 	 * @throws IllegalArgumentException if the text does not contain valid text content |  | ||||||
| 	 */ |  | ||||||
| 	public static void hasText(String text) { |  | ||||||
| 		hasText(text, |  | ||||||
| 				"[Assertion failed] - this String argument must have text; it must not be null, empty, or blank"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that the given text does not contain the given substring. | 	 * Assert that the given text does not contain the given substring. | ||||||
| 	 * <pre class="code"> | 	 * <pre class="code"> | ||||||
|  | @ -278,6 +226,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the text contains the substring | 	 * @throws IllegalArgumentException if the text contains the substring | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void doesNotContain(String textToSearch, String substring, Supplier<String> messageSupplier) { | 	public static void doesNotContain(String textToSearch, String substring, Supplier<String> messageSupplier) { | ||||||
| 		if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && | 		if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && | ||||||
|  | @ -301,18 +250,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that the given text does not contain the given substring. |  | ||||||
| 	 * <pre class="code">Assert.doesNotContain(name, "rod");</pre> |  | ||||||
| 	 * @param textToSearch the text to search |  | ||||||
| 	 * @param substring the substring to find within the text |  | ||||||
| 	 * @throws IllegalArgumentException if the text contains the substring |  | ||||||
| 	 */ |  | ||||||
| 	public static void doesNotContain(String textToSearch, String substring) { |  | ||||||
| 		doesNotContain(textToSearch, substring, |  | ||||||
| 				() -> "[Assertion failed] - this String argument must not contain the substring [" + substring + "]"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that an array contains elements; that is, it must not be | 	 * Assert that an array contains elements; that is, it must not be | ||||||
| 	 * {@code null} and must contain at least one element. | 	 * {@code null} and must contain at least one element. | ||||||
|  | @ -323,6 +260,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the object array is {@code null} or contains no elements | 	 * @throws IllegalArgumentException if the object array is {@code null} or contains no elements | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void notEmpty(Object[] array, Supplier<String> messageSupplier) { | 	public static void notEmpty(Object[] array, Supplier<String> messageSupplier) { | ||||||
| 		if (ObjectUtils.isEmpty(array)) { | 		if (ObjectUtils.isEmpty(array)) { | ||||||
|  | @ -344,18 +282,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that an array contains elements; that is, it must not be |  | ||||||
| 	 * {@code null} and must contain at least one element. |  | ||||||
| 	 * <pre class="code">Assert.notEmpty(array);</pre> |  | ||||||
| 	 * @param array the array to check |  | ||||||
| 	 * @throws IllegalArgumentException if the object array is {@code null} or |  | ||||||
| 	 * contains no elements |  | ||||||
| 	 */ |  | ||||||
| 	public static void notEmpty(Object[] array) { |  | ||||||
| 		notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that an array contains no {@code null} elements. | 	 * Assert that an array contains no {@code null} elements. | ||||||
| 	 * <p>Note: Does not complain if the array is empty! | 	 * <p>Note: Does not complain if the array is empty! | ||||||
|  | @ -366,6 +292,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the object array contains a {@code null} element | 	 * @throws IllegalArgumentException if the object array contains a {@code null} element | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void noNullElements(Object[] array, Supplier<String> messageSupplier) { | 	public static void noNullElements(Object[] array, Supplier<String> messageSupplier) { | ||||||
| 		if (array != null) { | 		if (array != null) { | ||||||
|  | @ -395,17 +322,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that an array contains no {@code null} elements. |  | ||||||
| 	 * <p>Note: Does not complain if the array is empty! |  | ||||||
| 	 * <pre class="code">Assert.noNullElements(array);</pre> |  | ||||||
| 	 * @param array the array to check |  | ||||||
| 	 * @throws IllegalArgumentException if the object array contains a {@code null} element |  | ||||||
| 	 */ |  | ||||||
| 	public static void noNullElements(Object[] array) { |  | ||||||
| 		noNullElements(array, "[Assertion failed] - this array must not contain any null elements"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that a collection contains elements; that is, it must not be | 	 * Assert that a collection contains elements; that is, it must not be | ||||||
| 	 * {@code null} and must contain at least one element. | 	 * {@code null} and must contain at least one element. | ||||||
|  | @ -417,6 +333,7 @@ public abstract class Assert { | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the collection is {@code null} or | 	 * @throws IllegalArgumentException if the collection is {@code null} or | ||||||
| 	 * contains no elements | 	 * contains no elements | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void notEmpty(Collection<?> collection, Supplier<String> messageSupplier) { | 	public static void notEmpty(Collection<?> collection, Supplier<String> messageSupplier) { | ||||||
| 		if (CollectionUtils.isEmpty(collection)) { | 		if (CollectionUtils.isEmpty(collection)) { | ||||||
|  | @ -439,19 +356,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that a collection contains elements; that is, it must not be |  | ||||||
| 	 * {@code null} and must contain at least one element. |  | ||||||
| 	 * <pre class="code">Assert.notEmpty(collection, "Collection must contain elements");</pre> |  | ||||||
| 	 * @param collection the collection to check |  | ||||||
| 	 * @throws IllegalArgumentException if the collection is {@code null} or |  | ||||||
| 	 * contains no elements |  | ||||||
| 	 */ |  | ||||||
| 	public static void notEmpty(Collection<?> collection) { |  | ||||||
| 		notEmpty(collection, |  | ||||||
| 				"[Assertion failed] - this collection must not be empty: it must contain at least 1 element"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that a Map contains entries; that is, it must not be {@code null} | 	 * Assert that a Map contains entries; that is, it must not be {@code null} | ||||||
| 	 * and must contain at least one entry. | 	 * and must contain at least one entry. | ||||||
|  | @ -462,6 +366,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalArgumentException if the map is {@code null} or contains no entries | 	 * @throws IllegalArgumentException if the map is {@code null} or contains no entries | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void notEmpty(Map<?, ?> map, Supplier<String> messageSupplier) { | 	public static void notEmpty(Map<?, ?> map, Supplier<String> messageSupplier) { | ||||||
| 		if (CollectionUtils.isEmpty(map)) { | 		if (CollectionUtils.isEmpty(map)) { | ||||||
|  | @ -483,29 +388,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert that a Map contains entries; that is, it must not be {@code null} |  | ||||||
| 	 * and must contain at least one entry. |  | ||||||
| 	 * <pre class="code">Assert.notEmpty(map);</pre> |  | ||||||
| 	 * @param map the map to check |  | ||||||
| 	 * @throws IllegalArgumentException if the map is {@code null} or contains no entries |  | ||||||
| 	 */ |  | ||||||
| 	public static void notEmpty(Map<?, ?> map) { |  | ||||||
| 		notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** |  | ||||||
| 	 * Assert that the provided object is an instance of the provided class. |  | ||||||
| 	 * <pre class="code">Assert.instanceOf(Foo.class, foo);</pre> |  | ||||||
| 	 * @param type the type to check against |  | ||||||
| 	 * @param obj the object to check |  | ||||||
| 	 * @throws IllegalArgumentException if the object is not an instance of type |  | ||||||
| 	 * @see Class#isInstance |  | ||||||
| 	 */ |  | ||||||
| 	public static void isInstanceOf(Class<?> type, Object obj) { |  | ||||||
| 		isInstanceOf(type, obj, ""); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Assert that the provided object is an instance of the provided class. | 	 * Assert that the provided object is an instance of the provided class. | ||||||
| 	 * <pre class="code"> | 	 * <pre class="code"> | ||||||
|  | @ -519,11 +401,12 @@ public abstract class Assert { | ||||||
| 	 * in ":" or "." so that the generated message looks OK when appended to it. | 	 * in ":" or "." so that the generated message looks OK when appended to it. | ||||||
| 	 * @throws IllegalArgumentException if the object is not an instance of type | 	 * @throws IllegalArgumentException if the object is not an instance of type | ||||||
| 	 * @see Class#isInstance | 	 * @see Class#isInstance | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void isInstanceOf(Class<?> type, Object obj, Supplier<String> messageSupplier) { | 	public static void isInstanceOf(Class<?> type, Object obj, Supplier<String> messageSupplier) { | ||||||
| 		notNull(type, "Type to check against must not be null"); | 		notNull(type, "Type to check against must not be null"); | ||||||
| 		if (!type.isInstance(obj)) { | 		if (!type.isInstance(obj)) { | ||||||
| 			isInstanceCheckFailed(type, obj, nullSafeGet(messageSupplier)); | 			instanceCheckFailed(type, obj, nullSafeGet(messageSupplier)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -541,26 +424,26 @@ public abstract class Assert { | ||||||
| 	public static void isInstanceOf(Class<?> type, Object obj, String message) { | 	public static void isInstanceOf(Class<?> type, Object obj, String message) { | ||||||
| 		notNull(type, "Type to check against must not be null"); | 		notNull(type, "Type to check against must not be null"); | ||||||
| 		if (!type.isInstance(obj)) { | 		if (!type.isInstance(obj)) { | ||||||
| 			isInstanceCheckFailed(type, obj, message); | 			instanceCheckFailed(type, obj, message); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private static void isInstanceCheckFailed(Class<?> type, Object obj, String message) { | 	/** | ||||||
| 		throw new IllegalArgumentException( | 	 * Assert that the provided object is an instance of the provided class. | ||||||
| 				(StringUtils.hasLength(message) ? message + " " : "") + | 	 * <pre class="code">Assert.instanceOf(Foo.class, foo);</pre> | ||||||
| 				"Object of class [" + (obj != null ? obj.getClass().getName() : "null") + | 	 * @param type the type to check against | ||||||
| 				"] must be an instance of " + type); | 	 * @param obj the object to check | ||||||
|  | 	 * @throws IllegalArgumentException if the object is not an instance of type | ||||||
|  | 	 * @see Class#isInstance | ||||||
|  | 	 */ | ||||||
|  | 	public static void isInstanceOf(Class<?> type, Object obj) { | ||||||
|  | 		isInstanceOf(type, obj, ""); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	private static void instanceCheckFailed(Class<?> type, Object obj, String message) { | ||||||
| 	 * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}. | 		String className = (obj != null ? obj.getClass().getName() : "null"); | ||||||
| 	 * <pre class="code">Assert.isAssignable(Number.class, myClass);</pre> | 		throw new IllegalArgumentException(StringUtils.hasLength(message) ? message + ": " + className : | ||||||
| 	 * @param superType the super type to check | 				"Object of class [" + className + "] must be an instance of " + type); | ||||||
| 	 * @param subType the sub type to check |  | ||||||
| 	 * @throws IllegalArgumentException if the classes are not assignable |  | ||||||
| 	 */ |  | ||||||
| 	public static void isAssignable(Class<?> superType, Class<?> subType) { |  | ||||||
| 		isAssignable(superType, subType, ""); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  | @ -575,11 +458,12 @@ public abstract class Assert { | ||||||
| 	 * by this method in order to provide further context. It should normally end | 	 * by this method in order to provide further context. It should normally end | ||||||
| 	 * in ":" or "." so that the generated message looks OK when appended to it. | 	 * in ":" or "." so that the generated message looks OK when appended to it. | ||||||
| 	 * @throws IllegalArgumentException if the classes are not assignable | 	 * @throws IllegalArgumentException if the classes are not assignable | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void isAssignable(Class<?> superType, Class<?> subType, Supplier<String> messageSupplier) { | 	public static void isAssignable(Class<?> superType, Class<?> subType, Supplier<String> messageSupplier) { | ||||||
| 		notNull(superType, "Super type to check against must not be null"); | 		notNull(superType, "Super type to check against must not be null"); | ||||||
| 		if (subType == null || !superType.isAssignableFrom(subType)) { | 		if (subType == null || !superType.isAssignableFrom(subType)) { | ||||||
| 			isAssignableCheckFailed(superType, subType, nullSafeGet(messageSupplier)); | 			assignableCheckFailed(superType, subType, nullSafeGet(messageSupplier)); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -596,12 +480,23 @@ public abstract class Assert { | ||||||
| 	public static void isAssignable(Class<?> superType, Class<?> subType, String message) { | 	public static void isAssignable(Class<?> superType, Class<?> subType, String message) { | ||||||
| 		notNull(superType, "Super type to check against must not be null"); | 		notNull(superType, "Super type to check against must not be null"); | ||||||
| 		if (subType == null || !superType.isAssignableFrom(subType)) { | 		if (subType == null || !superType.isAssignableFrom(subType)) { | ||||||
| 			isAssignableCheckFailed(superType, subType, message); | 			assignableCheckFailed(superType, subType, message); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private static void isAssignableCheckFailed(Class<?> superType, Class<?> subType, String message) { | 	/** | ||||||
| 		throw new IllegalArgumentException((StringUtils.hasLength(message) ? message + " " : "") + | 	 * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}. | ||||||
|  | 	 * <pre class="code">Assert.isAssignable(Number.class, myClass);</pre> | ||||||
|  | 	 * @param superType the super type to check | ||||||
|  | 	 * @param subType the sub type to check | ||||||
|  | 	 * @throws IllegalArgumentException if the classes are not assignable | ||||||
|  | 	 */ | ||||||
|  | 	public static void isAssignable(Class<?> superType, Class<?> subType) { | ||||||
|  | 		isAssignable(superType, subType, ""); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static void assignableCheckFailed(Class<?> superType, Class<?> subType, String message) { | ||||||
|  | 		throw new IllegalArgumentException(StringUtils.hasLength(message) ? message + ": " + subType : | ||||||
| 				subType + " is not assignable to " + superType); | 				subType + " is not assignable to " + superType); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -618,6 +513,7 @@ public abstract class Assert { | ||||||
| 	 * @param messageSupplier a supplier for the exception message to use if the | 	 * @param messageSupplier a supplier for the exception message to use if the | ||||||
| 	 * assertion fails | 	 * assertion fails | ||||||
| 	 * @throws IllegalStateException if {@code expression} is {@code false} | 	 * @throws IllegalStateException if {@code expression} is {@code false} | ||||||
|  | 	 * @since 5.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public static void state(boolean expression, Supplier<String> messageSupplier) { | 	public static void state(boolean expression, Supplier<String> messageSupplier) { | ||||||
| 		if (!expression) { | 		if (!expression) { | ||||||
|  | @ -641,19 +537,6 @@ public abstract class Assert { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** |  | ||||||
| 	 * Assert a boolean expression, throwing an {@link IllegalStateException} |  | ||||||
| 	 * if the expression evaluates to {@code false}. |  | ||||||
| 	 * <p>Call {@link #isTrue} if you wish to throw an {@code IllegalArgumentException} |  | ||||||
| 	 * on an assertion failure. |  | ||||||
| 	 * <pre class="code">Assert.state(id == null);</pre> |  | ||||||
| 	 * @param expression a boolean expression |  | ||||||
| 	 * @throws IllegalStateException if {@code expression} is {@code false} |  | ||||||
| 	 */ |  | ||||||
| 	public static void state(boolean expression) { |  | ||||||
| 		state(expression, "[Assertion failed] - this state invariant must be true"); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private static String nullSafeGet(Supplier<String> messageSupplier) { | 	private static String nullSafeGet(Supplier<String> messageSupplier) { | ||||||
| 		return (messageSupplier != null ? messageSupplier.get() : null); | 		return (messageSupplier != null ? messageSupplier.get() : null); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -903,7 +903,7 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
| 		public void remove() { | 		public void remove() { | ||||||
| 			Assert.state(this.last != null); | 			Assert.state(this.last != null, "No element to remove"); | ||||||
| 			ConcurrentReferenceHashMap.this.remove(this.last.getKey()); | 			ConcurrentReferenceHashMap.this.remove(this.last.getKey()); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -35,6 +35,7 @@ import static org.hamcrest.CoreMatchers.*; | ||||||
|  * @author Rick Evans |  * @author Rick Evans | ||||||
|  * @author Arjen Poutsma |  * @author Arjen Poutsma | ||||||
|  * @author Sam Brannen |  * @author Sam Brannen | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  */ |  */ | ||||||
| public class AssertTests { | public class AssertTests { | ||||||
| 
 | 
 | ||||||
|  | @ -43,14 +44,15 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isTrue() { | 	public void isTrueWithMessage() { | ||||||
| 		Assert.isTrue(true); | 		Assert.isTrue(true, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isTrueWithFalseExpression() { | 	public void isTrueWithFalse() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.isTrue(false); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.isTrue(false, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -72,22 +74,11 @@ public class AssertTests { | ||||||
| 		Assert.isTrue(false, (Supplier<String>) null); | 		Assert.isTrue(false, (Supplier<String>) null); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test |  | ||||||
| 	public void isNull() { |  | ||||||
| 		Assert.isNull(null); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isNullWithMessage() { | 	public void isNullWithMessage() { | ||||||
| 		Assert.isNull(null, "Bla"); | 		Assert.isNull(null, "Bla"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test |  | ||||||
| 	public void isNullWithNonNullObject() { |  | ||||||
| 		thrown.expect(IllegalArgumentException.class); |  | ||||||
| 		Assert.isNull(new Object()); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isNullWithMessageSupplier() { | 	public void isNullWithMessageSupplier() { | ||||||
| 		Assert.isNull(null, () -> "enigma"); | 		Assert.isNull(null, () -> "enigma"); | ||||||
|  | @ -108,8 +99,8 @@ public class AssertTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notNull() { | 	public void notNullWithMessage() { | ||||||
| 		Assert.notNull("foo"); | 		Assert.notNull("foo", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -133,24 +124,26 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasLength() { | 	public void hasLength() { | ||||||
| 		Assert.hasLength("I Heart ..."); | 		Assert.hasLength("I Heart ...", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasLengthWithWhitespaceOnly() { | 	public void hasLengthWithWhitespaceOnly() { | ||||||
| 		Assert.hasLength("\t  "); | 		Assert.hasLength("\t  ", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasLengthWithEmptyString() { | 	public void hasLengthWithEmptyString() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.hasLength(""); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.hasLength("", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasLengthWithNull() { | 	public void hasLengthWithNull() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.hasLength(null); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.hasLength(null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -186,7 +179,7 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasText() { | 	public void hasText() { | ||||||
| 		Assert.hasText("foo"); | 		Assert.hasText("foo", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -204,7 +197,7 @@ public class AssertTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void hasTextWithNullAndMessage() { | 	public void hasTextWithNull() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma"); | 		thrown.expectMessage("enigma"); | ||||||
| 		Assert.hasText(null, "enigma"); | 		Assert.hasText(null, "enigma"); | ||||||
|  | @ -245,21 +238,21 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void doesNotContainWithNullSearchString() { | 	public void doesNotContainWithNullSearchString() { | ||||||
| 		Assert.doesNotContain(null, "rod"); | 		Assert.doesNotContain(null, "rod", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void doesNotContainWithNullSubstring() { | 	public void doesNotContainWithNullSubstring() { | ||||||
| 		Assert.doesNotContain("A cool chick's name is Brod.", null); | 		Assert.doesNotContain("A cool chick's name is Brod.", null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void doesNotContainWithEmptySubstring() { | 	public void doesNotContainWithEmptySubstring() { | ||||||
| 		Assert.doesNotContain("A cool chick's name is Brod.", ""); | 		Assert.doesNotContain("A cool chick's name is Brod.", "", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void doesNotContainWithNullSearchStringAndNullSubstringAndMessage() { | 	public void doesNotContainWithNullSearchStringAndNullSubstring() { | ||||||
| 		Assert.doesNotContain(null, null, "enigma"); | 		Assert.doesNotContain(null, null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -299,12 +292,26 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyArray() { | 	public void notEmptyArray() { | ||||||
| 		Assert.notEmpty(new String[] { "1234" }); | 		Assert.notEmpty(new String[] {"1234"}, "enigma"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	public void notEmptyArrayWithEmptyArray() { | ||||||
|  | 		thrown.expect(IllegalArgumentException.class); | ||||||
|  | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty(new String[] {}, "enigma"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	public void notEmptyArrayWithNullArray() { | ||||||
|  | 		thrown.expect(IllegalArgumentException.class); | ||||||
|  | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty((Object[]) null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyArrayWithMessageSupplier() { | 	public void notEmptyArrayWithMessageSupplier() { | ||||||
| 		Assert.notEmpty(new String[] { "1234" }, () -> "enigma"); | 		Assert.notEmpty(new String[] {"1234"}, () -> "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -369,19 +376,21 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyCollection() { | 	public void notEmptyCollection() { | ||||||
| 		Assert.notEmpty(singletonList("foo")); | 		Assert.notEmpty(singletonList("foo"), "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyCollectionWithEmptyCollection() { | 	public void notEmptyCollectionWithEmptyCollection() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.notEmpty(emptyList()); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty(emptyList(), "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyCollectionWithNullCollection() { | 	public void notEmptyCollectionWithNullCollection() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.notEmpty((Collection<?>) null); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty((Collection<?>) null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -412,19 +421,21 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyMap() { | 	public void notEmptyMap() { | ||||||
| 		Assert.notEmpty(singletonMap("foo", "bar")); | 		Assert.notEmpty(singletonMap("foo", "bar"), "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyMapWithNullMap() { | 	public void notEmptyMapWithNullMap() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.notEmpty((Map<?, ?>) null); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty((Map<?, ?>) null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void notEmptyMapWithEmptyMap() { | 	public void notEmptyMapWithEmptyMap() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		Assert.notEmpty(emptyMap()); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.notEmpty(emptyMap(), "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -455,21 +466,21 @@ public class AssertTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOf() { | 	public void isInstanceOf() { | ||||||
| 		Assert.isInstanceOf(String.class, "foo"); | 		Assert.isInstanceOf(String.class, "foo", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOfWithNullType() { | 	public void isInstanceOfWithNullType() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("Type to check against must not be null"); | 		thrown.expectMessage("Type to check against must not be null"); | ||||||
| 		Assert.isInstanceOf(null, "foo"); | 		Assert.isInstanceOf(null, "foo", "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOfWithNullInstance() { | 	public void isInstanceOfWithNullInstance() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("Object of class [null] must be an instance of class java.lang.String"); | 		thrown.expectMessage("enigma: null"); | ||||||
| 		Assert.isInstanceOf(String.class, null); | 		Assert.isInstanceOf(String.class, null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -482,9 +493,8 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOfWithTypeMismatchAndCustomMessage() { | 	public void isInstanceOfWithTypeMismatchAndCustomMessage() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage( | 		thrown.expectMessage("Custom message: java.lang.Long"); | ||||||
| 			"Custom message. Object of class [java.lang.Long] must be an instance of class java.lang.String"); | 		Assert.isInstanceOf(String.class, 42L, "Custom message"); | ||||||
| 		Assert.isInstanceOf(String.class, 42L, "Custom message."); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -502,8 +512,8 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOfWithNullInstanceAndMessageSupplier() { | 	public void isInstanceOfWithNullInstanceAndMessageSupplier() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma: Object of class [null] must be an instance of class java.lang.String"); | 		thrown.expectMessage("enigma: null"); | ||||||
| 		Assert.isInstanceOf(String.class, null, () -> "enigma:"); | 		Assert.isInstanceOf(String.class, null, () -> "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -516,27 +526,27 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isInstanceOfWithTypeMismatchAndMessageSupplier() { | 	public void isInstanceOfWithTypeMismatchAndMessageSupplier() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma: Object of class [java.lang.Long] must be an instance of class java.lang.String"); | 		thrown.expectMessage("enigma: java.lang.Long"); | ||||||
| 		Assert.isInstanceOf(String.class, 42L, () -> "enigma:"); | 		Assert.isInstanceOf(String.class, 42L, () -> "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignable() { | 	public void isAssignable() { | ||||||
| 		Assert.isAssignable(Number.class, Integer.class); | 		Assert.isAssignable(Number.class, Integer.class, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignableWithNullSupertype() { | 	public void isAssignableWithNullSupertype() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("Super type to check against must not be null"); | 		thrown.expectMessage("Super type to check against must not be null"); | ||||||
| 		Assert.isAssignable(null, Integer.class); | 		Assert.isAssignable(null, Integer.class, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignableWithNullSubtype() { | 	public void isAssignableWithNullSubtype() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("null is not assignable to class java.lang.Integer"); | 		thrown.expectMessage("enigma: null"); | ||||||
| 		Assert.isAssignable(Integer.class, null); | 		Assert.isAssignable(Integer.class, null, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -549,8 +559,8 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignableWithTypeMismatchAndCustomMessage() { | 	public void isAssignableWithTypeMismatchAndCustomMessage() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma: class java.lang.Integer is not assignable to class java.lang.String"); | 		thrown.expectMessage("enigma: class java.lang.Integer"); | ||||||
| 		Assert.isAssignable(String.class, Integer.class, "enigma:"); | 		Assert.isAssignable(String.class, Integer.class, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -568,8 +578,8 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignableWithNullSubtypeAndMessageSupplier() { | 	public void isAssignableWithNullSubtypeAndMessageSupplier() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma: null is not assignable to class java.lang.Integer"); | 		thrown.expectMessage("enigma: null"); | ||||||
| 		Assert.isAssignable(Integer.class, null, () -> "enigma:"); | 		Assert.isAssignable(Integer.class, null, () -> "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  | @ -582,19 +592,20 @@ public class AssertTests { | ||||||
| 	@Test | 	@Test | ||||||
| 	public void isAssignableWithTypeMismatchAndMessageSupplier() { | 	public void isAssignableWithTypeMismatchAndMessageSupplier() { | ||||||
| 		thrown.expect(IllegalArgumentException.class); | 		thrown.expect(IllegalArgumentException.class); | ||||||
| 		thrown.expectMessage("enigma: class java.lang.Integer is not assignable to class java.lang.String"); | 		thrown.expectMessage("enigma: class java.lang.Integer"); | ||||||
| 		Assert.isAssignable(String.class, Integer.class, () -> "enigma:"); | 		Assert.isAssignable(String.class, Integer.class, () -> "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void state() { | 	public void state() { | ||||||
| 		Assert.state(true); | 		Assert.state(true, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void stateWithFalseExpression() { | 	public void stateWithFalseExpression() { | ||||||
| 		thrown.expect(IllegalStateException.class); | 		thrown.expect(IllegalStateException.class); | ||||||
| 		Assert.state(false); | 		thrown.expectMessage("enigma"); | ||||||
|  | 		Assert.state(false, "enigma"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,8 +43,8 @@ public class OpDec extends Operator { | ||||||
| 
 | 
 | ||||||
| 	public OpDec(int pos, boolean postfix, SpelNodeImpl... operands) { | 	public OpDec(int pos, boolean postfix, SpelNodeImpl... operands) { | ||||||
| 		super("--", pos, operands); | 		super("--", pos, operands); | ||||||
| 		Assert.notEmpty(operands); |  | ||||||
| 		this.postfix = postfix; | 		this.postfix = postfix; | ||||||
|  | 		Assert.notEmpty(operands, "Operands must not be empty"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,8 +43,8 @@ public class OpInc extends Operator { | ||||||
| 
 | 
 | ||||||
| 	public OpInc(int pos, boolean postfix, SpelNodeImpl... operands) { | 	public OpInc(int pos, boolean postfix, SpelNodeImpl... operands) { | ||||||
| 		super("++", pos, operands); | 		super("++", pos, operands); | ||||||
| 		Assert.notEmpty(operands); |  | ||||||
| 		this.postfix = postfix; | 		this.postfix = postfix; | ||||||
|  | 		Assert.notEmpty(operands, "Operands must not be empty"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -51,7 +51,7 @@ public class OpPlus extends Operator { | ||||||
| 
 | 
 | ||||||
| 	public OpPlus(int pos, SpelNodeImpl... operands) { | 	public OpPlus(int pos, SpelNodeImpl... operands) { | ||||||
| 		super("+", pos, operands); | 		super("+", pos, operands); | ||||||
| 		Assert.notEmpty(operands); | 		Assert.notEmpty(operands, "Operands must not be empty"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -51,7 +51,7 @@ public abstract class Operator extends SpelNodeImpl { | ||||||
| 	protected String rightActualDescriptor; | 	protected String rightActualDescriptor; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public Operator(String payload,int pos,SpelNodeImpl... operands) { | 	public Operator(String payload, int pos, SpelNodeImpl... operands) { | ||||||
| 		super(pos, operands); | 		super(pos, operands); | ||||||
| 		this.operatorName = payload; | 		this.operatorName = payload; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -79,6 +79,7 @@ import org.springframework.util.StringUtils; | ||||||
|  * Hand written SpEL parser. Instances are reusable but are not thread-safe. |  * Hand written SpEL parser. Instances are reusable but are not thread-safe. | ||||||
|  * |  * | ||||||
|  * @author Andy Clement |  * @author Andy Clement | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  * @author Phillip Webb |  * @author Phillip Webb | ||||||
|  * @since 3.0 |  * @since 3.0 | ||||||
|  */ |  */ | ||||||
|  | @ -128,7 +129,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 			if (moreTokens()) { | 			if (moreTokens()) { | ||||||
| 				throw new SpelParseException(peekToken().startPos, SpelMessage.MORE_INPUT, toString(nextToken())); | 				throw new SpelParseException(peekToken().startPos, SpelMessage.MORE_INPUT, toString(nextToken())); | ||||||
| 			} | 			} | ||||||
| 			Assert.isTrue(this.constructedNodes.isEmpty()); | 			Assert.isTrue(this.constructedNodes.isEmpty(), "At least one node expected"); | ||||||
| 			return new SpelExpression(expressionString, ast, this.configuration); | 			return new SpelExpression(expressionString, ast, this.configuration); | ||||||
| 		} | 		} | ||||||
| 		catch (InternalParseException ex) { | 		catch (InternalParseException ex) { | ||||||
|  | @ -232,7 +233,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 				if (tk == TokenKind.EQ) { | 				if (tk == TokenKind.EQ) { | ||||||
| 					return new OpEQ(pos, expr, rhExpr); | 					return new OpEQ(pos, expr, rhExpr); | ||||||
| 				} | 				} | ||||||
| 				Assert.isTrue(tk == TokenKind.NE); | 				Assert.isTrue(tk == TokenKind.NE, "Not-equals token expected"); | ||||||
| 				return new OpNE(pos, expr, rhExpr); | 				return new OpNE(pos, expr, rhExpr); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -244,7 +245,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 				return new OperatorMatches(toPos(t), expr, rhExpr); | 				return new OperatorMatches(toPos(t), expr, rhExpr); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			Assert.isTrue(tk == TokenKind.BETWEEN); | 			Assert.isTrue(tk == TokenKind.BETWEEN, "Between token expected"); | ||||||
| 			return new OperatorBetween(toPos(t), expr, rhExpr); | 			return new OperatorBetween(toPos(t), expr, rhExpr); | ||||||
| 		} | 		} | ||||||
| 		return expr; | 		return expr; | ||||||
|  | @ -281,7 +282,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 				expr = new OpDivide(toPos(t), expr, rhExpr); | 				expr = new OpDivide(toPos(t), expr, rhExpr); | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
| 				Assert.isTrue(t.kind == TokenKind.MOD); | 				Assert.isTrue(t.kind == TokenKind.MOD, "Mod token expected"); | ||||||
| 				expr = new OpModulus(toPos(t), expr, rhExpr); | 				expr = new OpModulus(toPos(t), expr, rhExpr); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -298,7 +299,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 			return new OperatorPower(toPos(t), expr, rhExpr); | 			return new OperatorPower(toPos(t), expr, rhExpr); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (expr != null && peekToken(TokenKind.INC,TokenKind.DEC)) { | 		if (expr != null && peekToken(TokenKind.INC, TokenKind.DEC)) { | ||||||
| 			Token t = nextToken();  //consume INC/DEC | 			Token t = nextToken();  //consume INC/DEC | ||||||
| 			if (t.getKind() == TokenKind.INC) { | 			if (t.getKind() == TokenKind.INC) { | ||||||
| 				return new OpInc(toPos(t), true, expr); | 				return new OpInc(toPos(t), true, expr); | ||||||
|  | @ -321,7 +322,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 			if (t.kind == TokenKind.PLUS) { | 			if (t.kind == TokenKind.PLUS) { | ||||||
| 				return new OpPlus(toPos(t), expr); | 				return new OpPlus(toPos(t), expr); | ||||||
| 			} | 			} | ||||||
| 			Assert.isTrue(t.kind == TokenKind.MINUS); | 			Assert.isTrue(t.kind == TokenKind.MINUS, "Minus token expected"); | ||||||
| 			return new OpMinus(toPos(t), expr); | 			return new OpMinus(toPos(t), expr); | ||||||
| 
 | 
 | ||||||
| 		} | 		} | ||||||
|  | @ -356,7 +357,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 	// node : ((DOT dottedNode) | (SAFE_NAVI dottedNode) | nonDottedNode)+; | 	// node : ((DOT dottedNode) | (SAFE_NAVI dottedNode) | nonDottedNode)+; | ||||||
| 	private boolean maybeEatNode() { | 	private boolean maybeEatNode() { | ||||||
| 		SpelNodeImpl expr = null; | 		SpelNodeImpl expr = null; | ||||||
| 		if (peekToken(TokenKind.DOT,TokenKind.SAFE_NAVI)) { | 		if (peekToken(TokenKind.DOT, TokenKind.SAFE_NAVI)) { | ||||||
| 			expr = eatDottedNode(); | 			expr = eatDottedNode(); | ||||||
| 		} | 		} | ||||||
| 		else { | 		else { | ||||||
|  | @ -940,7 +941,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean peekToken(TokenKind possible1,TokenKind possible2) { | 	private boolean peekToken(TokenKind possible1, TokenKind possible2) { | ||||||
| 		if (!moreTokens()) { | 		if (!moreTokens()) { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
|  | @ -948,12 +949,12 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 		return (t.kind == possible1 || t.kind == possible2); | 		return (t.kind == possible1 || t.kind == possible2); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean peekToken(TokenKind possible1,TokenKind possible2, TokenKind possible3) { | 	private boolean peekToken(TokenKind possible1, TokenKind possible2, TokenKind possible3) { | ||||||
| 		if (!moreTokens()) { | 		if (!moreTokens()) { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 		Token t = peekToken(); | 		Token t = peekToken(); | ||||||
| 		return t.kind == possible1 || t.kind == possible2 || t.kind == possible3; | 		return (t.kind == possible1 || t.kind == possible2 || t.kind == possible3); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean peekIdentifierToken(String identifierString) { | 	private boolean peekIdentifierToken(String identifierString) { | ||||||
|  | @ -961,7 +962,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 		Token t = peekToken(); | 		Token t = peekToken(); | ||||||
| 		return t.kind == TokenKind.IDENTIFIER && t.stringValue().equalsIgnoreCase(identifierString); | 		return (t.kind == TokenKind.IDENTIFIER && t.stringValue().equalsIgnoreCase(identifierString)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean peekSelectToken() { | 	private boolean peekSelectToken() { | ||||||
|  | @ -969,8 +970,7 @@ class InternalSpelExpressionParser extends TemplateAwareExpressionParser { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 		Token t = peekToken(); | 		Token t = peekToken(); | ||||||
| 		return t.kind == TokenKind.SELECT || t.kind == TokenKind.SELECT_FIRST | 		return (t.kind == TokenKind.SELECT || t.kind == TokenKind.SELECT_FIRST || t.kind == TokenKind.SELECT_LAST); | ||||||
| 				|| t.kind == TokenKind.SELECT_LAST; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private boolean moreTokens() { | 	private boolean moreTokens() { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -23,7 +23,6 @@ import java.util.List; | ||||||
| import org.springframework.expression.spel.InternalParseException; | import org.springframework.expression.spel.InternalParseException; | ||||||
| import org.springframework.expression.spel.SpelMessage; | import org.springframework.expression.spel.SpelMessage; | ||||||
| import org.springframework.expression.spel.SpelParseException; | import org.springframework.expression.spel.SpelParseException; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Lex some input data into a stream of tokens that can then be parsed. |  * Lex some input data into a stream of tokens that can then be parsed. | ||||||
|  | @ -522,9 +521,9 @@ class Tokenizer { | ||||||
| 	 * Check if this might be a two character token. | 	 * Check if this might be a two character token. | ||||||
| 	 */ | 	 */ | ||||||
| 	private boolean isTwoCharToken(TokenKind kind) { | 	private boolean isTwoCharToken(TokenKind kind) { | ||||||
| 		Assert.isTrue(kind.tokenChars.length == 2); | 		return (kind.tokenChars.length == 2 && | ||||||
| 		Assert.isTrue(this.toProcess[this.pos] == kind.tokenChars[0]); | 				this.toProcess[this.pos] == kind.tokenChars[0] && | ||||||
| 		return this.toProcess[this.pos + 1] == kind.tokenChars[1]; | 				this.toProcess[this.pos + 1] == kind.tokenChars[1]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2005 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -18,11 +18,11 @@ package org.springframework.jdbc.core; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Interface to be implemented by objects that can close resources |  * Interface to be implemented by objects that can close resources | ||||||
|  * allocated by parameters like SqlLobValues. |  * allocated by parameters like {@code SqlLobValue} objects. | ||||||
|  * |  * | ||||||
|  * <p>Typically implemented by PreparedStatementCreators and |  * <p>Typically implemented by {@code PreparedStatementCreators} and | ||||||
|  * PreparedStatementSetters that support DisposableSqlTypeValue |  * {@code PreparedStatementSetters} that support {@link DisposableSqlTypeValue} | ||||||
|  * objects (e.g. SqlLobValue) as parameters. |  * objects (e.g. {@code SqlLobValue}) as parameters. | ||||||
|  * |  * | ||||||
|  * @author Thomas Risberg |  * @author Thomas Risberg | ||||||
|  * @author Juergen Hoeller |  * @author Juergen Hoeller | ||||||
|  | @ -38,9 +38,9 @@ public interface ParameterDisposer { | ||||||
| 	 * Close the resources allocated by parameters that the implementing | 	 * Close the resources allocated by parameters that the implementing | ||||||
| 	 * object holds, for example in case of a DisposableSqlTypeValue | 	 * object holds, for example in case of a DisposableSqlTypeValue | ||||||
| 	 * (like a SqlLobValue). | 	 * (like a SqlLobValue). | ||||||
| 	 * @see DisposableSqlTypeValue#cleanup | 	 * @see DisposableSqlTypeValue#cleanup() | ||||||
| 	 * @see org.springframework.jdbc.core.support.SqlLobValue#cleanup | 	 * @see org.springframework.jdbc.core.support.SqlLobValue#cleanup() | ||||||
| 	 */ | 	 */ | ||||||
| 	public void cleanupParameters(); | 	void cleanupParameters(); | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -94,7 +94,9 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet | ||||||
| 			throws Exception { | 			throws Exception { | ||||||
| 
 | 
 | ||||||
| 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | ||||||
| 		Assert.notNull(handler, "No handler for return value type [" + returnType.getParameterType().getName() + "]"); | 		if (handler == null) { | ||||||
|  | 			throw new IllegalStateException("No handler for return value type: " + returnType.getParameterType()); | ||||||
|  | 		} | ||||||
| 		if (logger.isTraceEnabled()) { | 		if (logger.isTraceEnabled()) { | ||||||
| 			logger.trace("Processing return value with " + handler); | 			logger.trace("Processing return value with " + handler); | ||||||
| 		} | 		} | ||||||
|  | @ -104,14 +106,15 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType) { | 	public boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType) { | ||||||
| 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | ||||||
| 		return (handler != null && handler instanceof AsyncHandlerMethodReturnValueHandler && | 		return (handler instanceof AsyncHandlerMethodReturnValueHandler && | ||||||
| 				((AsyncHandlerMethodReturnValueHandler) handler).isAsyncReturnValue(returnValue, returnType)); | 				((AsyncHandlerMethodReturnValueHandler) handler).isAsyncReturnValue(returnValue, returnType)); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public ListenableFuture<?> toListenableFuture(Object returnValue, MethodParameter returnType) { | 	public ListenableFuture<?> toListenableFuture(Object returnValue, MethodParameter returnType) { | ||||||
| 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | 		HandlerMethodReturnValueHandler handler = getReturnValueHandler(returnType); | ||||||
| 		Assert.isTrue(handler != null && handler instanceof AsyncHandlerMethodReturnValueHandler); | 		Assert.state(handler instanceof AsyncHandlerMethodReturnValueHandler, | ||||||
|  | 				"AsyncHandlerMethodReturnValueHandler required"); | ||||||
| 		return ((AsyncHandlerMethodReturnValueHandler) handler).toListenableFuture(returnValue, returnType); | 		return ((AsyncHandlerMethodReturnValueHandler) handler).toListenableFuture(returnValue, returnType); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -58,10 +58,10 @@ public class SimpMessagingTemplate extends AbstractMessageSendingTemplate<String | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Create a new {@link SimpMessagingTemplate} instance. | 	 * Create a new {@link SimpMessagingTemplate} instance. | ||||||
| 	 * @param messageChannel the message channel (must not be {@code null}) | 	 * @param messageChannel the message channel (never {@code null}) | ||||||
| 	 */ | 	 */ | ||||||
| 	public SimpMessagingTemplate(MessageChannel messageChannel) { | 	public SimpMessagingTemplate(MessageChannel messageChannel) { | ||||||
| 		Assert.notNull(messageChannel, "'messageChannel' must not be null"); | 		Assert.notNull(messageChannel, "MessageChannel must not be null"); | ||||||
| 		this.messageChannel = messageChannel; | 		this.messageChannel = messageChannel; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -79,8 +79,8 @@ public class SimpMessagingTemplate extends AbstractMessageSendingTemplate<String | ||||||
| 	 * @see org.springframework.messaging.simp.user.UserDestinationMessageHandler | 	 * @see org.springframework.messaging.simp.user.UserDestinationMessageHandler | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setUserDestinationPrefix(String prefix) { | 	public void setUserDestinationPrefix(String prefix) { | ||||||
| 		Assert.hasText(prefix, "'destinationPrefix' must not be empty"); | 		Assert.hasText(prefix, "User destination prefix must not be empty"); | ||||||
| 		this.destinationPrefix = prefix.endsWith("/") ? prefix : prefix + "/"; | 		this.destinationPrefix = (prefix.endsWith("/") ? prefix : prefix + "/"); | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -135,7 +135,7 @@ public class SimpMessagingTemplate extends AbstractMessageSendingTemplate<String | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void send(Message<?> message) { | 	public void send(Message<?> message) { | ||||||
| 		Assert.notNull(message, "'message' is required"); | 		Assert.notNull(message, "Message is required"); | ||||||
| 		String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); | 		String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); | ||||||
| 		if (destination != null) { | 		if (destination != null) { | ||||||
| 			sendInternal(message); | 			sendInternal(message); | ||||||
|  | @ -178,7 +178,7 @@ public class SimpMessagingTemplate extends AbstractMessageSendingTemplate<String | ||||||
| 
 | 
 | ||||||
| 	private void sendInternal(Message<?> message) { | 	private void sendInternal(Message<?> message) { | ||||||
| 		String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); | 		String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders()); | ||||||
| 		Assert.notNull(destination); | 		Assert.notNull(destination, "Destination header required"); | ||||||
| 
 | 
 | ||||||
| 		long timeout = this.sendTimeout; | 		long timeout = this.sendTimeout; | ||||||
| 		boolean sent = (timeout >= 0 ? this.messageChannel.send(message, timeout) : this.messageChannel.send(message)); | 		boolean sent = (timeout >= 0 ? this.messageChannel.send(message, timeout) : this.messageChannel.send(message)); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -480,7 +480,7 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan | ||||||
| 			Map<String, String> vars = getPathMatcher().extractUriTemplateVariables(pattern, lookupDestination); | 			Map<String, String> vars = getPathMatcher().extractUriTemplateVariables(pattern, lookupDestination); | ||||||
| 			if (!CollectionUtils.isEmpty(vars)) { | 			if (!CollectionUtils.isEmpty(vars)) { | ||||||
| 				MessageHeaderAccessor mha = MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class); | 				MessageHeaderAccessor mha = MessageHeaderAccessor.getAccessor(message, MessageHeaderAccessor.class); | ||||||
| 				Assert.state(mha != null && mha.isMutable()); | 				Assert.state(mha != null && mha.isMutable(), "Mutable MessageHeaderAccessor required"); | ||||||
| 				mha.setHeader(DestinationVariableMethodArgumentResolver.DESTINATION_TEMPLATE_VARIABLES_HEADER, vars); | 				mha.setHeader(DestinationVariableMethodArgumentResolver.DESTINATION_TEMPLATE_VARIABLES_HEADER, vars); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -17,6 +17,7 @@ | ||||||
| package org.springframework.messaging.simp.broker; | package org.springframework.messaging.simp.broker; | ||||||
| 
 | 
 | ||||||
| import java.security.Principal; | import java.security.Principal; | ||||||
|  | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||||
|  | @ -174,7 +175,9 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler { | ||||||
| 	 * @since 4.2 | 	 * @since 4.2 | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setHeartbeatValue(long[] heartbeat) { | 	public void setHeartbeatValue(long[] heartbeat) { | ||||||
| 		Assert.notNull(heartbeat); | 		if (heartbeat == null || heartbeat.length != 2 || heartbeat[0] < 0 || heartbeat[1] < 0) { | ||||||
|  | 			throw new IllegalArgumentException("Invalid heart-beat: " + Arrays.toString(heartbeat)); | ||||||
|  | 		} | ||||||
| 		this.heartbeatValue = heartbeat; | 		this.heartbeatValue = heartbeat; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -317,14 +317,14 @@ public abstract class AbstractMessageBrokerConfiguration implements ApplicationC | ||||||
| 			return new NoOpMessageHandler(); | 			return new NoOpMessageHandler(); | ||||||
| 		} | 		} | ||||||
| 		SimpUserRegistry userRegistry = userRegistry(); | 		SimpUserRegistry userRegistry = userRegistry(); | ||||||
| 		Assert.isInstanceOf(MultiServerUserRegistry.class, userRegistry); | 		Assert.isInstanceOf(MultiServerUserRegistry.class, userRegistry, "MultiServerUserRegistry required"); | ||||||
| 		return new UserRegistryMessageHandler((MultiServerUserRegistry) userRegistry, | 		return new UserRegistryMessageHandler((MultiServerUserRegistry) userRegistry, | ||||||
| 				brokerMessagingTemplate(), getBrokerRegistry().getUserRegistryBroadcast(), | 				brokerMessagingTemplate(), getBrokerRegistry().getUserRegistryBroadcast(), | ||||||
| 				messageBrokerTaskScheduler()); | 				messageBrokerTaskScheduler()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Expose alias for 4.1 compatibility | 	// Expose alias for 4.1 compatibility | ||||||
| 	@Bean(name={"messageBrokerTaskScheduler", "messageBrokerSockJsTaskScheduler"}) | 	@Bean(name = {"messageBrokerTaskScheduler", "messageBrokerSockJsTaskScheduler"}) | ||||||
| 	public ThreadPoolTaskScheduler messageBrokerTaskScheduler() { | 	public ThreadPoolTaskScheduler messageBrokerTaskScheduler() { | ||||||
| 		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); | 		ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); | ||||||
| 		scheduler.setThreadNamePrefix("MessageBroker-"); | 		scheduler.setThreadNamePrefix("MessageBroker-"); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -55,8 +55,8 @@ public class MessageBrokerRegistry { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public MessageBrokerRegistry(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel) { | 	public MessageBrokerRegistry(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel) { | ||||||
| 		Assert.notNull(clientInboundChannel); | 		Assert.notNull(clientInboundChannel, "Inbound channel must not be null"); | ||||||
| 		Assert.notNull(clientOutboundChannel); | 		Assert.notNull(clientOutboundChannel, "Outbound channel must not be null"); | ||||||
| 		this.clientInboundChannel = clientInboundChannel; | 		this.clientInboundChannel = clientInboundChannel; | ||||||
| 		this.clientOutboundChannel = clientOutboundChannel; | 		this.clientOutboundChannel = clientOutboundChannel; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -175,7 +175,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession { | ||||||
| 	 * <p>By default set to 15,000 (15 seconds). | 	 * <p>By default set to 15,000 (15 seconds). | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setReceiptTimeLimit(long receiptTimeLimit) { | 	public void setReceiptTimeLimit(long receiptTimeLimit) { | ||||||
| 		Assert.isTrue(receiptTimeLimit > 0); | 		Assert.isTrue(receiptTimeLimit > 0, "Receipt time limit must be larger than zero"); | ||||||
| 		this.receiptTimeLimit = receiptTimeLimit; | 		this.receiptTimeLimit = receiptTimeLimit; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -126,7 +126,7 @@ public abstract class StompClientSupport { | ||||||
| 	 * <p>By default set to 15,000 (15 seconds). | 	 * <p>By default set to 15,000 (15 seconds). | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setReceiptTimeLimit(long receiptTimeLimit) { | 	public void setReceiptTimeLimit(long receiptTimeLimit) { | ||||||
| 		Assert.isTrue(receiptTimeLimit > 0); | 		Assert.isTrue(receiptTimeLimit > 0, "Receipt time limit must be larger than zero"); | ||||||
| 		this.receiptTimeLimit = receiptTimeLimit; | 		this.receiptTimeLimit = receiptTimeLimit; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -48,7 +48,7 @@ abstract class AbstractMonoToListenableFutureAdapter<S, T> implements Listenable | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	protected AbstractMonoToListenableFutureAdapter(Mono<S> mono) { | 	protected AbstractMonoToListenableFutureAdapter(Mono<S> mono) { | ||||||
| 		Assert.notNull(mono, "'mono' must not be null"); | 		Assert.notNull(mono, "Mono must not be null"); | ||||||
| 		this.monoProcessor = mono | 		this.monoProcessor = mono | ||||||
| 				.doOnSuccess(result -> { | 				.doOnSuccess(result -> { | ||||||
| 					T adapted; | 					T adapted; | ||||||
|  | @ -73,10 +73,8 @@ abstract class AbstractMonoToListenableFutureAdapter<S, T> implements Listenable | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public T get(long timeout, TimeUnit unit) | 	public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { | ||||||
| 			throws InterruptedException, ExecutionException, TimeoutException { | 		Assert.notNull(unit, "TimeUnit must not be null"); | ||||||
| 
 |  | ||||||
| 		Assert.notNull(unit); |  | ||||||
| 		Duration duration = Duration.ofMillis(TimeUnit.MILLISECONDS.convert(timeout, unit)); | 		Duration duration = Duration.ofMillis(TimeUnit.MILLISECONDS.convert(timeout, unit)); | ||||||
| 		S result = this.monoProcessor.block(duration); | 		S result = this.monoProcessor.block(duration); | ||||||
| 		return adapt(result); | 		return adapt(result); | ||||||
|  | @ -112,6 +110,7 @@ abstract class AbstractMonoToListenableFutureAdapter<S, T> implements Listenable | ||||||
| 		this.registry.addFailureCallback(failureCallback); | 		this.registry.addFailureCallback(failureCallback); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	protected abstract T adapt(S result); | 	protected abstract T adapt(S result); | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -159,7 +159,7 @@ public class ReactorNettyTcpStompClientTests { | ||||||
| 		private final List<String> received = new ArrayList<>(); | 		private final List<String> received = new ArrayList<>(); | ||||||
| 
 | 
 | ||||||
| 		public ConsumingHandler(String... topics) { | 		public ConsumingHandler(String... topics) { | ||||||
| 			Assert.notEmpty(topics); | 			Assert.notEmpty(topics, "Topics must not be empty"); | ||||||
| 			this.topics = Arrays.asList(topics); | 			this.topics = Arrays.asList(topics); | ||||||
| 			this.subscriptionLatch = new CountDownLatch(this.topics.size()); | 			this.subscriptionLatch = new CountDownLatch(this.topics.size()); | ||||||
| 		} | 		} | ||||||
|  | @ -168,7 +168,6 @@ public class ReactorNettyTcpStompClientTests { | ||||||
| 			return this.received; | 			return this.received; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		@Override | 		@Override | ||||||
| 		public void afterConnected(StompSession session, StompHeaders connectedHeaders) { | 		public void afterConnected(StompSession session, StompHeaders connectedHeaders) { | ||||||
| 			for (String topic : this.topics) { | 			for (String topic : this.topics) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -399,7 +399,6 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public static MessageExchangeBuilder disconnectWithReceipt(String sessionId, String receiptId) { | 		public static MessageExchangeBuilder disconnectWithReceipt(String sessionId, String receiptId) { | ||||||
| 
 |  | ||||||
| 			StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.DISCONNECT); | 			StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.DISCONNECT); | ||||||
| 			headers.setSessionId(sessionId); | 			headers.setSessionId(sessionId); | ||||||
| 			headers.setReceipt(receiptId); | 			headers.setReceipt(receiptId); | ||||||
|  | @ -411,7 +410,7 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		public MessageExchangeBuilder andExpectMessage(String sessionId, String subscriptionId) { | 		public MessageExchangeBuilder andExpectMessage(String sessionId, String subscriptionId) { | ||||||
| 			Assert.isTrue(SimpMessageType.MESSAGE.equals(headers.getMessageType())); | 			Assert.state(SimpMessageType.MESSAGE.equals(this.headers.getMessageType()), "MESSAGE type expected"); | ||||||
| 			String destination = this.headers.getDestination(); | 			String destination = this.headers.getDestination(); | ||||||
| 			Object payload = this.message.getPayload(); | 			Object payload = this.message.getPayload(); | ||||||
| 			this.expected.add(new StompMessageFrameMessageMatcher(sessionId, subscriptionId, destination, payload)); | 			this.expected.add(new StompMessageFrameMessageMatcher(sessionId, subscriptionId, destination, payload)); | ||||||
|  | @ -420,7 +419,7 @@ public class StompBrokerRelayMessageHandlerIntegrationTests { | ||||||
| 
 | 
 | ||||||
| 		public MessageExchangeBuilder andExpectError() { | 		public MessageExchangeBuilder andExpectError() { | ||||||
| 			String sessionId = this.headers.getSessionId(); | 			String sessionId = this.headers.getSessionId(); | ||||||
| 			Assert.notNull(sessionId, "No sessionId to match the ERROR frame to"); | 			Assert.state(sessionId != null, "No sessionId to match the ERROR frame to"); | ||||||
| 			return andExpectError(sessionId); | 			return andExpectError(sessionId); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -110,7 +110,7 @@ public abstract class SessionFactoryUtils { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		// Check that it is the Hibernate FlushMode type, not JPA's... | 		// Check that it is the Hibernate FlushMode type, not JPA's... | ||||||
| 		Assert.state(FlushMode.class == getFlushMode.getReturnType()); | 		Assert.state(FlushMode.class == getFlushMode.getReturnType(), "Could not find Hibernate getFlushMode method"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -135,7 +135,6 @@ public abstract class AbstractEntityManagerFactoryBean implements | ||||||
| 	 * @see javax.persistence.Persistence | 	 * @see javax.persistence.Persistence | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setPersistenceProviderClass(Class<? extends PersistenceProvider> persistenceProviderClass) { | 	public void setPersistenceProviderClass(Class<? extends PersistenceProvider> persistenceProviderClass) { | ||||||
| 		Assert.isAssignable(PersistenceProvider.class, persistenceProviderClass); |  | ||||||
| 		this.persistenceProvider = BeanUtils.instantiateClass(persistenceProviderClass); | 		this.persistenceProvider = BeanUtils.instantiateClass(persistenceProviderClass); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -217,7 +216,6 @@ public abstract class AbstractEntityManagerFactoryBean implements | ||||||
| 	 * @see JpaVendorAdapter#getEntityManagerFactoryInterface() | 	 * @see JpaVendorAdapter#getEntityManagerFactoryInterface() | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setEntityManagerFactoryInterface(Class<? extends EntityManagerFactory> emfInterface) { | 	public void setEntityManagerFactoryInterface(Class<? extends EntityManagerFactory> emfInterface) { | ||||||
| 		Assert.isAssignable(EntityManagerFactory.class, emfInterface); |  | ||||||
| 		this.entityManagerFactoryInterface = emfInterface; | 		this.entityManagerFactoryInterface = emfInterface; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -231,7 +229,6 @@ public abstract class AbstractEntityManagerFactoryBean implements | ||||||
| 	 * @see EntityManagerFactoryInfo#getEntityManagerInterface() | 	 * @see EntityManagerFactoryInfo#getEntityManagerInterface() | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setEntityManagerInterface(Class<? extends EntityManager> emInterface) { | 	public void setEntityManagerInterface(Class<? extends EntityManager> emInterface) { | ||||||
| 		Assert.isAssignable(EntityManager.class, emInterface); |  | ||||||
| 		this.entityManagerInterface = emInterface; | 		this.entityManagerInterface = emInterface; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -68,7 +68,6 @@ public class SharedEntityManagerBean extends EntityManagerFactoryAccessor | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setEntityManagerInterface(Class<? extends EntityManager> entityManagerInterface) { | 	public void setEntityManagerInterface(Class<? extends EntityManager> entityManagerInterface) { | ||||||
| 		Assert.notNull(entityManagerInterface, "'entityManagerInterface' must not be null"); | 		Assert.notNull(entityManagerInterface, "'entityManagerInterface' must not be null"); | ||||||
| 		Assert.isAssignable(EntityManager.class, entityManagerInterface); |  | ||||||
| 		this.entityManagerInterface = entityManagerInterface; | 		this.entityManagerInterface = entityManagerInterface; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -100,7 +100,7 @@ public class HibernateJpaDialect extends DefaultJpaDialect { | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		// Check that it is the Hibernate FlushMode type, not JPA's... | 		// Check that it is the Hibernate FlushMode type, not JPA's... | ||||||
| 		Assert.state(FlushMode.class == getFlushMode.getReturnType()); | 		Assert.state(FlushMode.class == getFlushMode.getReturnType(), "Could not find Hibernate getFlushMode method"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -79,7 +79,6 @@ import org.springframework.oxm.UncategorizedMappingException; | ||||||
| import org.springframework.oxm.UnmarshallingFailureException; | import org.springframework.oxm.UnmarshallingFailureException; | ||||||
| import org.springframework.oxm.XmlMappingException; | import org.springframework.oxm.XmlMappingException; | ||||||
| import org.springframework.oxm.support.AbstractMarshaller; | import org.springframework.oxm.support.AbstractMarshaller; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| import org.springframework.util.ClassUtils; | import org.springframework.util.ClassUtils; | ||||||
| import org.springframework.util.ObjectUtils; | import org.springframework.util.ObjectUtils; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
|  | @ -114,7 +113,7 @@ import org.springframework.util.xml.StaxUtils; | ||||||
|  * @author Juergen Hoeller |  * @author Juergen Hoeller | ||||||
|  * @since 3.0 |  * @since 3.0 | ||||||
|  */ |  */ | ||||||
| public class XStreamMarshaller extends AbstractMarshaller implements InitializingBean, BeanClassLoaderAware { | public class XStreamMarshaller extends AbstractMarshaller implements BeanClassLoaderAware, InitializingBean { | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * The default encoding used for stream access: UTF-8. | 	 * The default encoding used for stream access: UTF-8. | ||||||
|  | @ -130,7 +129,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin | ||||||
| 
 | 
 | ||||||
| 	private Mapper mapper; | 	private Mapper mapper; | ||||||
| 
 | 
 | ||||||
| 	private Class<?>[] mapperWrappers; | 	private Class<? extends MapperWrapper>[] mapperWrappers; | ||||||
| 
 | 
 | ||||||
| 	private ConverterLookup converterLookup = new DefaultConverterLookup(); | 	private ConverterLookup converterLookup = new DefaultConverterLookup(); | ||||||
| 
 | 
 | ||||||
|  | @ -210,7 +209,8 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin | ||||||
| 	 * of type {@link Mapper} or {@link MapperWrapper}. | 	 * of type {@link Mapper} or {@link MapperWrapper}. | ||||||
| 	 * @since 4.0 | 	 * @since 4.0 | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setMapperWrappers(Class<?>... mapperWrappers) { | 	@SuppressWarnings("unchecked") | ||||||
|  | 	public void setMapperWrappers(Class<? extends MapperWrapper>... mapperWrappers) { | ||||||
| 		this.mapperWrappers = mapperWrappers; | 		this.mapperWrappers = mapperWrappers; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -413,9 +413,8 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin | ||||||
| 			protected MapperWrapper wrapMapper(MapperWrapper next) { | 			protected MapperWrapper wrapMapper(MapperWrapper next) { | ||||||
| 				MapperWrapper mapperToWrap = next; | 				MapperWrapper mapperToWrap = next; | ||||||
| 				if (mapperWrappers != null) { | 				if (mapperWrappers != null) { | ||||||
| 					for (Class<?> mapperWrapper : mapperWrappers) { | 					for (Class<? extends MapperWrapper> mapperWrapper : mapperWrappers) { | ||||||
| 						Assert.isAssignable(MapperWrapper.class, mapperWrapper); | 						Constructor<? extends MapperWrapper> ctor; | ||||||
| 						Constructor<?> ctor; |  | ||||||
| 						try { | 						try { | ||||||
| 							ctor = mapperWrapper.getConstructor(Mapper.class); | 							ctor = mapperWrapper.getConstructor(Mapper.class); | ||||||
| 						} | 						} | ||||||
|  | @ -428,9 +427,9 @@ public class XStreamMarshaller extends AbstractMarshaller implements Initializin | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| 						try { | 						try { | ||||||
| 							mapperToWrap = (MapperWrapper) ctor.newInstance(mapperToWrap); | 							mapperToWrap = ctor.newInstance(mapperToWrap); | ||||||
| 						} | 						} | ||||||
| 						catch (Exception ex) { | 						catch (Throwable ex) { | ||||||
| 							throw new IllegalStateException("Failed to construct MapperWrapper: " + mapperWrapper); | 							throw new IllegalStateException("Failed to construct MapperWrapper: " + mapperWrapper); | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -61,7 +61,7 @@ public class MockAsyncContext implements AsyncContext { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public void addDispatchHandler(Runnable handler) { | 	public void addDispatchHandler(Runnable handler) { | ||||||
| 		Assert.notNull(handler); | 		Assert.notNull(handler, "Dispatch handler must not be null"); | ||||||
| 		this.dispatchHandlers.add(handler); | 		this.dispatchHandlers.add(handler); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -77,7 +77,7 @@ public class MockAsyncContext implements AsyncContext { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean hasOriginalRequestAndResponse() { | 	public boolean hasOriginalRequestAndResponse() { | ||||||
| 		return (this.request instanceof MockHttpServletRequest) && (this.response instanceof MockHttpServletResponse); | 		return (this.request instanceof MockHttpServletRequest && this.response instanceof MockHttpServletResponse); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -356,12 +356,12 @@ public class MockPageContext extends PageContext { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public byte[] getContentAsByteArray() { | 	public byte[] getContentAsByteArray() { | ||||||
| 		Assert.isTrue(this.response instanceof MockHttpServletResponse); | 		Assert.state(this.response instanceof MockHttpServletResponse, "MockHttpServletResponse required"); | ||||||
| 		return ((MockHttpServletResponse) this.response).getContentAsByteArray(); | 		return ((MockHttpServletResponse) this.response).getContentAsByteArray(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public String getContentAsString() throws UnsupportedEncodingException { | 	public String getContentAsString() throws UnsupportedEncodingException { | ||||||
| 		Assert.isTrue(this.response instanceof MockHttpServletResponse); | 		Assert.state(this.response instanceof MockHttpServletResponse, "MockHttpServletResponse required"); | ||||||
| 		return ((MockHttpServletResponse) this.response).getContentAsString(); | 		return ((MockHttpServletResponse) this.response).getContentAsString(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,7 +43,7 @@ public class SimpleRequestExpectationManager extends AbstractRequestExpectationM | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	protected void afterExpectationsDeclared() { | 	protected void afterExpectationsDeclared() { | ||||||
| 		Assert.state(this.expectationIterator == null); | 		Assert.state(this.expectationIterator == null, "Expectations already declared"); | ||||||
| 		this.expectationIterator = getExpectations().iterator(); | 		this.expectationIterator = getExpectations().iterator(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2014 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -41,10 +41,10 @@ import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; | ||||||
| /** | /** | ||||||
|  * Demonstrates use of SPI extension points: |  * Demonstrates use of SPI extension points: | ||||||
|  * <ul> |  * <ul> | ||||||
|  * 	<li> {@link org.springframework.test.web.servlet.request.RequestPostProcessor} |  * <li> {@link org.springframework.test.web.servlet.request.RequestPostProcessor} | ||||||
|  * 	for extending request building with custom methods. |  * for extending request building with custom methods. | ||||||
|  * 	<li> {@link org.springframework.test.web.servlet.setup.MockMvcConfigurer |  * <li> {@link org.springframework.test.web.servlet.setup.MockMvcConfigurer | ||||||
|  * 	MockMvcConfigurer} for extending MockMvc building with some automatic setup. |  * MockMvcConfigurer} for extending MockMvc building with some automatic setup. | ||||||
|  * </ul> |  * </ul> | ||||||
|  * |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  | @ -106,6 +106,7 @@ public class FrameworkExtensionTests { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Test {@code MockMvcConfigurer}. | 	 * Test {@code MockMvcConfigurer}. | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -126,6 +127,7 @@ public class FrameworkExtensionTests { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	@Controller | 	@Controller | ||||||
| 	@RequestMapping("/") | 	@RequestMapping("/") | ||||||
| 	private static class SampleController { | 	private static class SampleController { | ||||||
|  | @ -133,16 +135,16 @@ public class FrameworkExtensionTests { | ||||||
| 		@RequestMapping(headers = "Foo") | 		@RequestMapping(headers = "Foo") | ||||||
| 		@ResponseBody | 		@ResponseBody | ||||||
| 		public String handleFoo(Principal principal) { | 		public String handleFoo(Principal principal) { | ||||||
| 			Assert.isTrue(principal != null); | 			Assert.notNull(principal, "Principal must not be null"); | ||||||
| 			return "Foo"; | 			return "Foo"; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		@RequestMapping(headers = "Bar") | 		@RequestMapping(headers = "Bar") | ||||||
| 		@ResponseBody | 		@ResponseBody | ||||||
| 		public String handleBar(Principal principal) { | 		public String handleBar(Principal principal) { | ||||||
| 			Assert.isTrue(principal != null); | 			Assert.notNull(principal, "Principal must not be null"); | ||||||
| 			return "Bar"; | 			return "Bar"; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -26,7 +26,6 @@ import org.springframework.beans.BeanUtils; | ||||||
| import org.springframework.beans.factory.DisposableBean; | import org.springframework.beans.factory.DisposableBean; | ||||||
| import org.springframework.beans.factory.FactoryBean; | import org.springframework.beans.factory.FactoryBean; | ||||||
| import org.springframework.beans.factory.InitializingBean; | import org.springframework.beans.factory.InitializingBean; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * {@link org.springframework.beans.factory.FactoryBean} that bootstraps |  * {@link org.springframework.beans.factory.FactoryBean} that bootstraps | ||||||
|  | @ -66,9 +65,8 @@ public class ResourceAdapterFactoryBean implements FactoryBean<ResourceAdapter>, | ||||||
| 	 * through the "resourceAdapter" property. | 	 * through the "resourceAdapter" property. | ||||||
| 	 * @see #setResourceAdapter | 	 * @see #setResourceAdapter | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setResourceAdapterClass(Class<?> resourceAdapterClass) { | 	public void setResourceAdapterClass(Class<? extends ResourceAdapter> resourceAdapterClass) { | ||||||
| 		Assert.isAssignable(ResourceAdapter.class, resourceAdapterClass); | 		this.resourceAdapter = BeanUtils.instantiateClass(resourceAdapterClass); | ||||||
| 		this.resourceAdapter = (ResourceAdapter) BeanUtils.instantiateClass(resourceAdapterClass); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.web.reactive.config; | package org.springframework.web.reactive.config; | ||||||
| 
 | 
 | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
|  | @ -30,7 +31,7 @@ public class UrlBasedViewResolverRegistration { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public UrlBasedViewResolverRegistration(UrlBasedViewResolver viewResolver) { | 	public UrlBasedViewResolverRegistration(UrlBasedViewResolver viewResolver) { | ||||||
| 		Assert.notNull(viewResolver); | 		Assert.notNull(viewResolver, "ViewResolver must not be null"); | ||||||
| 		this.viewResolver = viewResolver; | 		this.viewResolver = viewResolver; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.web.reactive.config; | package org.springframework.web.reactive.config; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | @ -32,7 +33,6 @@ import org.springframework.web.reactive.result.view.ViewResolver; | ||||||
| import org.springframework.web.reactive.result.view.freemarker.FreeMarkerConfigurer; | import org.springframework.web.reactive.result.view.freemarker.FreeMarkerConfigurer; | ||||||
| import org.springframework.web.reactive.result.view.freemarker.FreeMarkerViewResolver; | import org.springframework.web.reactive.result.view.freemarker.FreeMarkerViewResolver; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /** | /** | ||||||
|  * Assist with the configuration of a chain of {@link ViewResolver}'s supporting |  * Assist with the configuration of a chain of {@link ViewResolver}'s supporting | ||||||
|  * different template mechanisms. |  * different template mechanisms. | ||||||
|  | @ -46,17 +46,17 @@ import org.springframework.web.reactive.result.view.freemarker.FreeMarkerViewRes | ||||||
|  */ |  */ | ||||||
| public class ViewResolverRegistry { | public class ViewResolverRegistry { | ||||||
| 
 | 
 | ||||||
|  | 	private final ApplicationContext applicationContext; | ||||||
|  | 
 | ||||||
| 	private final List<ViewResolver> viewResolvers = new ArrayList<>(4); | 	private final List<ViewResolver> viewResolvers = new ArrayList<>(4); | ||||||
| 
 | 
 | ||||||
| 	private final List<View> defaultViews = new ArrayList<>(4); | 	private final List<View> defaultViews = new ArrayList<>(4); | ||||||
| 
 | 
 | ||||||
| 	private Integer order; | 	private Integer order; | ||||||
| 
 | 
 | ||||||
| 	private final ApplicationContext applicationContext; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 	public ViewResolverRegistry(ApplicationContext applicationContext) { | 	public ViewResolverRegistry(ApplicationContext applicationContext) { | ||||||
| 		Assert.notNull(applicationContext); | 		Assert.notNull(applicationContext, "ApplicationContext must not be null"); | ||||||
| 		this.applicationContext = applicationContext; | 		this.applicationContext = applicationContext; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -41,10 +41,13 @@ import org.springframework.web.server.support.HttpRequestPathHelper; | ||||||
|  * implementations. |  * implementations. | ||||||
|  * |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  * @since 5.0 |  * @since 5.0 | ||||||
|  */ |  */ | ||||||
| public abstract class AbstractHandlerMapping extends ApplicationObjectSupport | public abstract class AbstractHandlerMapping extends ApplicationObjectSupport implements HandlerMapping, Ordered { | ||||||
| 		implements HandlerMapping, Ordered { | 
 | ||||||
|  | 	private static final WebHandler REQUEST_HANDLED_HANDLER = exchange -> Mono.empty(); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	private int order = Integer.MAX_VALUE;  // default: same as non-Ordered | 	private int order = Integer.MAX_VALUE;  // default: same as non-Ordered | ||||||
| 
 | 
 | ||||||
|  | @ -158,7 +161,6 @@ public abstract class AbstractHandlerMapping extends ApplicationObjectSupport | ||||||
| 				CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange); | 				CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange); | ||||||
| 				CorsConfiguration configB = getCorsConfiguration(handler, exchange); | 				CorsConfiguration configB = getCorsConfiguration(handler, exchange); | ||||||
| 				CorsConfiguration config = (configA != null ? configA.combine(configB) : configB); | 				CorsConfiguration config = (configA != null ? configA.combine(configB) : configB); | ||||||
| 
 |  | ||||||
| 				if (!getCorsProcessor().processRequest(config, exchange) || | 				if (!getCorsProcessor().processRequest(config, exchange) || | ||||||
| 						CorsUtils.isPreFlightRequest(exchange.getRequest())) { | 						CorsUtils.isPreFlightRequest(exchange.getRequest())) { | ||||||
| 					return REQUEST_HANDLED_HANDLER; | 					return REQUEST_HANDLED_HANDLER; | ||||||
|  | @ -171,13 +173,11 @@ public abstract class AbstractHandlerMapping extends ApplicationObjectSupport | ||||||
| 	/** | 	/** | ||||||
| 	 * Look up a handler for the given request, returning an empty {@code Mono} | 	 * Look up a handler for the given request, returning an empty {@code Mono} | ||||||
| 	 * if no specific one is found. This method is called by {@link #getHandler}. | 	 * if no specific one is found. This method is called by {@link #getHandler}. | ||||||
| 	 * |  | ||||||
| 	 * <p>On CORS pre-flight requests this method should return a match not for | 	 * <p>On CORS pre-flight requests this method should return a match not for | ||||||
| 	 * the pre-flight request but for the expected actual request based on the URL | 	 * the pre-flight request but for the expected actual request based on the URL | ||||||
| 	 * path, the HTTP methods from the "Access-Control-Request-Method" header, and | 	 * path, the HTTP methods from the "Access-Control-Request-Method" header, and | ||||||
| 	 * the headers from the "Access-Control-Request-Headers" header thus allowing | 	 * the headers from the "Access-Control-Request-Headers" header thus allowing | ||||||
| 	 * the CORS configuration to be obtained via {@link #getCorsConfigurations}, | 	 * the CORS configuration to be obtained via {@link #getCorsConfigurations}, | ||||||
| 	 * |  | ||||||
| 	 * @param exchange current exchange | 	 * @param exchange current exchange | ||||||
| 	 * @return {@code Mono} for the matching handler, if any | 	 * @return {@code Mono} for the matching handler, if any | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -185,18 +185,15 @@ public abstract class AbstractHandlerMapping extends ApplicationObjectSupport | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Retrieve the CORS configuration for the given handler. | 	 * Retrieve the CORS configuration for the given handler. | ||||||
| 	 * @param handler the handler to check (never {@code null}). | 	 * @param handler the handler to check (never {@code null}) | ||||||
| 	 * @param exchange the current exchange | 	 * @param exchange the current exchange | ||||||
| 	 * @return the CORS configuration for the handler or {@code null}. | 	 * @return the CORS configuration for the handler, or {@code null} if none | ||||||
| 	 */ | 	 */ | ||||||
| 	protected CorsConfiguration getCorsConfiguration(Object handler, ServerWebExchange exchange) { | 	protected CorsConfiguration getCorsConfiguration(Object handler, ServerWebExchange exchange) { | ||||||
| 		if (handler != null && handler instanceof CorsConfigurationSource) { | 		if (handler instanceof CorsConfigurationSource) { | ||||||
| 			return ((CorsConfigurationSource) handler).getCorsConfiguration(exchange); | 			return ((CorsConfigurationSource) handler).getCorsConfiguration(exchange); | ||||||
| 		} | 		} | ||||||
| 		return null; | 		return null; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | } | ||||||
| 	private static final WebHandler REQUEST_HANDLED_HANDLER = exchange -> Mono.empty(); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -44,6 +44,7 @@ import org.springframework.web.server.ServerWebExchange; | ||||||
|  * path pattern that matches the current request path. |  * path pattern that matches the current request path. | ||||||
|  * |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  |  * @author Juergen Hoeller | ||||||
|  * @since 5.0 |  * @since 5.0 | ||||||
|  */ |  */ | ||||||
| public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { | public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { | ||||||
|  | @ -137,6 +138,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { | ||||||
| 		if (handler != null) { | 		if (handler != null) { | ||||||
| 			return handleMatch(handler, urlPath, urlPath, exchange); | 			return handleMatch(handler, urlPath, urlPath, exchange); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		// Pattern match? | 		// Pattern match? | ||||||
| 		List<String> matches = new ArrayList<>(); | 		List<String> matches = new ArrayList<>(); | ||||||
| 		for (String pattern : this.handlerMap.keySet()) { | 		for (String pattern : this.handlerMap.keySet()) { | ||||||
|  | @ -149,6 +151,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		String bestMatch = null; | 		String bestMatch = null; | ||||||
| 		Comparator<String> comparator = getPathMatcher().getPatternComparator(urlPath); | 		Comparator<String> comparator = getPathMatcher().getPatternComparator(urlPath); | ||||||
| 		if (!matches.isEmpty()) { | 		if (!matches.isEmpty()) { | ||||||
|  | @ -161,12 +164,18 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping { | ||||||
| 		if (bestMatch != null) { | 		if (bestMatch != null) { | ||||||
| 			handler = this.handlerMap.get(bestMatch); | 			handler = this.handlerMap.get(bestMatch); | ||||||
| 			if (handler == null) { | 			if (handler == null) { | ||||||
| 				Assert.isTrue(bestMatch.endsWith("/")); | 				if (bestMatch.endsWith("/")) { | ||||||
| 				handler = this.handlerMap.get(bestMatch.substring(0, bestMatch.length() - 1)); | 					handler = this.handlerMap.get(bestMatch.substring(0, bestMatch.length() - 1)); | ||||||
|  | 				} | ||||||
|  | 				if (handler == null) { | ||||||
|  | 					throw new IllegalStateException( | ||||||
|  | 							"Could not find handler for best pattern match [" + bestMatch + "]"); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestMatch, urlPath); | 			String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestMatch, urlPath); | ||||||
| 			return handleMatch(handler, bestMatch, pathWithinMapping, exchange); | 			return handleMatch(handler, bestMatch, pathWithinMapping, exchange); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		// No handler found... | 		// No handler found... | ||||||
| 		return null; | 		return null; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -52,11 +52,10 @@ import org.springframework.web.server.ServerWebExchange; | ||||||
|  * <p>For each registered handler method, a unique mapping is maintained with |  * <p>For each registered handler method, a unique mapping is maintained with | ||||||
|  * subclasses defining the details of the mapping type {@code <T>}. |  * subclasses defining the details of the mapping type {@code <T>}. | ||||||
|  * |  * | ||||||
|  * @param <T> The mapping for a {@link HandlerMethod} containing the conditions |  | ||||||
|  * needed to match the handler method to incoming request. |  | ||||||
|  * |  | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  * @since 5.0 |  * @since 5.0 | ||||||
|  |  * @param <T> The mapping for a {@link HandlerMethod} containing the conditions | ||||||
|  |  * needed to match the handler method to incoming request. | ||||||
|  */ |  */ | ||||||
| public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean { | public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean { | ||||||
| 
 | 
 | ||||||
|  | @ -570,10 +569,9 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap | ||||||
| 
 | 
 | ||||||
| 		private final List<String> directUrls; | 		private final List<String> directUrls; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public MappingRegistration(T mapping, HandlerMethod handlerMethod, List<String> directUrls) { | 		public MappingRegistration(T mapping, HandlerMethod handlerMethod, List<String> directUrls) { | ||||||
| 			Assert.notNull(mapping); | 			Assert.notNull(mapping, "Mapping must not be null"); | ||||||
| 			Assert.notNull(handlerMethod); | 			Assert.notNull(handlerMethod, "HandlerMethod must not be null"); | ||||||
| 			this.mapping = mapping; | 			this.mapping = mapping; | ||||||
| 			this.handlerMethod = handlerMethod; | 			this.handlerMethod = handlerMethod; | ||||||
| 			this.directUrls = (directUrls != null ? directUrls : Collections.emptyList()); | 			this.directUrls = (directUrls != null ? directUrls : Collections.emptyList()); | ||||||
|  | @ -629,10 +627,11 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private static class PreFlightAmbiguousMatchHandler { | 	private static class PreFlightAmbiguousMatchHandler { | ||||||
| 
 | 
 | ||||||
| 		public void handle() { | 		public void handle() { | ||||||
| 			throw new UnsupportedOperationException("not implemented"); | 			throw new UnsupportedOperationException("Not implemented"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -55,7 +55,7 @@ public class SyncInvocableHandlerMethod extends InvocableHandlerMethod { | ||||||
| 	public void setArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { | 	public void setArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { | ||||||
| 		resolvers.forEach(resolver -> | 		resolvers.forEach(resolver -> | ||||||
| 				Assert.isInstanceOf(SyncHandlerMethodArgumentResolver.class, resolver, | 				Assert.isInstanceOf(SyncHandlerMethodArgumentResolver.class, resolver, | ||||||
| 						"Expected sync argument resolver: " + resolver.getClass().getName())); | 						"SyncHandlerMethodArgumentResolver requires SyncHandlerMethodArgumentResolver")); | ||||||
| 		super.setArgumentResolvers(resolvers); | 		super.setArgumentResolvers(resolvers); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -106,7 +106,6 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { | 	public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { | ||||||
| 
 |  | ||||||
| 		ResolvableType returnType = result.getReturnType(); | 		ResolvableType returnType = result.getReturnType(); | ||||||
| 		MethodParameter bodyType; | 		MethodParameter bodyType; | ||||||
| 
 | 
 | ||||||
|  | @ -117,7 +116,7 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand | ||||||
| 		ReactiveAdapter adapter = getAdapterRegistry().getAdapter(rawClass, optionalValue); | 		ReactiveAdapter adapter = getAdapterRegistry().getAdapter(rawClass, optionalValue); | ||||||
| 
 | 
 | ||||||
| 		if (adapter != null) { | 		if (adapter != null) { | ||||||
| 			Assert.isTrue(!adapter.isMultiValue(), "Only a single ResponseEntity supported."); | 			Assert.isTrue(!adapter.isMultiValue(), "Only a single ResponseEntity supported"); | ||||||
| 			returnValueMono = Mono.from(adapter.toPublisher(optionalValue)); | 			returnValueMono = Mono.from(adapter.toPublisher(optionalValue)); | ||||||
| 			bodyType = new MethodParameter(result.getReturnTypeSource()); | 			bodyType = new MethodParameter(result.getReturnTypeSource()); | ||||||
| 			bodyType.increaseNestingLevel(); | 			bodyType.increaseNestingLevel(); | ||||||
|  | @ -130,8 +129,7 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		return returnValueMono.then(returnValue -> { | 		return returnValueMono.then(returnValue -> { | ||||||
| 
 | 			Assert.isInstanceOf(HttpEntity.class, returnValue, "HttpEntity expected"); | ||||||
| 			Assert.isInstanceOf(HttpEntity.class, returnValue); |  | ||||||
| 			HttpEntity<?> httpEntity = (HttpEntity<?>) returnValue; | 			HttpEntity<?> httpEntity = (HttpEntity<?>) returnValue; | ||||||
| 
 | 
 | ||||||
| 			if (httpEntity instanceof ResponseEntity) { | 			if (httpEntity instanceof ResponseEntity) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -111,7 +111,7 @@ public class ScriptTemplateView extends AbstractUrlBasedView { | ||||||
| 	 * See {@link ScriptTemplateConfigurer#setEngine(ScriptEngine)} documentation. | 	 * See {@link ScriptTemplateConfigurer#setEngine(ScriptEngine)} documentation. | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setEngine(ScriptEngine engine) { | 	public void setEngine(ScriptEngine engine) { | ||||||
| 		Assert.isInstanceOf(Invocable.class, engine); | 		Assert.isInstanceOf(Invocable.class, engine, "ScriptEngine must implement Invocable"); | ||||||
| 		this.engine = engine; | 		this.engine = engine; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -44,7 +44,7 @@ import org.springframework.web.reactive.socket.WebSocketSession; | ||||||
|  */ |  */ | ||||||
| public class JettyWebSocketSession extends AbstractListenerWebSocketSession<Session> { | public class JettyWebSocketSession extends AbstractListenerWebSocketSession<Session> { | ||||||
| 
 | 
 | ||||||
| 	private SuspendToken suspendToken; | 	private volatile SuspendToken suspendToken; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public JettyWebSocketSession(Session session, HandshakeInfo info, DataBufferFactory factory) { | 	public JettyWebSocketSession(Session session, HandshakeInfo info, DataBufferFactory factory) { | ||||||
|  | @ -65,14 +65,15 @@ public class JettyWebSocketSession extends AbstractListenerWebSocketSession<Sess | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	protected void suspendReceiving() { | 	protected void suspendReceiving() { | ||||||
| 		Assert.isNull(this.suspendToken); | 		Assert.state(this.suspendToken == null, "Already suspended"); | ||||||
| 		this.suspendToken = getDelegate().suspend(); | 		this.suspendToken = getDelegate().suspend(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	protected void resumeReceiving() { | 	protected void resumeReceiving() { | ||||||
| 		Assert.notNull(this.suspendToken); | 		SuspendToken tokenToUse = this.suspendToken; | ||||||
| 		this.suspendToken.resume(); | 		Assert.state(tokenToUse != null, "Not suspended"); | ||||||
|  | 		tokenToUse.resume(); | ||||||
| 		this.suspendToken = null; | 		this.suspendToken = null; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -146,12 +146,12 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) { | 	private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) { | ||||||
| 		Assert.isTrue(request instanceof ServletServerHttpRequest); | 		Assert.isInstanceOf(ServletServerHttpRequest.class, request, "ServletServerHttpRequest required"); | ||||||
| 		return ((ServletServerHttpRequest) request).getServletRequest(); | 		return ((ServletServerHttpRequest) request).getServletRequest(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) { | 	private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) { | ||||||
| 		Assert.isTrue(response instanceof ServletServerHttpResponse); | 		Assert.isInstanceOf(ServletServerHttpResponse.class, response, "ServletServerHttpResponse required"); | ||||||
| 		return ((ServletServerHttpResponse) response).getServletResponse(); | 		return ((ServletServerHttpResponse) response).getServletResponse(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -180,7 +180,6 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life | ||||||
| 
 | 
 | ||||||
| 		private final Optional<String> protocol; | 		private final Optional<String> protocol; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public WebSocketHandlerContainer(JettyWebSocketHandlerAdapter adapter, Optional<String> protocol) { | 		public WebSocketHandlerContainer(JettyWebSocketHandlerAdapter adapter, Optional<String> protocol) { | ||||||
| 			this.adapter = adapter; | 			this.adapter = adapter; | ||||||
| 			this.protocol = protocol; | 			this.protocol = protocol; | ||||||
|  | @ -194,4 +193,5 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life | ||||||
| 			return this.protocol; | 			return this.protocol; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -20,7 +20,6 @@ import java.io.IOException; | ||||||
| import java.security.Principal; | import java.security.Principal; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| import javax.servlet.ServletContext; |  | ||||||
| import javax.servlet.ServletException; | import javax.servlet.ServletException; | ||||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||||
| import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||||
|  | @ -35,8 +34,8 @@ import org.springframework.http.server.reactive.ServerHttpResponse; | ||||||
| import org.springframework.http.server.reactive.ServletServerHttpRequest; | import org.springframework.http.server.reactive.ServletServerHttpRequest; | ||||||
| import org.springframework.http.server.reactive.ServletServerHttpResponse; | import org.springframework.http.server.reactive.ServletServerHttpResponse; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.web.reactive.socket.WebSocketHandler; |  | ||||||
| import org.springframework.web.reactive.socket.HandshakeInfo; | import org.springframework.web.reactive.socket.HandshakeInfo; | ||||||
|  | import org.springframework.web.reactive.socket.WebSocketHandler; | ||||||
| import org.springframework.web.reactive.socket.adapter.StandardWebSocketHandlerAdapter; | import org.springframework.web.reactive.socket.adapter.StandardWebSocketHandlerAdapter; | ||||||
| import org.springframework.web.reactive.socket.adapter.StandardWebSocketSession; | import org.springframework.web.reactive.socket.adapter.StandardWebSocketSession; | ||||||
| import org.springframework.web.reactive.socket.server.RequestUpgradeStrategy; | import org.springframework.web.reactive.socket.server.RequestUpgradeStrategy; | ||||||
|  | @ -55,9 +54,7 @@ public class TomcatRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, | 	public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, Optional<String> subProtocol){ | ||||||
| 			Optional<String> subProtocol){ |  | ||||||
| 
 |  | ||||||
| 		ServerHttpRequest request = exchange.getRequest(); | 		ServerHttpRequest request = exchange.getRequest(); | ||||||
| 		ServerHttpResponse response = exchange.getResponse(); | 		ServerHttpResponse response = exchange.getResponse(); | ||||||
| 
 | 
 | ||||||
|  | @ -87,12 +84,12 @@ public class TomcatRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) { | 	private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) { | ||||||
| 		Assert.isTrue(request instanceof ServletServerHttpRequest); | 		Assert.isInstanceOf(ServletServerHttpRequest.class, request, "ServletServerHttpRequest required"); | ||||||
| 		return ((ServletServerHttpRequest) request).getServletRequest(); | 		return ((ServletServerHttpRequest) request).getServletRequest(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) { | 	private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) { | ||||||
| 		Assert.isTrue(response instanceof ServletServerHttpResponse); | 		Assert.isInstanceOf(ServletServerHttpResponse.class, response, "ServletServerHttpResponse required"); | ||||||
| 		return ((ServletServerHttpResponse) response).getServletResponse(); | 		return ((ServletServerHttpResponse) response).getServletResponse(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -103,12 +100,9 @@ public class TomcatRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private WsServerContainer getContainer(HttpServletRequest request) { | 	private WsServerContainer getContainer(HttpServletRequest request) { | ||||||
| 		ServletContext servletContext = request.getServletContext(); | 		Object container = request.getServletContext().getAttribute(SERVER_CONTAINER_ATTR); | ||||||
| 		Object container = servletContext.getAttribute(SERVER_CONTAINER_ATTR); | 		Assert.state(container instanceof WsServerContainer, | ||||||
| 		Assert.notNull(container, | 				"No 'javax.websocket.server.ServerContainer' ServletContext attribute in a Tomcat container"); | ||||||
| 				"No 'javax.websocket.server.ServerContainer' ServletContext attribute. " + |  | ||||||
| 						"Are you running in a Servlet container that supports JSR-356?"); |  | ||||||
| 		Assert.isTrue(container instanceof WsServerContainer); |  | ||||||
| 		return (WsServerContainer) container; | 		return (WsServerContainer) container; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -53,13 +53,10 @@ import org.springframework.web.server.ServerWebExchange; | ||||||
| @SuppressWarnings("OptionalUsedAsFieldOrParameterType") | @SuppressWarnings("OptionalUsedAsFieldOrParameterType") | ||||||
| public class UndertowRequestUpgradeStrategy implements RequestUpgradeStrategy { | public class UndertowRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	@Override | 	@Override | ||||||
| 	public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, | 	public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, Optional<String> subProtocol) { | ||||||
| 			Optional<String> subProtocol) { |  | ||||||
| 
 |  | ||||||
| 		ServerHttpRequest request = exchange.getRequest(); | 		ServerHttpRequest request = exchange.getRequest(); | ||||||
| 		Assert.isTrue(request instanceof UndertowServerHttpRequest); | 		Assert.isInstanceOf(UndertowServerHttpRequest.class, request, "UndertowServerHttpRequest required"); | ||||||
| 		HttpServerExchange httpExchange = ((UndertowServerHttpRequest) request).getUndertowExchange(); | 		HttpServerExchange httpExchange = ((UndertowServerHttpRequest) request).getUndertowExchange(); | ||||||
| 
 | 
 | ||||||
| 		Set<String> protocols = subProtocol.map(Collections::singleton).orElse(Collections.emptySet()); | 		Set<String> protocols = subProtocol.map(Collections::singleton).orElse(Collections.emptySet()); | ||||||
|  | @ -92,10 +89,7 @@ public class UndertowRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 
 | 
 | ||||||
| 		private final DataBufferFactory bufferFactory; | 		private final DataBufferFactory bufferFactory; | ||||||
| 
 | 
 | ||||||
| 
 | 		public DefaultCallback(HandshakeInfo handshakeInfo, WebSocketHandler handler, DataBufferFactory bufferFactory) { | ||||||
| 		public DefaultCallback(HandshakeInfo handshakeInfo, WebSocketHandler handler, |  | ||||||
| 				DataBufferFactory bufferFactory) { |  | ||||||
| 
 |  | ||||||
| 			this.handshakeInfo = handshakeInfo; | 			this.handshakeInfo = handshakeInfo; | ||||||
| 			this.handler = handler; | 			this.handler = handler; | ||||||
| 			this.bufferFactory = bufferFactory; | 			this.bufferFactory = bufferFactory; | ||||||
|  | @ -103,7 +97,6 @@ public class UndertowRequestUpgradeStrategy implements RequestUpgradeStrategy { | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
| 		public void onConnect(WebSocketHttpExchange httpExchange, WebSocketChannel channel) { | 		public void onConnect(WebSocketHttpExchange httpExchange, WebSocketChannel channel) { | ||||||
| 
 |  | ||||||
| 			UndertowWebSocketSession session = createSession(channel); | 			UndertowWebSocketSession session = createSession(channel); | ||||||
| 			UndertowWebSocketHandlerAdapter adapter = new UndertowWebSocketHandlerAdapter(session); | 			UndertowWebSocketHandlerAdapter adapter = new UndertowWebSocketHandlerAdapter(session); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -35,13 +35,14 @@ import org.springframework.http.server.reactive.HttpHandler; | ||||||
| import org.springframework.http.server.reactive.ServerHttpRequest; | import org.springframework.http.server.reactive.ServerHttpRequest; | ||||||
| import org.springframework.http.server.reactive.ServerHttpResponse; | import org.springframework.http.server.reactive.ServerHttpResponse; | ||||||
| import org.springframework.http.server.reactive.bootstrap.RxNettyHttpServer; | import org.springframework.http.server.reactive.bootstrap.RxNettyHttpServer; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| import org.springframework.web.reactive.function.BodyExtractors; | import org.springframework.web.reactive.function.BodyExtractors; | ||||||
| import org.springframework.web.reactive.function.client.WebClient; | import org.springframework.web.reactive.function.client.WebClient; | ||||||
| import org.springframework.web.reactive.function.client.WebClientOperations; | import org.springframework.web.reactive.function.client.WebClientOperations; | ||||||
| import org.springframework.web.util.DefaultUriBuilderFactory; | import org.springframework.web.util.DefaultUriBuilderFactory; | ||||||
| import org.springframework.web.util.UriBuilderFactory; | import org.springframework.web.util.UriBuilderFactory; | ||||||
| 
 | 
 | ||||||
|  | import static org.junit.Assert.*; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * @author Sebastien Deleuze |  * @author Sebastien Deleuze | ||||||
|  */ |  */ | ||||||
|  | @ -52,8 +53,7 @@ public class FlushingIntegrationTests extends AbstractHttpHandlerIntegrationTest | ||||||
| 
 | 
 | ||||||
| 	@Before | 	@Before | ||||||
| 	public void setup() throws Exception { | 	public void setup() throws Exception { | ||||||
| 
 | 		// TODO: fix failing RxNetty tests | ||||||
| 		// TODO: fix failing tests |  | ||||||
| 		Assume.assumeFalse(this.server instanceof RxNettyHttpServer); | 		Assume.assumeFalse(this.server instanceof RxNettyHttpServer); | ||||||
| 
 | 
 | ||||||
| 		super.setup(); | 		super.setup(); | ||||||
|  | @ -88,7 +88,7 @@ public class FlushingIntegrationTests extends AbstractHttpHandlerIntegrationTest | ||||||
| 				.reduce((s1, s2) -> s1 + s2); | 				.reduce((s1, s2) -> s1 + s2); | ||||||
| 
 | 
 | ||||||
| 		StepVerifier.create(result) | 		StepVerifier.create(result) | ||||||
| 				.consumeNextWith(value -> Assert.isTrue(value.length() == 200000)) | 				.consumeNextWith(value -> assertTrue(value.length() == 200000)) | ||||||
| 				.expectComplete() | 				.expectComplete() | ||||||
| 				.verify(Duration.ofSeconds(10L)); | 				.verify(Duration.ofSeconds(10L)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.web.reactive.result; | package org.springframework.web.reactive.result; | ||||||
| 
 | 
 | ||||||
| import java.lang.annotation.Annotation; | import java.lang.annotation.Annotation; | ||||||
|  | @ -70,7 +71,6 @@ public class ResolvableMethod { | ||||||
| 
 | 
 | ||||||
| 	private final Object object; | 	private final Object object; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 	private String methodName; | 	private String methodName; | ||||||
| 
 | 
 | ||||||
| 	private Class<?>[] argumentTypes; | 	private Class<?>[] argumentTypes; | ||||||
|  | @ -84,13 +84,13 @@ public class ResolvableMethod { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	private ResolvableMethod(Class<?> objectClass) { | 	private ResolvableMethod(Class<?> objectClass) { | ||||||
| 		Assert.notNull(objectClass); | 		Assert.notNull(objectClass, "Class must not be null"); | ||||||
| 		this.objectClass = objectClass; | 		this.objectClass = objectClass; | ||||||
| 		this.object = null; | 		this.object = null; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private ResolvableMethod(Object object) { | 	private ResolvableMethod(Object object) { | ||||||
| 		Assert.notNull(object); | 		Assert.notNull(object, "Object must not be null"); | ||||||
| 		this.object = object; | 		this.object = object; | ||||||
| 		this.objectClass = object.getClass(); | 		this.objectClass = object.getClass(); | ||||||
| 	} | 	} | ||||||
|  | @ -136,6 +136,7 @@ public class ResolvableMethod { | ||||||
| 		return this; | 		return this; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	// Resolve methods | 	// Resolve methods | ||||||
| 
 | 
 | ||||||
| 	public Method resolve() { | 	public Method resolve() { | ||||||
|  | @ -168,18 +169,17 @@ public class ResolvableMethod { | ||||||
| 					return true; | 					return true; | ||||||
| 				}); | 				}); | ||||||
| 
 | 
 | ||||||
| 		Assert.isTrue(!methods.isEmpty(), "No matching method: " + this); | 		Assert.state(!methods.isEmpty(), () -> "No matching method: " + this); | ||||||
| 		Assert.isTrue(methods.size() == 1, "Multiple matching methods: " + this); | 		Assert.state(methods.size() == 1, () -> "Multiple matching methods: " + this); | ||||||
| 
 |  | ||||||
| 		return methods.iterator().next(); | 		return methods.iterator().next(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private String getReturnType() { | 	private String getReturnType() { | ||||||
| 		return this.returnType != null ? this.returnType.toString() : null; | 		return (this.returnType != null ? this.returnType.toString() : null); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public InvocableHandlerMethod resolveHandlerMethod() { | 	public InvocableHandlerMethod resolveHandlerMethod() { | ||||||
| 		Assert.notNull(this.object); | 		Assert.state(this.object != null, "Object must not be null"); | ||||||
| 		return new InvocableHandlerMethod(this.object, resolve()); | 		return new InvocableHandlerMethod(this.object, resolve()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -194,9 +194,7 @@ public class ResolvableMethod { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@SafeVarargs | 	@SafeVarargs | ||||||
| 	public final MethodParameter resolveParam(ResolvableType type, | 	public final MethodParameter resolveParam(ResolvableType type, Predicate<MethodParameter>... predicates) { | ||||||
| 			Predicate<MethodParameter>... predicates) { |  | ||||||
| 
 |  | ||||||
| 		List<MethodParameter> matches = new ArrayList<>(); | 		List<MethodParameter> matches = new ArrayList<>(); | ||||||
| 
 | 
 | ||||||
| 		Method method = resolve(); | 		Method method = resolve(); | ||||||
|  | @ -215,9 +213,8 @@ public class ResolvableMethod { | ||||||
| 			matches.add(param); | 			matches.add(param); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		Assert.isTrue(!matches.isEmpty(), "No matching arg on " + method.toString()); | 		Assert.state(!matches.isEmpty(), () -> "No matching arg on " + method.toString()); | ||||||
| 		Assert.isTrue(matches.size() == 1, "Multiple matching args: " + matches + " on " + method.toString()); | 		Assert.state(matches.size() == 1, () -> "Multiple matching args: " + matches + " on " + method.toString()); | ||||||
| 
 |  | ||||||
| 		return matches.get(0); | 		return matches.get(0); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -238,4 +235,4 @@ public class ResolvableMethod { | ||||||
| 		return new ResolvableMethod(object); | 		return new ResolvableMethod(object); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.web.reactive.result.method.annotation; | package org.springframework.web.reactive.result.method.annotation; | ||||||
| 
 | 
 | ||||||
| import java.net.URISyntaxException; | import java.net.URISyntaxException; | ||||||
|  | @ -43,18 +44,12 @@ import org.springframework.web.reactive.result.ResolvableMethod; | ||||||
| import org.springframework.web.server.ServerWebExchange; | import org.springframework.web.server.ServerWebExchange; | ||||||
| import org.springframework.web.server.adapter.DefaultServerWebExchange; | import org.springframework.web.server.adapter.DefaultServerWebExchange; | ||||||
| 
 | 
 | ||||||
| import static junit.framework.TestCase.assertNotNull; | import static org.junit.Assert.*; | ||||||
| import static org.junit.Assert.assertEquals; | import static org.springframework.core.ResolvableType.*; | ||||||
| import static org.junit.Assert.assertFalse; |  | ||||||
| import static org.junit.Assert.assertSame; |  | ||||||
| import static org.junit.Assert.assertTrue; |  | ||||||
| import static org.springframework.core.ResolvableType.forClass; |  | ||||||
| import static org.springframework.core.ResolvableType.forClassWithGenerics; |  | ||||||
| import static org.springframework.util.Assert.isTrue; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Unit tests for {@link ModelAttributeMethodArgumentResolver}. |  * Unit tests for {@link ModelAttributeMethodArgumentResolver}. | ||||||
|  |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  */ |  */ | ||||||
| public class ModelAttributeMethodArgumentResolverTests { | public class ModelAttributeMethodArgumentResolverTests { | ||||||
|  | @ -208,7 +203,7 @@ public class ModelAttributeMethodArgumentResolverTests { | ||||||
| 				resolvedArgumentMono -> { | 				resolvedArgumentMono -> { | ||||||
| 					Object value = resolvedArgumentMono.blockMillis(5000); | 					Object value = resolvedArgumentMono.blockMillis(5000); | ||||||
| 					assertNotNull(value); | 					assertNotNull(value); | ||||||
| 					isTrue(value instanceof Mono); | 					assertTrue(value instanceof Mono); | ||||||
| 					return (Mono<?>) value; | 					return (Mono<?>) value; | ||||||
| 				}); | 				}); | ||||||
| 	} | 	} | ||||||
|  | @ -220,14 +215,13 @@ public class ModelAttributeMethodArgumentResolverTests { | ||||||
| 				resolvedArgumentMono -> { | 				resolvedArgumentMono -> { | ||||||
| 					Object value = resolvedArgumentMono.blockMillis(5000); | 					Object value = resolvedArgumentMono.blockMillis(5000); | ||||||
| 					assertNotNull(value); | 					assertNotNull(value); | ||||||
| 					isTrue(value instanceof Single); | 					assertTrue(value instanceof Single); | ||||||
| 					return Mono.from(RxReactiveStreams.toPublisher((Single) value)); | 					return Mono.from(RxReactiveStreams.toPublisher((Single) value)); | ||||||
| 				}); | 				}); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	private void testBindFoo(ResolvableType type, Function<Object, Foo> valueExtractor) throws Exception { | 	private void testBindFoo(ResolvableType type, Function<Object, Foo> valueExtractor) throws Exception { | ||||||
| 
 |  | ||||||
| 		Object value = createResolver() | 		Object value = createResolver() | ||||||
| 				.resolveArgument(parameter(type), this.bindContext, exchange("name=Robert&age=25")) | 				.resolveArgument(parameter(type), this.bindContext, exchange("name=Robert&age=25")) | ||||||
| 				.blockMillis(0); | 				.blockMillis(0); | ||||||
|  |  | ||||||
|  | @ -23,8 +23,7 @@ import java.nio.charset.StandardCharsets; | ||||||
| import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
| 
 | 
 | ||||||
| import static java.nio.charset.StandardCharsets.ISO_8859_1; | import static java.nio.charset.StandardCharsets.*; | ||||||
| import static java.nio.charset.StandardCharsets.UTF_8; |  | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Represent the content disposition type and parameters as defined in RFC 2183. |  * Represent the content disposition type and parameters as defined in RFC 2183. | ||||||
|  | @ -121,7 +120,7 @@ public class ContentDisposition { | ||||||
| 	 */ | 	 */ | ||||||
| 	public static ContentDisposition parse(String contentDisposition) { | 	public static ContentDisposition parse(String contentDisposition) { | ||||||
| 		String[] parts = StringUtils.tokenizeToStringArray(contentDisposition, ";"); | 		String[] parts = StringUtils.tokenizeToStringArray(contentDisposition, ";"); | ||||||
| 		Assert.isTrue(parts.length >= 1); | 		Assert.isTrue(parts.length >= 1, "Content-Disposition header must not be empty"); | ||||||
| 		String type = parts[0]; | 		String type = parts[0]; | ||||||
| 		String name = null; | 		String name = null; | ||||||
| 		String filename = null; | 		String filename = null; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.http; | package org.springframework.http; | ||||||
| 
 | 
 | ||||||
| import java.time.Duration; | import java.time.Duration; | ||||||
|  | @ -50,7 +51,7 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 			String path, boolean secure, boolean httpOnly) { | 			String path, boolean secure, boolean httpOnly) { | ||||||
| 
 | 
 | ||||||
| 		super(name, value); | 		super(name, value); | ||||||
| 		Assert.notNull(maxAge); | 		Assert.notNull(maxAge, "Max age must not be null"); | ||||||
| 		this.maxAge = maxAge; | 		this.maxAge = maxAge; | ||||||
| 		this.domain = Optional.ofNullable(domain); | 		this.domain = Optional.ofNullable(domain); | ||||||
| 		this.path = Optional.ofNullable(path); | 		this.path = Optional.ofNullable(path); | ||||||
|  | @ -61,7 +62,6 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Return the cookie "Max-Age" attribute in seconds. | 	 * Return the cookie "Max-Age" attribute in seconds. | ||||||
| 	 * |  | ||||||
| 	 * <p>A positive value indicates when the cookie expires relative to the | 	 * <p>A positive value indicates when the cookie expires relative to the | ||||||
| 	 * current time. A value of 0 means the cookie should expire immediately. | 	 * current time. A value of 0 means the cookie should expire immediately. | ||||||
| 	 * A negative value means no "Max-Age" attribute in which case the cookie | 	 * A negative value means no "Max-Age" attribute in which case the cookie | ||||||
|  | @ -100,13 +100,6 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 		return this.httpOnly; | 		return this.httpOnly; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override |  | ||||||
| 	public int hashCode() { |  | ||||||
| 		int result = super.hashCode(); |  | ||||||
| 		result = 31 * result + ObjectUtils.nullSafeHashCode(this.domain); |  | ||||||
| 		result = 31 * result + ObjectUtils.nullSafeHashCode(this.path); |  | ||||||
| 		return result; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean equals(Object other) { | 	public boolean equals(Object other) { | ||||||
|  | @ -122,6 +115,14 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 				ObjectUtils.nullSafeEquals(this.domain, otherCookie.getDomain())); | 				ObjectUtils.nullSafeEquals(this.domain, otherCookie.getDomain())); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int hashCode() { | ||||||
|  | 		int result = super.hashCode(); | ||||||
|  | 		result = 31 * result + ObjectUtils.nullSafeHashCode(this.domain); | ||||||
|  | 		result = 31 * result + ObjectUtils.nullSafeHashCode(this.path); | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * Factory method to obtain a builder for a server-defined cookie that starts | 	 * Factory method to obtain a builder for a server-defined cookie that starts | ||||||
|  | @ -144,7 +145,6 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 
 | 
 | ||||||
| 			private boolean httpOnly; | 			private boolean httpOnly; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public ResponseCookieBuilder maxAge(Duration maxAge) { | 			public ResponseCookieBuilder maxAge(Duration maxAge) { | ||||||
| 				this.maxAge = maxAge; | 				this.maxAge = maxAge; | ||||||
|  | @ -189,6 +189,7 @@ public final class ResponseCookie extends HttpCookie { | ||||||
| 		}; | 		}; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * A builder for a server-defined HttpCookie with attributes. | 	 * A builder for a server-defined HttpCookie with attributes. | ||||||
| 	 */ | 	 */ | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -177,7 +177,9 @@ public class SimpleClientHttpRequestFactory implements ClientHttpRequestFactory, | ||||||
| 	 */ | 	 */ | ||||||
| 	protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException { | 	protected HttpURLConnection openConnection(URL url, Proxy proxy) throws IOException { | ||||||
| 		URLConnection urlConnection = (proxy != null ? url.openConnection(proxy) : url.openConnection()); | 		URLConnection urlConnection = (proxy != null ? url.openConnection(proxy) : url.openConnection()); | ||||||
| 		Assert.isInstanceOf(HttpURLConnection.class, urlConnection); | 		if (!HttpURLConnection.class.isInstance(urlConnection)) { | ||||||
|  | 			throw new IllegalStateException("HttpURLConnection required for [" + url + "] but got: " + urlConnection); | ||||||
|  | 		} | ||||||
| 		return (HttpURLConnection) urlConnection; | 		return (HttpURLConnection) urlConnection; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -49,6 +49,7 @@ public abstract class AbstractClientHttpRequest implements ClientHttpRequest { | ||||||
| 	 */ | 	 */ | ||||||
| 	private enum State {NEW, COMMITTING, COMMITTED} | 	private enum State {NEW, COMMITTING, COMMITTED} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private final HttpHeaders headers; | 	private final HttpHeaders headers; | ||||||
| 
 | 
 | ||||||
| 	private final MultiValueMap<String, HttpCookie> cookies; | 	private final MultiValueMap<String, HttpCookie> cookies; | ||||||
|  | @ -63,7 +64,7 @@ public abstract class AbstractClientHttpRequest implements ClientHttpRequest { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public AbstractClientHttpRequest(HttpHeaders headers) { | 	public AbstractClientHttpRequest(HttpHeaders headers) { | ||||||
| 		Assert.notNull(headers); | 		Assert.notNull(headers, "HttpHeaders must not be null"); | ||||||
| 		this.headers = headers; | 		this.headers = headers; | ||||||
| 		this.cookies = new LinkedMultiValueMap<>(); | 		this.cookies = new LinkedMultiValueMap<>(); | ||||||
| 	} | 	} | ||||||
|  | @ -124,7 +125,7 @@ public abstract class AbstractClientHttpRequest implements ClientHttpRequest { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void beforeCommit(Supplier<? extends Mono<Void>> action) { | 	public void beforeCommit(Supplier<? extends Mono<Void>> action) { | ||||||
| 		Assert.notNull(action); | 		Assert.notNull(action, "Action must not be null"); | ||||||
| 		this.commitActions.add(action); | 		this.commitActions.add(action); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -140,5 +141,4 @@ public abstract class AbstractClientHttpRequest implements ClientHttpRequest { | ||||||
| 	 */ | 	 */ | ||||||
| 	protected abstract void applyCookies(); | 	protected abstract void applyCookies(); | ||||||
| 
 | 
 | ||||||
| 
 | } | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -58,16 +58,17 @@ public class MappingJackson2CborHttpMessageConverter extends AbstractJackson2Htt | ||||||
| 	 */ | 	 */ | ||||||
| 	public MappingJackson2CborHttpMessageConverter(ObjectMapper objectMapper) { | 	public MappingJackson2CborHttpMessageConverter(ObjectMapper objectMapper) { | ||||||
| 		super(objectMapper, new MediaType("application", "cbor")); | 		super(objectMapper, new MediaType("application", "cbor")); | ||||||
| 		Assert.isAssignable(CBORFactory.class, objectMapper.getFactory().getClass()); | 		Assert.isInstanceOf(CBORFactory.class, objectMapper.getFactory(), "CBORFactory required"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * {@inheritDoc} | 	 * {@inheritDoc} | ||||||
| 	 * The {@code objectMapper} parameter must be configured with a {@code CBORFactory} instance. | 	 * The {@code ObjectMapper} must be configured with a {@code CBORFactory} instance. | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setObjectMapper(ObjectMapper objectMapper) { | 	public void setObjectMapper(ObjectMapper objectMapper) { | ||||||
| 		Assert.isAssignable(CBORFactory.class, objectMapper.getFactory().getClass()); | 		Assert.isInstanceOf(CBORFactory.class, objectMapper.getFactory(), "CBORFactory required"); | ||||||
| 		super.setObjectMapper(objectMapper); | 		super.setObjectMapper(objectMapper); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -58,16 +58,17 @@ public class MappingJackson2SmileHttpMessageConverter extends AbstractJackson2Ht | ||||||
| 	 */ | 	 */ | ||||||
| 	public MappingJackson2SmileHttpMessageConverter(ObjectMapper objectMapper) { | 	public MappingJackson2SmileHttpMessageConverter(ObjectMapper objectMapper) { | ||||||
| 		super(objectMapper, new MediaType("application", "x-jackson-smile")); | 		super(objectMapper, new MediaType("application", "x-jackson-smile")); | ||||||
| 		Assert.isAssignable(SmileFactory.class, objectMapper.getFactory().getClass()); | 		Assert.isInstanceOf(SmileFactory.class, objectMapper.getFactory(), "SmileFactory required"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * {@inheritDoc} | 	 * {@inheritDoc} | ||||||
| 	 * The {@code objectMapper} parameter must be configured with a {@code SmileFactory} instance. | 	 * The {@code ObjectMapper} must be configured with a {@code SmileFactory} instance. | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setObjectMapper(ObjectMapper objectMapper) { | 	public void setObjectMapper(ObjectMapper objectMapper) { | ||||||
| 		Assert.isAssignable(SmileFactory.class, objectMapper.getFactory().getClass()); | 		Assert.isInstanceOf(SmileFactory.class, objectMapper.getFactory(), "SmileFactory required"); | ||||||
| 		super.setObjectMapper(objectMapper); | 		super.setObjectMapper(objectMapper); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -60,16 +60,17 @@ public class MappingJackson2XmlHttpMessageConverter extends AbstractJackson2Http | ||||||
| 		super(objectMapper, new MediaType("application", "xml"), | 		super(objectMapper, new MediaType("application", "xml"), | ||||||
| 				new MediaType("text", "xml"), | 				new MediaType("text", "xml"), | ||||||
| 				new MediaType("application", "*+xml")); | 				new MediaType("application", "*+xml")); | ||||||
| 		Assert.isAssignable(XmlMapper.class, objectMapper.getClass()); | 		Assert.isInstanceOf(XmlMapper.class, objectMapper, "XmlMapper required"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * {@inheritDoc} | 	 * {@inheritDoc} | ||||||
| 	 * The {@code objectMapper} parameter must be a {@link XmlMapper} instance. | 	 * The {@code ObjectMapper} parameter must be a {@link XmlMapper} instance. | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setObjectMapper(ObjectMapper objectMapper) { | 	public void setObjectMapper(ObjectMapper objectMapper) { | ||||||
| 		Assert.isAssignable(XmlMapper.class, objectMapper.getClass()); | 		Assert.isInstanceOf(XmlMapper.class, objectMapper, "XmlMapper required"); | ||||||
| 		super.setObjectMapper(objectMapper); | 		super.setObjectMapper(objectMapper); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -181,7 +181,9 @@ public class ServletServerHttpRequest implements ServerHttpRequest { | ||||||
| 	@Override | 	@Override | ||||||
| 	public ServerHttpAsyncRequestControl getAsyncRequestControl(ServerHttpResponse response) { | 	public ServerHttpAsyncRequestControl getAsyncRequestControl(ServerHttpResponse response) { | ||||||
| 		if (this.asyncRequestControl == null) { | 		if (this.asyncRequestControl == null) { | ||||||
| 			Assert.isInstanceOf(ServletServerHttpResponse.class, response); | 			if (!ServletServerHttpResponse.class.isInstance(response)) { | ||||||
|  | 				throw new IllegalArgumentException("Response must be a ServletServerHttpResponse: " + response.getClass()); | ||||||
|  | 			} | ||||||
| 			ServletServerHttpResponse servletServerResponse = (ServletServerHttpResponse) response; | 			ServletServerHttpResponse servletServerResponse = (ServletServerHttpResponse) response; | ||||||
| 			this.asyncRequestControl = new ServletServerHttpAsyncRequestControl(this, servletServerResponse); | 			this.asyncRequestControl = new ServletServerHttpAsyncRequestControl(this, servletServerResponse); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -17,7 +17,6 @@ | ||||||
| package org.springframework.http.server.reactive; | package org.springframework.http.server.reactive; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.concurrent.atomic.AtomicLongFieldUpdater; | import java.util.concurrent.atomic.AtomicLongFieldUpdater; | ||||||
| import java.util.concurrent.atomic.AtomicReference; | import java.util.concurrent.atomic.AtomicReference; | ||||||
| 
 | 
 | ||||||
|  | @ -28,6 +27,8 @@ import org.reactivestreams.Subscriber; | ||||||
| import org.reactivestreams.Subscription; | import org.reactivestreams.Subscription; | ||||||
| import reactor.core.publisher.Operators; | import reactor.core.publisher.Operators; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.util.Assert; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Abstract base class for {@code Publisher} implementations that bridge between |  * Abstract base class for {@code Publisher} implementations that bridge between | ||||||
|  * event-listener read APIs and Reactive Streams. |  * event-listener read APIs and Reactive Streams. | ||||||
|  | @ -48,6 +49,7 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> { | ||||||
| 
 | 
 | ||||||
| 	private final AtomicReference<State> state = new AtomicReference<>(State.UNSUBSCRIBED); | 	private final AtomicReference<State> state = new AtomicReference<>(State.UNSUBSCRIBED); | ||||||
| 
 | 
 | ||||||
|  | 	@SuppressWarnings("unused") | ||||||
| 	private volatile long demand; | 	private volatile long demand; | ||||||
| 
 | 
 | ||||||
| 	@SuppressWarnings("rawtypes") | 	@SuppressWarnings("rawtypes") | ||||||
|  | @ -196,7 +198,8 @@ public abstract class AbstractListenerReadPublisher<T> implements Publisher<T> { | ||||||
| 		UNSUBSCRIBED { | 		UNSUBSCRIBED { | ||||||
| 			@Override | 			@Override | ||||||
| 			<T> void subscribe(AbstractListenerReadPublisher<T> publisher, Subscriber<? super T> subscriber) { | 			<T> void subscribe(AbstractListenerReadPublisher<T> publisher, Subscriber<? super T> subscriber) { | ||||||
| 				Objects.requireNonNull(subscriber); | 				Assert.notNull(publisher, "Publisher must not be null"); | ||||||
|  | 				Assert.notNull(subscriber, "Subscriber must not be null"); | ||||||
| 				if (publisher.changeState(this, NO_DEMAND)) { | 				if (publisher.changeState(this, NO_DEMAND)) { | ||||||
| 					Subscription subscription = new ReadSubscription(publisher); | 					Subscription subscription = new ReadSubscription(publisher); | ||||||
| 					publisher.subscriber = subscriber; | 					publisher.subscriber = subscriber; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -17,7 +17,6 @@ | ||||||
| package org.springframework.http.server.reactive; | package org.springframework.http.server.reactive; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.concurrent.atomic.AtomicReference; | import java.util.concurrent.atomic.AtomicReference; | ||||||
| 
 | 
 | ||||||
| import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||||
|  | @ -27,6 +26,8 @@ import org.reactivestreams.Publisher; | ||||||
| import org.reactivestreams.Subscriber; | import org.reactivestreams.Subscriber; | ||||||
| import org.reactivestreams.Subscription; | import org.reactivestreams.Subscription; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.util.Assert; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * An alternative to {@link AbstractListenerWriteProcessor} but instead writing |  * An alternative to {@link AbstractListenerWriteProcessor} but instead writing | ||||||
|  * a {@code Publisher<Publisher<T>>} with flush boundaries enforces after |  * a {@code Publisher<Publisher<T>>} with flush boundaries enforces after | ||||||
|  | @ -127,10 +128,9 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 	private enum State { | 	private enum State { | ||||||
| 
 | 
 | ||||||
| 		UNSUBSCRIBED { | 		UNSUBSCRIBED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onSubscribe(AbstractListenerWriteFlushProcessor<T> processor, Subscription subscription) { | 			public <T> void onSubscribe(AbstractListenerWriteFlushProcessor<T> processor, Subscription subscription) { | ||||||
| 				Objects.requireNonNull(subscription, "Subscription cannot be null"); | 				Assert.notNull(subscription, "Subscription must not be null"); | ||||||
| 				if (processor.changeState(this, REQUESTED)) { | 				if (processor.changeState(this, REQUESTED)) { | ||||||
| 					processor.subscription = subscription; | 					processor.subscription = subscription; | ||||||
| 					subscription.request(1); | 					subscription.request(1); | ||||||
|  | @ -140,8 +140,8 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| 		REQUESTED { |  | ||||||
| 
 | 
 | ||||||
|  | 		REQUESTED { | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onNext(AbstractListenerWriteFlushProcessor<T> processor, Publisher<? extends T> chunk) { | 			public <T> void onNext(AbstractListenerWriteFlushProcessor<T> processor, Publisher<? extends T> chunk) { | ||||||
| 				if (processor.changeState(this, RECEIVED)) { | 				if (processor.changeState(this, RECEIVED)) { | ||||||
|  | @ -150,7 +150,6 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 					chunkProcessor.subscribe(new WriteSubscriber(processor)); | 					chunkProcessor.subscribe(new WriteSubscriber(processor)); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | ||||||
| 				if (processor.changeState(this, COMPLETED)) { | 				if (processor.changeState(this, COMPLETED)) { | ||||||
|  | @ -158,8 +157,8 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| 		RECEIVED { |  | ||||||
| 
 | 
 | ||||||
|  | 		RECEIVED { | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void writeComplete(AbstractListenerWriteFlushProcessor<T> processor) { | 			public <T> void writeComplete(AbstractListenerWriteFlushProcessor<T> processor) { | ||||||
| 				try { | 				try { | ||||||
|  | @ -169,7 +168,6 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 					processor.cancel(); | 					processor.cancel(); | ||||||
| 					processor.onError(ex); | 					processor.onError(ex); | ||||||
| 				} | 				} | ||||||
| 
 |  | ||||||
| 				if (processor.subscriberCompleted) { | 				if (processor.subscriberCompleted) { | ||||||
| 					if (processor.changeState(this, COMPLETED)) { | 					if (processor.changeState(this, COMPLETED)) { | ||||||
| 						processor.resultPublisher.publishComplete(); | 						processor.resultPublisher.publishComplete(); | ||||||
|  | @ -181,26 +179,21 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | ||||||
| 				processor.subscriberCompleted = true; | 				processor.subscriberCompleted = true; | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | 
 | ||||||
| 		COMPLETED { | 		COMPLETED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onNext(AbstractListenerWriteFlushProcessor<T> processor, | 			public <T> void onNext(AbstractListenerWriteFlushProcessor<T> processor, Publisher<? extends T> publisher) { | ||||||
| 					Publisher<? extends T> publisher) { |  | ||||||
| 				// ignore | 				// ignore | ||||||
| 
 |  | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onError(AbstractListenerWriteFlushProcessor<T> processor, Throwable t) { | 			public <T> void onError(AbstractListenerWriteFlushProcessor<T> processor, Throwable t) { | ||||||
| 				// ignore | 				// ignore | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteFlushProcessor<T> processor) { | ||||||
| 				// ignore | 				// ignore | ||||||
|  | @ -234,7 +227,6 @@ public abstract class AbstractListenerWriteFlushProcessor<T> implements Processo | ||||||
| 
 | 
 | ||||||
| 			private final AbstractListenerWriteFlushProcessor<?> processor; | 			private final AbstractListenerWriteFlushProcessor<?> processor; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 			public WriteSubscriber(AbstractListenerWriteFlushProcessor<?> processor) { | 			public WriteSubscriber(AbstractListenerWriteFlushProcessor<?> processor) { | ||||||
| 				this.processor = processor; | 				this.processor = processor; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -17,7 +17,6 @@ | ||||||
| package org.springframework.http.server.reactive; | package org.springframework.http.server.reactive; | ||||||
| 
 | 
 | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.concurrent.atomic.AtomicReference; | import java.util.concurrent.atomic.AtomicReference; | ||||||
| 
 | 
 | ||||||
| import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||||
|  | @ -120,7 +119,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 	 * Called when a data item is received via {@link Subscriber#onNext(Object)} | 	 * Called when a data item is received via {@link Subscriber#onNext(Object)} | ||||||
| 	 */ | 	 */ | ||||||
| 	protected void receiveData(T data) { | 	protected void receiveData(T data) { | ||||||
| 		Assert.state(this.currentData == null); | 		if (this.currentData != null) { | ||||||
|  | 			throw new IllegalStateException("Current data not processed yet: " + this.currentData); | ||||||
|  | 		} | ||||||
| 		this.currentData = data; | 		this.currentData = data; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -185,10 +186,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 		 * #REQUESTED}. | 		 * #REQUESTED}. | ||||||
| 		 */ | 		 */ | ||||||
| 		UNSUBSCRIBED { | 		UNSUBSCRIBED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onSubscribe(AbstractListenerWriteProcessor<T> processor, Subscription subscription) { | 			public <T> void onSubscribe(AbstractListenerWriteProcessor<T> processor, Subscription subscription) { | ||||||
| 				Objects.requireNonNull(subscription, "Subscription cannot be null"); | 				Assert.notNull(subscription, "Subscription must not be null"); | ||||||
| 				if (processor.changeState(this, REQUESTED)) { | 				if (processor.changeState(this, REQUESTED)) { | ||||||
| 					processor.subscription = subscription; | 					processor.subscription = subscription; | ||||||
| 					subscription.request(1); | 					subscription.request(1); | ||||||
|  | @ -198,6 +198,7 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | 
 | ||||||
| 		/** | 		/** | ||||||
| 		 * State that gets entered after a data has been | 		 * State that gets entered after a data has been | ||||||
| 		 * {@linkplain Subscription#request(long) requested}. Responds to {@code onNext} | 		 * {@linkplain Subscription#request(long) requested}. Responds to {@code onNext} | ||||||
|  | @ -205,7 +206,6 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 		 * changing state to {@link #COMPLETED}. | 		 * changing state to {@link #COMPLETED}. | ||||||
| 		 */ | 		 */ | ||||||
| 		REQUESTED { | 		REQUESTED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onNext(AbstractListenerWriteProcessor<T> processor, T data) { | 			public <T> void onNext(AbstractListenerWriteProcessor<T> processor, T data) { | ||||||
| 				if (processor.isDataEmpty(data)) { | 				if (processor.isDataEmpty(data)) { | ||||||
|  | @ -218,7 +218,6 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | ||||||
| 				if (processor.changeState(this, COMPLETED)) { | 				if (processor.changeState(this, COMPLETED)) { | ||||||
|  | @ -226,6 +225,7 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | 
 | ||||||
| 		/** | 		/** | ||||||
| 		 * State that gets entered after a data has been | 		 * State that gets entered after a data has been | ||||||
| 		 * {@linkplain Subscriber#onNext(Object) received}. Responds to | 		 * {@linkplain Subscriber#onNext(Object) received}. Responds to | ||||||
|  | @ -233,10 +233,9 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 		 * the state to {@link #WRITING}. If it can be written completely, | 		 * the state to {@link #WRITING}. If it can be written completely, | ||||||
| 		 * changes the state to either {@link #REQUESTED} if the subscription | 		 * changes the state to either {@link #REQUESTED} if the subscription | ||||||
| 		 * has not been completed; or {@link #COMPLETED} if it has. If it cannot | 		 * has not been completed; or {@link #COMPLETED} if it has. If it cannot | ||||||
| 		 * be written completely the state will be changed to {@link #RECEIVED}. | 		 * be written completely the state will be changed to {@code #RECEIVED}. | ||||||
| 		 */ | 		 */ | ||||||
| 		RECEIVED { | 		RECEIVED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onWritePossible(AbstractListenerWriteProcessor<T> processor) { | 			public <T> void onWritePossible(AbstractListenerWriteProcessor<T> processor) { | ||||||
| 				if (processor.changeState(this, WRITING)) { | 				if (processor.changeState(this, WRITING)) { | ||||||
|  | @ -265,38 +264,35 @@ public abstract class AbstractListenerWriteProcessor<T> implements Processor<T, | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | ||||||
| 				processor.subscriberCompleted = true; | 				processor.subscriberCompleted = true; | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | 
 | ||||||
| 		/** | 		/** | ||||||
| 		 * State that gets entered after a writing of the current data has been | 		 * State that gets entered after a writing of the current data has been | ||||||
| 		 * {@code onWritePossible started}. | 		 * {@code onWritePossible started}. | ||||||
| 		 */ | 		 */ | ||||||
| 		WRITING { | 		WRITING { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | ||||||
| 				processor.subscriberCompleted = true; | 				processor.subscriberCompleted = true; | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  | 
 | ||||||
| 		/** | 		/** | ||||||
| 		 * The terminal completed state. Does not respond to any events. | 		 * The terminal completed state. Does not respond to any events. | ||||||
| 		 */ | 		 */ | ||||||
| 		COMPLETED { | 		COMPLETED { | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onNext(AbstractListenerWriteProcessor<T> processor, T data) { | 			public <T> void onNext(AbstractListenerWriteProcessor<T> processor, T data) { | ||||||
| 				// ignore | 				// ignore | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onError(AbstractListenerWriteProcessor<T> processor, Throwable ex) { | 			public <T> void onError(AbstractListenerWriteProcessor<T> processor, Throwable ex) { | ||||||
| 				// ignore | 				// ignore | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 			@Override | 			@Override | ||||||
| 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | 			public <T> void onComplete(AbstractListenerWriteProcessor<T> processor) { | ||||||
| 				// ignore | 				// ignore | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -89,7 +89,7 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean setStatusCode(HttpStatus statusCode) { | 	public boolean setStatusCode(HttpStatus statusCode) { | ||||||
| 		Assert.notNull(statusCode); | 		Assert.notNull(statusCode, "Status code must not be null"); | ||||||
| 		if (this.state.get() == State.COMMITTED) { | 		if (this.state.get() == State.COMMITTED) { | ||||||
| 			if (logger.isDebugEnabled()) { | 			if (logger.isDebugEnabled()) { | ||||||
| 				logger.debug("Can't set the status " + statusCode.toString() + | 				logger.debug("Can't set the status " + statusCode.toString() + | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.http.server.reactive; | package org.springframework.http.server.reactive; | ||||||
| 
 | 
 | ||||||
| import java.util.LinkedHashMap; | import java.util.LinkedHashMap; | ||||||
|  | @ -57,11 +58,9 @@ public abstract class HttpHandlerAdapterSupport { | ||||||
| 	/** | 	/** | ||||||
| 	 * Constructor with {@code HttpHandler}s mapped to distinct context paths. | 	 * Constructor with {@code HttpHandler}s mapped to distinct context paths. | ||||||
| 	 * Context paths must start but not end with "/" and must be encoded. | 	 * Context paths must start but not end with "/" and must be encoded. | ||||||
| 	 * |  | ||||||
| 	 * <p>At request time context paths are compared against the "raw" path of | 	 * <p>At request time context paths are compared against the "raw" path of | ||||||
| 	 * the request URI in the order in which they are provided. The first one | 	 * the request URI in the order in which they are provided. The first one | ||||||
| 	 * to match is chosen. If none match the response status is set to 404. | 	 * to match is chosen. If none match the response status is set to 404. | ||||||
| 	 * |  | ||||||
| 	 * @param handlerMap map with context paths and {@code HttpHandler}s. | 	 * @param handlerMap map with context paths and {@code HttpHandler}s. | ||||||
| 	 * @see ServerHttpRequest#getContextPath() | 	 * @see ServerHttpRequest#getContextPath() | ||||||
| 	 */ | 	 */ | ||||||
|  | @ -85,9 +84,8 @@ public abstract class HttpHandlerAdapterSupport { | ||||||
| 
 | 
 | ||||||
| 		private final Map<String, HttpHandler> handlerMap; | 		private final Map<String, HttpHandler> handlerMap; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public CompositeHttpHandler(Map<String, HttpHandler> handlerMap) { | 		public CompositeHttpHandler(Map<String, HttpHandler> handlerMap) { | ||||||
| 			Assert.notEmpty(handlerMap); | 			Assert.notEmpty(handlerMap, "Handler map must not be empty"); | ||||||
| 			this.handlerMap = initHandlerMap(handlerMap); | 			this.handlerMap = initHandlerMap(handlerMap); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -97,10 +95,10 @@ public abstract class HttpHandlerAdapterSupport { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		private static void validateContextPath(String contextPath) { | 		private static void validateContextPath(String contextPath) { | ||||||
| 			Assert.hasText(contextPath, "contextPath must not be empty"); | 			Assert.hasText(contextPath, "Context path must not be empty"); | ||||||
| 			if (!contextPath.equals("/")) { | 			if (!contextPath.equals("/")) { | ||||||
| 				Assert.isTrue(contextPath.startsWith("/"), "contextPath must begin with '/'"); | 				Assert.isTrue(contextPath.startsWith("/"), "Context path must begin with '/'"); | ||||||
| 				Assert.isTrue(!contextPath.endsWith("/"), "contextPath must not end with '/'"); | 				Assert.isTrue(!contextPath.endsWith("/"), "Context path must not end with '/'"); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -124,7 +122,9 @@ public abstract class HttpHandlerAdapterSupport { | ||||||
| 					}); | 					}); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/** Strip the context path from native request if any */ | 		/** | ||||||
|  | 		 * Strip the context path from the native request, if any. | ||||||
|  | 		 */ | ||||||
| 		private String getPathToUse(ServerHttpRequest request) { | 		private String getPathToUse(ServerHttpRequest request) { | ||||||
| 			String path = request.getURI().getRawPath(); | 			String path = request.getURI().getRawPath(); | ||||||
| 			String contextPath = request.getContextPath(); | 			String contextPath = request.getContextPath(); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -50,12 +50,12 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme | ||||||
| 	private static final int DEFAULT_BUFFER_SIZE = 8192; | 	private static final int DEFAULT_BUFFER_SIZE = 8192; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 	private int bufferSize = DEFAULT_BUFFER_SIZE; | ||||||
|  | 
 | ||||||
| 	// Servlet is based on blocking I/O, hence the usage of non-direct, heap-based buffers | 	// Servlet is based on blocking I/O, hence the usage of non-direct, heap-based buffers | ||||||
| 	// (i.e. 'false' as constructor argument) | 	// (i.e. 'false' as constructor argument) | ||||||
| 	private DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(false); | 	private DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory(false); | ||||||
| 
 | 
 | ||||||
| 	private int bufferSize = DEFAULT_BUFFER_SIZE; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| 	public ServletHttpHandlerAdapter(HttpHandler httpHandler) { | 	public ServletHttpHandlerAdapter(HttpHandler httpHandler) { | ||||||
| 		super(httpHandler); | 		super(httpHandler); | ||||||
|  | @ -66,21 +66,12 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public void setDataBufferFactory(DataBufferFactory dataBufferFactory) { |  | ||||||
| 		Assert.notNull(dataBufferFactory, "'dataBufferFactory' must not be null"); |  | ||||||
| 		this.dataBufferFactory = dataBufferFactory; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	public DataBufferFactory getDataBufferFactory() { |  | ||||||
| 		return this.dataBufferFactory; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Set the size of the input buffer used for reading in bytes. | 	 * Set the size of the input buffer used for reading in bytes. | ||||||
| 	 * <p>By default this is set to 8192. | 	 * <p>By default this is set to 8192. | ||||||
| 	 */ | 	 */ | ||||||
| 	public void setBufferSize(int bufferSize) { | 	public void setBufferSize(int bufferSize) { | ||||||
| 		Assert.isTrue(bufferSize > 0); | 		Assert.isTrue(bufferSize > 0, "Buffer size must be larger than zero"); | ||||||
| 		this.bufferSize = bufferSize; | 		this.bufferSize = bufferSize; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -91,10 +82,20 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme | ||||||
| 		return this.bufferSize; | 		return this.bufferSize; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public void setDataBufferFactory(DataBufferFactory dataBufferFactory) { | ||||||
|  | 		Assert.notNull(dataBufferFactory, "DataBufferFactory must not be null"); | ||||||
|  | 		this.dataBufferFactory = dataBufferFactory; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public DataBufferFactory getDataBufferFactory() { | ||||||
|  | 		return this.dataBufferFactory; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	// The Servlet.service method | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public void service(ServletRequest request, ServletResponse response) throws IOException { | 	public void service(ServletRequest request, ServletResponse response) throws IOException { | ||||||
| 
 |  | ||||||
| 		// Start async before Read/WriteListener registration | 		// Start async before Read/WriteListener registration | ||||||
| 		AsyncContext asyncContext = request.startAsync(); | 		AsyncContext asyncContext = request.startAsync(); | ||||||
| 
 | 
 | ||||||
|  | @ -105,18 +106,15 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme | ||||||
| 		getHttpHandler().handle(httpRequest, httpResponse).subscribe(subscriber); | 		getHttpHandler().handle(httpRequest, httpResponse).subscribe(subscriber); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context) | 	protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context) throws IOException { | ||||||
| 			throws IOException { |  | ||||||
| 
 |  | ||||||
| 		return new ServletServerHttpRequest(request, context, getDataBufferFactory(), getBufferSize()); | 		return new ServletServerHttpRequest(request, context, getDataBufferFactory(), getBufferSize()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext context) | 	protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncContext context) throws IOException { | ||||||
| 			throws IOException { |  | ||||||
| 
 |  | ||||||
| 		return new ServletServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize()); | 		return new ServletServerHttpResponse(response, context, getDataBufferFactory(), getBufferSize()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	// Other Servlet methods... | 	// Other Servlet methods... | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -142,7 +140,6 @@ public class ServletHttpHandlerAdapter extends HttpHandlerAdapterSupport impleme | ||||||
| 
 | 
 | ||||||
| 		private final AsyncContext asyncContext; | 		private final AsyncContext asyncContext; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public HandlerResultSubscriber(AsyncContext asyncContext) { | 		public HandlerResultSubscriber(AsyncContext asyncContext) { | ||||||
| 			this.asyncContext = asyncContext; | 			this.asyncContext = asyncContext; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,6 +43,7 @@ import org.springframework.util.Assert; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Adapt {@link ServerHttpResponse} to the Servlet {@link HttpServletResponse}. |  * Adapt {@link ServerHttpResponse} to the Servlet {@link HttpServletResponse}. | ||||||
|  |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  * @since 5.0 |  * @since 5.0 | ||||||
|  */ |  */ | ||||||
|  | @ -66,7 +67,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons | ||||||
| 
 | 
 | ||||||
| 		Assert.notNull(response, "HttpServletResponse must not be null"); | 		Assert.notNull(response, "HttpServletResponse must not be null"); | ||||||
| 		Assert.notNull(bufferFactory, "DataBufferFactory must not be null"); | 		Assert.notNull(bufferFactory, "DataBufferFactory must not be null"); | ||||||
| 		Assert.isTrue(bufferSize > 0, "'bufferSize' must be greater than 0"); | 		Assert.isTrue(bufferSize > 0, "Buffer size must be greater than 0"); | ||||||
| 
 | 
 | ||||||
| 		this.response = response; | 		this.response = response; | ||||||
| 		this.bufferSize = bufferSize; | 		this.bufferSize = bufferSize; | ||||||
|  | @ -210,6 +211,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private class ResponseBodyWriteListener implements WriteListener { | 	private class ResponseBodyWriteListener implements WriteListener { | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
|  | @ -228,6 +230,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private class ResponseBodyFlushProcessor extends AbstractListenerWriteFlushProcessor<DataBuffer> { | 	private class ResponseBodyFlushProcessor extends AbstractListenerWriteFlushProcessor<DataBuffer> { | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
|  | @ -251,11 +254,11 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private class ResponseBodyProcessor extends AbstractListenerWriteProcessor<DataBuffer> { | 	private class ResponseBodyProcessor extends AbstractListenerWriteProcessor<DataBuffer> { | ||||||
| 
 | 
 | ||||||
| 		private final ServletOutputStream outputStream; | 		private final ServletOutputStream outputStream; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public ResponseBodyProcessor(ServletOutputStream outputStream) { | 		public ResponseBodyProcessor(ServletOutputStream outputStream) { | ||||||
| 			this.outputStream = outputStream; | 			this.outputStream = outputStream; | ||||||
| 		} | 		} | ||||||
|  | @ -268,7 +271,7 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons | ||||||
| 		@Override | 		@Override | ||||||
| 		protected void releaseData() { | 		protected void releaseData() { | ||||||
| 			if (logger.isTraceEnabled()) { | 			if (logger.isTraceEnabled()) { | ||||||
| 				logger.trace("releaseBuffer: " + this.currentData); | 				logger.trace("releaseData: " + this.currentData); | ||||||
| 			} | 			} | ||||||
| 			DataBufferUtils.release(this.currentData); | 			DataBufferUtils.release(this.currentData); | ||||||
| 			this.currentData = null; | 			this.currentData = null; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -30,7 +30,6 @@ import io.undertow.server.handlers.CookieImpl; | ||||||
| import io.undertow.util.HttpString; | import io.undertow.util.HttpString; | ||||||
| import org.reactivestreams.Processor; | import org.reactivestreams.Processor; | ||||||
| import org.reactivestreams.Publisher; | import org.reactivestreams.Publisher; | ||||||
| import org.xnio.ChannelListener; |  | ||||||
| import org.xnio.channels.StreamSinkChannel; | import org.xnio.channels.StreamSinkChannel; | ||||||
| import reactor.core.publisher.Mono; | import reactor.core.publisher.Mono; | ||||||
| 
 | 
 | ||||||
|  | @ -60,7 +59,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon | ||||||
| 
 | 
 | ||||||
| 	public UndertowServerHttpResponse(HttpServerExchange exchange, DataBufferFactory bufferFactory) { | 	public UndertowServerHttpResponse(HttpServerExchange exchange, DataBufferFactory bufferFactory) { | ||||||
| 		super(bufferFactory); | 		super(bufferFactory); | ||||||
| 		Assert.notNull(exchange, "'exchange' is required."); | 		Assert.notNull(exchange, "HttpServerExchange is required"); | ||||||
| 		this.exchange = exchange; | 		this.exchange = exchange; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -69,6 +68,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon | ||||||
| 		return this.exchange; | 		return this.exchange; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	protected void applyStatusCode() { | 	protected void applyStatusCode() { | ||||||
| 		HttpStatus statusCode = this.getStatusCode(); | 		HttpStatus statusCode = this.getStatusCode(); | ||||||
|  | @ -145,15 +145,13 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon | ||||||
| 
 | 
 | ||||||
| 		private volatile ByteBuffer byteBuffer; | 		private volatile ByteBuffer byteBuffer; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public ResponseBodyProcessor(StreamSinkChannel channel) { | 		public ResponseBodyProcessor(StreamSinkChannel channel) { | ||||||
| 			Assert.notNull(channel, "StreamSinkChannel must not be null"); | 			Assert.notNull(channel, "StreamSinkChannel must not be null"); | ||||||
| 			this.channel = channel; | 			this.channel = channel; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 		public void registerListener() { | 		public void registerListener() { | ||||||
| 			this.channel.getWriteSetter().set((ChannelListener<StreamSinkChannel>) c -> onWritePossible()); | 			this.channel.getWriteSetter().set(c -> onWritePossible()); | ||||||
| 			this.channel.resumeWrites(); | 			this.channel.resumeWrites(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -199,7 +197,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon | ||||||
| 		@Override | 		@Override | ||||||
| 		protected void releaseData() { | 		protected void releaseData() { | ||||||
| 			if (logger.isTraceEnabled()) { | 			if (logger.isTraceEnabled()) { | ||||||
| 				logger.trace("releaseBuffer: " + this.currentData); | 				logger.trace("releaseData: " + this.currentData); | ||||||
| 			} | 			} | ||||||
| 			DataBufferUtils.release(this.currentData); | 			DataBufferUtils.release(this.currentData); | ||||||
| 			this.currentData = null; | 			this.currentData = null; | ||||||
|  | @ -209,10 +207,11 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
| 		protected boolean isDataEmpty(DataBuffer dataBuffer) { | 		protected boolean isDataEmpty(DataBuffer dataBuffer) { | ||||||
| 			return dataBuffer.readableByteCount() == 0; | 			return (dataBuffer.readableByteCount() == 0); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| 	private class ResponseBodyFlushProcessor extends AbstractListenerWriteFlushProcessor<DataBuffer> { | 	private class ResponseBodyFlushProcessor extends AbstractListenerWriteFlushProcessor<DataBuffer> { | ||||||
| 
 | 
 | ||||||
| 		@Override | 		@Override | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -16,7 +16,6 @@ | ||||||
| 
 | 
 | ||||||
| package org.springframework.http.server.reactive; | package org.springframework.http.server.reactive; | ||||||
| 
 | 
 | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.concurrent.atomic.AtomicReference; | import java.util.concurrent.atomic.AtomicReference; | ||||||
| 
 | 
 | ||||||
| import org.apache.commons.logging.Log; | import org.apache.commons.logging.Log; | ||||||
|  | @ -26,6 +25,8 @@ import org.reactivestreams.Subscriber; | ||||||
| import org.reactivestreams.Subscription; | import org.reactivestreams.Subscription; | ||||||
| import reactor.core.publisher.Operators; | import reactor.core.publisher.Operators; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.util.Assert; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * Publisher returned from {@link ServerHttpResponse#writeWith(Publisher)}. |  * Publisher returned from {@link ServerHttpResponse#writeWith(Publisher)}. | ||||||
|  * |  * | ||||||
|  | @ -113,12 +114,10 @@ class WriteResultPublisher implements Publisher<Void> { | ||||||
| 
 | 
 | ||||||
| 		UNSUBSCRIBED { | 		UNSUBSCRIBED { | ||||||
| 			@Override | 			@Override | ||||||
| 			void subscribe(WriteResultPublisher publisher, | 			void subscribe(WriteResultPublisher publisher, Subscriber<? super Void> subscriber) { | ||||||
| 					Subscriber<? super Void> subscriber) { | 				Assert.notNull(subscriber, "Subscriber must not be null"); | ||||||
| 				Objects.requireNonNull(subscriber); |  | ||||||
| 				if (publisher.changeState(this, SUBSCRIBED)) { | 				if (publisher.changeState(this, SUBSCRIBED)) { | ||||||
| 					Subscription subscription = | 					Subscription subscription = new ResponseBodyWriteResultSubscription(publisher); | ||||||
| 							new ResponseBodyWriteResultSubscription(publisher); |  | ||||||
| 					publisher.subscriber = subscriber; | 					publisher.subscriber = subscriber; | ||||||
| 					subscriber.onSubscribe(subscription); | 					subscriber.onSubscribe(subscription); | ||||||
| 					if (publisher.publisherCompleted) { | 					if (publisher.publisherCompleted) { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -136,15 +136,15 @@ public class PathExtensionContentNegotiationStrategy extends AbstractMappingCont | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
| 	 * A public method exposing the knowledge of the path extension strategy to | 	 * A public method exposing the knowledge of the path extension strategy to | ||||||
| 	 * resolve file extensions to a MediaType in this case for a given | 	 * resolve file extensions to a {@link MediaType} in this case for a given | ||||||
| 	 * {@link Resource}. The method first looks up any explicitly registered | 	 * {@link Resource}. The method first looks up any explicitly registered | ||||||
| 	 * file extensions first and then falls back on JAF if available. | 	 * file extensions first and then falls back on JAF if available. | ||||||
| 	 * @param resource the resource to look up | 	 * @param resource the resource to look up | ||||||
| 	 * @return the MediaType for the extension or {@code null}. | 	 * @return the MediaType for the extension, or {@code null} if none found | ||||||
| 	 * @since 4.3 | 	 * @since 4.3 | ||||||
| 	 */ | 	 */ | ||||||
| 	public MediaType getMediaTypeForResource(Resource resource) { | 	public MediaType getMediaTypeForResource(Resource resource) { | ||||||
| 		Assert.notNull(resource); | 		Assert.notNull(resource, "Resource must not be null"); | ||||||
| 		MediaType mediaType = null; | 		MediaType mediaType = null; | ||||||
| 		String filename = resource.getFilename(); | 		String filename = resource.getFilename(); | ||||||
| 		String extension = StringUtils.getFilenameExtension(filename); | 		String extension = StringUtils.getFilenameExtension(filename); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -64,7 +64,7 @@ public class UnsatisfiedServletRequestParameterException extends ServletRequestB | ||||||
| 			Map<String, String[]> actualParams) { | 			Map<String, String[]> actualParams) { | ||||||
| 
 | 
 | ||||||
| 		super(""); | 		super(""); | ||||||
| 		Assert.isTrue(!CollectionUtils.isEmpty(paramConditions)); | 		Assert.notEmpty(paramConditions, "Parameter conditions must not be empty"); | ||||||
| 		this.paramConditions = paramConditions; | 		this.paramConditions = paramConditions; | ||||||
| 		this.actualParams = actualParams; | 		this.actualParams = actualParams; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -37,7 +37,6 @@ import org.springframework.core.annotation.AnnotationAwareOrderComparator; | ||||||
| import org.springframework.core.env.ConfigurableEnvironment; | import org.springframework.core.env.ConfigurableEnvironment; | ||||||
| import org.springframework.core.io.ClassPathResource; | import org.springframework.core.io.ClassPathResource; | ||||||
| import org.springframework.core.io.support.PropertiesLoaderUtils; | import org.springframework.core.io.support.PropertiesLoaderUtils; | ||||||
| import org.springframework.util.Assert; |  | ||||||
| import org.springframework.util.ClassUtils; | import org.springframework.util.ClassUtils; | ||||||
| import org.springframework.util.ObjectUtils; | import org.springframework.util.ObjectUtils; | ||||||
| import org.springframework.util.StringUtils; | import org.springframework.util.StringUtils; | ||||||
|  | @ -480,7 +479,10 @@ public class ContextLoader { | ||||||
| 	private Class<ApplicationContextInitializer<ConfigurableApplicationContext>> loadInitializerClass(String className) { | 	private Class<ApplicationContextInitializer<ConfigurableApplicationContext>> loadInitializerClass(String className) { | ||||||
| 		try { | 		try { | ||||||
| 			Class<?> clazz = ClassUtils.forName(className, ClassUtils.getDefaultClassLoader()); | 			Class<?> clazz = ClassUtils.forName(className, ClassUtils.getDefaultClassLoader()); | ||||||
| 			Assert.isAssignable(ApplicationContextInitializer.class, clazz); | 			if (!ApplicationContextInitializer.class.isAssignableFrom(clazz)) { | ||||||
|  | 				throw new ApplicationContextException( | ||||||
|  | 						"Initializer class does not implement ApplicationContextInitializer interface: " + clazz); | ||||||
|  | 			} | ||||||
| 			return (Class<ApplicationContextInitializer<ConfigurableApplicationContext>>) clazz; | 			return (Class<ApplicationContextInitializer<ConfigurableApplicationContext>>) clazz; | ||||||
| 		} | 		} | ||||||
| 		catch (ClassNotFoundException ex) { | 		catch (ClassNotFoundException ex) { | ||||||
|  |  | ||||||
|  | @ -816,7 +816,7 @@ final class HierarchicalUriComponents extends UriComponents { | ||||||
| 		private final List<PathComponent> pathComponents; | 		private final List<PathComponent> pathComponents; | ||||||
| 
 | 
 | ||||||
| 		public PathComponentComposite(List<PathComponent> pathComponents) { | 		public PathComponentComposite(List<PathComponent> pathComponents) { | ||||||
| 			Assert.notNull(pathComponents); | 			Assert.notNull(pathComponents, "PathComponent List must not be null"); | ||||||
| 			this.pathComponents = pathComponents; | 			this.pathComponents = pathComponents; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -41,10 +41,10 @@ import static org.junit.Assert.fail; | ||||||
| public class HttpHandlerAdapterSupportTests { | public class HttpHandlerAdapterSupportTests { | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void invalidContextPath() throws Exception { | 	public void invalidContextPath() { | ||||||
| 		testInvalidContextPath("  ", "contextPath must not be empty"); | 		testInvalidContextPath("  ", "Context path must not be empty"); | ||||||
| 		testInvalidContextPath("path", "contextPath must begin with '/'"); | 		testInvalidContextPath("path", "Context path must begin with '/'"); | ||||||
| 		testInvalidContextPath("/path/", "contextPath must not end with '/'"); | 		testInvalidContextPath("/path/", "Context path must not end with '/'"); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private void testInvalidContextPath(String contextPath, String errorMessage) { | 	private void testInvalidContextPath(String contextPath, String errorMessage) { | ||||||
|  | @ -58,7 +58,7 @@ public class HttpHandlerAdapterSupportTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void match() throws Exception { | 	public void match() { | ||||||
| 		TestHttpHandler handler1 = new TestHttpHandler(); | 		TestHttpHandler handler1 = new TestHttpHandler(); | ||||||
| 		TestHttpHandler handler2 = new TestHttpHandler(); | 		TestHttpHandler handler2 = new TestHttpHandler(); | ||||||
| 		TestHttpHandler handler3 = new TestHttpHandler(); | 		TestHttpHandler handler3 = new TestHttpHandler(); | ||||||
|  | @ -75,7 +75,7 @@ public class HttpHandlerAdapterSupportTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void matchWithContextPathEqualToPath() throws Exception { | 	public void matchWithContextPathEqualToPath() { | ||||||
| 		TestHttpHandler handler1 = new TestHttpHandler(); | 		TestHttpHandler handler1 = new TestHttpHandler(); | ||||||
| 		TestHttpHandler handler2 = new TestHttpHandler(); | 		TestHttpHandler handler2 = new TestHttpHandler(); | ||||||
| 		TestHttpHandler handler3 = new TestHttpHandler(); | 		TestHttpHandler handler3 = new TestHttpHandler(); | ||||||
|  | @ -92,7 +92,7 @@ public class HttpHandlerAdapterSupportTests { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
| 	public void matchWithNativeContextPath() throws Exception { | 	public void matchWithNativeContextPath() { | ||||||
| 		MockServerHttpRequest request = MockServerHttpRequest | 		MockServerHttpRequest request = MockServerHttpRequest | ||||||
| 				.get("/yet/another/path") | 				.get("/yet/another/path") | ||||||
| 				.contextPath("/yet")  // contextPath in underlying request | 				.contextPath("/yet")  // contextPath in underlying request | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -80,12 +80,12 @@ public abstract class AbstractHttpServer implements HttpServer { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public final void afterPropertiesSet() throws Exception { | 	public final void afterPropertiesSet() throws Exception { | ||||||
| 		synchronized (this.lifecycleMonitor) { | 		Assert.notNull(this.host, "Host must not be null"); | ||||||
| 			Assert.isTrue(this.host != null); | 		Assert.isTrue(this.port >= 0, "Port must not be a negative number"); | ||||||
| 			Assert.isTrue(this.port != -1); | 		Assert.isTrue(this.httpHandler != null || this.handlerMap != null, "No HttpHandler configured"); | ||||||
| 			Assert.isTrue(this.httpHandler != null || this.handlerMap != null); | 		Assert.state(!this.running, "Cannot reconfigure while running"); | ||||||
| 			Assert.isTrue(!this.running); |  | ||||||
| 
 | 
 | ||||||
|  | 		synchronized (this.lifecycleMonitor) { | ||||||
| 			initServer(); | 			initServer(); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -110,7 +110,7 @@ public abstract class AbstractHttpServer implements HttpServer { | ||||||
| 				try { | 				try { | ||||||
| 					startInternal(); | 					startInternal(); | ||||||
| 				} | 				} | ||||||
| 				catch (Exception ex) { | 				catch (Throwable ex) { | ||||||
| 					throw new IllegalStateException(ex); | 					throw new IllegalStateException(ex); | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | @ -128,7 +128,7 @@ public abstract class AbstractHttpServer implements HttpServer { | ||||||
| 				try { | 				try { | ||||||
| 					stopInternal(); | 					stopInternal(); | ||||||
| 				} | 				} | ||||||
| 				catch (Exception ex) { | 				catch (Throwable ex) { | ||||||
| 					throw new IllegalStateException(ex); | 					throw new IllegalStateException(ex); | ||||||
| 				} | 				} | ||||||
| 				finally { | 				finally { | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2015 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -16,7 +16,6 @@ | ||||||
| 
 | 
 | ||||||
| package org.springframework.http.server.reactive.bootstrap; | package org.springframework.http.server.reactive.bootstrap; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| import org.springframework.beans.factory.InitializingBean; | import org.springframework.beans.factory.InitializingBean; | ||||||
| import org.springframework.context.Lifecycle; | import org.springframework.context.Lifecycle; | ||||||
| import org.springframework.http.server.reactive.HttpHandler; | import org.springframework.http.server.reactive.HttpHandler; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -43,7 +43,7 @@ public class TomcatHttpServer extends AbstractHttpServer { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public TomcatHttpServer(String baseDir, Class<?> wsListener) { | 	public TomcatHttpServer(String baseDir, Class<?> wsListener) { | ||||||
| 		Assert.notNull(baseDir); | 		Assert.notNull(baseDir, "Base dir must not be null"); | ||||||
| 		this.baseDir = baseDir; | 		this.baseDir = baseDir; | ||||||
| 		this.wsListener = wsListener; | 		this.wsListener = wsListener; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -61,7 +61,7 @@ public class MockAsyncContext implements AsyncContext { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	public void addDispatchHandler(Runnable handler) { | 	public void addDispatchHandler(Runnable handler) { | ||||||
| 		Assert.notNull(handler); | 		Assert.notNull(handler, "Dispatch handler must not be null"); | ||||||
| 		this.dispatchHandlers.add(handler); | 		this.dispatchHandlers.add(handler); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -77,7 +77,7 @@ public class MockAsyncContext implements AsyncContext { | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	public boolean hasOriginalRequestAndResponse() { | 	public boolean hasOriginalRequestAndResponse() { | ||||||
| 		return (this.request instanceof MockHttpServletRequest) && (this.response instanceof MockHttpServletResponse); | 		return (this.request instanceof MockHttpServletRequest && this.response instanceof MockHttpServletResponse); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Override | 	@Override | ||||||
|  | @ -112,8 +112,8 @@ public class MockAsyncContext implements AsyncContext { | ||||||
| 			try { | 			try { | ||||||
| 				listener.onComplete(new AsyncEvent(this, this.request, this.response)); | 				listener.onComplete(new AsyncEvent(this, this.request, this.response)); | ||||||
| 			} | 			} | ||||||
| 			catch (IOException e) { | 			catch (IOException ex) { | ||||||
| 				throw new IllegalStateException("AsyncListener failure", e); | 				throw new IllegalStateException("AsyncListener failure", ex); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -356,12 +356,12 @@ public class MockPageContext extends PageContext { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public byte[] getContentAsByteArray() { | 	public byte[] getContentAsByteArray() { | ||||||
| 		Assert.isTrue(this.response instanceof MockHttpServletResponse); | 		Assert.state(this.response instanceof MockHttpServletResponse, "MockHttpServletResponse required"); | ||||||
| 		return ((MockHttpServletResponse) this.response).getContentAsByteArray(); | 		return ((MockHttpServletResponse) this.response).getContentAsByteArray(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public String getContentAsString() throws UnsupportedEncodingException { | 	public String getContentAsString() throws UnsupportedEncodingException { | ||||||
| 		Assert.isTrue(this.response instanceof MockHttpServletResponse); | 		Assert.state(this.response instanceof MockHttpServletResponse, "MockHttpServletResponse required"); | ||||||
| 		return ((MockHttpServletResponse) this.response).getContentAsString(); | 		return ((MockHttpServletResponse) this.response).getContentAsString(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -13,6 +13,7 @@ | ||||||
|  * See the License for the specific language governing permissions and |  * See the License for the specific language governing permissions and | ||||||
|  * limitations under the License. |  * limitations under the License. | ||||||
|  */ |  */ | ||||||
|  | 
 | ||||||
| package org.springframework.web.util; | package org.springframework.web.util; | ||||||
| 
 | 
 | ||||||
| import java.net.URI; | import java.net.URI; | ||||||
|  | @ -21,13 +22,14 @@ import java.util.Map; | ||||||
| 
 | 
 | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.assertEquals; | import static org.junit.Assert.*; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Unit tests for {@link DefaultUriTemplateHandler}. |  * Unit tests for {@link DefaultUriTemplateHandler}. | ||||||
|  * |  * | ||||||
|  * @author Rossen Stoyanchev |  * @author Rossen Stoyanchev | ||||||
|  */ |  */ | ||||||
|  | @SuppressWarnings("deprecation") | ||||||
| public class DefaultUriTemplateHandlerTests { | public class DefaultUriTemplateHandlerTests { | ||||||
| 
 | 
 | ||||||
| 	private final DefaultUriTemplateHandler handler = new DefaultUriTemplateHandler(); | 	private final DefaultUriTemplateHandler handler = new DefaultUriTemplateHandler(); | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -190,7 +190,7 @@ public abstract class HttpServletBean extends HttpServlet | ||||||
| 	 */ | 	 */ | ||||||
| 	@Override | 	@Override | ||||||
| 	public void setEnvironment(Environment environment) { | 	public void setEnvironment(Environment environment) { | ||||||
| 		Assert.isInstanceOf(ConfigurableEnvironment.class, environment); | 		Assert.isInstanceOf(ConfigurableEnvironment.class, environment, "ConfigurableEnvironment required"); | ||||||
| 		this.environment = (ConfigurableEnvironment) environment; | 		this.environment = (ConfigurableEnvironment) environment; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -679,8 +679,8 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap | ||||||
| 		private final String mappingName; | 		private final String mappingName; | ||||||
| 
 | 
 | ||||||
| 		public MappingRegistration(T mapping, HandlerMethod handlerMethod, List<String> directUrls, String mappingName) { | 		public MappingRegistration(T mapping, HandlerMethod handlerMethod, List<String> directUrls, String mappingName) { | ||||||
| 			Assert.notNull(mapping); | 			Assert.notNull(mapping, "Mapping must not be null"); | ||||||
| 			Assert.notNull(handlerMethod); | 			Assert.notNull(handlerMethod, "HandlerMethod must not be null"); | ||||||
| 			this.mapping = mapping; | 			this.mapping = mapping; | ||||||
| 			this.handlerMethod = handlerMethod; | 			this.handlerMethod = handlerMethod; | ||||||
| 			this.directUrls = (directUrls != null ? directUrls : Collections.emptyList()); | 			this.directUrls = (directUrls != null ? directUrls : Collections.emptyList()); | ||||||
|  | @ -745,7 +745,7 @@ public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMap | ||||||
| 	private static class EmptyHandler { | 	private static class EmptyHandler { | ||||||
| 
 | 
 | ||||||
| 		public void handle() { | 		public void handle() { | ||||||
| 			throw new UnsupportedOperationException("not implemented"); | 			throw new UnsupportedOperationException("Not implemented"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| /* | /* | ||||||
|  * Copyright 2002-2016 the original author or authors. |  * Copyright 2002-2017 the original author or authors. | ||||||
|  * |  * | ||||||
|  * Licensed under the Apache License, Version 2.0 (the "License"); |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  * you may not use this file except in compliance with the License. |  * you may not use this file except in compliance with the License. | ||||||
|  | @ -170,6 +170,7 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i | ||||||
| 			validateHandler(handler, request); | 			validateHandler(handler, request); | ||||||
| 			return buildPathExposingHandler(handler, urlPath, urlPath, null); | 			return buildPathExposingHandler(handler, urlPath, urlPath, null); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		// Pattern match? | 		// Pattern match? | ||||||
| 		List<String> matchingPatterns = new ArrayList<>(); | 		List<String> matchingPatterns = new ArrayList<>(); | ||||||
| 		for (String registeredPattern : this.handlerMap.keySet()) { | 		for (String registeredPattern : this.handlerMap.keySet()) { | ||||||
|  | @ -182,20 +183,26 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		String bestPatternMatch = null; | 
 | ||||||
|  | 		String bestMatch = null; | ||||||
| 		Comparator<String> patternComparator = getPathMatcher().getPatternComparator(urlPath); | 		Comparator<String> patternComparator = getPathMatcher().getPatternComparator(urlPath); | ||||||
| 		if (!matchingPatterns.isEmpty()) { | 		if (!matchingPatterns.isEmpty()) { | ||||||
| 			Collections.sort(matchingPatterns, patternComparator); | 			Collections.sort(matchingPatterns, patternComparator); | ||||||
| 			if (logger.isDebugEnabled()) { | 			if (logger.isDebugEnabled()) { | ||||||
| 				logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns); | 				logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns); | ||||||
| 			} | 			} | ||||||
| 			bestPatternMatch = matchingPatterns.get(0); | 			bestMatch = matchingPatterns.get(0); | ||||||
| 		} | 		} | ||||||
| 		if (bestPatternMatch != null) { | 		if (bestMatch != null) { | ||||||
| 			handler = this.handlerMap.get(bestPatternMatch); | 			handler = this.handlerMap.get(bestMatch); | ||||||
| 			if (handler == null) { | 			if (handler == null) { | ||||||
| 				Assert.isTrue(bestPatternMatch.endsWith("/")); | 				if (bestMatch.endsWith("/")) { | ||||||
| 				handler = this.handlerMap.get(bestPatternMatch.substring(0, bestPatternMatch.length() - 1)); | 					handler = this.handlerMap.get(bestMatch.substring(0, bestMatch.length() - 1)); | ||||||
|  | 				} | ||||||
|  | 				if (handler == null) { | ||||||
|  | 					throw new IllegalStateException( | ||||||
|  | 							"Could not find handler for best pattern match [" + bestMatch + "]"); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			// Bean name or resolved handler? | 			// Bean name or resolved handler? | ||||||
| 			if (handler instanceof String) { | 			if (handler instanceof String) { | ||||||
|  | @ -203,13 +210,13 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i | ||||||
| 				handler = getApplicationContext().getBean(handlerName); | 				handler = getApplicationContext().getBean(handlerName); | ||||||
| 			} | 			} | ||||||
| 			validateHandler(handler, request); | 			validateHandler(handler, request); | ||||||
| 			String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPatternMatch, urlPath); | 			String pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestMatch, urlPath); | ||||||
| 
 | 
 | ||||||
| 			// There might be multiple 'best patterns', let's make sure we have the correct URI template variables | 			// There might be multiple 'best patterns', let's make sure we have the correct URI template variables | ||||||
| 			// for all of them | 			// for all of them | ||||||
| 			Map<String, String> uriTemplateVariables = new LinkedHashMap<>(); | 			Map<String, String> uriTemplateVariables = new LinkedHashMap<>(); | ||||||
| 			for (String matchingPattern : matchingPatterns) { | 			for (String matchingPattern : matchingPatterns) { | ||||||
| 				if (patternComparator.compare(bestPatternMatch, matchingPattern) == 0) { | 				if (patternComparator.compare(bestMatch, matchingPattern) == 0) { | ||||||
| 					Map<String, String> vars = getPathMatcher().extractUriTemplateVariables(matchingPattern, urlPath); | 					Map<String, String> vars = getPathMatcher().extractUriTemplateVariables(matchingPattern, urlPath); | ||||||
| 					Map<String, String> decodedVars = getUrlPathHelper().decodePathVariables(request, vars); | 					Map<String, String> decodedVars = getUrlPathHelper().decodePathVariables(request, vars); | ||||||
| 					uriTemplateVariables.putAll(decodedVars); | 					uriTemplateVariables.putAll(decodedVars); | ||||||
|  | @ -218,8 +225,9 @@ public abstract class AbstractUrlHandlerMapping extends AbstractHandlerMapping i | ||||||
| 			if (logger.isDebugEnabled()) { | 			if (logger.isDebugEnabled()) { | ||||||
| 				logger.debug("URI Template variables for request [" + urlPath + "] are " + uriTemplateVariables); | 				logger.debug("URI Template variables for request [" + urlPath + "] are " + uriTemplateVariables); | ||||||
| 			} | 			} | ||||||
| 			return buildPathExposingHandler(handler, bestPatternMatch, pathWithinMapping, uriTemplateVariables); | 			return buildPathExposingHandler(handler, bestMatch, pathWithinMapping, uriTemplateVariables); | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
| 		// No handler found... | 		// No handler found... | ||||||
| 		return null; | 		return null; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue