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() {