Author: veithen
Date: Fri Jul 3 20:41:45 2015
New Revision: 1689086
URL: http://svn.apache.org/r1689086
Log:
AXIS-2909: Fix a concurrency issue that can be easily reproduced with Java 8.
Modified:
axis/axis1/java/trunk/axis-rt-core/src/main/java/org/apache/axis/description/JavaServiceDesc.java
Modified:
axis/axis1/java/trunk/axis-rt-core/src/main/java/org/apache/axis/description/JavaServiceDesc.java
URL:
http://svn.apache.org/viewvc/axis/axis1/java/trunk/axis-rt-core/src/main/java/org/apache/axis/description/JavaServiceDesc.java?rev=1689086&r1=1689085&r2=1689086&view=diff
==============================================================================
---
axis/axis1/java/trunk/axis-rt-core/src/main/java/org/apache/axis/description/JavaServiceDesc.java
(original)
+++
axis/axis1/java/trunk/axis-rt-core/src/main/java/org/apache/axis/description/JavaServiceDesc.java
Fri Jul 3 20:41:45 2015
@@ -36,12 +36,13 @@ import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import javax.xml.rpc.holders.Holder;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
@@ -520,11 +521,15 @@ public class JavaServiceDesc implements
getSyncedOperationsForName(implClass,
((OperationDesc)overloads.get(0)).getName());
+ // Convert to array before sorting to avoid concurrency issues
+ OperationDesc[] array = (OperationDesc[])overloads.toArray(
+ new OperationDesc[overloads.size()]);
+
// Sort the overloads by number of arguments - prevents us calling
methods
// with more parameters than supplied in the request (with missing
parameters
// defaulted to null) when a perfectly good method exists with exactly
the
// supplied parameters.
- Collections.sort(overloads,
+ Arrays.sort(array,
new Comparator() {
public int compare(Object o1, Object o2)
{
@@ -535,8 +540,7 @@ public class JavaServiceDesc implements
}
});
- OperationDesc [] array = new OperationDesc [overloads.size()];
- return (OperationDesc[])overloads.toArray(array);
+ return array;
}
private synchronized void initQNameMap() {