User: schaefera
  Date: 01/06/25 11:28:52

  Modified:    src/main/org/jboss/jmx/server XMLAdaptorImpl.java
                        XMLTestService.java
  Log:
  Fixed some problems and add the "create-mbean" support.
  
  Revision  Changes    Path
  1.2       +267 -68   jboss/src/main/org/jboss/jmx/server/XMLAdaptorImpl.java
  
  Index: XMLAdaptorImpl.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/jmx/server/XMLAdaptorImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XMLAdaptorImpl.java       2001/06/23 08:48:42     1.1
  +++ XMLAdaptorImpl.java       2001/06/25 18:28:52     1.2
  @@ -6,19 +6,24 @@
   */
   package org.jboss.jmx.server;
   
  +import java.beans.PropertyEditor;
  +import java.beans.PropertyEditorManager;
  +import java.util.Hashtable;
   import java.util.Iterator;
   import java.util.Vector;
   
   import javax.management.Attribute;
  +import javax.management.AttributeList;
   import javax.management.ObjectName;
  -import javax.management.QueryExp;
   import javax.management.ObjectInstance;
  -import javax.management.AttributeNotFoundException;
  -import javax.management.InstanceNotFoundException;
  -import javax.management.InvalidAttributeValueException;
  +// import javax.management.AttributeNotFoundException;
  +// import javax.management.InstanceNotFoundException;
  +// import javax.management.InvalidAttributeValueException;
  +import javax.management.MalformedObjectNameException;
  +import javax.management.MBeanAttributeInfo;
   import javax.management.MBeanException;
  -import javax.management.ReflectionException;
   import javax.management.MBeanServer;
  +// import javax.management.ReflectionException;
   import javax.naming.InitialContext;
   
   import org.w3c.dom.Document;
  @@ -31,7 +36,7 @@
   *
   * @author Andreas Schaefer ([EMAIL PROTECTED])
   * @created June 22, 2001
  -* @version $Revision: 1.1 $
  +* @version $Revision: 1.2 $
   */
   public class XMLAdaptorImpl
   {
  @@ -43,7 +48,22 @@
   
     // Static --------------------------------------------------------
   
  -  // Constructors --------------------------------------------------
  +  /** Primitive type name -> class map. */
  +  private static Hashtable mPrimitives = new Hashtable();
  +  
  +  /** Setup the primitives map. */
  +  static {
  +    mPrimitives.put( "boolean", Boolean.TYPE );
  +    mPrimitives.put( "byte", Byte.TYPE );
  +    mPrimitives.put( "short", Short.TYPE );
  +    mPrimitives.put( "int", Integer.TYPE );
  +    mPrimitives.put( "long", Long.TYPE );
  +    mPrimitives.put( "float", Float.TYPE );
  +    mPrimitives.put( "double", Double.TYPE );
  +    mPrimitives.put( "char", Character.TYPE );
  +  }
  +
  +   // Constructors --------------------------------------------------
   
     /**
     *  Constructor for the JMXAdaptorImpl object
  @@ -59,10 +79,15 @@
   
     public Object[] invokeXML( Document pJmxOperations ) {
       Vector lReturns = new Vector();
  -    NodeList lOperations = pJmxOperations.getChildNodes();
  -    for( int i = 0; i < lOperations.getLength(); i++ ) {
  -      Element lChildElement = (Element) lOperations.item( i );
  -      lReturns.add( invokeXML( lChildElement ) );
  +    NodeList lRoot = pJmxOperations.getChildNodes();
  +    if( lRoot.getLength() > 0 ) {
  +      Element lRootElement = (Element) lRoot.item( 0 );
  +      System.out.println( "XMLAdaptorImpl.invokeXML(), root: " + lRootElement );
  +      NodeList lOperations = lRootElement.getChildNodes();
  +      for( int i = 0; i < lOperations.getLength(); i++ ) {
  +        Element lChildElement = (Element) lOperations.item( i );
  +        lReturns.add( invokeXML( lChildElement ) );
  +      }
       }
       return (Object[]) lReturns.toArray( new Object[ 0 ] );
     }
  @@ -73,74 +98,248 @@
       }
       // Get the requested operation
       String lTag = pJmxOperation.getTagName();
  +    System.out.println( "XMLAdaptorImpl.invokeXML(), Tag: " + lTag );
       if( "invoke".equals( lTag ) ) {
         // Get the operation, Object Name and attributes and invoke it
         String lOperation = pJmxOperation.getAttribute( "operation" );
  -      if( !"".equals( lOperation ) ) {
  +      return invoke(
  +        lOperation,
  +        pJmxOperation.getElementsByTagName( "object-name" ),
  +        pJmxOperation.getElementsByTagName( "attribute" )
  +      );
  +    }
  +    else if( !"create-mbean".equals( lTag ) ) {
           NodeList lList = pJmxOperation.getElementsByTagName( "object-name" );
  -        if( lList.getLength() > 0 ) {
  -          try {
  -            Node lNodeName = lList.item( 0 );
  -            ObjectName lName = null;
  -            switch( lNodeName.getNodeType() ) {
  -              case Node.ELEMENT_NODE:
  -                Element lElementName = (Element) lNodeName;
  -                lName = new ObjectName( lElementName.getAttribute( "name" ) );
  -                break;
  -            }
  -            // Get attribute values and types
  -            NodeList lAttributeList = pJmxOperation.getElementsByTagName( 
"attribute" );
  -            Object[] lObjects = new Object[ lAttributeList.getLength() ];
  -            String[] lTypes = new String[ lAttributeList.getLength() ];
  -            for( int i = 0; i < lAttributeList.getLength(); i++ ) {
  -              Node lAttributeNode = lAttributeList.item( i );
  -              Element lAttributeElement = (Element) lAttributeNode;
  -              lTypes[ i ] = lAttributeElement.getAttribute( "type" );
  -              if( "int".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Integer( lAttributeElement.getAttribute( 
"value" ) );
  -              }
  -              else if( "short".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Short( lAttributeElement.getAttribute( "value" 
) );
  -              }
  -              else if( "byte".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Byte( lAttributeElement.getAttribute( "value" ) 
);
  -              }
  -              else if( "char".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Character( lAttributeElement.getAttribute( 
"value" ).charAt( 0 ) );
  -              }
  -              else if( "long".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Long( lAttributeElement.getAttribute( "value" ) 
);
  -              }
  -              else if( "float".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Float( lAttributeElement.getAttribute( "value" 
) );
  -              }
  -              else if( "double".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Double( lAttributeElement.getAttribute( "value" 
) );
  -              }
  -              else if( "boolean".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new Boolean( lAttributeElement.getAttribute( 
"value" ) );
  -              }
  -              else if( "java.lang.String".equals( lTypes[ i ] ) ) {
  -                lObjects[ i ] = new String( lAttributeElement.getAttribute( "value" 
) );
  -              }
  -            }
  -            // Invoke the method and return the value
  -            return mServer.invoke(
  +      // Get the operation, Object Name and attributes and invoke it
  +      String lCodebase = pJmxOperation.getAttribute( "code" );
  +      String lName = pJmxOperation.getAttribute( "name" );
  +      return createMBean(
  +        lCodebase,
  +        lName,
  +        pJmxOperation.getElementsByTagName( "object-name" ),
  +        pJmxOperation.getElementsByTagName( "constructor" ),
  +        pJmxOperation.getElementsByTagName( "attribute" )
  +      );
  +    }
  +    return null;
  +  }
  +
  +  public ObjectName createMBean(
  +    String pCodebase,
  +    String pName,
  +    NodeList pObjectName,
  +    NodeList pConstructor,
  +    NodeList pAttributes
  +  ) {
  +    ObjectName lReturn = null;
  +    // Check Codebase
  +    if( pCodebase != null && !pCodebase.equals( "" ) ) {
  +      try {
  +        // Create ObjectName
  +        ObjectName lName = null;
  +        if( pName != null && !pName.equals( "" ) ) {
  +          lName = createObjectName( pName );
  +        }
  +        else if( pObjectName != null && pObjectName.getLength() > 0 ) {
  +          lName = createObjectName( (Element) pObjectName.item( 0 ) );
  +        }
  +        if( lName != null ) {
  +          ObjectInstance lNew = null;
  +          if( pConstructor.getLength() == 0 ) {
  +            lNew = mServer.createMBean( pCodebase, lName );
  +          }
  +          else {
  +            // Get the Constructor Values
  +            Object[][] lAttributes = getAttributes(
  +              ( (Element) pConstructor.item( 0 ) ).getElementsByTagName( "argument" 
)
  +            );
  +            lNew = mServer.createMBean(
  +              pCodebase,
                 lName,
  -              lOperation,
  -              lObjects,
  -              lTypes
  +              lAttributes[ 0 ],
  +              (String[]) lAttributes[ 1 ]
               );
  -          }
  -          catch( Exception e ) {
  -            e.printStackTrace();
             }
  +          // Now loop over the attributes and set them
  +          Object[][] lAttributes = getAttributes(
  +            lNew.getObjectName(),
  +            pAttributes
  +          );
  +          applyAttributes(
  +            lNew.getObjectName(),
  +            (String[]) lAttributes[ 1 ],
  +            (Object[]) lAttributes[ 0 ]
  +          );
  +          
  +          lReturn = lNew.getObjectName();
           }
         }
  +      catch( Exception e ) {
  +        e.printStackTrace();
  +      }
       }
  -    return null;
  +    return lReturn;
     }
   
  +  public Object invoke( String pOperation, NodeList pObjectName, NodeList 
pAttributes ) {
  +    Object lReturn = null;
  +    System.out.println( "XMLAdaptorImpl.invoke(), Operation: " + pOperation );
  +    if( pOperation != null && !pOperation.equals( "" ) &&
  +        pObjectName != null && pObjectName.getLength() > 0 )
  +    {
  +      try {
  +        ObjectName lName = createObjectName( (Element) pObjectName.item( 0 ) );
  +        if( pAttributes != null && pAttributes.getLength() > 0 ) {
  +          Object[][] lAttributes = getAttributes(
  +            pAttributes
  +          );
  +          // Invoke the method and return the value
  +          lReturn = mServer.invoke(
  +            lName,
  +            pOperation,
  +            lAttributes[ 0 ],
  +            (String[]) lAttributes[ 1 ]
  +          );
  +        }
  +        else {
  +          // Invoke the method and return the value
  +          lReturn = mServer.invoke(
  +            lName,
  +            pOperation,
  +            new Object[] {},
  +            new String[] {}
  +          );
  +        }
  +      }
  +      catch( Exception e ) {
  +        e.printStackTrace();
  +      }
  +    }
  +    return lReturn;
  +  }
     // Protected -----------------------------------------------------
  -}
  +  
  +  protected ObjectName createObjectName( String pName )
  +    throws
  +      MalformedObjectNameException
  +  {
  +    return new ObjectName( pName );
  +  }
  +  
  +  protected ObjectName createObjectName( Element pObjectName )
  +    throws
  +      MalformedObjectNameException
  +  {
  +    if( pObjectName.hasAttribute( "name" ) ) {
  +      return new ObjectName( pObjectName.getAttribute( "name" ) );
  +    }
  +    else {
  +      String lDomain = null;
  +      if( pObjectName.hasAttribute( "domain" ) ) {
  +        lDomain = pObjectName.getAttribute( "domain" );
  +      }
  +      Hashtable lProperties = new Hashtable();
  +      NodeList lPropertyList = pObjectName.getElementsByTagName( "property" );
  +      for( int i = 0; i < lPropertyList.getLength(); i++ ) {
  +        Element lProperty = (Element) lPropertyList.item( i );
  +        if( lProperty.hasAttribute( "key" ) && lProperty.hasAttribute( "value" ) ) {
  +          lProperties.put( lProperty.getAttribute( "key" ), lProperty.getAttribute( 
"value" ) );
  +        }
  +      }
  +      return new ObjectName( lDomain, lProperties );
  +    }
  +  }
   
  +  protected Object[][] getAttributes( NodeList pAttributes ) {
  +    Object[] lReturn = new Object[ 2 ];
  +    Object[] lValues = new Object[ pAttributes.getLength() ];
  +    String[] lTypes = new String[ pAttributes.getLength() ];
  +    // Loop through argument list and create type and values
  +    for( int i = 0; i < pAttributes.getLength(); i++ ) {
  +      try {
  +        Element lArgument = (Element) pAttributes.item( 0 );
  +        String lTypeString = lArgument.getAttribute( "type" );
  +        String lValueString = lArgument.getAttribute( "value" );
  +        Class lClass = null;
  +        if( mPrimitives.containsKey( lTypeString ) ) {
  +          lClass = (Class) mPrimitives.get( lTypeString );
  +        }
  +        else {
  +         lClass = Thread.currentThread().getContextClassLoader().loadClass( 
lTypeString );
  +        }
  +        PropertyEditor lEditor = PropertyEditorManager.findEditor( lClass );
  +        lEditor.setAsText( lValueString );
  +        lValues[ i ] = lEditor.getValue();
  +        lTypes[ i ] = lClass.getName();
  +      }
  +      catch( Exception e ) {
  +        e.printStackTrace();
  +      }
  +    }
  +    lReturn[ 0 ] = lValues;
  +    lReturn[ 1 ] = lTypes;
  +    return (Object[][]) lReturn;
  +  }
  +  protected Object[][] getAttributes( ObjectName pName, NodeList pAttributes ) {
  +    Object[] lReturn = new Object[ 2 ];
  +    Object[] lValues = new Object[ pAttributes.getLength() ];
  +    String[] lTypes = new String[ pAttributes.getLength() ];
  +
  +    try {
  +      MBeanAttributeInfo[] attributes = mServer.getMBeanInfo( pName 
).getAttributes();
  +      // Loop through argument list and create type and values
  +      for( int i = 0; i < pAttributes.getLength(); i++ ) {
  +        Element lArgument = (Element) pAttributes.item( 0 );
  +        String lNameString = lArgument.getAttribute( "name" );
  +        String lValueString = lArgument.getAttribute( "value" );
  +        for( int k = 0; k < attributes.length; k++ ) {
  +          if( attributes[ k ].getName().equals( lNameString ) ) { 
  +            String lTypeString = attributes[ k ].getType();
  +            Class lClass;
  +            if( mPrimitives.containsKey( lTypeString ) ) {
  +               lClass = (Class) mPrimitives.get( lTypeString );
  +            }
  +            else {
  +              lClass = Thread.currentThread().getContextClassLoader().loadClass( 
lTypeString );
  +            }
  +            PropertyEditor lEditor = PropertyEditorManager.findEditor( lClass );
  +            lEditor.setAsText( lValueString );
  +            lValues[ i ] = lEditor.getValue();
  +            lTypes[ i ] = lClass.getName();
  +          }
  +        }
  +      }
  +    }
  +    catch( Exception e ) {
  +      e.printStackTrace();
  +    }
  +    lReturn[ 0 ] = lValues;
  +    lReturn[ 1 ] = lTypes;
  +    return (Object[][]) lReturn;
  +  }
  +  
  +  protected void applyAttributes(
  +    ObjectName pName,
  +    String[] pNames,
  +    Object[] pValues
  +  ) {
  +    try {
  +      if( pName != null && pNames != null && pValues != null ) {
  +        if( pNames.length == pValues.length ) {
  +          AttributeList lList = new AttributeList();
  +          for( int i = 0; i < pNames.length; i++ ) {
  +            String lName = pNames[ i ];
  +            if( lName != null && !lName.equals( "" ) ) {
  +              // Create Value from attribute type and given string representation
  +              lList.add( new Attribute( lName, pValues[ i ] ) );
  +            }
  +          }
  +          mServer.setAttributes( pName, lList );
  +        }
  +      }
  +    }
  +    catch( Exception e ) {
  +      e.printStackTrace();
  +    }
  +  }
  +}
  
  
  
  1.2       +3 -3      jboss/src/main/org/jboss/jmx/server/XMLTestService.java
  
  Index: XMLTestService.java
  ===================================================================
  RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/jmx/server/XMLTestService.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- XMLTestService.java       2001/06/23 08:48:42     1.1
  +++ XMLTestService.java       2001/06/25 18:28:52     1.2
  @@ -24,7 +24,7 @@
   *
   * @author Andreas Schaefer ([EMAIL PROTECTED])
   * @created June 22, 2001
  -* @version $Revision: 1.1 $
  +* @version $Revision: 1.2 $
   */
   public class XMLTestService
     extends ServiceMBeanSupport
  @@ -75,8 +75,8 @@
         // Create Test XML Document
         Document lTest = 
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
           new StringBufferInputStream(
  -          "<invoke operation=\"stop\"><object-name name=\":service=Scheduler\"/>" +
  -          "</invoke>"
  +          "<jmx><invoke operation=\"stop\"><object-name 
name=\":service=Scheduler\"/>" +
  +          "</invoke></jmx>"
           )
         );
         System.out.println( "Call invokeXML with: " + lTest );
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to