Hi Victor,
Mind attaching the patch as a unified diff, please? It's easier to read.
  
Sure, please find it enclosed.

There are two things here:
  • bug fixes w.r.t. handling of primitive data types resp. their "boxing"/"unboxing",
  • one deals with a pecularity on Java 1.1.8 (yes, very old, yet there are people/business still using it); the test in the anonymous static block for "setAccessible" is carried out that way, in order to allow to determine the availablity also on non-Sun-Java compliant implementations of Java.
If you have any questions please let me know.

Regards,

---rony



--- E:\svnrgf\remote\bsf\src\org\apache\bsf\util\EngineUtils.java       
2004-06-14 19:29:41.000000000 +0200
+++ EngineUtils.java    2005-06-07 11:37:28.114998400 +0200
@@ -1,7 +1,7 @@
 /*
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 2004 The Apache Software Foundation.  All rights
+ * Copyright (c) 2002 The Apache Software Foundation.  All rights
  * reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -75,6 +75,25 @@
     // temp directory
     static BSFClassLoader bsfCL;
 
+  // ---rgf, 2003-02-13, determine whether changing accessibility of Methods 
is possible
+  static boolean bMethodHasSetAccessible=false;
+
+  // ---rgf, 2003-02-13, determine whether changing accessibility of Methods 
is possible
+  static {
+      Class mc=Method.class;            // get the "Method" class object
+      Class arg[]={boolean.class};      // define an array with the primitive 
"boolean" pseudo class object
+      try {
+          Object o=mc.getMethod("setAccessible", arg ); // is this method 
available?
+          bMethodHasSetAccessible=true; // no exception, hence method exists
+      }
+      catch (Exception e)
+      {
+          bMethodHasSetAccessible=false;// exception occurred, hence method 
does not exist
+      }
+  }
+
+  //////////////////////////////////////////////////////////////////////////
+
     /**
      * Add a script as a listener to some event coming out of an object. The
      * first two args identify the src of the event and the event set
@@ -87,7 +106,7 @@
      * @param engine       BSFEngine which can run this script
      * @param manager      BSFManager of the above engine
      * @param source       (context info) the source of this expression 
-     *                                    (e.g., filename)
+                                                (e.g., filename)
      * @param lineNo       (context info) the line number in source for expr
      * @param columnNo     (context info) the column number in source for expr
      * @param script       the script to execute when the event occurs
@@ -95,23 +114,23 @@
      * @exception BSFException if anything goes wrong while running the script
      */
     public static void addEventListener (Object bean, String eventSetName,
-                                         String filter, BSFEngine engine, 
-                                         BSFManager manager, String source,
-                                         int lineNo, int columnNo, 
-                                         Object script) throws BSFException {
+                                      String filter,
+                                      BSFEngine engine, BSFManager manager,
+                                      String source, int lineNo,
+                                      int columnNo, Object script)
+          throws BSFException {
         BSFEventProcessor ep = new BSFEventProcessor (engine, manager, filter,
                                                       source, lineNo, columnNo,
                                                       script);
-        
         try {
             ReflectionUtils.addEventListener (bean, eventSetName, ep);
         } catch (Exception e) {
             e.printStackTrace ();
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
-                                    "ouch while adding event listener: " 
-                                    + e, e);
+                             "ouch while adding event listener: " + e, e);
         }
     }
+  //////////////////////////////////////////////////////////////////////////
 
     /**
      * Finds and invokes a method with the given signature on the given
@@ -130,10 +149,8 @@
      */
     public static Object callBeanMethod (Object bean, String methodName, 
                                          Object[] args) throws BSFException {
+       // determine arg types. note that a null argtype matches any object type
         Class[] argTypes = null;
-        // determine arg types. note that a null argtype 
-        // matches any object type
-    
         if (args != null) {
             argTypes = new Class[args.length];
             for (int i = 0; i < args.length; i++) {
@@ -144,13 +161,11 @@
         // we want to allow a static call to occur on an object, similar
         // to what Java allows. So isStaticOnly is set to false. 
         boolean isStaticOnly = false;
-        Class beanClass = (bean instanceof Class) ? (Class)bean : 
-                                                    bean.getClass ();
+       Class beanClass = (bean instanceof Class) ? (Class)bean : bean.getClass 
();
 
         // now try to call method with the right signature
         try {
-            Method m = null;
-            
+         Method m;
             try {
                 m = MethodUtils.getMethod (beanClass, methodName, argTypes,
                                            isStaticOnly);
@@ -161,23 +176,27 @@
                 // if args is null the NullPointerException will get caught
                 // below and the right thing'll happen .. ugly but works
                     for (int i = 0; i < args.length; i++) {
-                        if (args[i] instanceof Number) {
+           if (args[i] instanceof Number)
+            {
                         // byte is convertible to all primitive numeric types, 
                         // so this'll find anything in that order and the
                         // actual type will be that specified by the method 
decl
-                            argTypes[i] = byte.class;
-                            if(args[i] instanceof Float) 
-                                argTypes[i] = float.class;
-                            else if(args[i] instanceof Double) 
-                                argTypes[i] = double.class;
+             if      (args[i] instanceof Byte)    argTypes[i] = byte.class;
+                    // 2005-06-08, rgf, *must* be given, or signatures not 
found!
+              else if (args[i] instanceof Short  ) argTypes[i] = short.class;
+              else if (args[i] instanceof Integer) argTypes[i] = int.class;
+              else if (args[i] instanceof Long)    argTypes[i] = long.class;
+
+             else if (args[i] instanceof Float)   argTypes[i] = float.class;
+             else if (args[i] instanceof Double ) argTypes[i] = double.class;
+           }
+            else if (args[i] instanceof Boolean)   argTypes[i] = boolean.class;
+            // ---rgf, handle also the case of "Character"
+            else if (args[i] instanceof Character) argTypes[i] = char.class;
                         }
-                        else if (args[i] instanceof Boolean) 
-                            argTypes[i] = boolean.class;
-                        else if (args[i] instanceof Character)
-                            argTypes[i] = char.class;
-                    }
-                    m = MethodUtils.getMethod (beanClass, methodName,
-                                               argTypes, isStaticOnly);
+
+         m = MethodUtils.getMethod (beanClass, methodName, argTypes,
+                                        isStaticOnly);
                 } catch (Exception e2) {
                     // throw the original
                     throw e;
@@ -185,7 +204,21 @@
             }
 
             // call it, and return the result
+      try {
             return m.invoke (bean, args);
+      }
+      catch (Exception e3)                   // 2003-02-23, --rgf, maybe an 
IllegalAccessException?
+      {
+          if (e3 instanceof IllegalAccessException &&
+              bMethodHasSetAccessible &&
+              Modifier.isPublic(m.getModifiers())   )   // if a public method 
allow access to it
+          {
+              m.setAccessible(true);        // allow unconditional access to 
method
+         return m.invoke (bean, args);
+          }
+         // re-throw the exception
+         throw e3;
+      }
 
         } catch (Exception e) {
             // something went wrong while invoking method
@@ -194,13 +227,13 @@
                           null;
             throw new BSFException (BSFException.REASON_OTHER_ERROR,
                                     "method invocation failed: " + e +
-                                    ((t==null) ? "" : 
-                                     (" target exception: " + t)), t);
+                             ((t==null)?"":(" target exception: "+t)), t);
         }
     }
+  //////////////////////////////////////////////////////////////////////////
 
     /**
-     * Creates a new bean. The signature of the constructor that's invoked
+   * Creates a new bean. The signature of teh constructor that's invoked
      * is first taken as the types of the args, but if that fails, this tries
      * to convert any primitive wrapper type args to their primitive 
      * counterparts to see whether a method exists that way. If it does, done.
@@ -214,11 +247,11 @@
      *            org.apache.cs.util.MethodUtils for the real
      *            exceptions that can occur).
      */
-    public static Object createBean (String className, Object args[]) 
-        throws BSFException {
+  public static Object createBean (String className,
+                                  Object args[]) throws BSFException {
         Bean obj;
-        Class[] argTypes = null;
 
+       Class[] argTypes = null;
         if (args != null) {
             argTypes = new Class[args.length];
             for (int i = 0; i < args.length; i++) {
@@ -228,8 +261,7 @@
 
         try {
             try {
-                obj = ReflectionUtils.createBean (null, className, 
-                                                  argTypes, args);
+       obj = ReflectionUtils.createBean (null, className, argTypes, args);
                 return obj.value;
             } catch (NoSuchMethodException me) {
                 // ok, so that didn't work - now try converting any primitive
@@ -238,15 +270,16 @@
                     // if args is null the NullPointerException will get caught
                     // below and the right thing'll happen .. ugly but works
                     for (int i = 0; i < args.length; i++) {
-                        if (args[i] instanceof Number)
+           if (args[i] instanceof Number) {
+             // byte is convertible to all primitive numeric types,
+             // so this'll find anything in that order and the
+             // actual type will be that specified by the method decl
                             argTypes[i] = byte.class;
-                        else if (args[i] instanceof Boolean)
+           } else if (args[i] instanceof Boolean) {
                             argTypes[i] = boolean.class;
-                        else if (args[i] instanceof Character)
-                            argTypes[i] = char.class;
                     }
-                    obj = ReflectionUtils.createBean (null, className, 
-                                                      argTypes, args);
+         }
+         obj = ReflectionUtils.createBean (null, className, argTypes, args);
                     return obj.value;
                 } catch (Exception e) {
                     // throw the previous exception
@@ -258,6 +291,7 @@
                                     e.getMessage (), e);
         }
     }
+  //////////////////////////////////////////////////////////////////////////
 
     /**
      * Given a class return the type signature string fragment for it.
@@ -269,24 +303,25 @@
      */
     public static String getTypeSignatureString (Class cl) {
         if (cl.isPrimitive ()) {
-            if (cl == boolean.class) 
+         if (cl == boolean.class) {
                 return "Z";
-            else if (cl == byte.class) 
+         } else if (cl == byte.class) {
                 return "B";
-            else if (cl == char.class) 
+         } else if (cl == char.class) {
                 return "C";
-            else if (cl == short.class) 
+         } else if (cl == short.class) {
                 return "S";
-            else if (cl == int.class) 
+         } else if (cl == int.class) {
                 return "I";
-            else if (cl == long.class) 
+         } else if (cl == long.class) {
                 return "J";
-            else if (cl == float.class) 
+         } else if (cl == float.class) {
                 return "F";
-            else if (cl == double.class) 
+         } else if (cl == double.class) {
                 return "D";
-            else 
+         } else { // (cl == void.class)
                 return "V";
+         }
         } else {
             StringBuffer sb = new StringBuffer ("L");
             sb.append (cl.getName ());
@@ -294,6 +329,7 @@
             return sb.toString().replace ('.', '/');
         }
     }
+  //////////////////////////////////////////////////////////////////////////
 
     /**
      * Load a class using the class loader of given manager. If that fails
@@ -310,15 +346,15 @@
     public static Class loadClass (BSFManager mgr, String name) 
         throws BSFException {
         ClassLoader classLoader = mgr.getClassLoader ();
-
         try {
             return (classLoader == null) ? Class.forName (name)
                 : classLoader.loadClass (name);
         } catch (ClassNotFoundException e) {
             // try to load it from the temp dir using my own class loader
             try {
-                if (bsfCL == null)
+       if (bsfCL == null) {
                     bsfCL = new BSFClassLoader ();
+       }
                 bsfCL.setTempDir (mgr.getTempDir ());
                 return bsfCL.loadClass (name);
             } catch (ClassNotFoundException e2) {

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to