home *** CD-ROM | disk | FTP | other *** search
- package opera;
-
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import netscape.javascript.JSObject;
-
- class MethodResolver {
- static Class jsobjectClass;
- static Class objectClass;
- static Class stringClass;
- static Class classClass;
- static Class doubleClass;
- static Class booleanClass;
- static final int JSTYPE_NOTFOUND = 0;
- static final int JSTYPE_NUMBER = 1;
- static final int JSTYPE_BOOLEAN = 2;
- static final int JSTYPE_OBJECT = 3;
- static final int JSTYPE_JAVAARRAY = 4;
- static final int JSTYPE_JAVAOBJECT = 5;
- static final int JSTYPE_STATIC = 8;
- static final int JSTYPE_FINAL = 16;
- static final int JM_NOTFOUND = 0;
- static final int JM_NONSTATIC = 1;
- static final int JM_STATIC = 2;
-
- static String findMethod(Class var0, String var1, String var2, boolean var3) {
- if (var1.equals("<init>")) {
- Constructor[] var6 = var0.getConstructors();
-
- for(int var7 = 0; var7 < var6.length; ++var7) {
- if ((!var3 || Modifier.isStatic(var6[var7].getModifiers())) && (var2 == null || isApplicable(var6[var7].getParameterTypes(), var2))) {
- return makeSignature((Class)null, var6[var7].getParameterTypes());
- }
- }
-
- return null;
- } else {
- Method[] var4 = var0.getMethods();
-
- for(int var5 = 0; var5 < var4.length; ++var5) {
- if (var1.equals(var4[var5].getName()) && (!var3 || Modifier.isStatic(var4[var5].getModifiers())) && isApplicable(var4[var5].getParameterTypes(), var2)) {
- return makeSignature(var4[var5].getReturnType(), var4[var5].getParameterTypes());
- }
- }
-
- return null;
- }
- }
-
- static boolean isApplicable(Class[] var0, String var1) {
- if (var1.length() != var0.length) {
- return false;
- } else {
- for(int var2 = 0; var2 < var0.length; ++var2) {
- if (!var0[var2].equals(Boolean.TYPE)) {
- if (var0[var2].equals(Byte.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Character.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Double.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Float.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Integer.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Long.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(Short.TYPE)) {
- if (var1.charAt(var2) == 'c') {
- return false;
- }
- } else if (var0[var2].equals(jsobjectClass)) {
- switch (var1.charAt(var2)) {
- case 'b':
- case 'n':
- case 's':
- case 'u':
- return false;
- }
- } else if (!var0[var2].equals(objectClass) && !var0[var2].equals(stringClass)) {
- if (var0[var2].equals(classClass)) {
- switch (var1.charAt(var2)) {
- case 'c':
- case 'o':
- break;
- default:
- return false;
- }
- } else if (var0[var2].equals(doubleClass)) {
- switch (var1.charAt(var2)) {
- case 'j':
- case 'n':
- case 'o':
- break;
- default:
- return false;
- }
- } else if (var0[var2].equals(booleanClass)) {
- if (var1.charAt(var2) != 'z') {
- return false;
- }
- } else {
- if (var0[var2].isPrimitive()) {
- return false;
- }
-
- switch (var1.charAt(var2)) {
- case 'a':
- case 'j':
- case 'z':
- break;
- default:
- return false;
- }
- }
- }
- }
- }
-
- return true;
- }
- }
-
- static String makeSignature(Class var0, Class[] var1) {
- String var2 = new String("(");
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- if (var1[var3] != null) {
- var2 = var2 + getTypeSignature(var1[var3]);
- }
- }
-
- var2 = var2 + ")";
- if (var0 != null) {
- var2 = var2 + getTypeSignature(var0);
- } else {
- var2 = var2 + "V";
- }
-
- return var2;
- }
-
- static boolean hasMethod(Class var0, String var1, boolean var2, JSObject var3) {
- try {
- MethodLookupThread var4 = new MethodLookupThread(var0, var1, var2, var3);
- var4.start();
- return true;
- } catch (Exception var5) {
- var5.printStackTrace(System.err);
- return false;
- }
- }
-
- static int hasMethod(Class var0, String var1, boolean var2) {
- Method[] var3 = var0.getMethods();
- int var4 = 0;
-
- for(int var5 = 0; var5 < var3.length; ++var5) {
- if (var1.equals(var3[var5].getName()) && (!var2 || Modifier.isStatic(var3[var5].getModifiers()))) {
- var4 |= Modifier.isStatic(var3[var5].getModifiers()) ? 2 : 1;
- break;
- }
- }
-
- return var4;
- }
-
- static int hasField(Class var0, String var1, boolean var2) {
- try {
- Field var3 = var0.getField(var1);
- if (var2 && !Modifier.isStatic(var3.getModifiers())) {
- return 0;
- } else {
- Class var4 = var3.getType();
- return classToJSType(var4) | (Modifier.isStatic(var3.getModifiers()) ? 8 : 0) | (Modifier.isFinal(var3.getModifiers()) ? 16 : 0);
- }
- } catch (NoSuchFieldException var5) {
- return 0;
- }
- }
-
- static int classToJSType(Class var0) {
- if (!var0.equals(Byte.TYPE) && !var0.equals(Character.TYPE) && !var0.equals(Short.TYPE) && !var0.equals(Integer.TYPE) && !var0.equals(Long.TYPE) && !var0.equals(Float.TYPE) && !var0.equals(Double.TYPE)) {
- if (var0.equals(Boolean.TYPE)) {
- return 2;
- } else if (var0.equals(jsobjectClass)) {
- return 3;
- } else {
- return var0.isArray() ? 4 : 5;
- }
- } else {
- return 1;
- }
- }
-
- static String getFieldTypeName(Class var0, String var1, boolean var2) {
- try {
- Field var3 = var0.getField(var1);
- return var2 && !Modifier.isStatic(var3.getModifiers()) ? null : getTypeSignature(var3.getType());
- } catch (NoSuchFieldException var4) {
- return null;
- }
- }
-
- static double getFieldDouble(Class var0, String var1, Object var2, String var3) {
- try {
- Field var4 = var0.getField(var1);
- Object var5 = LiveConnectPrivilegedActions.getField(var4, var2, var3);
- return var5.getClass().equals(Character.TYPE) ? (double)(Character)var5 : ((Number)var5).doubleValue();
- } catch (Exception var6) {
- return (double)0.0F;
- }
- }
-
- static boolean getFieldBoolean(Class var0, String var1, Object var2, String var3) {
- try {
- Field var4 = var0.getField(var1);
- Object var5 = LiveConnectPrivilegedActions.getField(var4, var2, var3);
- return (Boolean)var5;
- } catch (Exception var6) {
- return false;
- }
- }
-
- static Object getFieldObject(Class var0, String var1, Object var2, String var3) {
- try {
- Field var4 = var0.getField(var1);
- return LiveConnectPrivilegedActions.getField(var4, var2, var3);
- } catch (Exception var5) {
- return null;
- }
- }
-
- static boolean isAssignableFrom(String var0, Object var1) {
- try {
- Class var2 = getTypeFromSignature(var0);
- return var2.isAssignableFrom(var1.getClass());
- } catch (Exception var3) {
- return false;
- }
- }
-
- private static Class getTypeFromSignature(String var0) {
- try {
- switch (var0.charAt(0)) {
- case 'B':
- return Byte.TYPE;
- case 'C':
- return Character.TYPE;
- case 'D':
- return Double.TYPE;
- case 'E':
- case 'G':
- case 'H':
- case 'K':
- case 'M':
- case 'N':
- case 'O':
- case 'P':
- case 'Q':
- case 'R':
- case 'T':
- case 'U':
- case 'W':
- case 'X':
- case 'Y':
- default:
- return null;
- case 'F':
- return Float.TYPE;
- case 'I':
- return Integer.TYPE;
- case 'J':
- return Long.TYPE;
- case 'L':
- String var1 = var0.replace('/', '.');
- return Class.forName(var1.substring(1, var1.indexOf(59)));
- case 'S':
- return Short.TYPE;
- case 'V':
- return Void.TYPE;
- case 'Z':
- return Boolean.TYPE;
- case '[':
- return Class.forName(var0);
- }
- } catch (ClassNotFoundException var2) {
- return null;
- }
- }
-
- private static String getTypeSignature(Class var0) {
- if (var0.isPrimitive()) {
- if (var0.equals(Boolean.TYPE)) {
- return new String("Z");
- } else if (var0.equals(Byte.TYPE)) {
- return new String("B");
- } else if (var0.equals(Character.TYPE)) {
- return new String("C");
- } else if (var0.equals(Double.TYPE)) {
- return new String("D");
- } else if (var0.equals(Float.TYPE)) {
- return new String("F");
- } else if (var0.equals(Integer.TYPE)) {
- return new String("I");
- } else if (var0.equals(Long.TYPE)) {
- return new String("J");
- } else if (var0.equals(Short.TYPE)) {
- return new String("S");
- } else {
- return var0.equals(Void.TYPE) ? new String("V") : null;
- }
- } else {
- return var0.isArray() ? var0.getName() : "L" + var0.getName().replace('.', '/') + ";";
- }
- }
-
- private static String getJRIStubName(Class var0, Method var1) {
- return "native_" + var0.getName().replace('.', '_') + "_" + var1.getName();
- }
-
- private static int nativeMethodCount(Method[] var0) {
- int var1 = 0;
-
- for(int var2 = 0; var2 < var0.length; ++var2) {
- if (Modifier.isNative(var0[var2].getModifiers())) {
- ++var1;
- }
- }
-
- return var1;
- }
-
- private static String[] getNativeMethods(Class var0) {
- Method[] var1 = var0.getDeclaredMethods();
- int var2 = nativeMethodCount(var1);
- if (var2 <= 0) {
- return null;
- } else {
- String[] var3 = new String[var2 * 2];
- int var4 = 0;
-
- for(int var5 = 0; var5 < var1.length; ++var5) {
- if (Modifier.isNative(var1[var5].getModifiers())) {
- String var6 = var1[var5].getName() + "(";
- Class[] var7 = var1[var5].getParameterTypes();
-
- for(int var8 = 0; var8 < var7.length; ++var8) {
- var6 = var6 + getTypeSignature(var7[var8]);
- }
-
- var6 = var6 + ")";
- var6 = var6 + getTypeSignature(var1[var5].getReturnType());
- String var9 = getJRIStubName(var0, var1[var5]);
- var3[var4++] = var6;
- var3[var4++] = var9;
- }
- }
-
- return var3;
- }
- }
-
- private static Object newObject(Constructor var0, Object[] var1, String var2) {
- try {
- return LiveConnectPrivilegedActions.newObject(var0, var1, var2);
- } catch (Exception var4) {
- var4.printStackTrace(System.err);
- return null;
- }
- }
-
- private static boolean invoke(Object var0, Method var1, Object[] var2, JSObject var3, String var4) {
- try {
- InvocationThread var5 = new InvocationThread(var0, var1, var2, var3, var4);
- var5.start();
- return true;
- } catch (Exception var6) {
- var6.printStackTrace(System.err);
- return false;
- }
- }
-
- static {
- try {
- jsobjectClass = Class.forName("netscape.javascript.JSObject");
- objectClass = Class.forName("java.lang.Object");
- stringClass = Class.forName("java.lang.String");
- classClass = Class.forName("java.lang.Class");
- doubleClass = Class.forName("java.lang.Double");
- booleanClass = Class.forName("java.lang.Boolean");
- } catch (ClassNotFoundException var1) {
- }
-
- }
- }
-