jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/MethodUtil.java
author aefimov
Thu, 16 Feb 2017 13:14:39 +0300
changeset 43852 93a527059d8a
permissions -rw-r--r--
8174735: Update JAX-WS RI integration to latest version Reviewed-by: alanb, mchung, lancea Contributed-by: roman.grigoriadi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43852
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     1
/*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     4
 *
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    10
 *
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    15
 * accompanied this code).
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    16
 *
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    20
 *
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    23
 * questions.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    24
 */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    25
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    26
package com.sun.xml.internal.ws.util;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    27
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    28
import java.io.IOException;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    29
import java.io.InputStream;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    30
import java.lang.reflect.InvocationTargetException;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    31
import java.lang.reflect.Method;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    32
import java.lang.reflect.Proxy;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    33
import java.security.AccessController;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    34
import java.security.AllPermission;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    35
import java.security.CodeSource;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    36
import java.security.PermissionCollection;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    37
import java.security.PrivilegedExceptionAction;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    38
import java.security.SecureClassLoader;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    39
import java.util.Arrays;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    40
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    41
/*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    42
 * This copies from sun.reflect.misc.MethodUtil to implement the trampoline
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    43
 * code such that when a Method is invoked, it will be called through
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    44
 * the trampoline that is defined by this MethodUtil class loader.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    45
 */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    46
class Trampoline {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    47
    static {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    48
        if (Trampoline.class.getClassLoader() == null) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    49
            throw new Error(
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    50
                    "Trampoline must not be defined by the bootstrap classloader");
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    51
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    52
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    53
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    54
    private static void ensureInvocableMethod(Method m)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    55
            throws InvocationTargetException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    56
        Class<?> clazz = m.getDeclaringClass();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    57
        if (clazz.equals(AccessController.class) ||
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    58
                clazz.equals(Method.class) ||
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    59
                clazz.getName().startsWith("java.lang.invoke."))
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    60
            throw new InvocationTargetException(
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    61
                    new UnsupportedOperationException("invocation not supported"));
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    62
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    63
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    64
    private static Object invoke(Method m, Object obj, Object[] params)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    65
            throws InvocationTargetException, IllegalAccessException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    66
        ensureInvocableMethod(m);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    67
        return m.invoke(obj, params);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    68
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    69
}
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    70
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    71
/*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    72
 * Create a trampoline class.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    73
 */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    74
public final class MethodUtil extends SecureClassLoader {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    75
    private static final String WS_UTIL_PKG = "com.sun.xml.internal.ws.util.";
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    76
    private static final String TRAMPOLINE = WS_UTIL_PKG + "Trampoline";
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    77
    private static final Method bounce = getTrampoline();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    78
    private static final int DEFAULT_BUFFER_SIZE = 8192;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    79
    private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    80
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    81
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    82
    private MethodUtil() {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    83
        super();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    84
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    85
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    86
    /*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    87
     * Bounce through the trampoline.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    88
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    89
    public static Object invoke(Method m, Object obj, Object[] params)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    90
            throws InvocationTargetException, IllegalAccessException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    91
        try {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    92
            return bounce.invoke(null, m, obj, params);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    93
        } catch (InvocationTargetException ie) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    94
            Throwable t = ie.getCause();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    95
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    96
            if (t instanceof InvocationTargetException) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    97
                throw (InvocationTargetException) t;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    98
            } else if (t instanceof IllegalAccessException) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
    99
                throw (IllegalAccessException) t;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   100
            } else if (t instanceof RuntimeException) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   101
                throw (RuntimeException) t;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   102
            } else if (t instanceof Error) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   103
                throw (Error) t;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   104
            } else {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   105
                throw new Error("Unexpected invocation error", t);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   106
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   107
        } catch (IllegalAccessException iae) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   108
            // this can't happen
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   109
            throw new Error("Unexpected invocation error", iae);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   110
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   111
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   112
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   113
    private static Method getTrampoline() {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   114
        try {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   115
            return AccessController.doPrivileged(
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   116
                    new PrivilegedExceptionAction<Method>() {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   117
                        public Method run() throws Exception {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   118
                            Class<?> t = getTrampolineClass();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   119
                            Method b = t.getDeclaredMethod("invoke",
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   120
                                    Method.class, Object.class, Object[].class);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   121
                            b.setAccessible(true);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   122
                            return b;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   123
                        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   124
                    });
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   125
        } catch (Exception e) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   126
            throw new InternalError("bouncer cannot be found", e);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   127
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   128
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   129
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   130
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   131
    protected synchronized Class<?> loadClass(String name, boolean resolve)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   132
            throws ClassNotFoundException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   133
        // First, check if the class has already been loaded
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   134
        checkPackageAccess(name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   135
        Class<?> c = findLoadedClass(name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   136
        if (c == null) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   137
            try {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   138
                c = findClass(name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   139
            } catch (ClassNotFoundException e) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   140
                // Fall through ...
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   141
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   142
            if (c == null) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   143
                c = getParent().loadClass(name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   144
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   145
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   146
        if (resolve) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   147
            resolveClass(c);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   148
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   149
        return c;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   150
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   151
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   152
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   153
    protected Class<?> findClass(final String name)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   154
            throws ClassNotFoundException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   155
        if (!name.startsWith(WS_UTIL_PKG)) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   156
            throw new ClassNotFoundException(name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   157
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   158
        String path = "/".concat(name.replace('.', '/').concat(".class"));
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   159
        try (InputStream in = MethodUtil.class.getResourceAsStream(path)) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   160
            byte[] b = readAllBytes(in);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   161
            return defineClass(name, b);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   162
        } catch (IOException e) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   163
            throw new ClassNotFoundException(name, e);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   164
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   165
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   166
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   167
    /**
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   168
     * JDK9 {@link InputStream#readAllBytes()} substitution.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   169
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   170
    private byte[] readAllBytes(InputStream in) throws IOException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   171
        byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   172
        int capacity = buf.length;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   173
        int nread = 0;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   174
        int n;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   175
        for (; ; ) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   176
            // read to EOF which may read more or less than initial buffer size
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   177
            while ((n = in.read(buf, nread, capacity - nread)) > 0)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   178
                nread += n;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   179
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   180
            // if the last call to read returned -1, then we're done
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   181
            if (n < 0)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   182
                break;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   183
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   184
            // need to allocate a larger buffer
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   185
            if (capacity <= MAX_BUFFER_SIZE - capacity) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   186
                capacity = capacity << 1;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   187
            } else {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   188
                if (capacity == MAX_BUFFER_SIZE)
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   189
                    throw new OutOfMemoryError("Required array size too large");
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   190
                capacity = MAX_BUFFER_SIZE;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   191
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   192
            buf = Arrays.copyOf(buf, capacity);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   193
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   194
        return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   195
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   196
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   197
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   198
    /*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   199
     * Define the proxy classes
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   200
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   201
    private Class<?> defineClass(String name, byte[] b) throws IOException {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   202
        CodeSource cs = new CodeSource(null, (java.security.cert.Certificate[]) null);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   203
        if (!name.equals(TRAMPOLINE)) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   204
            throw new IOException("MethodUtil: bad name " + name);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   205
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   206
        return defineClass(name, b, 0, b.length, cs);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   207
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   208
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   209
    protected PermissionCollection getPermissions(CodeSource codesource) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   210
        PermissionCollection perms = super.getPermissions(codesource);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   211
        perms.add(new AllPermission());
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   212
        return perms;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   213
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   214
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   215
    private static Class<?> getTrampolineClass() {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   216
        try {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   217
            return Class.forName(TRAMPOLINE, true, new MethodUtil());
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   218
        } catch (ClassNotFoundException e) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   219
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   220
        return null;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   221
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   222
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   223
    /**
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   224
     * Checks package access on the given classname.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   225
     * This method is typically called when the Class instance is not
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   226
     * available and the caller attempts to load a class on behalf
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   227
     * the true caller (application).
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   228
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   229
    private static void checkPackageAccess(String name) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   230
        SecurityManager s = System.getSecurityManager();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   231
        if (s != null) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   232
            String cname = name.replace('/', '.');
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   233
            if (cname.startsWith("[")) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   234
                int b = cname.lastIndexOf('[') + 2;
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   235
                if (b > 1 && b < cname.length()) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   236
                    cname = cname.substring(b);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   237
                }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   238
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   239
            int i = cname.lastIndexOf('.');
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   240
            if (i != -1) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   241
                s.checkPackageAccess(cname.substring(0, i));
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   242
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   243
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   244
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   245
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   246
    /**
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   247
     * Checks package access on the given class.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   248
     * <p>
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   249
     * If it is a {@link Proxy#isProxyClass(Class)} that implements
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   250
     * a non-public interface (i.e. may be in a non-restricted package),
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   251
     * also check the package access on the proxy interfaces.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   252
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   253
    private static void checkPackageAccess(Class<?> clazz) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   254
        checkPackageAccess(clazz.getName());
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   255
        if (isNonPublicProxyClass(clazz)) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   256
            checkProxyPackageAccess(clazz);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   257
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   258
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   259
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   260
    // Note that bytecode instrumentation tools may exclude 'sun.*'
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   261
    // classes but not generated proxy classes and so keep it in com.sun.*
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   262
    private static final String PROXY_PACKAGE = "com.sun.proxy";
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   263
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   264
    /**
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   265
     * Test if the given class is a proxy class that implements
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   266
     * non-public interface.  Such proxy class may be in a non-restricted
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   267
     * package that bypasses checkPackageAccess.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   268
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   269
    private static boolean isNonPublicProxyClass(Class<?> cls) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   270
        String name = cls.getName();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   271
        int i = name.lastIndexOf('.');
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   272
        String pkg = (i != -1) ? name.substring(0, i) : "";
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   273
        return Proxy.isProxyClass(cls) && !pkg.startsWith(PROXY_PACKAGE);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   274
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   275
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   276
    /**
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   277
     * Check package access on the proxy interfaces that the given proxy class
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   278
     * implements.
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   279
     *
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   280
     * @param clazz Proxy class object
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   281
     */
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   282
    private static void checkProxyPackageAccess(Class<?> clazz) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   283
        SecurityManager s = System.getSecurityManager();
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   284
        if (s != null) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   285
            // check proxy interfaces if the given class is a proxy class
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   286
            if (Proxy.isProxyClass(clazz)) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   287
                for (Class<?> intf : clazz.getInterfaces()) {
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   288
                    checkPackageAccess(intf);
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   289
                }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   290
            }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   291
        }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   292
    }
93a527059d8a 8174735: Update JAX-WS RI integration to latest version
aefimov
parents:
diff changeset
   293
}