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

  1. package com.netscape.javascript;
  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 java.util.Enumeration;
  8. import java.util.Hashtable;
  9.  
  10. class JavaMembers {
  11.    private static Hashtable classTable = new Hashtable();
  12.    // $FF: renamed from: cl java.lang.Class
  13.    private Class field_0;
  14.    private Hashtable members = new Hashtable(23);
  15.    private Hashtable fieldAndMethods;
  16.    private Hashtable staticMembers = new Hashtable(7);
  17.    private Hashtable staticFieldAndMethods;
  18.    private Constructor[] ctors;
  19.  
  20.    Object get(Scriptable var1, String var2, Object var3, boolean var4) {
  21.       Hashtable var5 = var4 ? this.staticMembers : this.members;
  22.       Object var6 = var5.get(var2);
  23.       if (var6 == null) {
  24.          throw this.reportMemberNotFound(var2);
  25.       } else if (var6 instanceof Scriptable) {
  26.          return var6;
  27.       } else {
  28.          Field var7 = (Field)var6;
  29.  
  30.          Object var8;
  31.          try {
  32.             var8 = var7.get(var4 ? null : var3);
  33.          } catch (IllegalAccessException var10) {
  34.             throw new RuntimeException("unexpected IllegalAccessException accessing Java field");
  35.          }
  36.  
  37.          Class var9 = var7.getType();
  38.          var1 = ScriptableObject.getTopLevelScope(var1);
  39.          return NativeJavaObject.wrap(var1, var8, var9);
  40.       }
  41.    }
  42.  
  43.    public void put(String var1, Object var2, Object var3, boolean var4) {
  44.       Hashtable var5 = var4 ? this.staticMembers : this.members;
  45.       Object var6 = var5.get(var1);
  46.       if (var6 == null) {
  47.          throw this.reportMemberNotFound(var1);
  48.       } else {
  49.          if (var6 instanceof FieldAndMethods) {
  50.             var6 = ((FieldAndMethods)var5.get(var1)).getField();
  51.          }
  52.  
  53.          Object var7 = null;
  54.  
  55.          try {
  56.             Field var12 = (Field)var6;
  57.             var12.set(var2, NativeJavaObject.coerceType(var12.getType(), var3));
  58.          } catch (ClassCastException var9) {
  59.             Object[] var13 = new Object[]{var1};
  60.             throw Context.reportRuntimeError(Context.getMessage("msg.java.method.assign", var13));
  61.          } catch (IllegalAccessException var10) {
  62.             throw new RuntimeException("unexpected IllegalAccessException accessing Java field");
  63.          } catch (IllegalArgumentException var11) {
  64.             Object[] var8 = new Object[]{var3.getClass().getName(), var7, var2.getClass().getName()};
  65.             throw Context.reportRuntimeError(Context.getMessage("msg.java.internal.field.type", var8));
  66.          }
  67.       }
  68.    }
  69.  
  70.    Constructor[] getConstructors() {
  71.       return this.ctors;
  72.    }
  73.  
  74.    JavaMembers(Scriptable var1, Class var2) {
  75.       this.field_0 = var2;
  76.       this.reflect(var1, var2);
  77.    }
  78.  
  79.    RuntimeException reportMemberNotFound(String var1) {
  80.       Object[] var2 = new Object[]{this.field_0.getName(), var1};
  81.       return Context.reportRuntimeError(Context.getMessage("msg.java.member.not.found", var2));
  82.    }
  83.  
  84.    static JavaMembers lookupClass(Scriptable var0, Class var1, Class var2) {
  85.       Class var3 = var1;
  86.       JavaMembers var4 = (JavaMembers)classTable.get(var1);
  87.       if (var4 != null) {
  88.          return var4;
  89.       } else {
  90.          if (var2 != null && var2 != var1 && !Modifier.isPublic(var1.getModifiers()) && Modifier.isPublic(var2.getModifiers())) {
  91.             var3 = var2;
  92.          }
  93.  
  94.          synchronized(classTable){}
  95.  
  96.          JavaMembers var7;
  97.          try {
  98.             var4 = (JavaMembers)classTable.get(var3);
  99.             if (var4 == null) {
  100.                var4 = new JavaMembers(var0, var3);
  101.                classTable.put(var3, var4);
  102.                var7 = var4;
  103.                return var7;
  104.             }
  105.  
  106.             var7 = var4;
  107.          } catch (Throwable var9) {
  108.             throw var9;
  109.          }
  110.  
  111.          return var7;
  112.       }
  113.    }
  114.  
  115.    Hashtable getFieldAndMethodsObjects(Object var1, boolean var2) {
  116.       Hashtable var3 = var2 ? this.staticFieldAndMethods : this.fieldAndMethods;
  117.       if (var3 == null) {
  118.          return null;
  119.       } else {
  120.          int var4 = var3.size();
  121.          Hashtable var5 = new Hashtable(var4);
  122.          Enumeration var6 = var3.elements();
  123.  
  124.          while(var4-- > 0) {
  125.             FieldAndMethods var7 = (FieldAndMethods)var6.nextElement();
  126.             var7 = (FieldAndMethods)var7.clone();
  127.             var7.setJavaObject(var1);
  128.             var5.put(var7.getName(), var7);
  129.          }
  130.  
  131.          return var5;
  132.       }
  133.    }
  134.  
  135.    void reflect(Scriptable var1, Class var2) {
  136.       Method[] var3 = var2.getMethods();
  137.  
  138.       for(int var4 = 0; var4 < var3.length; ++var4) {
  139.          this.reflectMethod(var1, var3[var4]);
  140.       }
  141.  
  142.       Field[] var6 = var2.getFields();
  143.  
  144.       for(int var5 = 0; var5 < var6.length; ++var5) {
  145.          this.reflectField(var6[var5]);
  146.       }
  147.  
  148.       this.ctors = var2.getConstructors();
  149.    }
  150.  
  151.    void reflectMethod(Scriptable var1, Method var2) {
  152.       int var3 = var2.getModifiers();
  153.       if (Modifier.isPublic(var3)) {
  154.          boolean var4 = Modifier.isStatic(var3);
  155.          Hashtable var5 = var4 ? this.staticMembers : this.members;
  156.          String var6 = var2.getName();
  157.          NativeJavaMethod var7 = (NativeJavaMethod)var5.get(var6);
  158.          if (var7 == null) {
  159.             var7 = new NativeJavaMethod();
  160.             ((ScriptableObject)var7).setParentScope(var1);
  161.             ((ScriptableObject)var7).setPrototype(ScriptableObject.getFunctionPrototype(var1));
  162.             var5.put(var6, var7);
  163.             var7.add(var2);
  164.          } else {
  165.             var7.add(var2);
  166.          }
  167.       }
  168.    }
  169.  
  170.    boolean has(String var1, boolean var2) {
  171.       Hashtable var3 = var2 ? this.staticMembers : this.members;
  172.       return var3.get(var1) != null;
  173.    }
  174.  
  175.    Object[] getIds(boolean var1) {
  176.       Hashtable var2 = var1 ? this.staticMembers : this.members;
  177.       int var3 = var2.size();
  178.       Object[] var4 = new Object[var3];
  179.       Enumeration var5 = var2.keys();
  180.  
  181.       for(int var6 = 0; var6 < var3; ++var6) {
  182.          var4[var6] = var5.nextElement();
  183.       }
  184.  
  185.       return var4;
  186.    }
  187.  
  188.    Class getReflectedClass() {
  189.       return this.field_0;
  190.    }
  191.  
  192.    void reflectField(Field var1) {
  193.       int var2 = var1.getModifiers();
  194.       if (Modifier.isPublic(var2)) {
  195.          boolean var3 = Modifier.isStatic(var2);
  196.          Hashtable var4 = var3 ? this.staticMembers : this.members;
  197.          String var5 = var1.getName();
  198.          Object var6 = var4.get(var5);
  199.          if (var6 != null) {
  200.             if (var6 instanceof NativeJavaMethod) {
  201.                NativeJavaMethod var7 = (NativeJavaMethod)var6;
  202.                Hashtable var8 = var3 ? this.staticFieldAndMethods : this.fieldAndMethods;
  203.                if (var8 == null) {
  204.                   var8 = new Hashtable(11);
  205.                   if (var3) {
  206.                      this.staticFieldAndMethods = var8;
  207.                   } else {
  208.                      this.fieldAndMethods = var8;
  209.                   }
  210.                }
  211.  
  212.                FieldAndMethods var9 = new FieldAndMethods(var7.getMethods(), var1);
  213.                var8.put(var5, var9);
  214.                var4.put(var5, var9);
  215.             } else if (var6 instanceof Field) {
  216.                throw new RuntimeException("cannot have multiple Java fields with same name");
  217.             } else {
  218.                throw new RuntimeException("unknown member type");
  219.             }
  220.          } else {
  221.             var4.put(var5, var1);
  222.          }
  223.       }
  224.    }
  225. }
  226.