home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / netscape / javascript / NativeJavaMethod.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-09  |  5.2 KB  |  206 lines

  1. package com.netscape.javascript;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Member;
  6. import java.lang.reflect.Method;
  7. import java.lang.reflect.Modifier;
  8.  
  9. public class NativeJavaMethod extends NativeFunction implements Function {
  10.    private static final boolean debug = false;
  11.    Method[] methods;
  12.  
  13.    static String signature(Class[] var0) {
  14.       StringBuffer var1 = new StringBuffer();
  15.  
  16.       for(int var2 = 0; var2 < var0.length; ++var2) {
  17.          if (var2 != 0) {
  18.             var1.append(',');
  19.          }
  20.  
  21.          var1.append(signature(var0[var2]));
  22.       }
  23.  
  24.       return var1.toString();
  25.    }
  26.  
  27.    static String signature(Member var0) {
  28.       Class[] var1 = var0 instanceof Method ? ((Method)var0).getParameterTypes() : ((Constructor)var0).getParameterTypes();
  29.       return var0.getName() + "(" + signature(var1) + ")";
  30.    }
  31.  
  32.    public Object getDefaultValue(Class var1) {
  33.       return this;
  34.    }
  35.  
  36.    public NativeJavaMethod() {
  37.       super.names = new String[1];
  38.    }
  39.  
  40.    public NativeJavaMethod(Method[] var1) {
  41.       this.methods = var1;
  42.       super.names = new String[1];
  43.       super.names[0] = var1[0].getName();
  44.    }
  45.  
  46.    public void add(Method var1) {
  47.       if (super.names[0] == null) {
  48.          super.names[0] = var1.getName();
  49.       } else if (!super.names[0].equals(var1.getName())) {
  50.          throw new RuntimeException("internal method name mismatch");
  51.       }
  52.  
  53.       int var2 = this.methods == null ? 0 : this.methods.length;
  54.       Method[] var3 = new Method[var2 + 1];
  55.  
  56.       for(int var4 = 0; var4 < var2; ++var4) {
  57.          var3[var4] = this.methods[var4];
  58.       }
  59.  
  60.       var3[var2] = var1;
  61.       this.methods = var3;
  62.    }
  63.  
  64.    Method[] getMethods() {
  65.       return this.methods;
  66.    }
  67.  
  68.    private static void printDebug(String var0, Member var1, Object[] var2) {
  69.    }
  70.  
  71.    public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) throws JavaScriptException {
  72.       if (this.methods.length == 0) {
  73.          throw new RuntimeException("No methods defined for call");
  74.       } else {
  75.          for(int var5 = 0; var5 < var4.length; ++var5) {
  76.             if (var4[var5] instanceof Wrapper) {
  77.                var4[var5] = ((Wrapper)var4[var5]).unwrap();
  78.             }
  79.          }
  80.  
  81.          Method var15 = (Method)findFunction(this.methods, var4);
  82.          if (var15 == null) {
  83.             Class var16 = this.methods[0].getDeclaringClass();
  84.             String var18 = var16.getName() + "." + super.names[0] + "(" + signature(var4) + ")";
  85.             Object[] var20 = new Object[]{var18};
  86.             throw Context.reportRuntimeError(Context.getMessage("msg.java.no_such_method", var20));
  87.          } else {
  88.             Class[] var6 = var15.getParameterTypes();
  89.  
  90.             for(int var7 = 0; var7 < var4.length; ++var7) {
  91.                var4[var7] = NativeJavaObject.coerceType(var6[var7], var4[var7]);
  92.             }
  93.  
  94.             Object var17;
  95.             try {
  96.                var17 = ((NativeJavaObject)var3).unwrap();
  97.             } catch (ClassCastException var14) {
  98.                if (!Modifier.isStatic(var15.getModifiers())) {
  99.                   Object[] var8 = new Object[]{super.names[0]};
  100.                   throw Context.reportRuntimeError(Context.getMessage("msg.nonjava.method", var8));
  101.                }
  102.  
  103.                var17 = null;
  104.             }
  105.  
  106.             try {
  107.                Object var19 = var15.invoke(var17, var4);
  108.                Class var9 = var15.getReturnType();
  109.                Object var10 = NativeJavaObject.wrap(var2, var19, var9);
  110.                if (var10 == Undefined.instance) {
  111.                   return var10;
  112.                } else if (var10 == null && var9 == Void.TYPE) {
  113.                   return Undefined.instance;
  114.                } else {
  115.                   if (var19 != var10 && var10 instanceof Scriptable) {
  116.                      Scriptable var11 = (Scriptable)var10;
  117.                      if (var11.getPrototype() == null) {
  118.                         var11.setPrototype(super.parent.getPrototype());
  119.                      }
  120.  
  121.                      if (var11.getParentScope() == null) {
  122.                         var11.setParentScope(super.parent.getParentScope());
  123.                      }
  124.                   }
  125.  
  126.                   return var10;
  127.                }
  128.             } catch (IllegalAccessException var12) {
  129.                throw Context.reportRuntimeError(((Throwable)var12).getMessage());
  130.             } catch (InvocationTargetException var13) {
  131.                throw JavaScriptException.wrapException(var2, var13);
  132.             }
  133.          }
  134.       }
  135.    }
  136.  
  137.    static Member findFunction(Member[] var0, Object[] var1) {
  138.       if (var0.length == 0) {
  139.          return null;
  140.       } else {
  141.          boolean var2 = var0[0] instanceof Method;
  142.  
  143.          label35:
  144.          for(int var3 = 0; var3 < var0.length; ++var3) {
  145.             Member var4 = var0[var3];
  146.             Class[] var5 = var2 ? ((Method)var4).getParameterTypes() : ((Constructor)var4).getParameterTypes();
  147.             if (var5.length == var1.length) {
  148.                for(int var6 = 0; var6 < var5.length; ++var6) {
  149.                   if (!NativeJavaObject.canConvert(var1[var6], var5[var6])) {
  150.                      continue label35;
  151.                   }
  152.                }
  153.  
  154.                return var4;
  155.             }
  156.          }
  157.  
  158.          return null;
  159.       }
  160.    }
  161.  
  162.    static String signature(Class var0) {
  163.       if (var0 == null) {
  164.          return "null";
  165.       } else if (var0 == ScriptRuntime.BooleanClass) {
  166.          return "boolean";
  167.       } else if (var0 == ScriptRuntime.ByteClass) {
  168.          return "byte";
  169.       } else if (var0 == ScriptRuntime.ShortClass) {
  170.          return "short";
  171.       } else if (var0 == ScriptRuntime.IntegerClass) {
  172.          return "int";
  173.       } else if (var0 == ScriptRuntime.LongClass) {
  174.          return "long";
  175.       } else if (var0 == ScriptRuntime.FloatClass) {
  176.          return "float";
  177.       } else if (var0 == ScriptRuntime.DoubleClass) {
  178.          return "double";
  179.       } else if (var0 == ScriptRuntime.StringClass) {
  180.          return "string";
  181.       } else if (ScriptRuntime.ScriptableClass.isAssignableFrom(var0)) {
  182.          if (ScriptRuntime.FunctionClass.isAssignableFrom(var0)) {
  183.             return "function";
  184.          } else {
  185.             return var0 == ScriptRuntime.UndefinedClass ? "undefined" : "object";
  186.          }
  187.       } else {
  188.          return var0.getName();
  189.       }
  190.    }
  191.  
  192.    static String signature(Object[] var0) {
  193.       StringBuffer var1 = new StringBuffer();
  194.  
  195.       for(int var2 = 0; var2 < var0.length; ++var2) {
  196.          if (var2 != 0) {
  197.             var1.append(',');
  198.          }
  199.  
  200.          var1.append(var0[var2] == null ? "null" : signature(var0[var2].getClass()));
  201.       }
  202.  
  203.       return var1.toString();
  204.    }
  205. }
  206.