1/*
2 * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package jdk.internal.misc;
27
28import java.io.ObjectInputFilter;
29import java.lang.module.ModuleDescriptor;
30import java.util.ResourceBundle;
31import java.util.jar.JarFile;
32import java.io.Console;
33import java.io.FileDescriptor;
34import java.io.FilePermission;
35import java.io.ObjectInputStream;
36import java.io.RandomAccessFile;
37import java.security.ProtectionDomain;
38import java.security.AccessController;
39
40/** A repository of "shared secrets", which are a mechanism for
41    calling implementation-private methods in another package without
42    using reflection. A package-private class implements a public
43    interface and provides the ability to call package-private methods
44    within that package; the object implementing that interface is
45    provided through a third package to which access is restricted.
46    This framework avoids the primary disadvantage of using reflection
47    for this purpose, namely the loss of compile-time checking. */
48
49public class SharedSecrets {
50    private static final Unsafe unsafe = Unsafe.getUnsafe();
51    private static JavaUtilJarAccess javaUtilJarAccess;
52    private static JavaLangAccess javaLangAccess;
53    private static JavaLangModuleAccess javaLangModuleAccess;
54    private static JavaLangInvokeAccess javaLangInvokeAccess;
55    private static JavaLangRefAccess javaLangRefAccess;
56    private static JavaIOAccess javaIOAccess;
57    private static JavaNetInetAddressAccess javaNetInetAddressAccess;
58    private static JavaNetHttpCookieAccess javaNetHttpCookieAccess;
59    private static JavaNetSocketAccess javaNetSocketAccess;
60    private static JavaNetUriAccess javaNetUriAccess;
61    private static JavaNetURLAccess javaNetURLAccess;
62    private static JavaNetURLClassLoaderAccess javaNetURLClassLoaderAccess;
63    private static JavaNioAccess javaNioAccess;
64    private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess;
65    private static JavaIOFilePermissionAccess javaIOFilePermissionAccess;
66    private static JavaSecurityProtectionDomainAccess javaSecurityProtectionDomainAccess;
67    private static JavaSecurityAccess javaSecurityAccess;
68    private static JavaUtilZipFileAccess javaUtilZipFileAccess;
69    private static JavaUtilResourceBundleAccess javaUtilResourceBundleAccess;
70    private static JavaAWTAccess javaAWTAccess;
71    private static JavaAWTFontAccess javaAWTFontAccess;
72    private static JavaBeansAccess javaBeansAccess;
73    private static JavaObjectInputStreamAccess javaObjectInputStreamAccess;
74    private static JavaObjectInputFilterAccess javaObjectInputFilterAccess;
75    private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess;
76
77    public static JavaUtilJarAccess javaUtilJarAccess() {
78        if (javaUtilJarAccess == null) {
79            // Ensure JarFile is initialized; we know that that class
80            // provides the shared secret
81            unsafe.ensureClassInitialized(JarFile.class);
82        }
83        return javaUtilJarAccess;
84    }
85
86    public static void setJavaUtilJarAccess(JavaUtilJarAccess access) {
87        javaUtilJarAccess = access;
88    }
89
90    public static void setJavaLangAccess(JavaLangAccess jla) {
91        javaLangAccess = jla;
92    }
93
94    public static JavaLangAccess getJavaLangAccess() {
95        return javaLangAccess;
96    }
97
98    public static void setJavaLangInvokeAccess(JavaLangInvokeAccess jlia) {
99        javaLangInvokeAccess = jlia;
100    }
101
102    public static JavaLangInvokeAccess getJavaLangInvokeAccess() {
103        if (javaLangInvokeAccess == null) {
104            try {
105                Class<?> c = Class.forName("java.lang.invoke.MethodHandleImpl");
106                unsafe.ensureClassInitialized(c);
107            } catch (ClassNotFoundException e) {};
108        }
109        return javaLangInvokeAccess;
110    }
111
112    public static void setJavaLangModuleAccess(JavaLangModuleAccess jlrma) {
113        javaLangModuleAccess = jlrma;
114    }
115
116    public static JavaLangModuleAccess getJavaLangModuleAccess() {
117        if (javaLangModuleAccess == null) {
118            unsafe.ensureClassInitialized(ModuleDescriptor.class);
119        }
120        return javaLangModuleAccess;
121    }
122
123    public static void setJavaLangRefAccess(JavaLangRefAccess jlra) {
124        javaLangRefAccess = jlra;
125    }
126
127    public static JavaLangRefAccess getJavaLangRefAccess() {
128        return javaLangRefAccess;
129    }
130
131    public static void setJavaNetUriAccess(JavaNetUriAccess jnua) {
132        javaNetUriAccess = jnua;
133    }
134
135    public static JavaNetUriAccess getJavaNetUriAccess() {
136        if (javaNetUriAccess == null)
137            unsafe.ensureClassInitialized(java.net.URI.class);
138        return javaNetUriAccess;
139    }
140
141    public static void setJavaNetURLAccess(JavaNetURLAccess jnua) {
142        javaNetURLAccess = jnua;
143    }
144
145    public static JavaNetURLAccess getJavaNetURLAccess() {
146        if (javaNetURLAccess == null)
147            unsafe.ensureClassInitialized(java.net.URL.class);
148        return javaNetURLAccess;
149    }
150
151    public static void setJavaNetURLClassLoaderAccess(JavaNetURLClassLoaderAccess jnua) {
152        javaNetURLClassLoaderAccess = jnua;
153    }
154
155    public static JavaNetURLClassLoaderAccess getJavaNetURLClassLoaderAccess() {
156        if (javaNetURLClassLoaderAccess == null)
157            unsafe.ensureClassInitialized(java.net.URLClassLoader.class);
158        return javaNetURLClassLoaderAccess;
159    }
160
161    public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) {
162        javaNetInetAddressAccess = jna;
163    }
164
165    public static JavaNetInetAddressAccess getJavaNetInetAddressAccess() {
166        if (javaNetInetAddressAccess == null)
167            unsafe.ensureClassInitialized(java.net.InetAddress.class);
168        return javaNetInetAddressAccess;
169    }
170
171    public static void setJavaNetHttpCookieAccess(JavaNetHttpCookieAccess a) {
172        javaNetHttpCookieAccess = a;
173    }
174
175    public static JavaNetHttpCookieAccess getJavaNetHttpCookieAccess() {
176        if (javaNetHttpCookieAccess == null)
177            unsafe.ensureClassInitialized(java.net.HttpCookie.class);
178        return javaNetHttpCookieAccess;
179    }
180
181    public static void setJavaNetSocketAccess(JavaNetSocketAccess jnsa) {
182        javaNetSocketAccess = jnsa;
183    }
184
185    public static JavaNetSocketAccess getJavaNetSocketAccess() {
186        if (javaNetSocketAccess == null)
187            unsafe.ensureClassInitialized(java.net.ServerSocket.class);
188        return javaNetSocketAccess;
189    }
190
191    public static void setJavaNioAccess(JavaNioAccess jna) {
192        javaNioAccess = jna;
193    }
194
195    public static JavaNioAccess getJavaNioAccess() {
196        if (javaNioAccess == null) {
197            // Ensure java.nio.ByteOrder is initialized; we know that
198            // this class initializes java.nio.Bits that provides the
199            // shared secret.
200            unsafe.ensureClassInitialized(java.nio.ByteOrder.class);
201        }
202        return javaNioAccess;
203    }
204
205    public static void setJavaIOAccess(JavaIOAccess jia) {
206        javaIOAccess = jia;
207    }
208
209    public static JavaIOAccess getJavaIOAccess() {
210        if (javaIOAccess == null) {
211            unsafe.ensureClassInitialized(Console.class);
212        }
213        return javaIOAccess;
214    }
215
216    public static void setJavaIOFileDescriptorAccess(JavaIOFileDescriptorAccess jiofda) {
217        javaIOFileDescriptorAccess = jiofda;
218    }
219
220    public static JavaIOFilePermissionAccess getJavaIOFilePermissionAccess() {
221        if (javaIOFilePermissionAccess == null)
222            unsafe.ensureClassInitialized(FilePermission.class);
223
224        return javaIOFilePermissionAccess;
225    }
226
227    public static void setJavaIOFilePermissionAccess(JavaIOFilePermissionAccess jiofpa) {
228        javaIOFilePermissionAccess = jiofpa;
229    }
230
231    public static JavaIOFileDescriptorAccess getJavaIOFileDescriptorAccess() {
232        if (javaIOFileDescriptorAccess == null)
233            unsafe.ensureClassInitialized(FileDescriptor.class);
234
235        return javaIOFileDescriptorAccess;
236    }
237
238    public static void setJavaSecurityProtectionDomainAccess
239        (JavaSecurityProtectionDomainAccess jspda) {
240            javaSecurityProtectionDomainAccess = jspda;
241    }
242
243    public static JavaSecurityProtectionDomainAccess
244        getJavaSecurityProtectionDomainAccess() {
245            if (javaSecurityProtectionDomainAccess == null)
246                unsafe.ensureClassInitialized(ProtectionDomain.class);
247            return javaSecurityProtectionDomainAccess;
248    }
249
250    public static void setJavaSecurityAccess(JavaSecurityAccess jsa) {
251        javaSecurityAccess = jsa;
252    }
253
254    public static JavaSecurityAccess getJavaSecurityAccess() {
255        if (javaSecurityAccess == null) {
256            unsafe.ensureClassInitialized(AccessController.class);
257        }
258        return javaSecurityAccess;
259    }
260
261    public static JavaUtilZipFileAccess getJavaUtilZipFileAccess() {
262        if (javaUtilZipFileAccess == null)
263            unsafe.ensureClassInitialized(java.util.zip.ZipFile.class);
264        return javaUtilZipFileAccess;
265    }
266
267    public static void setJavaUtilZipFileAccess(JavaUtilZipFileAccess access) {
268        javaUtilZipFileAccess = access;
269    }
270
271    public static void setJavaAWTAccess(JavaAWTAccess jaa) {
272        javaAWTAccess = jaa;
273    }
274
275    public static JavaAWTAccess getJavaAWTAccess() {
276        // this may return null in which case calling code needs to
277        // provision for.
278        return javaAWTAccess;
279    }
280
281    public static void setJavaAWTFontAccess(JavaAWTFontAccess jafa) {
282        javaAWTFontAccess = jafa;
283    }
284
285    public static JavaAWTFontAccess getJavaAWTFontAccess() {
286        // this may return null in which case calling code needs to
287        // provision for.
288        return javaAWTFontAccess;
289    }
290
291    public static JavaBeansAccess getJavaBeansAccess() {
292        return javaBeansAccess;
293    }
294
295    public static void setJavaBeansAccess(JavaBeansAccess access) {
296        javaBeansAccess = access;
297    }
298
299    public static JavaUtilResourceBundleAccess getJavaUtilResourceBundleAccess() {
300        if (javaUtilResourceBundleAccess == null)
301            unsafe.ensureClassInitialized(ResourceBundle.class);
302        return javaUtilResourceBundleAccess;
303    }
304
305    public static void setJavaUtilResourceBundleAccess(JavaUtilResourceBundleAccess access) {
306        javaUtilResourceBundleAccess = access;
307    }
308
309    public static JavaObjectInputStreamAccess getJavaObjectInputStreamAccess() {
310        if (javaObjectInputStreamAccess == null) {
311            unsafe.ensureClassInitialized(ObjectInputStream.class);
312        }
313        return javaObjectInputStreamAccess;
314    }
315
316    public static void setJavaObjectInputStreamAccess(JavaObjectInputStreamAccess access) {
317        javaObjectInputStreamAccess = access;
318    }
319
320    public static JavaObjectInputFilterAccess getJavaObjectInputFilterAccess() {
321        if (javaObjectInputFilterAccess == null) {
322            unsafe.ensureClassInitialized(ObjectInputFilter.Config.class);
323        }
324        return javaObjectInputFilterAccess;
325    }
326
327    public static void setJavaObjectInputFilterAccess(JavaObjectInputFilterAccess access) {
328        javaObjectInputFilterAccess = access;
329    }
330
331    public static void setJavaIORandomAccessFileAccess(JavaIORandomAccessFileAccess jirafa) {
332        javaIORandomAccessFileAccess = jirafa;
333    }
334
335    public static JavaIORandomAccessFileAccess getJavaIORandomAccessFileAccess() {
336        if (javaIORandomAccessFileAccess == null) {
337            unsafe.ensureClassInitialized(RandomAccessFile.class);
338        }
339        return javaIORandomAccessFileAccess;
340    }
341}
342