Browse Source

Polishing (backported from master)

(cherry picked from commit 48f753f)
pull/689/head
Juergen Hoeller 12 years ago
parent
commit
c033f889bf
  1. 11
      spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
  2. 8
      spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java
  3. 46
      spring-core/src/main/java/org/springframework/util/CompositeIterator.java
  4. 67
      spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
  5. 73
      spring-core/src/test/java/org/springframework/util/CompositeIteratorTests.java
  6. 4
      spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java
  7. 22
      spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java
  8. 10
      spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java
  9. 10
      spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java

11
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

@ -123,7 +123,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
/** Resolution strategy for expressions in bean definition values */ /** Resolution strategy for expressions in bean definition values */
private BeanExpressionResolver beanExpressionResolver; private BeanExpressionResolver beanExpressionResolver;
/** Spring 3.0 ConversionService to use instead of PropertyEditors */ /** Spring ConversionService to use instead of PropertyEditors */
private ConversionService conversionService; private ConversionService conversionService;
/** Custom PropertyEditorRegistrars to apply to the beans of this factory */ /** Custom PropertyEditorRegistrars to apply to the beans of this factory */
@ -159,10 +159,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
private final Map<String, RootBeanDefinition> mergedBeanDefinitions = private final Map<String, RootBeanDefinition> mergedBeanDefinitions =
new ConcurrentHashMap<String, RootBeanDefinition>(64); new ConcurrentHashMap<String, RootBeanDefinition>(64);
/** /** Names of beans that have already been created at least once */
* Names of beans that have already been created at least once
* (using a ConcurrentHashMap as a Set)
*/
private final Map<String, Boolean> alreadyCreated = new ConcurrentHashMap<String, Boolean>(64); private final Map<String, Boolean> alreadyCreated = new ConcurrentHashMap<String, Boolean>(64);
/** Names of beans that are currently in creation */ /** Names of beans that are currently in creation */
@ -503,8 +500,8 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
// Retrieve corresponding bean definition. // Retrieve corresponding bean definition.
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
Class[] typesToMatch = (FactoryBean.class.equals(typeToMatch) ? Class<?>[] typesToMatch = (FactoryBean.class.equals(typeToMatch) ?
new Class[] {typeToMatch} : new Class[] {FactoryBean.class, typeToMatch}); new Class<?>[] {typeToMatch} : new Class<?>[] {FactoryBean.class, typeToMatch});
// Check decorated bean definition, if any: We assume it'll be easier // Check decorated bean definition, if any: We assume it'll be easier
// to determine the decorated bean's type than the proxy's type. // to determine the decorated bean's type than the proxy's type.

8
spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * 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.
@ -85,8 +85,8 @@ import org.springframework.util.CollectionUtils;
* @see org.quartz.impl.StdSchedulerFactory * @see org.quartz.impl.StdSchedulerFactory
* @see org.springframework.transaction.interceptor.TransactionProxyFactoryBean * @see org.springframework.transaction.interceptor.TransactionProxyFactoryBean
*/ */
public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBean<Scheduler>, BeanNameAware, public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBean<Scheduler>,
ApplicationContextAware, InitializingBean, DisposableBean, SmartLifecycle { BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean, SmartLifecycle {
public static final String PROP_THREAD_COUNT = "org.quartz.threadPool.threadCount"; public static final String PROP_THREAD_COUNT = "org.quartz.threadPool.threadCount";
@ -698,7 +698,7 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// Implementation of Lifecycle interface // Implementation of SmartLifecycle interface
//--------------------------------------------------------------------- //---------------------------------------------------------------------
public void start() throws SchedulingException { public void start() throws SchedulingException {

46
spring-core/src/main/java/org/springframework/util/CompositeIterator.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2004-2009 the original author or authors. * Copyright 2002-2014 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,45 +13,47 @@
* 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.util; package org.springframework.util;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedHashSet;
import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import java.util.Set;
/** /**
* Iterator that combines multiple other iterators. * Composite iterator that combines multiple other iterators,
* This implementation maintains a list of iterators which are invoked in sequence until all iterators are exhausted. * as registered via {@link #add(Iterator)}.
*
* <p>This implementation maintains a linked set of iterators
* which are invoked in sequence until all iterators are exhausted.
*
* @author Erwin Vervaet * @author Erwin Vervaet
* @author Juergen Hoeller
* @since 3.0
*/ */
public class CompositeIterator<E> implements Iterator<E> { public class CompositeIterator<E> implements Iterator<E> {
private List<Iterator<E>> iterators = new LinkedList<Iterator<E>>(); private final Set<Iterator<E>> iterators = new LinkedHashSet<Iterator<E>>();
private boolean inUse = false; private boolean inUse = false;
/**
* Create a new composite iterator. Add iterators using the {@link #add(Iterator)} method.
*/
public CompositeIterator() {
}
/** /**
* Add given iterator to this composite. * Add given iterator to this composite.
*/ */
public void add(Iterator<E> iterator) { public void add(Iterator<E> iterator) {
Assert.state(!inUse, "You can no longer add iterator to a composite iterator that's already in use"); Assert.state(!this.inUse, "You can no longer add iterators to a composite iterator that's already in use");
if (iterators.contains(iterator)) { if (this.iterators.contains(iterator)) {
throw new IllegalArgumentException("You cannot add the same iterator twice"); throw new IllegalArgumentException("You cannot add the same iterator twice");
} }
iterators.add(iterator); this.iterators.add(iterator);
} }
public boolean hasNext() { public boolean hasNext() {
inUse = true; this.inUse = true;
for (Iterator<Iterator<E>> it = iterators.iterator(); it.hasNext();) { for (Iterator<E> iterator : this.iterators) {
if (it.next().hasNext()) { if (iterator.hasNext()) {
return true; return true;
} }
} }
@ -59,17 +61,17 @@ public class CompositeIterator<E> implements Iterator<E> {
} }
public E next() { public E next() {
inUse = true; this.inUse = true;
for (Iterator<Iterator<E>> it = iterators.iterator(); it.hasNext();) { for (Iterator<E> iterator : this.iterators) {
Iterator<E> iterator = it.next();
if (iterator.hasNext()) { if (iterator.hasNext()) {
return iterator.next(); return iterator.next();
} }
} }
throw new NoSuchElementException("Exhaused all iterators"); throw new NoSuchElementException("All iterators exhausted");
} }
public void remove() { public void remove() {
throw new UnsupportedOperationException("Remove is not supported"); throw new UnsupportedOperationException("CompositeIterator does not support remove()");
} }
} }

67
spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java

@ -224,23 +224,23 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
@Override @Override
public V get(Object key) { public V get(Object key) {
Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY); Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY);
Entry<K, V> entry = (reference == null ? null : reference.get()); Entry<K, V> entry = (reference != null ? reference.get() : null);
return (entry != null ? entry.getValue() : null); return (entry != null ? entry.getValue() : null);
} }
@Override @Override
public boolean containsKey(Object key) { public boolean containsKey(Object key) {
Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY); Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY);
Entry<K, V> entry = (reference == null ? null : reference.get()); Entry<K, V> entry = (reference != null ? reference.get() : null);
return (entry != null && ObjectUtils.nullSafeEquals(entry.getKey(), key)); return (entry != null && ObjectUtils.nullSafeEquals(entry.getKey(), key));
} }
/** /**
* Returns a {@link Reference} to the {@link Entry} for the specified {@code key} or * Return a {@link Reference} to the {@link Entry} for the specified {@code key},
* {@code null} if not found. * or {@code null} if not found.
* @param key the key (can be {@code null}) * @param key the key (can be {@code null})
* @param restructure types of restructure allowed during this call * @param restructure types of restructure allowed during this call
* @return the reference or {@code null} * @return the reference, or {@code null} if not found
*/ */
protected final Reference<K, V> getReference(Object key, Restructure restructure) { protected final Reference<K, V> getReference(Object key, Restructure restructure) {
int hash = getHash(key); int hash = getHash(key);
@ -396,14 +396,10 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
*/ */
public static enum ReferenceType { public static enum ReferenceType {
/** /** Use {@link SoftReference}s */
* Use {@link SoftReference}s.
*/
SOFT, SOFT,
/** /** Use {@link WeakReference}s */
* Use {@link WeakReference}s.
*/
WEAK WEAK
} }
@ -458,8 +454,8 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
} }
/** /**
* Apply an update operation to this segment. The segment will be locked * Apply an update operation to this segment.
* during update. * The segment will be locked during the update.
* @param hash the hash of the key * @param hash the hash of the key
* @param key the key * @param key the key
* @param task the update operation * @param task the update operation
@ -470,7 +466,7 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
if (task.hasOption(TaskOption.RESTRUCTURE_BEFORE)) { if (task.hasOption(TaskOption.RESTRUCTURE_BEFORE)) {
restructureIfNecessary(resize); restructureIfNecessary(resize);
} }
if (task.hasOption(TaskOption.SKIP_IF_EMPTY) && (this.count == 0)) { if (task.hasOption(TaskOption.SKIP_IF_EMPTY) && this.count == 0) {
return task.execute(null, null, null); return task.execute(null, null, null);
} }
lock(); lock();
@ -478,12 +474,12 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
final int index = getIndex(hash, this.references); final int index = getIndex(hash, this.references);
final Reference<K, V> head = this.references[index]; final Reference<K, V> head = this.references[index];
Reference<K, V> reference = findInChain(head, key, hash); Reference<K, V> reference = findInChain(head, key, hash);
Entry<K, V> entry = (reference == null ? null : reference.get()); Entry<K, V> entry = (reference != null ? reference.get() : null);
Entries entries = new Entries() { Entries entries = new Entries() {
@Override @Override
public void add(V value) { public void add(V value) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Entry<K, V> newEntry = new Entry<K, V>((K)key, value); Entry<K, V> newEntry = new Entry<K, V>((K) key, value);
Reference<K, V> newReference = Segment.this.referenceManager.createReference(newEntry, hash, head); Reference<K, V> newReference = Segment.this.referenceManager.createReference(newEntry, hash, head);
Segment.this.references[index] = newReference; Segment.this.references[index] = newReference;
Segment.this.count++; Segment.this.count++;
@ -510,7 +506,8 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
try { try {
setReferences(createReferenceArray(this.initialSize)); setReferences(createReferenceArray(this.initialSize));
this.count = 0; this.count = 0;
} finally { }
finally {
unlock(); unlock();
} }
} }
@ -541,16 +538,16 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
// Recalculate taking into account count inside lock and items that // Recalculate taking into account count inside lock and items that
// will be purged // will be purged
needsResize = ((countAfterRestructure > 0) && (countAfterRestructure >= this.resizeThreshold)); needsResize = (countAfterRestructure > 0 && countAfterRestructure >= this.resizeThreshold);
boolean resizing = false; boolean resizing = false;
int restructureSize = this.references.length; int restructureSize = this.references.length;
if (allowResize && needsResize && (restructureSize < MAXIMUM_SEGMENT_SIZE)) { if (allowResize && needsResize && restructureSize < MAXIMUM_SEGMENT_SIZE) {
restructureSize <<= 1; restructureSize <<= 1;
resizing = true; resizing = true;
} }
// Either create a new table or reuse the existing one // Either create a new table or reuse the existing one
Reference<K, V>[] restructured = (resizing ? createReferenceArray(restructureSize) : this.references); Reference<K, V>[] restructured = (resizing ? createReferenceArray(restructureSize) : this.references);
// Restructure // Restructure
for (int i = 0; i < this.references.length; i++) { for (int i = 0; i < this.references.length; i++) {
@ -574,7 +571,8 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
setReferences(restructured); setReferences(restructured);
} }
this.count = Math.max(countAfterRestructure, 0); this.count = Math.max(countAfterRestructure, 0);
} finally { }
finally {
unlock(); unlock();
} }
} }
@ -602,7 +600,7 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
} }
private int getIndex(int hash, Reference<K, V>[] references) { private int getIndex(int hash, Reference<K, V>[] references) {
return hash & (references.length - 1); return (hash & (references.length - 1));
} }
/** /**
@ -693,27 +691,26 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
@Override @Override
public String toString() { public String toString() {
return this.key + "=" + this.value; return (this.key + "=" + this.value);
} }
@Override @Override
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public final boolean equals(Object o) { public final boolean equals(Object other) {
if (o == this) { if (this == other) {
return true; return true;
} }
if (o != null && o instanceof Map.Entry) { if (!(other instanceof Map.Entry)) {
Map.Entry other = (Map.Entry) o; return false;
return ObjectUtils.nullSafeEquals(getKey(), other.getKey())
&& ObjectUtils.nullSafeEquals(getValue(), other.getValue());
} }
return false; Map.Entry otherEntry = (Map.Entry) other;
return (ObjectUtils.nullSafeEquals(getKey(), otherEntry.getKey()) &&
ObjectUtils.nullSafeEquals(getValue(), otherEntry.getValue()));
} }
@Override @Override
public final int hashCode() { public final int hashCode() {
return ObjectUtils.nullSafeHashCode(this.key) return (ObjectUtils.nullSafeHashCode(this.key) ^ ObjectUtils.nullSafeHashCode(this.value));
^ ObjectUtils.nullSafeHashCode(this.value);
} }
} }
@ -795,7 +792,7 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
if (o != null && o instanceof Map.Entry<?, ?>) { if (o != null && o instanceof Map.Entry<?, ?>) {
Map.Entry<?, ?> entry = (java.util.Map.Entry<?, ?>) o; Map.Entry<?, ?> entry = (java.util.Map.Entry<?, ?>) o;
Reference<K, V> reference = ConcurrentReferenceHashMap.this.getReference(entry.getKey(), Restructure.NEVER); Reference<K, V> reference = ConcurrentReferenceHashMap.this.getReference(entry.getKey(), Restructure.NEVER);
Entry<K, V> other = (reference == null ? null : reference.get()); Entry<K, V> other = (reference != null ? reference.get() : null);
if (other != null) { if (other != null) {
return ObjectUtils.nullSafeEquals(entry.getValue(), other.getValue()); return ObjectUtils.nullSafeEquals(entry.getValue(), other.getValue());
} }
@ -847,7 +844,7 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
public boolean hasNext() { public boolean hasNext() {
getNextIfNecessary(); getNextIfNecessary();
return this.next != null; return (this.next != null);
} }
public Entry<K, V> next() { public Entry<K, V> next() {
@ -974,7 +971,6 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
enqueue(); enqueue();
clear(); clear();
} }
} }
@ -1005,7 +1001,6 @@ public class ConcurrentReferenceHashMap<K, V> extends AbstractMap<K, V> implemen
enqueue(); enqueue();
clear(); clear();
} }
} }
} }

73
spring-core/src/test/java/org/springframework/util/CompositeIteratorTests.java

@ -1,3 +1,19 @@
/*
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.util; package org.springframework.util;
import java.util.Arrays; import java.util.Arrays;
@ -5,29 +21,36 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import junit.framework.TestCase; import org.junit.Test;
import static org.junit.Assert.*;
/** /**
* Test case for {@link CompositeIterator}. * Test case for {@link CompositeIterator}.
* *
* @author Erwin Vervaet * @author Erwin Vervaet
* @author Juergen Hoeller
*/ */
public class CompositeIteratorTests extends TestCase { public class CompositeIteratorTests {
@Test
public void testNoIterators() { public void testNoIterators() {
CompositeIterator it = new CompositeIterator(); CompositeIterator<String> it = new CompositeIterator<String>();
assertFalse(it.hasNext()); assertFalse(it.hasNext());
try { try {
it.next(); it.next();
fail(); fail();
} catch (NoSuchElementException e) { }
catch (NoSuchElementException ex) {
// expected // expected
} }
} }
@Test
public void testSingleIterator() { public void testSingleIterator() {
CompositeIterator it = new CompositeIterator(); CompositeIterator<String> it = new CompositeIterator<String>();
it.add(Arrays.asList(new String[] { "0", "1" }).iterator()); it.add(Arrays.asList("0", "1").iterator());
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
assertTrue(it.hasNext()); assertTrue(it.hasNext());
assertEquals(String.valueOf(i), it.next()); assertEquals(String.valueOf(i), it.next());
@ -36,16 +59,18 @@ public class CompositeIteratorTests extends TestCase {
try { try {
it.next(); it.next();
fail(); fail();
} catch (NoSuchElementException e) { }
catch (NoSuchElementException ex) {
// expected // expected
} }
} }
@Test
public void testMultipleIterators() { public void testMultipleIterators() {
CompositeIterator it = new CompositeIterator(); CompositeIterator<String> it = new CompositeIterator<String>();
it.add(Arrays.asList(new String[] { "0", "1" }).iterator()); it.add(Arrays.asList("0", "1").iterator());
it.add(Arrays.asList(new String[] { "2" }).iterator()); it.add(Arrays.asList("2").iterator());
it.add(Arrays.asList(new String[] { "3", "4" }).iterator()); it.add(Arrays.asList("3", "4").iterator());
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
assertTrue(it.hasNext()); assertTrue(it.hasNext());
assertEquals(String.valueOf(i), it.next()); assertEquals(String.valueOf(i), it.next());
@ -54,43 +79,49 @@ public class CompositeIteratorTests extends TestCase {
try { try {
it.next(); it.next();
fail(); fail();
} catch (NoSuchElementException e) { }
catch (NoSuchElementException ex) {
// expected // expected
} }
} }
@Test
public void testInUse() { public void testInUse() {
List list = Arrays.asList(new String[] { "0", "1" }); List<String> list = Arrays.asList("0", "1");
CompositeIterator it = new CompositeIterator(); CompositeIterator<String> it = new CompositeIterator<String>();
it.add(list.iterator()); it.add(list.iterator());
it.hasNext(); it.hasNext();
try { try {
it.add(list.iterator()); it.add(list.iterator());
fail(); fail();
} catch (IllegalStateException e) { }
catch (IllegalStateException ex) {
// expected // expected
} }
it = new CompositeIterator(); it = new CompositeIterator<String>();
it.add(list.iterator()); it.add(list.iterator());
it.next(); it.next();
try { try {
it.add(list.iterator()); it.add(list.iterator());
fail(); fail();
} catch (IllegalStateException e) { }
catch (IllegalStateException ex) {
// expected // expected
} }
} }
@Test
public void testDuplicateIterators() { public void testDuplicateIterators() {
List list = Arrays.asList(new String[] { "0", "1" }); List<String> list = Arrays.asList("0", "1");
Iterator iterator = list.iterator(); Iterator<String> iterator = list.iterator();
CompositeIterator it = new CompositeIterator(); CompositeIterator<String> it = new CompositeIterator<String>();
it.add(iterator); it.add(iterator);
it.add(list.iterator()); it.add(list.iterator());
try { try {
it.add(iterator); it.add(iterator);
fail(); fail();
} catch (IllegalArgumentException e) { }
catch (IllegalArgumentException ex) {
// expected // expected
} }
} }

4
spring-jms/src/main/java/org/springframework/jms/listener/AbstractJmsListeningContainer.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * 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,7 +58,7 @@ import org.springframework.util.ClassUtils;
* @see #doShutdown() * @see #doShutdown()
*/ */
public abstract class AbstractJmsListeningContainer extends JmsDestinationAccessor public abstract class AbstractJmsListeningContainer extends JmsDestinationAccessor
implements SmartLifecycle, BeanNameAware, DisposableBean { implements BeanNameAware, DisposableBean, SmartLifecycle {
private String clientId; private String clientId;

22
spring-web/src/main/java/org/springframework/remoting/httpinvoker/HttpInvokerClientInterceptor.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * 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.
@ -99,10 +99,10 @@ public class HttpInvokerClientInterceptor extends RemoteInvocationBasedAccessor
* Set the HttpInvokerRequestExecutor implementation to use for executing * Set the HttpInvokerRequestExecutor implementation to use for executing
* remote invocations. * remote invocations.
* <p>Default is {@link SimpleHttpInvokerRequestExecutor}. Alternatively, * <p>Default is {@link SimpleHttpInvokerRequestExecutor}. Alternatively,
* consider using {@link CommonsHttpInvokerRequestExecutor} for more * consider using {@link HttpComponentsHttpInvokerRequestExecutor} for more
* sophisticated needs. * sophisticated needs.
* @see SimpleHttpInvokerRequestExecutor * @see SimpleHttpInvokerRequestExecutor
* @see CommonsHttpInvokerRequestExecutor * @see HttpComponentsHttpInvokerRequestExecutor
*/ */
public void setHttpInvokerRequestExecutor(HttpInvokerRequestExecutor httpInvokerRequestExecutor) { public void setHttpInvokerRequestExecutor(HttpInvokerRequestExecutor httpInvokerRequestExecutor) {
this.httpInvokerRequestExecutor = httpInvokerRequestExecutor; this.httpInvokerRequestExecutor = httpInvokerRequestExecutor;
@ -137,7 +137,7 @@ public class HttpInvokerClientInterceptor extends RemoteInvocationBasedAccessor
} }
RemoteInvocation invocation = createRemoteInvocation(methodInvocation); RemoteInvocation invocation = createRemoteInvocation(methodInvocation);
RemoteInvocationResult result = null; RemoteInvocationResult result;
try { try {
result = executeRequest(invocation, methodInvocation); result = executeRequest(invocation, methodInvocation);
} }
@ -200,18 +200,18 @@ public class HttpInvokerClientInterceptor extends RemoteInvocationBasedAccessor
*/ */
protected RemoteAccessException convertHttpInvokerAccessException(Throwable ex) { protected RemoteAccessException convertHttpInvokerAccessException(Throwable ex) {
if (ex instanceof ConnectException) { if (ex instanceof ConnectException) {
throw new RemoteConnectFailureException( return new RemoteConnectFailureException(
"Could not connect to HTTP invoker remote service at [" + getServiceUrl() + "]", ex); "Could not connect to HTTP invoker remote service at [" + getServiceUrl() + "]", ex);
} }
else if (ex instanceof ClassNotFoundException || ex instanceof NoClassDefFoundError ||
if (ex instanceof ClassNotFoundException || ex instanceof NoClassDefFoundError ||
ex instanceof InvalidClassException) { ex instanceof InvalidClassException) {
throw new RemoteAccessException( return new RemoteAccessException(
"Could not deserialize result from HTTP invoker remote service [" + getServiceUrl() + "]", ex); "Could not deserialize result from HTTP invoker remote service [" + getServiceUrl() + "]", ex);
} }
else {
throw new RemoteAccessException( return new RemoteAccessException(
"Could not access HTTP invoker remote service at [" + getServiceUrl() + "]", ex); "Could not access HTTP invoker remote service at [" + getServiceUrl() + "]", ex);
}
} }
} }

10
spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * 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.
@ -321,7 +321,7 @@ public @interface RequestMapping {
* specified header is <i>not</i> supposed to be present in the request. * specified header is <i>not</i> supposed to be present in the request.
* <p>Also supports media type wildcards (*), for headers such as Accept * <p>Also supports media type wildcards (*), for headers such as Accept
* and Content-Type. For instance, * and Content-Type. For instance,
* <pre> * <pre class="code">
* &#064;RequestMapping(value = "/something", headers = "content-type=text/*") * &#064;RequestMapping(value = "/something", headers = "content-type=text/*")
* </pre> * </pre>
* will match requests with a Content-Type of "text/html", "text/plain", etc. * will match requests with a Content-Type of "text/html", "text/plain", etc.
@ -340,7 +340,7 @@ public @interface RequestMapping {
* <p>The format is a single media type or a sequence of media types, * <p>The format is a single media type or a sequence of media types,
* with a request only mapped if the {@code Content-Type} matches one of these media types. * with a request only mapped if the {@code Content-Type} matches one of these media types.
* Examples: * Examples:
* <pre> * <pre class="code">
* consumes = "text/plain" * consumes = "text/plain"
* consumes = {"text/plain", "application/*"} * consumes = {"text/plain", "application/*"}
* </pre> * </pre>
@ -359,7 +359,7 @@ public @interface RequestMapping {
* <p>The format is a single media type or a sequence of media types, * <p>The format is a single media type or a sequence of media types,
* with a request only mapped if the {@code Accept} matches one of these media types. * with a request only mapped if the {@code Accept} matches one of these media types.
* Examples: * Examples:
* <pre> * <pre class="code">
* produces = "text/plain" * produces = "text/plain"
* produces = {"text/plain", "application/*"} * produces = {"text/plain", "application/*"}
* </pre> * </pre>
@ -367,7 +367,7 @@ public @interface RequestMapping {
* all requests with a {@code Accept} other than "text/plain". * all requests with a {@code Accept} other than "text/plain".
* <p><b>Supported at the type level as well as at the method level!</b> * <p><b>Supported at the type level as well as at the method level!</b>
* When used at the type level, all method-level mappings override * When used at the type level, all method-level mappings override
* this consumes restriction. * this produces restriction.
* @see org.springframework.http.MediaType * @see org.springframework.http.MediaType
*/ */
String[] produces() default {}; String[] produces() default {};

10
spring-webmvc/src/test/java/org/springframework/web/servlet/support/AnnotationConfigDispatcherServletInitializerTests.java

@ -214,7 +214,7 @@ public class AnnotationConfigDispatcherServletInitializerTests {
@Override @Override
protected Class<?>[] getServletConfigClasses() { protected Class<?>[] getServletConfigClasses() {
return new Class[]{MyConfiguration.class}; return new Class<?>[] {MyConfiguration.class};
} }
@Override @Override
@ -239,16 +239,12 @@ public class AnnotationConfigDispatcherServletInitializerTests {
} }
private static class MyBean { public static class MyBean {
} }
@Configuration @Configuration
@SuppressWarnings("unused") public static class MyConfiguration {
private static class MyConfiguration {
public MyConfiguration() {
}
@Bean @Bean
public MyBean bean() { public MyBean bean() {

Loading…
Cancel
Save