costin      2002/12/26 10:12:39

  Added:       modeler/src/java/org/apache/commons/modeler/util
                        DomUtil.java IntrospectionUtils.java
  Log:
  2 small utils, used to run modeler whith no external dependencies
  ( except JAXP ).
  
  The code is taken from jakarta-tomcat-connectors, with minimal
  modifications ( more for DomUtil ).
  
  JMX doesn't use a lot of advanced introspection - and the current
  implementation does that directly ( the only dep on beanutils is via
  digester ). IntrospectionUtils is used mostly for Dom.
  
  Note that a lot of code in IU is not used - but I preffer to keep
  it in sync with j-t-c
  
  Revision  Changes    Path
  1.1                  
jakarta-commons/modeler/src/java/org/apache/commons/modeler/util/DomUtil.java
  
  Index: DomUtil.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  package org.apache.commons.modeler.util;
  
  import java.io.*;
  
  import javax.xml.parsers.*;
  
  import org.w3c.dom.*;
  import org.xml.sax.*;
  
  
  /**
   *  Few simple utils to read DOM
   *
   * @author Costin Manolache
   */
  public class DomUtil {
      private static org.apache.commons.logging.Log log=
          org.apache.commons.logging.LogFactory.getLog( DomUtil.class );
  
      // -------------------- DOM utils --------------------
  
      /** Get the content of a node
       */
      public static String getContent(Node n ) {
          if( n==null ) return null;
          Node n1=n.getFirstChild();
          // XXX Check if it's a text node
  
          String s1=n1.getNodeValue();
          return s1.trim();
      }
  
      /** Get the first element child.
       * @param parent lookup direct childs
       * @param name name of the element. If null return the first element.
       */
      public static Node getChild( Node parent, String name ) {
          if( parent==null ) return null;
          Node first=parent.getFirstChild();
          if( first==null ) return null;
  
          for (Node node = first; node != null;
               node = node.getNextSibling()) {
              //System.out.println("getNode: " + name + " " + node.getNodeName());
              if( node.getNodeType()!=Node.ELEMENT_NODE)
                  continue;
              if( name != null &&
                  name.equals( node.getNodeName() ) ) {
                  return node;
              }
          }
          return null;
      }
  
      public static String getAttribute(Node element, String attName ) {
          NamedNodeMap attrs=element.getAttributes();
          if( attrs==null ) return null;
          Node attN=attrs.getNamedItem(attName);
          if( attN==null ) return null;
          return attN.getNodeValue();
      }
  
      /** Get the first child's content ( i.e. it's included TEXT node )
       */
      public static String getChildContent( Node parent, String name ) {
          Node first=parent.getFirstChild();
          if( first==null ) return null;
          for (Node node = first; node != null;
               node = node.getNextSibling()) {
              //System.out.println("getNode: " + name + " " + node.getNodeName());
              if( name.equals( node.getNodeName() ) ) {
                  return getContent( node );
              }
          }
          return null;
      }
  
      /** Get the next sibling with the same name and type
       */
      public static Node getNext( Node current ) {
          String name=current.getNodeName();
          int type=current.getNodeType();
          return getNext( current, name, type);
      }
  
      public static Node getNext( Node current, String name, int type) {
          Node first=current.getNextSibling();
          if( first==null ) return null;
          for (Node node = first; node != null;
               node = node.getNextSibling()) {
              if( node.getNodeType() != type ) continue;
              //System.out.println("getNode: " + name + " " + node.getNodeName());
              if( name.equals( node.getNodeName() ) ) {
                  return node;
              }
          }
          return null;
      }
  
      public static class NullResolver implements EntityResolver {
          public InputSource resolveEntity (String publicId,
                                                     String systemId)
              throws SAXException, IOException
          {
              if( log.isTraceEnabled())
                  log.trace("ResolveEntity: " + publicId + " " + systemId);
              return new InputSource(new StringReader(""));
          }
      }
  
      public static void setAttributes( Object o, Node parent)
      {
          NamedNodeMap attrs=parent.getAttributes();
          if( attrs==null ) return;
  
          for (int i=0; i<attrs.getLength(); i++ ) {
              Node n=attrs.item(i);
              String name=n.getNodeName();
              String value=n.getNodeValue();
  
              if( log.isTraceEnabled() )
                  log.trace("Attribute " + parent.getNodeName() + " " +
                              name + "=" + value);
              try {
                  IntrospectionUtils.setProperty(o, name, value);
              } catch( Exception ex ) {
                  ex.printStackTrace();
              }
          }
      }
  
      /** Read XML as DOM.
       */
      public static Document readXml(InputStream is)
          throws SAXException, IOException, ParserConfigurationException
      {
          DocumentBuilderFactory dbf =
              DocumentBuilderFactory.newInstance();
  
          dbf.setValidating(false);
          dbf.setIgnoringComments(false);
          dbf.setIgnoringElementContentWhitespace(true);
          //dbf.setCoalescing(true);
          //dbf.setExpandEntityReferences(true);
  
          DocumentBuilder db = null;
          db = dbf.newDocumentBuilder();
          db.setEntityResolver( new NullResolver() );
  
          // db.setErrorHandler( new MyErrorHandler());
  
          Document doc = db.parse(is);
          return doc;
      }
  
  }
  
  
  
  1.1                  
jakarta-commons/modeler/src/java/org/apache/commons/modeler/util/IntrospectionUtils.java
  
  Index: IntrospectionUtils.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  
  
  package org.apache.commons.modeler.util;
  
  import java.lang.reflect.*;
  import java.net.*;
  import java.io.*;
  import java.util.*;
  
  // Depends:
  //    JDK1.1
  
  /**
   *  Utils for introspection and reflection
   *
   *  Source: jakarta-tomcat-connector/util
   */
  public final class IntrospectionUtils {
      static final Class NO_PARAMS[]=new Class[0];
      static final Class STRING_OBJ_PARAM[]=new Class[] {
          String.class, Object.class };
      static final Class STRING_PARAM[]=new Class[] {
          String.class };
  
      /** Execute a no-param method.
       */
      public static void execute( Object proxy, String method  )
        throws Exception
      {
        Method executeM=null;
        Class c=proxy.getClass();
        executeM=findMethod( c, method, NO_PARAMS );
        if( executeM == null ) {
            throw new RuntimeException("No method " + method + " in " +
                      proxy.getClass() );
        }
        executeM.invoke(proxy, null );
      }
  
      /**
       *  Call void setAttribute( String ,Object )
       */
      public static void setAttribute( Object proxy, String n, Object v)
        throws Exception
      {
        if( proxy instanceof AttributeHolder ) {
            ((AttributeHolder)proxy).setAttribute( n, v );
            return;
        }
  
        Method executeM=null;
        Class c=proxy.getClass();
        executeM=findMethod( c, "setAttribute", STRING_OBJ_PARAM );
  
        if( executeM == null ) {
            System.out.println("No setAttribute in " + proxy.getClass() );
            return;
        }
        executeM.invoke(proxy, new Object[] { n, v });
        return;
      }
  
  
      /**
       *  Call void getAttribute( String )
       */
      public static Object getAttribute( Object proxy, String n)
        throws Exception
      {
        Method executeM=null;
        Class c=proxy.getClass();
        executeM=findMethod( c, "getAttribute", STRING_PARAM);
        if( executeM == null ) {
            System.out.println("No getAttribute in " + proxy.getClass() );
            return null;
        }
        return executeM.invoke(proxy, new Object[] { n });
      }
  
  
      /** Construct a URLClassLoader. Will compile and work in JDK1.1 too.
       */
      public static ClassLoader getURLClassLoader( URL urls[],
                                                 ClassLoader parent )
      {
        try {
            Class urlCL=Class.forName( "java.net.URLClassLoader");
            Class paramT[]=new Class[2];
            paramT[0]= urls.getClass();
            paramT[1]=ClassLoader.class;
            Method m=findMethod( urlCL, "newInstance", paramT);
            if( m==null ) return null;
  
            ClassLoader cl=(ClassLoader)m.invoke( urlCL,
                                                  new Object[] { urls,
                                                                 parent } );
            return cl;
        } catch(ClassNotFoundException ex ) {
            // jdk1.1
            return null;
        } catch(Exception ex ) {
            ex.printStackTrace();
            return null;
        }
      }
  
  
      public static String guessInstall(String installSysProp,
                String homeSysProp, String jarName) {
        return guessInstall( installSysProp, homeSysProp, jarName, null);
      }
  
      /** Guess a product install/home by analyzing the class path.
       *  It works for product using the pattern: lib/executable.jar
       *  or if executable.jar is included in classpath by a shell
       *  script. ( java -jar also works )
       *
       *  Insures both "install" and "home" System properties are set.
       *  If either or both System properties are unset, "install" and
       *  "home" will be set to the same value.  This value will be
       *  the other System  property that is set, or the guessed value
       *  if neither is set.
       */
      public static String guessInstall(String installSysProp, String homeSysProp,
                        String jarName, String classFile) {
        String install=null;
        String home=null;
  
        if ( installSysProp != null )
            install=System.getProperty( installSysProp );
  
        if( homeSysProp != null )
            home=System.getProperty( homeSysProp );
  
        if ( install != null ) {
            if ( home == null )
                System.getProperties().put( homeSysProp, install );
            return install;
        }
  
        // Find the directory where jarName.jar is located
  
        String cpath=System.getProperty( "java.class.path");
        String pathSep=System.getProperty( "path.separator");
        StringTokenizer st=new StringTokenizer( cpath, pathSep );
        while( st.hasMoreTokens() ) {
            String path=st.nextToken();
            //      log( "path " + path );
            if( path.endsWith( jarName ) ) {
                home=path.substring( 0, path.length() - jarName.length() );
                try {
                      if( "".equals(home) ) {
                          home=new File("./").getCanonicalPath();
                      } else if( home.endsWith(File.separator) ) {
                        home = home.substring(0,home.length()-1);
                    }
                      File f=new File( home );
                    String parentDir = f.getParent();
                    if(parentDir == null)
                        parentDir = home;  // unix style
                    File f1=new File ( parentDir );
                    install = f1.getCanonicalPath();
                    if( installSysProp != null )
                        System.getProperties().put( installSysProp, install );
                    if( home == null && homeSysProp != null )
                        System.getProperties().put( homeSysProp, install );
                    return install;
                } catch( Exception ex ) {
                    ex.printStackTrace();
                }
            } else  {
                String fname=path + ( path.endsWith("/") ?"":"/" ) + classFile;
                if( new File( fname ).exists()) {
                    try {
                        File f=new File( path );
                        String parentDir = f.getParent();
                        if( parentDir == null )
                            parentDir = path; // unix style
                        File f1=new File ( parentDir );
                        install = f1.getCanonicalPath();
                        if( installSysProp != null )
                            System.getProperties().put( installSysProp,
                                                        install );
                        if( home == null && homeSysProp != null )
                            System.getProperties().put( homeSysProp, install );
                        return install;
                    } catch( Exception ex ) {
                        ex.printStackTrace();
                    }
                }
            }
        }
  
          // if install directory can't be found, use home as the default
        if ( home != null ) {
            System.getProperties().put( installSysProp, home );
            return home;
        }
  
        return null;
      }
  
      /** Debug method, display the classpath
       */
      public static void displayClassPath( String msg, URL[] cp ) {
        System.out.println(msg);
        for( int i=0; i<cp.length; i++ ) {
            System.out.println( cp[i].getFile() );
        }
      }
  
      public static String PATH_SEPARATOR = System.getProperty("path.separator");
      /**
       * Adds classpath entries from a vector of URL's to the
       * "tc_path_add" System property.  This System property lists
       * the classpath entries common to web applications. This System
       * property is currently used by Jasper when its JSP servlet
       * compiles the Java file for a JSP.
      */
      public static String classPathAdd(URL urls[], String cp )
      {
        if( urls==null ) return cp;
  
        for( int i=0; i<urls.length; i++ ) {
              if( cp != null)
                  cp += PATH_SEPARATOR + urls[i].getFile();
              else
                  cp = urls[i].getFile();
          }
          return cp;
      }
  
      /** Find a method with the right name
        If found, call the method ( if param is int or boolean we'll convert
        value to the right type before) - that means you can have setDebug(1).
      */
      public static void setProperty( Object o, String name, String value ) {
        if( dbg > 1 ) d("setProperty(" +
                        o.getClass() + " " +  name + "="  +
                        value  +")" );
  
        String setter= "set" +capitalize(name);
  
        try {
            Method methods[]=findMethods( o.getClass() );
            Method setPropertyMethod=null;
  
            // First, the ideal case - a setFoo( String ) method
            for( int i=0; i< methods.length; i++ ) {
                Class paramT[]=methods[i].getParameterTypes();
                if( setter.equals( methods[i].getName() ) &&
                    paramT.length == 1 &&
                    "java.lang.String".equals( paramT[0].getName())) {
  
                    methods[i].invoke( o, new Object[] { value } );
                    return;
                }
            }
  
            // Try a setFoo ( int ) or ( boolean )
            for( int i=0; i< methods.length; i++ ) {
                boolean ok=true;
                if( setter.equals( methods[i].getName() ) &&
                    methods[i].getParameterTypes().length == 1) {
  
                    // match - find the type and invoke it
                    Class paramType=methods[i].getParameterTypes()[0];
                    Object params[]=new Object[1];
  
                    // Try a setFoo ( int )
                    if ("java.lang.Integer".equals( paramType.getName()) ||
                        "int".equals( paramType.getName())) {
                        try {
                            params[0]=new Integer(value);
                        } catch( NumberFormatException ex ) {ok=false;}
  
                    // Try a setFoo ( boolean )
                    } else if ("java.lang.Boolean".
                               equals( paramType.getName()) ||
                        "boolean".equals( paramType.getName())) {
                        params[0]=new Boolean(value);
  
                    // Try a setFoo ( InetAddress )
                    } else if ("java.net.InetAddress".
                                equals( paramType.getName())){
                        try{
                            params[0]= InetAddress.getByName(value);
                        }catch(UnknownHostException exc) {
                            d("Unable to resolve host name:" + value);
                            ok=false;
                        }
  
                    // Unknown type
                    } else {
                        d("Unknown type " + paramType.getName() );
                    }
  
                    if( ok ) {
                        methods[i].invoke( o, params );
                        return;
                    }
                }
  
                // save "setProperty" for later
                if( "setProperty".equals( methods[i].getName())) {
                    setPropertyMethod=methods[i];
                }
            }
  
            // Ok, no setXXX found, try a setProperty("name", "value")
            if( setPropertyMethod != null ) {
                Object params[]=new Object[2];
                params[0]=name;
                params[1]=value;
                setPropertyMethod.invoke( o, params );
            }
  
        } catch( IllegalArgumentException ex2 ) {
              System.err.println("IAE " + o + " " + name + " " + value);
              ex2.printStackTrace();
        } catch( SecurityException ex1 ) {
            if( dbg > 0 )
                d("SecurityException for " + o.getClass() + " " +
                        name + "="  + value  +")" );
            if( dbg > 1 ) ex1.printStackTrace();
        } catch (IllegalAccessException iae) {
            if( dbg > 0 )
                d("IllegalAccessException for " +
                        o.getClass() + " " +  name + "="  + value  +")" );
            if( dbg > 1 ) iae.printStackTrace();
        } catch (InvocationTargetException ie) {
            if( dbg > 0 )
                d("InvocationTargetException for " + o.getClass() +
                        " " +  name + "="  + value  +")" );
            if( dbg > 1 ) ie.printStackTrace();
        }
      }
  
      public static Object getProperty( Object o, String name ) {
        String getter= "get" +capitalize(name);
  
        try {
            Method methods[]=findMethods( o.getClass() );
            Method getPropertyMethod=null;
  
            // First, the ideal case - a getFoo() method
            for( int i=0; i< methods.length; i++ ) {
                Class paramT[]=methods[i].getParameterTypes();
                if( getter.equals( methods[i].getName() ) &&
                    paramT.length == 0 ) {
                    return methods[i].invoke( o, null );
                }
  
                if( "getProperty".equals( methods[i].getName())) {
                    getPropertyMethod=methods[i];
                }
                if( "getAttribute".equals( methods[i].getName())) {
                    getPropertyMethod=methods[i];
                }
            }
  
            // Ok, no setXXX found, try a getProperty("name")
            if( getPropertyMethod != null ) {
                Object params[]=new Object[1];
                params[0]=name;
                getPropertyMethod.invoke( o, params );
            }
  
        } catch( IllegalArgumentException ex2 ) {
              System.err.println("IAE " + o + " " + name );
              ex2.printStackTrace();
        } catch( SecurityException ex1 ) {
            if( dbg > 0 )
                d("SecurityException for " + o.getClass() + " " +
                        name + ")" );
            if( dbg > 1 ) ex1.printStackTrace();
        } catch (IllegalAccessException iae) {
            if( dbg > 0 )
                d("IllegalAccessException for " +
                        o.getClass() + " " +  name  +")" );
            if( dbg > 1 ) iae.printStackTrace();
        } catch (InvocationTargetException ie) {
            if( dbg > 0 )
                d("InvocationTargetException for " + o.getClass() +
                        " " +  name   +")" );
            if( dbg > 1 ) ie.printStackTrace();
        }
          return null;
      }
  
      /**
       */
      public static void setProperty( Object o, String name ) {
        String setter= "set" +capitalize(name);
        try {
            Method methods[]=findMethods( o.getClass() );
            Method setPropertyMethod=null;
            // find setFoo() method
            for( int i=0; i< methods.length; i++ ) {
                Class paramT[]=methods[i].getParameterTypes();
                if( setter.equals( methods[i].getName() ) &&
                    paramT.length == 0 ) {
                    methods[i].invoke( o, new Object[] {} );
                    return;
                }
            }
        } catch( Exception ex1 ) {
            if( dbg > 0 )
                d("Exception for " + o.getClass() + " " + name);
            if( dbg > 1 ) ex1.printStackTrace();
        }
      }
  
      /** Replace ${NAME} with the property value
       *  @deprecated. Use the explicit method
       */
      public static String replaceProperties(String value,
                                           Object getter )
      {
          if( getter instanceof Hashtable )
              return replaceProperties( value, (Hashtable)getter, null );
  
          if( getter instanceof PropertySource ) {
              PropertySource src[]=new PropertySource[] {(PropertySource)getter};
              return replaceProperties( value, null,  src);
          }
          return value;
      }
  
      /** Replace ${NAME} with the property value
       */
      public static String replaceProperties(String value,
                                           Hashtable staticProp, PropertySource 
dynamicProp[] )
      {
          StringBuffer sb=new StringBuffer();
          int prev=0;
          // assert value!=nil
          int pos;
          while( (pos=value.indexOf( "$", prev )) >= 0 ) {
              if(pos>0) {
                  sb.append( value.substring( prev, pos ) );
              }
              if( pos == (value.length() - 1)) {
                  sb.append('$');
                  prev = pos + 1;
              }
              else if (value.charAt( pos + 1 ) != '{' ) {
                  sb.append( value.charAt( pos + 1 ) );
                  prev=pos+2; // XXX
              } else {
                  int endName=value.indexOf( '}', pos );
                  if( endName < 0 ) {
                    sb.append( value.substring( pos ));
                    prev=value.length();
                    continue;
                  }
                  String n=value.substring( pos+2, endName );
                String v= null;
                if( staticProp != null ) {
                    v=(String)((Hashtable)staticProp).get(n);
                }
                  if( v==null && dynamicProp != null) {
                      for( int i=0; i<dynamicProp.length; i++ ) {
                          v=dynamicProp[i].getProperty( n );
                          if( v!=null ) {
                              break;
                          }
                      }
                }
                if( v== null )
                    v = "${"+n+"}";
  
                  sb.append( v );
                  prev=endName+1;
              }
          }
          if( prev < value.length() ) sb.append( value.substring( prev ) );
          return sb.toString();
      }
  
      /** Reverse of Introspector.decapitalize
       */
      public static String capitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toUpperCase(chars[0]);
        return new String(chars);
      }
  
      public static String unCapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
      }
  
      // -------------------- Class path tools --------------------
  
      /** Add all the jar files in a dir to the classpath,
       *  represented as a Vector of URLs.
       */
      public static void addToClassPath( Vector cpV, String dir ) {
        try{
              String cpComp[]=getFilesByExt(dir, ".jar");
              if (cpComp != null){
                  int jarCount=cpComp.length;
                  for( int i=0; i< jarCount ; i++ ) {
                    URL url=getURL(  dir , cpComp[i] );
                      if( url!=null )
                        cpV.addElement( url );
                  }
              }
          }catch(Exception ex){
              ex.printStackTrace();
          }
      }
  
  
      public static void addToolsJar( Vector v )
      {
        try {
              // Add tools.jar in any case
              File f=new File( System.getProperty( "java.home" ) +
                               "/../lib/tools.jar");
  
              if( ! f.exists() ) {
                  // On some systems java.home gets set to the root of jdk.
                  // That's a bug, but we can work around and be nice.
                  f=new File( System.getProperty( "java.home" ) +
                                   "/lib/tools.jar");
                  if( f.exists() ) {
                      System.out.println("Detected strange java.home value " +
                                         System.getProperty( "java.home" ) +
                                         ", it should point to jre");
                  }
              }
              URL url=new URL( "file", "" , f.getAbsolutePath() );
  
            v.addElement( url );
        } catch ( MalformedURLException ex ) {
            ex.printStackTrace();
        }
      }
  
  
      /** Return all files with a given extension in a dir
       */
      public static String[] getFilesByExt( String ld, String ext ) {
        File dir = new File(ld);
          String[] names=null;
        final String lext=ext;
          if (dir.isDirectory()){
              names = dir.list( new FilenameFilter(){
              public boolean accept(File d, String name) {
                  if (name.endsWith(lext)){
                      return true;
                  }
                  return false;
              }
              });
          }
        return names;
      }
  
  
      /** Construct a file url from a file, using a base dir
       */
      public static URL getURL( String base, String file ) {
          try {
              File baseF = new File(base);
              File f = new File(baseF,file);
              String path = f.getCanonicalPath();
              if( f.isDirectory() ){
                      path +="/";
              }
            if( ! f.exists() ) return null;
              return new URL( "file", "", path );
          } catch (Exception ex) {
              ex.printStackTrace();
              return null;
          }
      }
  
      /**
       * add elements from the classpath <i>cp</i> to a Vector
       * <i>jars</i> as file URLs (We use Vector for JDK 1.1 compat).
       * <p>
       * @param <b>cp</b> a String classpath of directory or jar file
       *                    elements separated by path.separator delimiters.
       * @return a Vector of URLs.
       */
      public static void addJarsFromClassPath(Vector jars, String cp)
              throws IOException,MalformedURLException
      {
          String sep = System.getProperty("path.separator");
          String token;
          StringTokenizer st;
          if(cp!=null){
              st = new StringTokenizer(cp,sep);
              while(st.hasMoreTokens()){
                  File f = new File(st.nextToken());
                  String path = f.getCanonicalPath();
                  if(f.isDirectory()){
                          path += "/";
                  }
                  URL url = new URL("file","",path);
                  if(!jars.contains(url)){
                          jars.addElement(url);
                  }
              }
          }
      }
  
      /** Return a URL[] that can be used to construct a class loader
       */
      public static URL[] getClassPath(Vector v){
          URL[] urls=new URL[ v.size() ];
          for( int i=0; i<v.size(); i++ ) {
              urls[i]=(URL)v.elementAt( i );
          }
          return urls;
      }
  
      /** Construct a URL classpath from files in a directory,
       *  a cpath property, and tools.jar.
       */
      public static URL[] getClassPath( String dir, String cpath,
                                      String cpathProp, boolean addTools )
        throws IOException, MalformedURLException
      {
        Vector jarsV = new Vector();
        if( dir!=null ) {
            // Add dir/classes first, if it exists
            URL url=getURL( dir, "classes");
            if( url!=null )
                jarsV.addElement(url);
            addToClassPath( jarsV, dir );
        }
  
        if( cpath != null )
            addJarsFromClassPath(jarsV,cpath);
  
        if( cpathProp!=null ) {
            String cpath1=System.getProperty( cpathProp );
            addJarsFromClassPath(jarsV,cpath1);
        }
  
        if(addTools)
            addToolsJar( jarsV );
  
        return getClassPath(jarsV);
      }
  
      // -------------------- Mapping command line params to setters
  
      public static boolean processArgs(Object proxy, String args[] )
        throws Exception
      {
        String args0[]=null;
        if( null != findMethod( proxy.getClass(),
                                "getOptions1", new Class[] {} )) {
            args0=(String[])callMethod0( proxy, "getOptions1");
        }
  
        if( args0==null ) {
            //args0=findVoidSetters(proxy.getClass());
            args0=findBooleanSetters(proxy.getClass());
        }
        Hashtable h=null;
        if( null != findMethod( proxy.getClass(),
                                "getOptionAliases", new Class[] {} )) {
            h=(Hashtable)callMethod0( proxy, "getOptionAliases");
        }
        return processArgs( proxy, args, args0, null, h );
      }
  
      public static boolean processArgs(Object proxy, String args[],
                                      String args0[], String args1[],
                                      Hashtable aliases )
        throws Exception
      {
        for( int i=0; i< args.length; i++ ) {
            String arg=args[i];
            if( arg.startsWith("-"))
                arg=arg.substring(1);
            if( aliases != null && aliases.get( arg ) != null)
                arg=(String)aliases.get(arg);
  
            if( args0!=null ) {
                boolean set=false;
                for( int j=0; j< args0.length ; j++ ) {
                    if( args0[j].equalsIgnoreCase( arg )) {
                        setProperty( proxy, args0[j], "true");
                        set=true;
                        break;
                    }
                }
                if( set ) continue;
            }
            if( args1!=null ) {
                for( int j=0; j< args1.length ; j++ ) {
                    if( args1[j].equalsIgnoreCase( arg )) {
                        i++;
                        if( i >= args.length )
                            return false;
                        setProperty( proxy, arg, args[i]);
                        break;
                    }
                }
            } else {
                // if args1 is not specified,assume all other options have param
                i++;
                if( i >= args.length )
                    return false;
                setProperty( proxy,arg, args[i]);
            }
  
        }
        return true;
      }
  
      // -------------------- other utils  --------------------
      public static String[] findVoidSetters( Class c ) {
        Method m[]=findMethods( c );
        if( m==null ) return null;
        Vector v=new Vector();
        for( int i=0; i<m.length; i++ ) {
            if( m[i].getName().startsWith("set") &&
                m[i].getParameterTypes().length == 0 ) {
                String arg=m[i].getName().substring( 3 );
                v.addElement( unCapitalize( arg ));
            }
        }
        String s[]=new String[v.size()];
        for( int i=0; i<s.length; i++ ) {
            s[i]=(String)v.elementAt( i );
        }
        return s;
      }
  
      public static String[] findBooleanSetters( Class c ) {
        Method m[]=findMethods( c );
        if( m==null ) return null;
        Vector v=new Vector();
        for( int i=0; i<m.length; i++ ) {
            if( m[i].getName().startsWith("set") &&
                m[i].getParameterTypes().length == 1 &&
                "boolean".equalsIgnoreCase( m[i].getParameterTypes()[0].getName()) ) {
                String arg=m[i].getName().substring( 3 );
                v.addElement( unCapitalize( arg ));
            }
        }
        String s[]=new String[v.size()];
        for( int i=0; i<s.length; i++ ) {
            s[i]=(String)v.elementAt( i );
        }
        return s;
      }
  
      static Hashtable objectMethods=new Hashtable();
  
      public static Method[] findMethods( Class c ) {
        Method methods[]= (Method [])objectMethods.get( c );
        if( methods != null ) return methods;
  
        methods=c.getMethods();
        objectMethods.put( c, methods );
        return methods;
      }
  
      public static Method findMethod( Class c, String name, Class params[] ) {
        Method methods[] = findMethods( c );
        if( methods==null ) return null;
        for (int i = 0; i < methods.length; i++) {
            if (methods[i].getName().equals(name) ) {
                Class methodParams[]=methods[i].getParameterTypes();
                if( methodParams==null )
                    if( params==null || params.length==0 )
                        return methods[i];
                if( params==null )
                    if( methodParams==null || methodParams.length==0 )
                        return methods[i];
                if( params.length != methodParams.length )
                    continue;
                boolean found=true;
                for( int j=0; j< params.length; j++ ) {
                    if( params[j] != methodParams[j] ) {
                        found=false;
                        break;
                    }
                }
                if( found ) return methods[i];
            }
        }
        return null;
      }
  
      /** Test if the object implements a particular
       *  method
       */
      public static boolean hasHook( Object obj, String methodN ) {
        try {
            Method myMethods[]=findMethods( obj.getClass() );
            for( int i=0; i< myMethods.length; i++ ) {
                if( methodN.equals ( myMethods[i].getName() )) {
                    // check if it's overriden
                    Class declaring=myMethods[i].getDeclaringClass();
                    Class parentOfDeclaring=declaring.getSuperclass();
                    // this works only if the base class doesn't extend
                    // another class.
  
                    // if the method is declared in a top level class
                    // like BaseInterceptor parent is Object, otherwise
                    // parent is BaseInterceptor or an intermediate class
                    if( ! "java.lang.Object".
                        equals(parentOfDeclaring.getName() )) {
                        return true;
                    }
                }
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        }
        return false;
      }
  
      public static void callMain( Class c, String args[] )
        throws Exception
      {
        Class p[]=new Class[1];
        p[0]=args.getClass();
        Method m=c.getMethod( "main", p);
        m.invoke( c, new Object[] {args} );
      }
  
      public static Object callMethod1( Object target,
                                    String methodN,
                                    Object param1,
                                    String typeParam1,
                                    ClassLoader cl)
        throws Exception
      {
        if( target==null || param1==null ) {
            d("Assert: Illegal params " + target + " " + param1 );
        }
        if( dbg > 0 ) d("callMethod1 " + target.getClass().getName() +
                        " " + param1.getClass().getName() +
                        " " + typeParam1 );
  
        Class params[]=new Class[1];
        if( typeParam1==null )
            params[0]=param1.getClass();
        else
            params[0]=cl.loadClass( typeParam1 );
        Method m=findMethod( target.getClass(), methodN, params);
        if( m==null )
            throw new NoSuchMethodException(target.getClass().getName() +
                                            " " + methodN);
        return m.invoke(target,  new Object[] {param1 } );
      }
  
      public static Object callMethod0( Object target,
                                    String methodN)
        throws Exception
      {
        if( target==null ) {
            d("Assert: Illegal params " + target );
            return null;
        }
        if( dbg > 0 )
            d("callMethod0 " + target.getClass().getName() + "." + methodN);
  
        Class params[]=new Class[0];
        Method m=findMethod( target.getClass(), methodN, params);
        if( m==null )
            throw new NoSuchMethodException(target.getClass().getName() +
                                            " " + methodN);
        return m.invoke(target,  emptyArray );
      }
  
      static Object[] emptyArray=new Object[] {};
  
      public static Object callMethodN( Object target,  String methodN,
                                    Object params[],  Class typeParams[] )
        throws Exception
      {
        Method m=null;
        m=findMethod( target.getClass(), methodN, typeParams );
          if( m== null ) {
            d("Can't find method " + methodN + " in " +
              target + " CLASS " + target.getClass());
            return null;
        }
        Object o=m.invoke( target, params );
  
        if(dbg > 0 ) {
            // debug
            StringBuffer sb=new StringBuffer();
            sb.append("" + target.getClass().getName() + "." + methodN + "( " );
            for(int i=0; i<params.length; i++ ) {
                if(i>0) sb.append( ", ");
                sb.append(params[i]);
            }
            sb.append(")");
            d(sb.toString());
        }
        return o;
      }
  
      // -------------------- Get property --------------------
      // This provides a layer of abstraction
  
      public static interface PropertySource {
  
        public String getProperty( String key );
  
      }
  
      public static interface AttributeHolder {
  
        public void setAttribute( String key, Object o );
  
      }
  
  
      // debug --------------------
      static final int dbg=0;
      static void d(String s ) {
        System.out.println("IntrospectionUtils: " + s );
      }
  }
  
  
  

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

Reply via email to