home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2003 January / maximum-cd-2003-01.iso / Software / Apps / OperawithJava / ow32enen700b1j.exe / OPERA.JAR / opera / MethodResolver.class (.txt) < prev    next >
Encoding:
Java Class File  |  2002-11-07  |  8.2 KB  |  411 lines

  1. package opera;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import netscape.javascript.JSObject;
  8.  
  9. class MethodResolver {
  10.    static Class jsobjectClass;
  11.    static Class objectClass;
  12.    static Class stringClass;
  13.    static Class classClass;
  14.    static Class doubleClass;
  15.    static Class booleanClass;
  16.    static final int JSTYPE_NOTFOUND = 0;
  17.    static final int JSTYPE_NUMBER = 1;
  18.    static final int JSTYPE_BOOLEAN = 2;
  19.    static final int JSTYPE_OBJECT = 3;
  20.    static final int JSTYPE_JAVAARRAY = 4;
  21.    static final int JSTYPE_JAVAOBJECT = 5;
  22.    static final int JSTYPE_STATIC = 8;
  23.    static final int JSTYPE_FINAL = 16;
  24.    static final int JM_NOTFOUND = 0;
  25.    static final int JM_NONSTATIC = 1;
  26.    static final int JM_STATIC = 2;
  27.  
  28.    static String findMethod(Class var0, String var1, String var2, boolean var3) {
  29.       if (var1.equals("<init>")) {
  30.          Constructor[] var6 = var0.getConstructors();
  31.  
  32.          for(int var7 = 0; var7 < var6.length; ++var7) {
  33.             if ((!var3 || Modifier.isStatic(var6[var7].getModifiers())) && (var2 == null || isApplicable(var6[var7].getParameterTypes(), var2))) {
  34.                return makeSignature((Class)null, var6[var7].getParameterTypes());
  35.             }
  36.          }
  37.  
  38.          return null;
  39.       } else {
  40.          Method[] var4 = var0.getMethods();
  41.  
  42.          for(int var5 = 0; var5 < var4.length; ++var5) {
  43.             if (var1.equals(var4[var5].getName()) && (!var3 || Modifier.isStatic(var4[var5].getModifiers())) && isApplicable(var4[var5].getParameterTypes(), var2)) {
  44.                return makeSignature(var4[var5].getReturnType(), var4[var5].getParameterTypes());
  45.             }
  46.          }
  47.  
  48.          return null;
  49.       }
  50.    }
  51.  
  52.    static boolean isApplicable(Class[] var0, String var1) {
  53.       if (var1.length() != var0.length) {
  54.          return false;
  55.       } else {
  56.          for(int var2 = 0; var2 < var0.length; ++var2) {
  57.             if (!var0[var2].equals(Boolean.TYPE)) {
  58.                if (var0[var2].equals(Byte.TYPE)) {
  59.                   if (var1.charAt(var2) == 'c') {
  60.                      return false;
  61.                   }
  62.                } else if (var0[var2].equals(Character.TYPE)) {
  63.                   if (var1.charAt(var2) == 'c') {
  64.                      return false;
  65.                   }
  66.                } else if (var0[var2].equals(Double.TYPE)) {
  67.                   if (var1.charAt(var2) == 'c') {
  68.                      return false;
  69.                   }
  70.                } else if (var0[var2].equals(Float.TYPE)) {
  71.                   if (var1.charAt(var2) == 'c') {
  72.                      return false;
  73.                   }
  74.                } else if (var0[var2].equals(Integer.TYPE)) {
  75.                   if (var1.charAt(var2) == 'c') {
  76.                      return false;
  77.                   }
  78.                } else if (var0[var2].equals(Long.TYPE)) {
  79.                   if (var1.charAt(var2) == 'c') {
  80.                      return false;
  81.                   }
  82.                } else if (var0[var2].equals(Short.TYPE)) {
  83.                   if (var1.charAt(var2) == 'c') {
  84.                      return false;
  85.                   }
  86.                } else if (var0[var2].equals(jsobjectClass)) {
  87.                   switch (var1.charAt(var2)) {
  88.                      case 'b':
  89.                      case 'n':
  90.                      case 's':
  91.                      case 'u':
  92.                         return false;
  93.                   }
  94.                } else if (!var0[var2].equals(objectClass) && !var0[var2].equals(stringClass)) {
  95.                   if (var0[var2].equals(classClass)) {
  96.                      switch (var1.charAt(var2)) {
  97.                         case 'c':
  98.                         case 'o':
  99.                            break;
  100.                         default:
  101.                            return false;
  102.                      }
  103.                   } else if (var0[var2].equals(doubleClass)) {
  104.                      switch (var1.charAt(var2)) {
  105.                         case 'j':
  106.                         case 'n':
  107.                         case 'o':
  108.                            break;
  109.                         default:
  110.                            return false;
  111.                      }
  112.                   } else if (var0[var2].equals(booleanClass)) {
  113.                      if (var1.charAt(var2) != 'z') {
  114.                         return false;
  115.                      }
  116.                   } else {
  117.                      if (var0[var2].isPrimitive()) {
  118.                         return false;
  119.                      }
  120.  
  121.                      switch (var1.charAt(var2)) {
  122.                         case 'a':
  123.                         case 'j':
  124.                         case 'z':
  125.                            break;
  126.                         default:
  127.                            return false;
  128.                      }
  129.                   }
  130.                }
  131.             }
  132.          }
  133.  
  134.          return true;
  135.       }
  136.    }
  137.  
  138.    static String makeSignature(Class var0, Class[] var1) {
  139.       String var2 = new String("(");
  140.  
  141.       for(int var3 = 0; var3 < var1.length; ++var3) {
  142.          if (var1[var3] != null) {
  143.             var2 = var2 + getTypeSignature(var1[var3]);
  144.          }
  145.       }
  146.  
  147.       var2 = var2 + ")";
  148.       if (var0 != null) {
  149.          var2 = var2 + getTypeSignature(var0);
  150.       } else {
  151.          var2 = var2 + "V";
  152.       }
  153.  
  154.       return var2;
  155.    }
  156.  
  157.    static boolean hasMethod(Class var0, String var1, boolean var2, JSObject var3) {
  158.       try {
  159.          MethodLookupThread var4 = new MethodLookupThread(var0, var1, var2, var3);
  160.          var4.start();
  161.          return true;
  162.       } catch (Exception var5) {
  163.          var5.printStackTrace(System.err);
  164.          return false;
  165.       }
  166.    }
  167.  
  168.    static int hasMethod(Class var0, String var1, boolean var2) {
  169.       Method[] var3 = var0.getMethods();
  170.       int var4 = 0;
  171.  
  172.       for(int var5 = 0; var5 < var3.length; ++var5) {
  173.          if (var1.equals(var3[var5].getName()) && (!var2 || Modifier.isStatic(var3[var5].getModifiers()))) {
  174.             var4 |= Modifier.isStatic(var3[var5].getModifiers()) ? 2 : 1;
  175.             break;
  176.          }
  177.       }
  178.  
  179.       return var4;
  180.    }
  181.  
  182.    static int hasField(Class var0, String var1, boolean var2) {
  183.       try {
  184.          Field var3 = var0.getField(var1);
  185.          if (var2 && !Modifier.isStatic(var3.getModifiers())) {
  186.             return 0;
  187.          } else {
  188.             Class var4 = var3.getType();
  189.             return classToJSType(var4) | (Modifier.isStatic(var3.getModifiers()) ? 8 : 0) | (Modifier.isFinal(var3.getModifiers()) ? 16 : 0);
  190.          }
  191.       } catch (NoSuchFieldException var5) {
  192.          return 0;
  193.       }
  194.    }
  195.  
  196.    static int classToJSType(Class var0) {
  197.       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)) {
  198.          if (var0.equals(Boolean.TYPE)) {
  199.             return 2;
  200.          } else if (var0.equals(jsobjectClass)) {
  201.             return 3;
  202.          } else {
  203.             return var0.isArray() ? 4 : 5;
  204.          }
  205.       } else {
  206.          return 1;
  207.       }
  208.    }
  209.  
  210.    static String getFieldTypeName(Class var0, String var1, boolean var2) {
  211.       try {
  212.          Field var3 = var0.getField(var1);
  213.          return var2 && !Modifier.isStatic(var3.getModifiers()) ? null : getTypeSignature(var3.getType());
  214.       } catch (NoSuchFieldException var4) {
  215.          return null;
  216.       }
  217.    }
  218.  
  219.    static double getFieldDouble(Class var0, String var1, Object var2, String var3) {
  220.       try {
  221.          Field var4 = var0.getField(var1);
  222.          Object var5 = LiveConnectPrivilegedActions.getField(var4, var2, var3);
  223.          return var5.getClass().equals(Character.TYPE) ? (double)(Character)var5 : ((Number)var5).doubleValue();
  224.       } catch (Exception var6) {
  225.          return (double)0.0F;
  226.       }
  227.    }
  228.  
  229.    static boolean getFieldBoolean(Class var0, String var1, Object var2, String var3) {
  230.       try {
  231.          Field var4 = var0.getField(var1);
  232.          Object var5 = LiveConnectPrivilegedActions.getField(var4, var2, var3);
  233.          return (Boolean)var5;
  234.       } catch (Exception var6) {
  235.          return false;
  236.       }
  237.    }
  238.  
  239.    static Object getFieldObject(Class var0, String var1, Object var2, String var3) {
  240.       try {
  241.          Field var4 = var0.getField(var1);
  242.          return LiveConnectPrivilegedActions.getField(var4, var2, var3);
  243.       } catch (Exception var5) {
  244.          return null;
  245.       }
  246.    }
  247.  
  248.    static boolean isAssignableFrom(String var0, Object var1) {
  249.       try {
  250.          Class var2 = getTypeFromSignature(var0);
  251.          return var2.isAssignableFrom(var1.getClass());
  252.       } catch (Exception var3) {
  253.          return false;
  254.       }
  255.    }
  256.  
  257.    private static Class getTypeFromSignature(String var0) {
  258.       try {
  259.          switch (var0.charAt(0)) {
  260.             case 'B':
  261.                return Byte.TYPE;
  262.             case 'C':
  263.                return Character.TYPE;
  264.             case 'D':
  265.                return Double.TYPE;
  266.             case 'E':
  267.             case 'G':
  268.             case 'H':
  269.             case 'K':
  270.             case 'M':
  271.             case 'N':
  272.             case 'O':
  273.             case 'P':
  274.             case 'Q':
  275.             case 'R':
  276.             case 'T':
  277.             case 'U':
  278.             case 'W':
  279.             case 'X':
  280.             case 'Y':
  281.             default:
  282.                return null;
  283.             case 'F':
  284.                return Float.TYPE;
  285.             case 'I':
  286.                return Integer.TYPE;
  287.             case 'J':
  288.                return Long.TYPE;
  289.             case 'L':
  290.                String var1 = var0.replace('/', '.');
  291.                return Class.forName(var1.substring(1, var1.indexOf(59)));
  292.             case 'S':
  293.                return Short.TYPE;
  294.             case 'V':
  295.                return Void.TYPE;
  296.             case 'Z':
  297.                return Boolean.TYPE;
  298.             case '[':
  299.                return Class.forName(var0);
  300.          }
  301.       } catch (ClassNotFoundException var2) {
  302.          return null;
  303.       }
  304.    }
  305.  
  306.    private static String getTypeSignature(Class var0) {
  307.       if (var0.isPrimitive()) {
  308.          if (var0.equals(Boolean.TYPE)) {
  309.             return new String("Z");
  310.          } else if (var0.equals(Byte.TYPE)) {
  311.             return new String("B");
  312.          } else if (var0.equals(Character.TYPE)) {
  313.             return new String("C");
  314.          } else if (var0.equals(Double.TYPE)) {
  315.             return new String("D");
  316.          } else if (var0.equals(Float.TYPE)) {
  317.             return new String("F");
  318.          } else if (var0.equals(Integer.TYPE)) {
  319.             return new String("I");
  320.          } else if (var0.equals(Long.TYPE)) {
  321.             return new String("J");
  322.          } else if (var0.equals(Short.TYPE)) {
  323.             return new String("S");
  324.          } else {
  325.             return var0.equals(Void.TYPE) ? new String("V") : null;
  326.          }
  327.       } else {
  328.          return var0.isArray() ? var0.getName() : "L" + var0.getName().replace('.', '/') + ";";
  329.       }
  330.    }
  331.  
  332.    private static String getJRIStubName(Class var0, Method var1) {
  333.       return "native_" + var0.getName().replace('.', '_') + "_" + var1.getName();
  334.    }
  335.  
  336.    private static int nativeMethodCount(Method[] var0) {
  337.       int var1 = 0;
  338.  
  339.       for(int var2 = 0; var2 < var0.length; ++var2) {
  340.          if (Modifier.isNative(var0[var2].getModifiers())) {
  341.             ++var1;
  342.          }
  343.       }
  344.  
  345.       return var1;
  346.    }
  347.  
  348.    private static String[] getNativeMethods(Class var0) {
  349.       Method[] var1 = var0.getDeclaredMethods();
  350.       int var2 = nativeMethodCount(var1);
  351.       if (var2 <= 0) {
  352.          return null;
  353.       } else {
  354.          String[] var3 = new String[var2 * 2];
  355.          int var4 = 0;
  356.  
  357.          for(int var5 = 0; var5 < var1.length; ++var5) {
  358.             if (Modifier.isNative(var1[var5].getModifiers())) {
  359.                String var6 = var1[var5].getName() + "(";
  360.                Class[] var7 = var1[var5].getParameterTypes();
  361.  
  362.                for(int var8 = 0; var8 < var7.length; ++var8) {
  363.                   var6 = var6 + getTypeSignature(var7[var8]);
  364.                }
  365.  
  366.                var6 = var6 + ")";
  367.                var6 = var6 + getTypeSignature(var1[var5].getReturnType());
  368.                String var9 = getJRIStubName(var0, var1[var5]);
  369.                var3[var4++] = var6;
  370.                var3[var4++] = var9;
  371.             }
  372.          }
  373.  
  374.          return var3;
  375.       }
  376.    }
  377.  
  378.    private static Object newObject(Constructor var0, Object[] var1, String var2) {
  379.       try {
  380.          return LiveConnectPrivilegedActions.newObject(var0, var1, var2);
  381.       } catch (Exception var4) {
  382.          var4.printStackTrace(System.err);
  383.          return null;
  384.       }
  385.    }
  386.  
  387.    private static boolean invoke(Object var0, Method var1, Object[] var2, JSObject var3, String var4) {
  388.       try {
  389.          InvocationThread var5 = new InvocationThread(var0, var1, var2, var3, var4);
  390.          var5.start();
  391.          return true;
  392.       } catch (Exception var6) {
  393.          var6.printStackTrace(System.err);
  394.          return false;
  395.       }
  396.    }
  397.  
  398.    static {
  399.       try {
  400.          jsobjectClass = Class.forName("netscape.javascript.JSObject");
  401.          objectClass = Class.forName("java.lang.Object");
  402.          stringClass = Class.forName("java.lang.String");
  403.          classClass = Class.forName("java.lang.Class");
  404.          doubleClass = Class.forName("java.lang.Double");
  405.          booleanClass = Class.forName("java.lang.Boolean");
  406.       } catch (ClassNotFoundException var1) {
  407.       }
  408.  
  409.    }
  410. }
  411.