INT-3626: More Sonar Fixes

JIRA: https://jira.spring.io/browse/INT-3626

Remove Direct Array Usages.

With the increased use of java configuration and DSL, it
is no longer safe to directly use array arguments.

(Except in simple wrapper objects).

Avoid (or mark //NOSONAR) catch Throwable.

Remove unused field.
This commit is contained in:
Gary Russell
2015-02-11 10:34:29 -05:00
parent bc509da062
commit 632740d2cf
27 changed files with 225 additions and 102 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
package org.springframework.integration.amqp.config;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Executor;
@@ -239,7 +240,7 @@ public class AmqpChannelFactoryBean extends AbstractFactoryBean<AbstractAmqpChan
}
public void setAdviceChain(Advice[] adviceChain) {
this.adviceChain = adviceChain;
this.adviceChain = Arrays.copyOf(adviceChain, adviceChain.length);
}
public void setAutoStartup(boolean autoStartup) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2010 the original author or authors.
* Copyright 2002-2015 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
@@ -31,10 +31,11 @@ public class SequenceNumberComparator implements Comparator<Message<?>> {
* doesn't then the numbered message comes first, or finally of neither has a sequence number then they are equal in
* rank.
*/
@Override
public int compare(Message<?> o1, Message<?> o2) {
Integer sequenceNumber1 = new IntegrationMessageHeaderAccessor(o1).getSequenceNumber();
Integer sequenceNumber2 = new IntegrationMessageHeaderAccessor(o2).getSequenceNumber();
if (sequenceNumber1 == sequenceNumber2) {
if (sequenceNumber1 == sequenceNumber2) {//NOSONAR - early exit optimization
return 0;
}
if (sequenceNumber1 == null) {

View File

@@ -142,7 +142,7 @@ public class MessagePublishingInterceptor implements MethodInterceptor, BeanFact
context.setVariable(PublisherMetadataSource.RETURN_VALUE_VARIABLE_NAME, returnValue);
return returnValue;
}
catch (Throwable t) {
catch (Throwable t) {//NOSONAR - rethrown below
context.setVariable(PublisherMetadataSource.EXCEPTION_VARIABLE_NAME, t);
throw t;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -396,7 +396,7 @@ public abstract class AbstractMessageChannel extends IntegrationObjectSupport
try {
interceptor.afterSendCompletion(message, channel, sent, ex);
}
catch (Throwable ex2) {
catch (Exception ex2) {
logger.error("Exception from afterSendCompletion in " + interceptor, ex2);
}
}
@@ -443,7 +443,7 @@ public abstract class AbstractMessageChannel extends IntegrationObjectSupport
try {
interceptor.afterReceiveCompletion(message, channel, ex);
}
catch (Throwable ex2) {
catch (Exception ex2) {
logger.error("Exception from afterReceiveCompletion in " + interceptor, ex2);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2009 the original author or authors.
* Copyright 2002-2015 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.
@@ -67,6 +67,7 @@ public class MessagePublishingErrorHandler implements ErrorHandler, BeanFactoryA
this.sendTimeout = sendTimeout;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) {
Assert.notNull(beanFactory, "beanFactory must not be null");
if (this.channelResolver == null) {
@@ -74,6 +75,7 @@ public class MessagePublishingErrorHandler implements ErrorHandler, BeanFactoryA
}
}
@Override
public final void handleError(Throwable t) {
MessageChannel errorChannel = this.resolveErrorChannel(t);
boolean sent = false;
@@ -86,10 +88,14 @@ public class MessagePublishingErrorHandler implements ErrorHandler, BeanFactoryA
sent = errorChannel.send(new ErrorMessage(t));
}
}
catch (Throwable errorDeliveryError) { // message will be logged only
catch (Throwable errorDeliveryError) {//NOSONAR
// message will be logged only
if (logger.isWarnEnabled()) {
logger.warn("Error message was not delivered.", errorDeliveryError);
}
if (errorDeliveryError instanceof Error) {
throw ((Error) errorDeliveryError);
}
}
}
if (!sent && logger.isErrorEnabled()) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,6 +16,8 @@
package org.springframework.integration.channel.interceptor;
import java.util.Arrays;
import org.springframework.core.Ordered;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.util.Assert;
@@ -23,6 +25,7 @@ import org.springframework.util.Assert;
/**
* @author Oleg Zhurakousky
* @author Mark Fisher
* @author Gary Russell
* @since 2.0
*/
public class GlobalChannelInterceptorWrapper implements Ordered {
@@ -59,7 +62,7 @@ public class GlobalChannelInterceptorWrapper implements Ordered {
}
public void setPatterns(String[] patterns) {
this.patterns = patterns;
this.patterns = Arrays.copyOf(patterns, patterns.length);
}
public String[] getPatterns() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -115,7 +115,7 @@ public class MethodInvokingMessageSource extends AbstractMessageSource<Object>
}
return ReflectionUtils.invokeMethod(this.method, this.object);
}
catch (Throwable e) {
catch (Exception e) {
throw new MessagingException("Failed to invoke method", e);
}
}

View File

@@ -29,11 +29,6 @@ import java.util.concurrent.Future;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import reactor.core.Environment;
import reactor.core.composable.Promise;
import reactor.core.composable.spec.Promises;
import reactor.function.Functions;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.SimpleTypeConverter;
@@ -68,6 +63,11 @@ import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import reactor.core.Environment;
import reactor.core.composable.Promise;
import reactor.core.composable.spec.Promises;
import reactor.function.Functions;
/**
* Generates a proxy for the provided service interface to enable interaction
* with messaging components without application code being aware of them allowing
@@ -373,7 +373,7 @@ public class GatewayProxyFactoryBean extends AbstractEndpoint
try {
return this.invokeGatewayMethod(invocation);
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - ok to catch, rethrown below
this.rethrowExceptionCauseIfPossible(e, invocation.getMethod());
return null; // preceding call should always throw something
}
@@ -638,7 +638,10 @@ public class GatewayProxyFactoryBean extends AbstractEndpoint
try {
return doInvoke(this.invocation);
}
catch (Throwable t) {
catch (Error e) {//NOSONAR
throw e;
}
catch (Throwable t) {//NOSONAR
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013 the original author or authors.
* Copyright 2013-2015 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.
@@ -34,9 +34,9 @@ public final class MethodArgsHolder {
private final Object[] args;
public MethodArgsHolder(Method method, Object[] args) {
public MethodArgsHolder(Method method, Object[] args) {//NOSONAR - direct storage
this.method = method;
this.args = args;
this.args = args;//NOSONAR - direct storage
}
public final Method getMethod() {
@@ -44,7 +44,7 @@ public final class MethodArgsHolder {
}
public final Object[] getArgs() {
return args;
return args;//NOSONAR - direct access
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -67,7 +67,7 @@ public abstract class AbstractMessageHandler extends IntegrationObjectSupport im
@Override
public final void handleMessage(Message<?> message) {
Assert.notNull(message, "Message must not be null");
Assert.notNull(message.getPayload(), "Message payload must not be null");
Assert.notNull(message.getPayload(), "Message payload must not be null");//NOSONAR - false positive
if (this.logger.isDebugEnabled()) {
this.logger.debug(this + " received message: " + message);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -73,10 +73,10 @@ public abstract class AbstractRequestHandlerAdvice extends IntegrationObjectSupp
try {
return invocation.proceed();
}
catch (Exception e) {
catch (Exception e) {//NOSONAR - catch necessary so we can wrap Errors
throw e;
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - ok to catch; unwrapped and rethrown below
throw new ThrowableHolderException(e);
}
}
@@ -97,10 +97,10 @@ public abstract class AbstractRequestHandlerAdvice extends IntegrationObjectSupp
" so please raise an issue if you see this exception");
}
}
catch (Exception e) {
catch (Exception e) {//NOSONAR - catch necessary so we can wrap Errors
throw e;
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - ok to catch; unwrapped and rethrown below
throw new ThrowableHolderException(e);
}
}
@@ -132,10 +132,9 @@ public abstract class AbstractRequestHandlerAdvice extends IntegrationObjectSupp
*/
protected Exception unwrapExceptionIfNecessary(Exception e) {
Exception actualException = e;
if (e instanceof ThrowableHolderException) {
if (e.getCause() instanceof Exception) {
actualException = (Exception) e.getCause();
}
if (e instanceof ThrowableHolderException
&& e.getCause() instanceof Exception) {
actualException = (Exception) e.getCause();
}
return actualException;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2010 the original author or authors.
* Copyright 2002-2015 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.
@@ -26,9 +26,10 @@ import org.springframework.util.ErrorHandler;
* A {@link TaskExecutor} implementation that wraps an existing Executor
* instance in order to catch any exceptions. If an exception is thrown, it
* will be handled by the provided {@link ErrorHandler}.
*
*
* @author Jonas Partner
* @author Mark Fisher
* @author Gary Russell
*/
public class ErrorHandlingTaskExecutor implements TaskExecutor {
@@ -45,13 +46,15 @@ public class ErrorHandlingTaskExecutor implements TaskExecutor {
}
@Override
public void execute(final Runnable task) {
this.executor.execute(new Runnable() {
@Override
public void run() {
try {
task.run();
}
catch (Throwable t) {
catch (Throwable t) {//NOSONAR
errorHandler.handleError(t);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -36,6 +36,7 @@ import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.integration.annotation.Gateway;
import org.springframework.integration.annotation.GatewayHeader;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
@@ -87,6 +88,34 @@ public class AsyncGatewayTests {
assertEquals("foobar", ((Message<?>) result).getPayload());
}
@Test
public void futureWithError() throws Exception {
final Error error = new Error("error");
DirectChannel channel = new DirectChannel() {
@Override
protected boolean doSend(Message<?> message, long timeout) {
throw error;
}
};
GatewayProxyFactoryBean proxyFactory = new GatewayProxyFactoryBean();
proxyFactory.setDefaultRequestChannel(channel);
proxyFactory.setServiceInterface(TestEchoService.class);
proxyFactory.setBeanName("testGateway");
proxyFactory.setBeanFactory(mock(BeanFactory.class));
proxyFactory.afterPropertiesSet();
TestEchoService service = (TestEchoService) proxyFactory.getObject();
Future<Message<?>> f = service.returnMessage("foo");
try {
f.get(1000, TimeUnit.MILLISECONDS);
fail("Expected Exception");
}
catch (ExecutionException e) {
assertEquals(error, e.getCause());
}
}
@Test
public void listenableFutureWithMessageReturned() throws Exception {
QueueChannel requestChannel = new QueueChannel();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2015 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.
@@ -50,7 +50,8 @@ public class UploadedMultipartFile implements MultipartFile {
private final String originalFilename;
public UploadedMultipartFile(File file, long size, String contentType, String formParameterName, String originalFilename) {
public UploadedMultipartFile(File file, long size, String contentType, String formParameterName,
String originalFilename) {
Assert.notNull(file, "file must not be null");
Assert.hasText(contentType, "contentType is required");
Assert.hasText(formParameterName, "formParameterName is required");
@@ -63,12 +64,13 @@ public class UploadedMultipartFile implements MultipartFile {
this.originalFilename = originalFilename;
}
public UploadedMultipartFile(byte[] bytes, String contentType, String formParameterName, String originalFilename) {
public UploadedMultipartFile(byte[] bytes, String contentType, String formParameterName,//NOSONAR - direct storage
String originalFilename) {
Assert.notNull(bytes, "bytes must not be null");
Assert.hasText(contentType, "contentType is required");
Assert.hasText(formParameterName, "formParameterName is required");
Assert.hasText(originalFilename, "originalFilename is required");
this.bytes = bytes;
this.bytes = bytes;//NOSONAR - direct storage
this.size = bytes.length;
this.file = null;
this.contentType = contentType;
@@ -77,21 +79,25 @@ public class UploadedMultipartFile implements MultipartFile {
}
@Override
public String getName() {
return this.formParameterName;
}
@Override
public byte[] getBytes() throws IOException {
if (this.bytes != null) {
return this.bytes;
return this.bytes;//NOSONAR - direct access
}
return FileCopyUtils.copyToByteArray(this.file);
}
@Override
public String getContentType() {
return this.contentType;
}
@Override
public InputStream getInputStream() throws IOException {
if (this.bytes != null) {
return new ByteArrayInputStream(this.bytes);
@@ -99,18 +105,22 @@ public class UploadedMultipartFile implements MultipartFile {
return new BufferedInputStream(new FileInputStream(this.file));
}
@Override
public String getOriginalFilename() {
return this.originalFilename;
}
@Override
public long getSize() {
return this.size;
}
@Override
public boolean isEmpty() {
return this.size == 0;
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
if (this.bytes != null) {
FileCopyUtils.copy(this.bytes, dest);

View File

@@ -293,6 +293,10 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
private volatile String userDefinedHeaderPrefix = "X-";
private volatile boolean isDefaultOutboundMapper;
private volatile boolean isDefaultInboundMapper;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
@@ -306,8 +310,15 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
* {@link DefaultHttpHeaderMapper#setUserDefinedHeaderPrefix(String)}. The default is 'X-'.
* @param outboundHeaderNames The outbound header names.
*/
public void setOutboundHeaderNames(String[] outboundHeaderNames) {
this.outboundHeaderNames = (outboundHeaderNames != null) ? outboundHeaderNames : new String[0];
public void setOutboundHeaderNames(String[] outboundHeaderNames) {//NOSONAR - false positive
if (HTTP_REQUEST_HEADER_NAMES == outboundHeaderNames) {
this.isDefaultOutboundMapper = true;
}
else if (HTTP_RESPONSE_HEADER_NAMES == outboundHeaderNames) {
this.isDefaultInboundMapper = true;
}
this.outboundHeaderNames = outboundHeaderNames != null ?
Arrays.copyOf(outboundHeaderNames, outboundHeaderNames.length) : new String[0];
this.outboundHeaderNamesLower = new String[this.outboundHeaderNames.length];
for (int i = 0; i < this.outboundHeaderNames.length; i++) {
if (HTTP_REQUEST_HEADER_NAME_PATTERN.equals(this.outboundHeaderNames[i])
@@ -333,8 +344,9 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
* {@link DefaultHttpHeaderMapper#setUserDefinedHeaderPrefix(String)}. The default is 'X-'.
* @param inboundHeaderNames The inbound header names.
*/
public void setInboundHeaderNames(String[] inboundHeaderNames) {
this.inboundHeaderNames = (inboundHeaderNames != null) ? inboundHeaderNames : new String[0];
public void setInboundHeaderNames(String[] inboundHeaderNames) {//NOSONAR - false positive
this.inboundHeaderNames = inboundHeaderNames != null ?
Arrays.copyOf(inboundHeaderNames, inboundHeaderNames.length) : new String[0];
this.inboundHeaderNamesLower = new String[this.inboundHeaderNames.length];
for (int i = 0; i < this.inboundHeaderNames.length; i++) {
if (HTTP_REQUEST_HEADER_NAME_PATTERN.equals(this.inboundHeaderNames[i])
@@ -355,7 +367,8 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
public void setExcludedOutboundStandardRequestHeaderNames(String[] excludedOutboundStandardRequestHeaderNames) {
Assert.notNull(excludedOutboundStandardRequestHeaderNames,
"'excludedOutboundStandardRequestHeaderNames' must not be null");
this.excludedOutboundStandardRequestHeaderNames = excludedOutboundStandardRequestHeaderNames;
this.excludedOutboundStandardRequestHeaderNames = Arrays.copyOf(excludedOutboundStandardRequestHeaderNames,
excludedOutboundStandardRequestHeaderNames.length);
}
/**
@@ -366,7 +379,8 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
public void setExcludedInboundStandardResponseHeaderNames(String[] excludedInboundStandardResponseHeaderNames) {
Assert.notNull(excludedInboundStandardResponseHeaderNames,
"'excludedInboundStandardResponseHeaderNames' must not be null");
this.excludedInboundStandardResponseHeaderNames = excludedInboundStandardResponseHeaderNames;
this.excludedInboundStandardResponseHeaderNames = Arrays.copyOf(excludedInboundStandardResponseHeaderNames,
excludedInboundStandardResponseHeaderNames.length);
}
/**
@@ -476,34 +490,34 @@ public class DefaultHttpHeaderMapper implements HeaderMapper<HttpHeaders>, BeanF
}
private boolean shouldMapOutboundHeader(String headerName) {
String[] outboundHeaderNames = this.outboundHeaderNamesLower;
String[] outboundHeaderNamesLower = this.outboundHeaderNamesLower;
if (this.outboundHeaderNames == HTTP_RESPONSE_HEADER_NAMES) { // a default inbound mapper
if (this.isDefaultInboundMapper) {
/*
* When using the default response header name list, suppress the
* mapping of exclusions for specific headers.
*/
if (this.containsElementIgnoreCase(this.excludedInboundStandardResponseHeaderNames, headerName)) {
if (logger.isDebugEnabled()) {
logger.debug(MessageFormat.format("headerName=[{0}] WILL NOT be mapped", headerName));
logger.debug(MessageFormat.format("headerName=[{0}] WILL NOT be mapped (excluded)", headerName));
}
return false;
}
}
else if (this.outboundHeaderNames == HTTP_REQUEST_HEADER_NAMES) { // a default outbound mapper
outboundHeaderNames = this.outboundHeaderNamesLowerWithContentType;
else if (this.isDefaultOutboundMapper) {
outboundHeaderNamesLower = this.outboundHeaderNamesLowerWithContentType;
/*
* When using the default request header name list, suppress the
* mapping of exclusions for specific headers.
*/
if (this.containsElementIgnoreCase(this.excludedOutboundStandardRequestHeaderNames, headerName)) {
if (logger.isDebugEnabled()) {
logger.debug(MessageFormat.format("headerName=[{0}] WILL NOT be mapped", headerName));
logger.debug(MessageFormat.format("headerName=[{0}] WILL NOT be mapped (excluded)", headerName));
}
return false;
}
}
return this.shouldMapHeader(headerName, outboundHeaderNames);
return this.shouldMapHeader(headerName, outboundHeaderNamesLower);
}
private boolean shouldMapInboundHeader(String headerName) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2010 the original author or authors.
* Copyright 2002-2015 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.
@@ -15,6 +15,8 @@
*/
package org.springframework.integration.ip.tcp.connection;
import java.util.Arrays;
/**
* @author Gary Russell
* @since 2.0
@@ -25,11 +27,11 @@ public class TcpConnectionInterceptorFactoryChain {
private TcpConnectionInterceptorFactory[] interceptorFactories;
public TcpConnectionInterceptorFactory[] getInterceptorFactories() {
return interceptorFactories;
return interceptorFactories;//NOSONAR
}
public void setInterceptors(TcpConnectionInterceptorFactory[] interceptorFactories) {
this.interceptorFactories = interceptorFactories;
this.interceptorFactories = Arrays.copyOf(interceptorFactories, interceptorFactories.length);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -159,7 +159,7 @@ public class TcpNioSSLConnection extends TcpNioConnection {
}
switch (result.getHandshakeStatus()) {
case FINISHED:
resumeWriterIfNeeded();
resumeWriterIfNeeded();//NOSONAR - fall-through inteded
// switch fall-through intended
case NOT_HANDSHAKING:
case NEED_UNWRAP:

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2014-2015 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.
@@ -34,14 +34,15 @@ public class TcpDeserializationExceptionEvent extends IpIntegrationEvent {
private final int offset;
public TcpDeserializationExceptionEvent(Object source, Throwable cause, byte[] buffer, int offset) {
public TcpDeserializationExceptionEvent(Object source, Throwable cause, byte[] buffer,//NOSONAR - direct storage
int offset) {
super(source, cause);
this.buffer = buffer;
this.buffer = buffer;//NOSONAR - direct storage
this.offset = offset;
}
public byte[] getBuffer() {
return buffer;
return buffer;//NOSONAR - direct access
}
public int getOffset() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2001-2013 the original author or authors.
* Copyright 2001-2015 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.
@@ -75,8 +75,6 @@ public class UnicastSendingMessageHandler extends
private volatile Map<String, CountDownLatch> ackControl = Collections
.synchronizedMap(new HashMap<String, CountDownLatch>());
private volatile Exception fatalException;
private volatile int soReceiveBufferSize = -1;
private volatile String localAddress;
@@ -224,9 +222,6 @@ public class UnicastSendingMessageHandler extends
try {
DatagramPacket packet;
if (this.waitForAck) {
if (this.fatalException != null) {
throw new MessagingException(message, "Acknowledgment failure", fatalException);
}
countdownLatch = new CountDownLatch(ackCounter);
this.ackControl.put(messageId, countdownLatch);
}
@@ -402,10 +397,6 @@ public class UnicastSendingMessageHandler extends
* (bind) error occurred, without bouncing the JVM.
*/
public void restartAckThread() {
if (fatalException == null) {
return;
}
this.fatalException = null;
this.taskExecutor.execute(this);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2009-2014 the original author or authors.
* Copyright 2009-2015 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
@@ -31,6 +31,7 @@ import org.springframework.util.StopWatch;
*
* @author Dave Syer
* @author Helena Edelson
* @author Gary Russell
* @since 2.0
*/
@ManagedResource
@@ -45,7 +46,7 @@ public class DirectChannelMetrics implements MethodInterceptor, MessageChannelMe
public static final int DEFAULT_MOVING_AVERAGE_WINDOW = 10;
private ExponentialMovingAverage sendDuration = new ExponentialMovingAverage(
private final ExponentialMovingAverage sendDuration = new ExponentialMovingAverage(
DEFAULT_MOVING_AVERAGE_WINDOW);
private final ExponentialMovingAverageRate sendErrorRate = new ExponentialMovingAverageRate(
@@ -86,6 +87,7 @@ public class DirectChannelMetrics implements MethodInterceptor, MessageChannelMe
return name;
}
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String method = invocation.getMethod().getName();
MessageChannel channel = (MessageChannel) invocation.getThis();
@@ -125,7 +127,7 @@ public class DirectChannelMetrics implements MethodInterceptor, MessageChannelMe
}
return result;
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - rethrown below
sendSuccessRatio.failure();
sendErrorCount.incrementAndGet();
sendErrorRate.increment();
@@ -138,6 +140,7 @@ public class DirectChannelMetrics implements MethodInterceptor, MessageChannelMe
}
}
@Override
public synchronized void reset() {
sendDuration.reset();
sendErrorRate.reset();
@@ -147,62 +150,77 @@ public class DirectChannelMetrics implements MethodInterceptor, MessageChannelMe
sendErrorCount.set(0);
}
@Override
public int getSendCount() {
return (int) sendCount.get();
}
@Override
public long getSendCountLong() {
return sendCount.get();
}
@Override
public int getSendErrorCount() {
return (int) sendErrorCount.get();
}
@Override
public long getSendErrorCountLong() {
return sendErrorCount.get();
}
@Override
public double getTimeSinceLastSend() {
return sendRate.getTimeSinceLastMeasurement();
}
@Override
public double getMeanSendRate() {
return sendRate.getMean();
}
@Override
public double getMeanErrorRate() {
return sendErrorRate.getMean();
}
@Override
public double getMeanErrorRatio() {
return 1 - sendSuccessRatio.getMean();
}
@Override
public double getMeanSendDuration() {
return sendDuration.getMean();
}
@Override
public double getMinSendDuration() {
return sendDuration.getMin();
}
@Override
public double getMaxSendDuration() {
return sendDuration.getMax();
}
@Override
public double getStandardDeviationSendDuration() {
return sendDuration.getStandardDeviation();
}
@Override
public Statistics getSendDuration() {
return sendDuration.getStatistics();
}
@Override
public Statistics getSendRate() {
return sendRate.getStatistics();
}
@Override
public Statistics getErrorRate() {
return sendErrorRate.getStatistics();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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
@@ -14,6 +14,7 @@
package org.springframework.integration.monitor;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -210,7 +211,7 @@ public class IntegrationMBeanExporter extends MBeanExporter implements BeanPostP
public void setComponentNamePatterns(String[] componentNamePatterns) {
Assert.notEmpty(componentNamePatterns, "componentNamePatterns must not be empty");
this.componentNamePatterns = componentNamePatterns;
this.componentNamePatterns = Arrays.copyOf(componentNamePatterns, componentNamePatterns.length);
}
@Override

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -27,6 +27,7 @@ import org.springframework.messaging.MessageChannel;
/**
* @author Dave Syer
* @author Gary Russell
* @since 2.0
*/
public class PollableChannelMetrics extends DirectChannelMetrics {
@@ -59,12 +60,13 @@ public class PollableChannelMetrics extends DirectChannelMetrics {
}
return object;
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - rethrown below
this.receiveErrorCount.incrementAndGet();
throw e;
}
}
@Override
@ManagedOperation
public synchronized void reset() {
super.reset();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -64,6 +64,7 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@@ -72,6 +73,7 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
this.source = source;
}
@Override
public String getSource() {
return this.source;
}
@@ -80,6 +82,7 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
return this.handler;
}
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
String method = invocation.getMethod().getName();
if ("handleMessage".equals(method)) {
@@ -109,7 +112,7 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
timer.stop();
this.duration.append(timer.getTotalTimeMillis());
}
catch (Throwable e) {
catch (Throwable e) {//NOSONAR - rethrown below
this.errorCount.incrementAndGet();
throw e;
}
@@ -118,12 +121,14 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
}
}
@Override
public synchronized void reset() {
this.duration.reset();
this.errorCount.set(0);
this.handleCount.set(0);
}
@Override
public long getHandleCountLong() {
if (logger.isTraceEnabled()) {
logger.trace("Getting Handle Count:" + this);
@@ -131,42 +136,52 @@ public class SimpleMessageHandlerMetrics implements MethodInterceptor, MessageHa
return this.handleCount.get();
}
@Override
public int getHandleCount() {
return (int) getHandleCountLong();
}
@Override
public int getErrorCount() {
return (int) this.errorCount.get();
}
@Override
public long getErrorCountLong() {
return this.errorCount.get();
}
@Override
public double getMeanDuration() {
return this.duration.getMean();
}
@Override
public double getMinDuration() {
return this.duration.getMin();
}
@Override
public double getMaxDuration() {
return this.duration.getMax();
}
@Override
public double getStandardDeviationDuration() {
return this.duration.getStandardDeviation();
}
@Override
public int getActiveCount() {
return (int) this.activeCount.get();
}
@Override
public long getActiveCountLong() {
return this.activeCount.get();
}
@Override
public Statistics getDuration() {
return this.duration.getStatistics();
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.
@@ -15,6 +15,7 @@
*/
package org.springframework.integration.mqtt.core;
import java.util.Arrays;
import java.util.Properties;
import javax.net.SocketFactory;
@@ -104,7 +105,7 @@ public class DefaultMqttPahoClientFactory implements MqttPahoClientFactory {
* @since 4.1
*/
public void setServerURIs(String[] serverURIs) {
this.serverURIs = serverURIs;
this.serverURIs = Arrays.copyOf(serverURIs, serverURIs.length);
}
@Override
@@ -162,9 +163,9 @@ public class DefaultMqttPahoClientFactory implements MqttPahoClientFactory {
private final boolean retained;
public Will(String topic, byte[] payload, int qos, boolean retained) {
public Will(String topic, byte[] payload, int qos, boolean retained) {//NOSONAR
this.topic = topic;
this.payload = payload;
this.payload = payload;//NOSONAR
this.qos = qos;
this.retained = retained;
}
@@ -174,7 +175,7 @@ public class DefaultMqttPahoClientFactory implements MqttPahoClientFactory {
}
protected byte[] getPayload() {
return payload;
return payload;//NOSONAR
}
protected int getQos() {

View File

@@ -123,16 +123,20 @@ public abstract class IntegrationWebSocketContainer implements DisposableBean {
@Override
public void destroy() throws Exception {
// Notify sessions to stop flushing messages
for (WebSocketSession session : this.sessions.values()) {
try {
session.close(CloseStatus.GOING_AWAY);
}
catch (Throwable t) {
logger.error("Failed to close session id '" + session.getId() + "': " + t.getMessage());
try {
// Notify sessions to stop flushing messages
for (WebSocketSession session : this.sessions.values()) {
try {
session.close(CloseStatus.GOING_AWAY);
}
catch (Exception e) {
logger.error("Failed to close session id '" + session.getId() + "': " + e.getMessage());
}
}
}
this.sessions.clear();
finally {
this.sessions.clear();
}
}
/**

View File

@@ -1,5 +1,22 @@
/*
* Copyright 2014-2015 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.integration.websocket;
import java.util.Arrays;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -23,6 +40,7 @@ import org.springframework.web.socket.sockjs.transport.TransportHandler;
* implementation of this class.
*
* @author Artem Bilan
* @author Gary Russell
* @since 4.1
*/
public class ServerWebSocketContainer extends IntegrationWebSocketContainer implements WebSocketConfigurer {
@@ -45,7 +63,7 @@ public class ServerWebSocketContainer extends IntegrationWebSocketContainer impl
}
public ServerWebSocketContainer setInterceptors(HandshakeInterceptor[] interceptors) {
this.interceptors = interceptors;
this.interceptors = Arrays.copyOf(interceptors, interceptors.length);
return this;
}

View File

@@ -17,6 +17,7 @@
package org.springframework.integration.xml.transformer;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Map.Entry;
@@ -181,7 +182,7 @@ public class XsltPayloadTransformer extends AbstractXmlTransformer implements Be
}
public void setXsltParamHeaders(String[] xsltParamHeaders) {
this.xsltParamHeaders = xsltParamHeaders;
this.xsltParamHeaders = Arrays.copyOf(xsltParamHeaders, xsltParamHeaders.length);
}
@Override