diff options
Diffstat (limited to 'java/jdk15/files/patch-liveconnect_ReplaceMethod.java')
-rw-r--r-- | java/jdk15/files/patch-liveconnect_ReplaceMethod.java | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/java/jdk15/files/patch-liveconnect_ReplaceMethod.java b/java/jdk15/files/patch-liveconnect_ReplaceMethod.java new file mode 100644 index 0000000..829e434 --- /dev/null +++ b/java/jdk15/files/patch-liveconnect_ReplaceMethod.java @@ -0,0 +1,93 @@ +$FreeBSD$ + +--- ../../deploy/src/plugin/src/share/classes/sun/plugin/liveconnect/ReplaceMethod.java 1 Jan 1970 00:00:00 -0000 ++++ ../../deploy/src/plugin/src/share/classes/sun/plugin/liveconnect/ReplaceMethod.java 3 Dec 2004 03:56:58 -0000 1.1 +@@ -0,0 +1,88 @@ ++/* ++ * @(#)ReplaceMethod.java 1.1 04/06/20 ++ * ++ * Copyright 2004 Sun Microsystems, Inc. All rights reserved. ++ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. ++ */ ++package sun.plugin.liveconnect; ++ ++import java.lang.reflect.Method; ++import java.lang.reflect.Modifier; ++import sun.plugin.javascript.JSClassLoader; ++ ++public class ReplaceMethod { ++ /* ++ * Replace the inaccessible method by a suitable method on public ++ * class/interface accessible to the calling JavaScript code. ++ * Returns null if accessible method is not found. ++ */ ++ static Method getJScriptMethod(Method start) { ++ Class cls = start.getDeclaringClass(); ++ ++ if (Modifier.isPublic(cls.getModifiers())) { ++ return start; ++ } ++ ++ String name = start.getName(); ++ Class[] params = start.getParameterTypes(); ++ ++ Method result = null; ++ while (cls != null && result == null) { ++ result = getPublicMethod(cls, name, params); ++ if (result == null) { ++ result = getJScriptInterfaceMethod(cls, name, params); ++ } ++ cls = cls.getSuperclass(); ++ } ++ return result; ++ } ++ ++ /* ++ * Process the immediate interfaces of this class or interface. ++ */ ++ static Method getJScriptInterfaceMethod(Class cls, String name, Class[] params) { ++ Method result = null; ++ Class[] intfs = cls.getInterfaces(); ++ for (int i=0; i < intfs.length && result == null; i++) { ++ Class intf = intfs[i]; ++ result = getPublicMethod(intf, name, params); ++ if (result == null) { ++ result = getJScriptInterfaceMethod(intf, name, params); ++ } ++ } ++ return result; ++ } ++ ++ /* ++ * ++ * Process the methods in this class or interface ++ */ ++ static private Method getPublicMethod(Class cls, String name, Class[] params) { ++ try { ++ /* ++ * This class or interface is non-public so we ++ * can't use any of it's methods. Go back and ++ * try again with a superclass or superinterface. ++ */ ++ if (!Modifier.isPublic(cls.getModifiers())) { ++ return null; ++ } ++ ++ /* ++ * This call will fail if 'cls' is in a restricted ++ * package and we don't have permission to access ++ * it. ++ */ ++ if (!JSClassLoader.isPackageAccessible(cls)) { ++ return null; ++ } ++ return cls.getMethod(name, params); ++ } catch (NoSuchMethodException nsme) { ++ return null; ++ } catch (SecurityException se) { ++ return null; ++ } ++ } ++} ++ ++ |