You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2006/09/20 00:07:25 UTC

svn commit: r447994 [40/46] - in /incubator/qpid/trunk/qpid: ./ cpp/ cpp/bin/ cpp/broker/ cpp/broker/inc/ cpp/broker/src/ cpp/broker/test/ cpp/client/ cpp/client/inc/ cpp/client/src/ cpp/client/test/ cpp/common/ cpp/common/concurrent/ cpp/common/concur...

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/commands/LsCommand.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/commands/LsCommand.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/commands/LsCommand.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/commands/LsCommand.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,123 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.commands;
+
+import org.apache.qpid.AMQException;
+import org.apache.qpid.stac.jmx.CurrentMBean;
+import org.apache.qpid.stac.jmx.MBeanServerConnectionContext;
+import org.apache.qpid.stac.jmx.MBeanUtils;
+
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanParameterInfo;
+import java.util.SortedSet;
+
+public class LsCommand
+{
+    public static void execute(MBeanServerConnectionContext context)
+            throws AMQException
+    {
+        CurrentMBean currentMBean = context.getCurrentMBean();
+
+        SortedSet<MBeanAttributeInfo> directories = currentMBean.getOrderedObjects();
+        System.out.println();
+        for (MBeanAttributeInfo ai : directories)
+        {
+            if (!MBeanUtils.isHidden(ai))
+            {
+                outputAccess(ai);
+                System.out.println(" " + ai.getName());
+            }
+        }
+        System.out.println();
+
+        SortedSet<MBeanAttributeInfo> attributes = currentMBean.getOrderedAttributes();
+        for (MBeanAttributeInfo ai : attributes)
+        {
+            outputAccess(ai);
+            System.out.printf(" %1$-15s%2$-15s %3$s\n", ai.getName(), "[" + convertType(ai.getType()) + "]",
+                              currentMBean.getAttributeValue(ai.getName(), ai.getType()));
+        }
+        System.out.println();
+        SortedSet<MBeanOperationInfo> operations = currentMBean.getOrderedOperations();
+
+        for (MBeanOperationInfo oi : operations)
+        {
+            System.out.printf("-r-x %1$-15s", oi.getName());
+            MBeanParameterInfo[] paramInfos = oi.getSignature();
+            System.out.print("[");
+            if (paramInfos.length == 0)
+            {
+                System.out.print("No arguments");
+            }
+
+            for (int i = 0; i < paramInfos.length; i++)
+            {
+                MBeanParameterInfo pi = paramInfos[i];
+                System.out.printf("%1$s:%2$s%3$s", pi.getName(), convertType(pi.getType()),
+                                  (i < paramInfos.length)?",":"");
+            }
+            System.out.println("]");
+        }
+        System.out.println();
+    }
+
+    private static void outputAccess(MBeanAttributeInfo ai)
+    {
+        boolean isObject = ai.getType().equals("javax.management.ObjectName");
+        System.out.print(isObject?"d":"-");
+        System.out.print(ai.isReadable()?"r":"-");
+        System.out.print(ai.isWritable()?"w":"-");
+        System.out.print("-");
+    }
+
+    /**
+     * Converts the type name to a non-Java type (e.g. java.lang.String -> String)
+     * @param javaType
+     * @return a generic type
+     */
+    private static String convertType(String javaType)
+    {
+        if ("java.lang.String".equals(javaType))
+        {
+            return "String";
+        }
+        else if ("java.lang.Integer".equals(javaType))
+        {
+            return "Integer";
+        }
+        else if ("java.lang.Boolean".equals(javaType))
+        {
+            return "Boolean";
+        }
+        else if ("java.lang.Double".equals(javaType))
+        {
+            return "Double";
+        }
+        else if ("java.util.Date".equals(javaType))
+        {
+            return "Date";
+        }
+        else
+        {
+            return javaType;
+        }
+    }
+
+
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/commands/LsCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/CurrentMBean.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/CurrentMBean.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/CurrentMBean.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/CurrentMBean.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,180 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import org.apache.qpid.AMQException;
+
+import javax.management.*;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * Stores information about the "current" MBean. This data is used when navigating the hierarchy.
+ *
+ * For example, we need to map between a name and an object id, and this stores that link.
+ *
+ */
+public class CurrentMBean
+{
+    private MBeanServerConnection _mbeanServerConnection;
+
+    public static final String PARENT_ATTRIBUTE = "__parent";
+
+    private static final SimpleDateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    /**
+     * Maps names to ObjectNames. Used for efficiency to avoid iterating through all names when doing a CD command.
+     */
+    private Map<String, ObjectName> _name2ObjectNameMap = new HashMap<String, ObjectName>();
+
+    private ObjectName _mbeanObjectName;
+
+    private MBeanInfo _mbeanInfo;
+
+    public CurrentMBean(MBeanServerConnection mbeanServerConnection)
+    {
+        _mbeanServerConnection = mbeanServerConnection;
+    }
+
+    public void changeMBean(ObjectName objectName) throws AMQException
+    {
+        try
+        {
+            _mbeanInfo = _mbeanServerConnection.getMBeanInfo(objectName);
+        }
+        catch (Exception e)
+        {
+            throw new AMQException("Unable to look up MBean for object name " + objectName + ": " + e, e);
+        }
+        _mbeanObjectName = objectName;
+    }
+
+    public ObjectName getMBeanObjectName()
+    {
+        return _mbeanObjectName;
+    }
+
+    public MBeanInfo getMBeanInfo()
+    {
+        return _mbeanInfo;
+    }
+
+    public Object getAttributeValue(String name, String type) throws AMQException
+    {
+        // TODO: The type argument is a temporary workaround for a bug (somewhere!) in which
+        // a date is returned as a String
+        try
+        {
+            Object o = _mbeanServerConnection.getAttribute(_mbeanObjectName, name);
+            if ("java.util.Date".equals(type))
+            {
+
+                return _dateFormat.format(new Date(Long.parseLong((String)o)));
+            }
+            else
+            {
+                return o;
+            }
+        }
+        catch (Exception e)
+        {
+            throw new AMQException("Unable to read attribute value for attribute name " + name, e);
+        }
+    }
+
+    /**
+     * Get the objects (i.e. "directories") under the current mbean, ordered alphabetically. This method also
+     * refreshes the cache that maps from name to ObjectName (this saves iterating through the attributes again).
+     * @return a set containing the attribute infos, sorted by name
+     */
+    public SortedSet<MBeanAttributeInfo> getOrderedObjects() throws AMQException
+    {
+        TreeSet<MBeanAttributeInfo> attributes = new TreeSet<MBeanAttributeInfo>(new MBeanAttributeInfoComparator());
+        _name2ObjectNameMap.clear();
+        for (MBeanAttributeInfo ai : _mbeanInfo.getAttributes())
+        {
+            String type = ai.getType();
+
+            if ("javax.management.ObjectName".equals(type))
+            {
+                _name2ObjectNameMap.put(ai.getName(), (ObjectName)getAttributeValue(ai.getName(), type));
+                attributes.add(ai);
+            }
+        }
+        return attributes;
+    }
+
+    public void refreshNameToObjectNameMap() throws AMQException
+    {
+        _name2ObjectNameMap.clear();
+        for (MBeanAttributeInfo ai : _mbeanInfo.getAttributes())
+        {
+            final String type = ai.getType();
+
+            if ("javax.management.ObjectName".equals(type))
+            {
+                _name2ObjectNameMap.put(ai.getName(), (ObjectName)getAttributeValue(ai.getName(), type));
+            }
+        }
+    }
+
+    /**
+     * Gets an object name, given the "display name"
+     * @param name the display name (usually returned to the user when he does an ls()
+     * @return the object name
+     */
+    public ObjectName getObjectNameByName(String name)
+    {
+        return _name2ObjectNameMap.get(name);
+    }
+
+    public SortedSet<MBeanAttributeInfo> getOrderedAttributes()
+    {
+        TreeSet<MBeanAttributeInfo> attributes = new TreeSet<MBeanAttributeInfo>(new MBeanAttributeInfoComparator());
+        for (MBeanAttributeInfo ai : _mbeanInfo.getAttributes())
+        {
+            String type = ai.getType();
+            if (!"javax.management.ObjectName".equals(type))
+            {
+                attributes.add(ai);
+            }
+        }
+        return attributes;
+    }
+
+    public SortedSet<MBeanOperationInfo> getOrderedOperations()
+    {
+        TreeSet<MBeanOperationInfo> operations = new TreeSet<MBeanOperationInfo>(new MBeanOperationInfoComparator());
+        for (MBeanOperationInfo oi : _mbeanInfo.getOperations())
+        {
+            operations.add(oi);
+        }
+        return operations;
+    }
+
+    public void invoke(String methodName, Object... args) throws AMQException
+    {
+        try
+        {
+            _mbeanServerConnection.invoke(_mbeanObjectName, methodName, null, null);
+        }
+        catch (Exception e)
+        {
+            throw new AMQException("Error invoking method " + methodName + ": " + e, e);
+        }
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/CurrentMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanAttributeInfoComparator.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanAttributeInfoComparator.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanAttributeInfoComparator.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanAttributeInfoComparator.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,29 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import javax.management.MBeanAttributeInfo;
+import java.util.Comparator;
+
+public class MBeanAttributeInfoComparator implements Comparator<MBeanAttributeInfo>
+{
+    public int compare(MBeanAttributeInfo o1, MBeanAttributeInfo o2)
+    {
+        return o1.getName().compareTo(o2.getName());
+    }    
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanAttributeInfoComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanOperationInfoComparator.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanOperationInfoComparator.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanOperationInfoComparator.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanOperationInfoComparator.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,29 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import javax.management.MBeanOperationInfo;
+import java.util.Comparator;
+
+public class MBeanOperationInfoComparator implements Comparator<MBeanOperationInfo>
+{
+    public int compare(MBeanOperationInfo o1, MBeanOperationInfo o2)
+    {
+        return o1.getName().compareTo(o2.getName());
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanOperationInfoComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanServerConnectionContext.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanServerConnectionContext.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanServerConnectionContext.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanServerConnectionContext.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,202 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import org.apache.qpid.AMQException;
+import org.apache.qpid.management.jmx.JmxConstants;
+import org.apache.qpid.stac.commands.CdCommand;
+import org.apache.qpid.stac.commands.LsCommand;
+import org.apache.log4j.Logger;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.ObjectInstance;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import java.lang.management.ManagementFactory;
+import java.util.Hashtable;
+import java.util.Set;
+
+public class MBeanServerConnectionContext
+{
+    private static final Logger _log = Logger.getLogger(MBeanServerConnectionContext.class);
+
+    /**
+     * The connection to the MBean server. Can be remote or local, depending on whether we are proxying.
+     */
+    private MBeanServerConnection _connection;
+
+    /**
+     * The connector used to make the connection to the remote MBean server
+     */
+    private JMXConnector _connector;
+
+    private CurrentMBean _currentMBean;
+
+    /*
+    * Initialize connection to the Domain Runtime MBean Server
+    */
+    public void connect(String host) throws AMQException
+    {
+        if (host == null)
+        {
+            _connection = (MBeanServerConnection) ManagementFactory.getPlatformMBeanServer();
+        }
+        else
+        {
+            String serviceURLString  = "service:jmx:local://localhost";
+
+            try
+            {
+                JMXServiceURL serviceURL = new JMXServiceURL(serviceURLString);
+                _connector = JMXConnectorFactory.connect(serviceURL, null);
+                _connection = _connector.getMBeanServerConnection();
+            }
+            catch (Exception e)
+            {
+                throw new AMQException("Unable to connect to remote MBean server with service url " + serviceURLString +
+                                       ": " + e, e);
+            }
+        }
+        _currentMBean = new CurrentMBean(_connection);
+        changeBean(getRootObjectName());
+    }
+
+    /**
+     * Connect to the local MBean server
+     * @throws AMQException
+     */
+    public void connect() throws AMQException
+    {
+        connect(null);
+    }
+
+    public void disconnect() throws AMQException
+    {
+        if (_connection != null)
+        {
+            try
+            {
+                ObjectName queryName = new ObjectName(JmxConstants.JMX_DOMAIN + ":*");
+                Set<ObjectInstance> beans = _connection.queryMBeans(queryName, null);
+                for (ObjectInstance bean : beans)
+                {
+                    _log.debug("Unregistering MBean: " + bean.getObjectName());
+                    _connection.unregisterMBean(bean.getObjectName());
+                }
+            }
+            catch (Exception e)
+            {
+                throw new AMQException("Error unregistering MBeans: " + e, e);
+            }
+        }
+    }
+
+    public ObjectName getRootObjectName() throws AMQException
+    {
+        Hashtable<String, String> props = new Hashtable<String, String>();
+        props.put("objectid", "0");
+        props.put("type", "broker");
+        try
+        {
+            return new ObjectName(JmxConstants.JMX_DOMAIN, props);
+        }
+        catch (MalformedObjectNameException e)
+        {
+            throw new AMQException("Cannot construct root MBean object name: " + e, e);
+        }
+    }
+
+    private void changeBean(ObjectName objectName) throws AMQException
+    {
+        _currentMBean.changeMBean(objectName);
+    }
+
+    /**
+     * Change the current bean to the one underneath the current bean, represented by the display name
+     * @param name
+     * @throws AMQException
+     */
+    public void changeBean(String name) throws AMQException
+    {
+        checkConnection();
+        if (name.equals("/"))
+        {
+            changeBean(getRootObjectName());
+        }
+        else
+        {
+            ObjectName objName = _currentMBean.getObjectNameByName(name);
+            if (CurrentMBean.PARENT_ATTRIBUTE.equals(name) && objName == null)
+            {
+                // we have tried to change up a level from the root, so just ignore
+                return;
+            }
+            if (objName == null)
+            {
+                // could be stale cache, so refresh
+                _currentMBean.refreshNameToObjectNameMap();
+                objName = _currentMBean.getObjectNameByName(name);
+            }
+            if (objName == null)
+            {
+                throw new AMQException("Unknown managed object with name: " + name);
+            }
+            else
+            {
+                changeBean(objName);
+            }
+        }
+    }
+
+    public void ls() throws AMQException
+    {
+        checkConnection();
+        LsCommand.execute(this);
+    }
+
+    public void cd(String destination) throws AMQException
+    {
+        CdCommand.execute(this, destination);
+    }
+
+    public void invoke(String methodName, Object... args) throws AMQException
+    {
+        _currentMBean.invoke(methodName, args);
+    }
+
+    public CurrentMBean getCurrentMBean()
+    {
+        return _currentMBean;
+    }
+
+    public MBeanServerConnection getMBeanServerConnection()
+    {
+        return _connection;
+    }
+
+    private void checkConnection() throws NotConnectedException
+    {
+        if (_connection == null)
+        {
+            throw new NotConnectedException();
+        }
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanServerConnectionContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanUtils.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanUtils.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanUtils.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanUtils.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,35 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import javax.management.MBeanAttributeInfo;
+
+/**
+ * Useful MBean methods. Also provides functionality for our CMLMBean
+ */
+public class MBeanUtils
+{
+    public static boolean isHidden(MBeanAttributeInfo ai)
+    {
+        /* This is JDK 1.6 only
+        String hidden = (String) ai.getDescriptor().getFieldValue("hidden");
+        return hidden != null && "true".equals(hidden);
+        */
+        return ai.getName().startsWith("__");
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/MBeanUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/NotConnectedException.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/NotConnectedException.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/NotConnectedException.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/NotConnectedException.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac.jmx;
+
+import org.apache.qpid.AMQException;
+
+public class NotConnectedException extends AMQException
+{
+    public NotConnectedException()
+    {
+        super("Not connected to JMX server");
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/org/apache/qpid/stac/jmx/NotConnectedException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/src/python/stac.py
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/src/python/stac.py?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/src/python/stac.py (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/src/python/stac.py Tue Sep 19 15:06:50 2006
@@ -0,0 +1,190 @@
+#
+# Copyright (c) 2006 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""
+Bridges between Python and Java, to provide a simpler and more Pythonesque environment.
+Certified to be free of dead parrots.
+"""
+# Imports
+from java.lang import *
+import org.amqp.blaze.management.jmx.AMQConsole as AMQConsole
+import org.amqp.blaze.stac.jmx.MBeanServerConnectionContext as MBeanServerConnectionContext
+
+# Globals
+commandPrompt = ""
+proxied = 0
+connected = 0
+amqConsole = None
+connectionContext = None
+
+# Functions
+def connect(url="", username="", password=""):
+  """
+  Connects to an AMQP broker. The URL must be in the form amq://host:port/context
+  """
+  try:
+    global connected
+    global connectionContext
+    if connected==1:
+      print "Already Connected!"
+      return
+
+    try:
+       parsedURL = parseURL(url)
+    except URLFormatError, ufe:
+       print "Invalid URL: " + ufe.msg
+       return
+
+    amqConsole = AMQConsole(parsedURL['host'], parsedURL['port'], username, password, parsedURL['context'])
+
+    amqConsole.initialise()
+    amqConsole.registerAllMBeans()
+    connectionContext = MBeanServerConnectionContext()
+    connectionContext.connect()
+    connected = 1
+  except Exception, e:
+    updateGlobals()
+    print e
+    e.printStackTrace()
+    cause = e.getCause()
+    if cause != None:
+        cause.printStackTrace()
+  else:
+    updateGlobals();
+
+def disconnect():
+    """
+    Disconnects from the broker
+    """
+    global connected
+    global connectionContext
+
+    if connected==0:
+      print "Not connected!"
+      return
+    try:
+        connectionContext.disconnect()
+        connected = 0
+    except Exception, e:
+        updateGlobals()
+        print e
+    else:
+        updateGlobals()
+
+def quit():
+    global connected
+    if connected != 0:
+        disconnect()    
+
+def ls():
+    """
+    Lists the current mbean
+    """
+    global connected
+    if connected == 0:
+        print "Not connected!"
+        return
+
+    connectionContext.ls()
+
+def cd(beanName):
+    """
+    Changes the current mbean
+    """
+    global connected
+    global connectionContext
+    if connected == 0:
+        print "Not connected!"
+        return
+
+    try:
+        connectionContext.cd(beanName)
+    except Exception, e:
+        updateGlobals()
+        msg = "Error: " + e.getMessage()
+        print msg
+    else:
+        updateGlobals()
+
+def invoke(methodName):
+    """
+    Invokes an operation of the current mbean
+    """
+    global connected
+    global connectionContext
+
+    if connected == 0:
+        print "Not connected!"
+        return
+
+    try:
+        connectionContext.invoke(methodName, None)
+    except Exception, e:
+        updateGlobals()
+        msg = "Error: " + e.getMessage()
+        print msg
+    else:
+        updateGlobals()
+
+class URLFormatError(Exception):
+    """Exception raised for errors in format of the URL
+
+    Attributes:
+        expression -- input expression in which the error occurred
+        message -- explanation of the error
+    """
+
+    def __init__(self, url, message):
+        self.url = url
+        self.msg = message
+
+def parseURL(url):
+    """
+    Parses an AMQ URL into host, port and context components returning them in a dictionary
+    """
+    idx = url.find("amq://")
+    errorMsg = "Invalid URL - must be format amq://hostname:port/vhost"
+    if idx != 0:
+        raise URLFormatError(url, errorMsg)
+
+    hostEndIdx = url.find(":", 6)
+    if hostEndIdx == -1:
+        raise URLFormatError(url, errorMsg)
+
+    hostname = url[6:hostEndIdx]
+
+    portIdx = url.find("/", hostEndIdx + 1)
+    port = url[hostEndIdx + 1:portIdx]
+    vhost = url[portIdx + 1:]
+    if portIdx == -1:
+        raise URLFormatError(url, errorMsg)
+
+    return {'host':hostname,'port':int(port),'context':vhost}
+
+def updateGlobals():
+    global commandPrompt
+    global connectionContext
+    if connected == 1:
+        commandPrompt = "AMQ:connected#" + connectionContext.getCurrentMBean().getAttributeValue("name", "java.lang.String") + "> "
+    else:
+        commandPrompt = "AMQ:disconnected> "
+# Classes
+
+
+# Global execution
+
+# Update all the global variables - this is called to sync everything at the start
+updateGlobals()

Propchange: incubator/qpid/trunk/qpid/java/management/cli/src/python/stac.py
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/cli/test/org/apache/qpid/stac/ConnectionTest.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/cli/test/org/apache/qpid/stac/ConnectionTest.java?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/cli/test/org/apache/qpid/stac/ConnectionTest.java (added)
+++ incubator/qpid/trunk/qpid/java/management/cli/test/org/apache/qpid/stac/ConnectionTest.java Tue Sep 19 15:06:50 2006
@@ -0,0 +1,35 @@
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.qpid.stac;
+
+import org.apache.qpid.management.jmx.AMQConsole;
+import org.apache.qpid.stac.jmx.MBeanServerConnectionContext;
+
+public class ConnectionTest
+{
+    public static void main(String[] args) throws Exception
+    {
+
+        AMQConsole console = new AMQConsole("localhost", 5672, "guest", "guest", "/test");
+        console.initialise();
+        console.registerAllMBeans();
+        MBeanServerConnectionContext connectionContext = new MBeanServerConnectionContext();
+        connectionContext.connect();
+        connectionContext.ls();
+    }
+}

Propchange: incubator/qpid/trunk/qpid/java/management/cli/test/org/apache/qpid/stac/ConnectionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/core/build-module.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/build-module.xml?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/core/build-module.xml (added)
+++ incubator/qpid/trunk/qpid/java/management/core/build-module.xml Tue Sep 19 15:06:50 2006
@@ -0,0 +1,47 @@
+<!--
+ -
+ - Copyright (c) 2006 The Apache Software Foundation
+ -
+ - Licensed under the Apache License, Version 2.0 (the "License");
+ - you may not use this file except in compliance with the License.
+ - You may obtain a copy of the License at
+ -
+ -    http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+ -
+ -->
+<project name="AMQ Management Core" default="build">
+
+  <property name="module.depends" value="common,client"/>
+
+  <import file="../../module.xml"/>
+
+  <property name="etc" value="etc"/>
+  <property name="xmlbeans.timestamp" value="${module.dir}/xmlbeans.timestamp"/>
+
+  <fileset id="xmlbeans.schema" dir="${etc}" includes="**/*.xsd"/>
+
+  <uptodate property="xmlbeans.done" targetfile="${xmlbeans.timestamp}">
+    <srcfiles refid="xmlbeans.schema"/>
+  </uptodate>
+
+  <taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="module.class.path"/>
+
+  <!-- Generate code from the XML schema -->
+  <target name="xmlbeans" unless="xmlbeans.done">
+    <xmlbean classgendir="${module.classes}" classpathref="module.class.path"
+             failonerror="true" srcgendir="${module.precompiled}"
+             javasource="1.5" source="1.5">
+      <fileset refid="xmlbeans.schema"/>
+    </xmlbean>
+    <touch file="${xmlbeans.timestamp}"/>
+  </target>
+
+  <target name="precompile" depends="xmlbeans"/>
+
+</project>

Propchange: incubator/qpid/trunk/qpid/java/management/core/build-module.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/core/build-old.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/build-old.xml?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/core/build-old.xml (added)
+++ incubator/qpid/trunk/qpid/java/management/core/build-old.xml Tue Sep 19 15:06:50 2006
@@ -0,0 +1,189 @@
+<?xml version="1.0"?>
+<!--
+ -
+ - Copyright (c) 2006 The Apache Software Foundation
+ -
+ - Licensed under the Apache License, Version 2.0 (the "License");
+ - you may not use this file except in compliance with the License.
+ - You may obtain a copy of the License at
+ -
+ -    http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+ -
+ -->
+
+<!-- AMQP Management Core Java build file -->
+
+<project name="management-core" default="jar" basedir=".">
+    <property name="lib" value="${basedir}/lib"/>
+    <property name="src" value="${basedir}/src"/>
+    <property name="generated.src" value="${basedir}/generated/src"/>
+    <property name="tests" value="${basedir}/test"/>
+    <property name="etc" value="${basedir}/etc"/>
+    <property name="classes" value="${basedir}/classes"/>
+    <property name="testclasses" value="${basedir}/testclasses"/>
+    <property name="dist" value="${basedir}/dist"/>
+    <property name="apache.root" value="${basedir}/../../clients_java"/>
+    <property name="apache.dist" value="${apache.root}/dist"/>
+    <property name="apache.lib" value="${apache.root}/lib"/>
+
+    <taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="core.classpath"/>
+
+    <!-- Setup details -->
+    <target name="init">
+        <tstamp>
+            <format property="release" pattern="-dMMMyy" locale="en" timezone="GMT"/>
+        </tstamp>
+
+        <mkdir dir="${generated.src}"/>
+        <mkdir dir="${classes}"/>
+        <mkdir dir="${testclasses}"/>
+        <mkdir dir="${dist}"/>
+    </target>
+
+    <path id="core.classpath">
+        <fileset dir="${lib}">
+            <include name="**/*.jar"/>
+        </fileset>
+        <pathelement path="${classes}"/>
+        <pathelement path="${testclasses}/"/>
+        <fileset dir="${apache.dist}">
+            <include name="**/*.jar"/>
+        </fileset>
+        <fileset dir="${apache.lib}">
+            <include name="**/*.jar"/>
+        </fileset>
+    </path>
+
+    <!-- Remove all built files -->
+    <target name="clean" depends="init">
+        <delete dir="${generated.src}"/>
+        <delete dir="${classes}"/>
+        <delete dir="${dist}"/>
+        <delete dir="${testclasses}"/>
+    </target>
+
+    <!-- Generate code from the XML schema -->
+    <target name="xmlbeans" depends="init">
+        <xmlbean classgendir="${classes}" classpathref="core.classpath"
+                 failonerror="true" srcgendir="${generated.src}"
+                 javasource="1.5" source="1.5">
+            <fileset dir="${etc}" includes="**/*.xsd"/>
+        </xmlbean>
+    </target>
+
+    <!-- Compile Java -->
+    <target name="compile" depends="xmlbeans">
+        <javac destdir="${classes}" target="1.5" source="1.5" debug="on">
+            <classpath refid="core.classpath"/>
+            <src path="${src}"/>
+            <src path="${generated.src}"/>
+        </javac>
+
+        <copy todir="${classes}">
+            <!-- copy any non java src files into the build tree, e.g. log4j.properties -->
+            <fileset dir="${src}">
+                <exclude name="**/*.java"/>
+                <exclude name="**/package.html"/>
+            </fileset>
+        </copy>
+    </target>
+
+
+    <target name="compiletests" depends="compile">
+        <javac destdir="${testclasses}" target="1.5" source="1.5" classpathref="core.classpath"
+               debug="on">
+            <src path="${tests}"/>
+        </javac>
+
+        <copy todir="${testclasses}">
+            <!-- copy any non java src files into the build tree, e.g. log4j.properties -->
+            <fileset dir="${tests}">
+                <exclude name="**/*.java"/>
+                <exclude name="**/package.html"/>
+            </fileset>
+        </copy>
+    </target>
+
+    <!-- Build jar archive -->
+    <target name="jar" depends="compiletests">
+        <mkdir dir="${dist}"/>
+        <jar basedir="${classes}" jarfile="${dist}/apache-management-common.jar"/>
+        <jar basedir="${testclasses}" jarfile="${dist}/apache-management-tests.jar"/>
+    </target>
+
+
+    <target name="javadoc" depends="compile, compiletests">
+        <mkdir dir="${dist}/docs/api"/>
+        <javadoc sourcepath="${src}" destdir="${dist}/docs/api"
+                 packagenames="org.apache.qpid.*" classpathref="apache.classpath" author="true"
+                 version="true" windowTitle="AMQP Client API" doctitle="AMQP Client API"
+                 footer="See &lt;a href=&quot;http://www.apache.org&quot;&gt;www.apache.org&lt;/a&gt; for more information."
+                 use="true" verbose="false"/>
+    </target>
+
+    <target name="ServiceProvidingClient" depends="compiletests">
+        <java fork="yes" classname="org.apache.qpid.requestreply1.ServiceProvidingClient">
+              <classpath refid="apache.classpath"/>
+              <jvmarg value="-server"/>
+              <jvmarg value="-Damqj.logging.level=INFO"/>
+              <arg value="localhost"/>
+              <arg value="5672"/>
+              <arg value="guest"/>
+              <arg value="guest"/>
+              <arg value="/vpath"/>
+              <arg value="serviceQ1"/>
+        </java>
+    </target>
+
+     <target name="ServiceRequestingClient" depends="compiletests">
+        <java fork="yes" classname="org.apache.qpid.requestreply1.ServiceRequestingClient">
+              <classpath refid="apache.classpath"/>
+              <jvmarg value="-server"/>
+              <jvmarg value="-Damqj.logging.level=INFO"/>
+              <arg value="localhost"/>
+              <arg value="5672"/>
+              <arg value="guest"/>
+              <arg value="guest"/>
+              <arg value="/vpath"/>
+              <arg value="serviceQ1"/>
+              <arg value="5000"/>
+        </java>
+    </target>
+
+    <target name="profile" depends="compile" description="Profile Project">
+        <fail unless="netbeans.home">This target can only run inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+          <classpath refid="apache.classpath"/>
+        </nbprofiledirect>
+        <java fork="true" classname="org.apache.qpid.requestreply1.ServiceRequestingClient"
+              dir="${profiler.session.working.dir}"
+              jvm="${profiler.info.jvm}">
+          <jvmarg value="${profiler.info.jvmargs.agent}"/>
+          <jvmarg line="${profiler.info.jvmargs}"/>
+          <env key="Path" path="${profiler.info.agentpath}:${env.Path}"/>
+          <classpath refid="apache.classpath"/>
+          <jvmarg value="-server"/>
+          <jvmarg value="-Damqj.logging.level=INFO"/>
+          <arg value="localhost"/>
+          <arg value="5672"/>
+          <arg value="guest"/>
+          <arg value="guest"/>
+          <arg value="/vpath"/>
+          <arg value="serviceQ1"/>
+          <arg value="5000"/>
+        </java>
+    </target>
+
+    <target name="profile-single" depends="compile" description="Profile File">
+        <fail unless="netbeans.home">This target can only run inside the NetBeans IDE.</fail>
+        <nbprofile classname="${profile.class}">
+            <classpath refid="apache.classpath"/>
+        </nbprofile>
+    </target>
+</project>

Propchange: incubator/qpid/trunk/qpid/java/management/core/build-old.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/core/etc/cml-exampleschema.xml
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/etc/cml-exampleschema.xml?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/core/etc/cml-exampleschema.xml (added)
+++ incubator/qpid/trunk/qpid/java/management/core/etc/cml-exampleschema.xml Tue Sep 19 15:06:50 2006
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!--
+ -
+ - Copyright (c) 2006 The Apache Software Foundation
+ -
+ - Licensed under the Apache License, Version 2.0 (the "License");
+ - you may not use this file except in compliance with the License.
+ - You may obtain a copy of the License at
+ -
+ -    http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+ -
+ -->
+<cml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.apache.org/schema/cml cml.xsd"
+   xmlns="http://www.apache.org/schema/cml"
+   version="1.0">   
+   <schema-reply name = "qpid.apache.org/kernel" version = "0.1" status = "ok">
+      <class name = "broker">
+         <field name = "started" label = "Date, time broker started" />
+         <field name = "vhost" type = "objref" repeat = "1" />
+      </class>
+      <class name = "vhost">
+         <field name = "name" label = "Virtual host path" />
+         <field name = "exchange" type = "objref" repeat = "1" />
+         <field name = "queue" type = "objref" repeat = "1" />
+      </class>
+      <class name = "exchange">
+         <field name = "name" />
+         <field name = "type" />
+         <field name = "durable" label = "Durable exchange?" type = "bool" />
+         <field name = "auto_delete" label = "Auto-deleted?" type = "bool" />
+         <field name = "bindings" label = "Number of bindings" type = "int" />
+      </class>
+      <class name = "queue">
+         <field name = "scope" />
+         <field name = "name" />
+         <field name = "enabled" label = "Queue accepts new messages?" modify = "1" />
+         <field name = "durable" label = "Durable queue?" type = "bool" />
+         <field name = "exclusive" label = "Exclusive to one connection?" type = "bool" />
+         <field name = "auto_delete" label = "Auto-deleted?" type = "bool" />
+         <field name = "consumers" label = "Number of consumers" type = "int" />
+         <field name = "messages" label = "Number of messages" type = "int" />
+      </class>
+   </schema-reply>
+</cml>

Propchange: incubator/qpid/trunk/qpid/java/management/core/etc/cml-exampleschema.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/core/etc/cml.xsd
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/etc/cml.xsd?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/core/etc/cml.xsd (added)
+++ incubator/qpid/trunk/qpid/java/management/core/etc/cml.xsd Tue Sep 19 15:06:50 2006
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ -
+ - Copyright (c) 2006 The Apache Software Foundation
+ -
+ - Licensed under the Apache License, Version 2.0 (the "License");
+ - you may not use this file except in compliance with the License.
+ - You may obtain a copy of the License at
+ -
+ -    http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+ -
+ -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.apache.org/qpid/schema/cml" xmlns="http://www.apache.org/qpid/schema/cml"
+    elementFormDefault="qualified">
+    <xs:element name="cml">
+        <xs:annotation>
+            <xs:documentation>Defines a CML document as a schema or a...</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:choice>
+                <xs:element name="schema-request" minOccurs="0"/>
+                <xs:element name="schema-reply" type="schema-reply-type" minOccurs="0" >
+                    <!--<xs:key name="classkey">
+                        <xs:selector xpath="class"/>
+                        <xs:field xpath="@name"/>
+                    </xs:key>-->
+                </xs:element>
+                <xs:element name="inspect-request" type="inspect-request-type" minOccurs="0"/>
+                <xs:element name="inspect-reply" type="inspect-reply-type" minOccurs="0" />
+                <xs:element name="method-request" type="method-request-type" minOccurs="0"/>
+                <xs:element name="method-reply" type="method-reply-type" minOccurs="0" />
+             </xs:choice>
+            <xs:attribute name="version" type="xs:string" use="required"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:complexType name="schema-reply-type">
+        <xs:annotation>
+            <xs:documentation>Client request for a schema</xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="class" type="class-type" minOccurs="1" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="name" type="xs:string" use="required"/>
+        <xs:attribute name="version" type="xs:string" use="required"/>
+        <xs:attribute name="status">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="ok"/>
+                    <xs:enumeration value="not ok"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:complexType>
+    <xs:complexType name="class-type">
+        <xs:annotation>
+            <xs:documentation>Defines a class which is a managable object</xs:documentation>
+        </xs:annotation>
+        <xs:choice>
+            <xs:element name="field" type="field-type" minOccurs="0" maxOccurs="unbounded">
+                <xs:unique name="uniqueFieldName">
+                    <xs:selector xpath="field"/>
+                    <xs:field xpath="@name"/>
+                </xs:unique>
+            </xs:element>
+            <xs:element name="method" type="method-type" minOccurs="0" maxOccurs="unbounded">
+                <xs:unique name="uniqueMethodName">
+                    <xs:selector xpath="method"/>
+                    <xs:field xpath="@name"/>
+                </xs:unique>
+            </xs:element>
+        </xs:choice>
+        <xs:attribute name="name" type="xs:string" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="field-type">
+        <xs:annotation>
+            <xs:documentation>Defines a field within a class</xs:documentation>
+        </xs:annotation>
+        <xs:simpleContent>
+            <xs:extension base="xs:string">
+                <xs:attribute name="name" type="xs:string" use="required"/>
+                <xs:attribute name="type" use="optional" default="string">
+                    <xs:simpleType>
+                        <xs:restriction base="xs:string">
+                            <xs:enumeration value="bool"/>
+                            <xs:enumeration value="string"/>
+                            <xs:enumeration value="int"/>
+                            <xs:enumeration value="objref"/>
+                            <xs:enumeration value="time"/>
+                        </xs:restriction>
+                    </xs:simpleType>
+                </xs:attribute>
+                <xs:attribute name="label" type="xs:string" use="optional"/>
+                <xs:attribute name="repeat" type="xs:boolean" use="optional" default="false"/>
+                <xs:attribute name="modify" type="xs:boolean" use="optional" default="false"/>
+            </xs:extension>
+        </xs:simpleContent>
+    </xs:complexType>
+    <xs:complexType name="method-type">
+        <xs:annotation>
+            <xs:documentation>Defines a method within a class</xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="field" type="field-type" minOccurs="0" maxOccurs="unbounded">
+                <xs:unique name="uniqueArgumentName">
+                    <xs:selector xpath="field"/>
+                    <xs:field xpath="@name"/>
+                </xs:unique>
+            </xs:element>
+        </xs:sequence>
+        <xs:attribute name="name" type="xs:string" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="inspect-request-type">
+        <xs:annotation>
+            <xs:documentation>A request to get the property values of an instance</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="object" type="xs:int" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="inspect-reply-type">
+        <xs:annotation>
+            <xs:documentation>A response containing the properties of an instance</xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="field" type="field-type" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="object" type="object-type" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="class" type="xs:string" use="optional"/>
+        <xs:attribute name="status" use="optional">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="ok"/>
+                    <xs:enumeration value="notfound"/>
+                    <xs:enumeration value="noaccess"/>
+                    <xs:enumeration value="invalid"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="object" type="xs:int" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="object-type">
+        <xs:annotation>
+            <xs:documentation>A reference to an object instance</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="class" type="xs:string" use="required"/>
+        <xs:attribute name="id" type="xs:int" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="method-request-type">
+        <xs:annotation>
+            <xs:documentation>A request to invoke a method</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="object" type="xs:int" use="required"/>
+        <xs:attribute name="name" type="xs:string" use="required"/>
+    </xs:complexType>
+    <xs:complexType name="method-reply-type">
+        <xs:annotation>
+            <xs:documentation>A reply to a method invocation request</xs:documentation>
+        </xs:annotation>
+        <xs:attribute name="object" type="xs:int" use="required"/>
+        <xs:attribute name="status" use="required">
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:enumeration value="ok"/>
+                    <xs:enumeration value="notfound"/>
+                    <xs:enumeration value="noaccess"/>
+                    <xs:enumeration value="invalid"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:complexType>
+</xs:schema>

Propchange: incubator/qpid/trunk/qpid/java/management/core/etc/cml.xsd
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-api.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-api.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-api.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-compiler.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-compiler.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-attributes-compiler.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-beanutils.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-beanutils.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-beanutils.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-codec.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-codec.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-codec.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-collections.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-collections.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-collections.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-dbcp.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-dbcp.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-dbcp.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-digester.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-digester.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-digester.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-discovery.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-discovery.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-discovery.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-fileupload.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-fileupload.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-fileupload.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-httpclient.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-httpclient.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-httpclient.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-lang.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-lang.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-lang.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-logging.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-logging.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-logging.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-pool.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-pool.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-pool.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-validator.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-validator.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/jakarta-commons/commons-validator.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/log4j/log4j-1.2.9.jar
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/log4j/log4j-1.2.9.jar?view=auto&rev=447994
==============================================================================
Binary file - no diff available.

Propchange: incubator/qpid/trunk/qpid/java/management/core/lib/log4j/log4j-1.2.9.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/qpid/trunk/qpid/java/management/core/lib/spring/spring-beans.dtd
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/management/core/lib/spring/spring-beans.dtd?view=auto&rev=447994
==============================================================================
--- incubator/qpid/trunk/qpid/java/management/core/lib/spring/spring-beans.dtd (added)
+++ incubator/qpid/trunk/qpid/java/management/core/lib/spring/spring-beans.dtd Tue Sep 19 15:06:50 2006
@@ -0,0 +1,587 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+	Spring XML Beans DTD
+	Authors: Rod Johnson, Juergen Hoeller, Alef Arendsen, Colin Sampaleanu
+
+	This defines a simple and consistent way of creating a namespace
+	of JavaBeans objects, managed by a Spring BeanFactory, read by
+	XmlBeanDefinitionReader (with DefaultXmlBeanDefinitionParser).
+
+	This document type is used by most Spring functionality, including
+	web application contexts, which are based on bean factories.
+
+	Each "bean" element in this document defines a JavaBean.
+	Typically the bean class is specified, along with JavaBean properties
+	and/or constructor arguments.
+
+	Bean instances can be "singletons" (shared instances) or "prototypes"
+	(independent instances). Further scopes are supposed to be built on top
+	of the core BeanFactory infrastructure and are therefore not part of it.
+
+	References among beans are supported, i.e. setting a JavaBean property
+	or a constructor argument to refer to another bean in the same factory
+	(or an ancestor factory).
+
+	As alternative to bean references, "inner bean definitions" can be used.
+	Singleton flags of such inner bean definitions are effectively ignored:
+	Inner beans are typically anonymous prototypes.
+
+	There is also support for lists, sets, maps, and java.util.Properties
+	as bean property types or constructor argument types.
+
+	As the format is simple, a DTD is sufficient, and there's no need
+	for a schema at this point.
+
+	XML documents that conform to this DTD should declare the following doctype:
+
+	<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
+		"http://www.springframework.org/dtd/spring-beans.dtd">
+-->
+
+
+<!--
+	The document root. A document can contain bean definitions only,
+	imports only, or a mixture of both (typically with imports first).
+-->
+<!ELEMENT beans (
+	description?,
+	(import | alias | bean)*
+)>
+
+<!--
+	Default values for all bean definitions. Can be overridden at
+	the "bean" level. See those attribute definitions for details.
+-->
+<!ATTLIST beans default-lazy-init (true | false) "false">
+<!ATTLIST beans default-autowire (no | byName | byType | constructor | autodetect) "no">
+<!ATTLIST beans default-dependency-check (none | objects | simple | all) "none">
+
+<!--
+	Element containing informative text describing the purpose of the enclosing
+	element. Always optional.
+	Used primarily for user documentation of XML bean definition documents.
+-->
+<!ELEMENT description (#PCDATA)>
+
+
+<!--
+	Specifies an XML bean definition resource to import.
+-->
+<!ELEMENT import EMPTY>
+
+<!--
+	The relative resource location of the XML bean definition file to import,
+	for example "myImport.xml" or "includes/myImport.xml" or "../myImport.xml".
+-->
+<!ATTLIST import resource CDATA #REQUIRED>
+
+
+<!--
+	Defines an alias for a bean, which can reside in a different definition file.
+-->
+<!ELEMENT alias EMPTY>
+
+<!--
+	The name of the bean to define an alias for.
+-->
+<!ATTLIST alias name CDATA #REQUIRED>
+
+<!--
+	The alias name to define for the bean.
+-->
+<!ATTLIST alias alias CDATA #REQUIRED>
+
+
+<!--
+	Defines a single (usually named) bean.
+
+	A bean definition may contain nested tags for constructor arguments,
+	property values, lookup methods, and replaced methods. Mixing constructor
+	injection and setter injection on the same bean is explicitly supported.
+-->
+<!ELEMENT bean (
+	description?,
+	(constructor-arg | property | lookup-method | replaced-method)*
+)>
+
+<!--
+	Beans can be identified by an id, to enable reference checking.
+
+	There are constraints on a valid XML id: if you want to reference your bean
+	in Java code using a name that's illegal as an XML id, use the optional
+	"name" attribute. If neither is given, the bean class name is used as id
+	(with an appended counter like "#2" if there is already a bean with that name).
+-->
+<!ATTLIST bean id ID #IMPLIED>
+
+<!--
+	Optional. Can be used to create one or more aliases illegal in an id.
+	Multiple aliases can be separated by any number of spaces or commas.
+-->
+<!ATTLIST bean name CDATA #IMPLIED>
+
+<!--
+	Each bean definition must specify the fully qualified name of the class,
+	except if it pure serves as parent for child bean definitions.
+-->
+<!ATTLIST bean class CDATA #IMPLIED>
+
+<!--
+	Optionally specify a parent bean definition.
+
+	Will use the bean class of the parent if none specified, but can
+	also override it. In the latter case, the child bean class must be
+	compatible with the parent, i.e. accept the parent's property values
+	and constructor argument values, if any.
+
+	A child bean definition will inherit constructor argument values,
+	property values and method overrides from the parent, with the option
+	to add new values. If init method, destroy method, factory bean and/or factory
+	method are specified, they will override the corresponding parent settings.
+
+	The remaining settings will always be taken from the child definition:
+	depends on, autowire mode, dependency check, singleton, lazy init.
+-->
+<!ATTLIST bean parent CDATA #IMPLIED>
+
+<!--
+	Is this bean "abstract", i.e. not meant to be instantiated itself but
+	rather just serving as parent for concrete child bean definitions.
+	Default is "false". Specify "true" to tell the bean factory to not try to
+	instantiate that particular bean in any case.
+-->
+<!ATTLIST bean abstract (true | false) "false">
+
+<!--
+	Is this bean a "singleton" (one shared instance, which will
+	be returned by all calls to getBean() with the id),
+	or a "prototype" (independent instance resulting from each call to
+	getBean(). Default is singleton.
+
+	Singletons are most commonly used, and are ideal for multi-threaded
+	service objects.
+-->
+<!ATTLIST bean singleton (true | false) "true">
+
+<!--
+	If this bean should be lazily initialized.
+	If false, it will get instantiated on startup by bean factories
+	that perform eager initialization of singletons.
+-->
+<!ATTLIST bean lazy-init (true | false | default) "default">
+
+<!--
+	Optional attribute controlling whether to "autowire" bean properties.
+	This is an automagical process in which bean references don't need to be coded
+	explicitly in the XML bean definition file, but Spring works out dependencies.
+
+	There are 5 modes:
+
+	1. "no"
+	The traditional Spring default. No automagical wiring. Bean references
+	must be defined in the XML file via the <ref> element. We recommend this
+	in most cases as it makes documentation more explicit.
+
+	2. "byName"
+	Autowiring by property name. If a bean of class Cat exposes a dog property,
+	Spring will try to set this to the value of the bean "dog" in the current factory.
+	If there is no matching bean by name, nothing special happens;
+	use dependency-check="objects" to raise an error in that case.
+
+	3. "byType"
+	Autowiring if there is exactly one bean of the property type in the bean factory.
+	If there is more than one, a fatal error is raised, and you can't use byType
+	autowiring for that bean. If there is none, nothing special happens;
+	use dependency-check="objects" to raise an error in that case.
+
+	4. "constructor"
+	Analogous to "byType" for constructor arguments. If there isn't exactly one bean
+	of the constructor argument type in the bean factory, a fatal error is raised.
+
+	5. "autodetect"
+	Chooses "constructor" or "byType" through introspection of the bean class.
+	If a default constructor is found, "byType" gets applied.
+
+	The latter two are similar to PicoContainer and make bean factories simple to
+	configure for small namespaces, but doesn't work as well as standard Spring
+	behaviour for bigger applications.
+
+	Note that explicit dependencies, i.e. "property" and "constructor-arg" elements,
+	always override autowiring. Autowire behaviour can be combined with dependency
+	checking, which will be performed after all autowiring has been completed.
+-->
+<!ATTLIST bean autowire (no | byName | byType | constructor | autodetect | default) "default">
+
+<!--
+	Optional attribute controlling whether to check whether all this
+	beans dependencies, expressed in its properties, are satisfied.
+	Default is no dependency checking.
+
+	"simple" type dependency checking includes primitives and String
+	"object" includes collaborators (other beans in the factory)
+	"all" includes both types of dependency checking
+-->
+<!ATTLIST bean dependency-check (none | objects | simple | all | default) "default">
+
+<!--
+	The names of the beans that this bean depends on being initialized.
+	The bean factory will guarantee that these beans get initialized before.
+
+	Note that dependencies are normally expressed through bean properties or
+	constructor arguments. This property should just be necessary for other kinds
+	of dependencies like statics (*ugh*) or database preparation on startup.
+-->
+<!ATTLIST bean depends-on CDATA #IMPLIED>
+
+<!--
+	Optional attribute for the name of the custom initialization method
+	to invoke after setting bean properties. The method must have no arguments,
+	but may throw any exception.
+-->
+<!ATTLIST bean init-method CDATA #IMPLIED>
+
+<!--
+	Optional attribute for the name of the custom destroy method to invoke
+	on bean factory shutdown. The method must have no arguments,
+	but may throw any exception. Note: Only invoked on singleton beans!
+-->
+<!ATTLIST bean destroy-method CDATA #IMPLIED>
+
+<!--
+	Optional attribute specifying the name of a factory method to use to
+	create this object. Use constructor-arg elements to specify arguments
+	to the factory method, if it takes arguments. Autowiring does not apply
+	to factory methods.
+
+	If the "class" attribute is present, the factory method will be a static
+	method on the class specified by the "class" attribute on this bean
+	definition. Often this will be the same class as that of the constructed
+	object - for example, when the factory method is used as an alternative
+	to a constructor. However, it may be on a different class. In that case,
+	the created object will *not* be of the class specified in the "class"
+	attribute. This is analogous to FactoryBean behavior.
+
+	If the "factory-bean" attribute is present, the "class" attribute is not
+	used, and the factory method will be an instance method on the object
+	returned from a getBean call with the specified bean name. The factory
+	bean may be defined as a singleton or a prototype.
+
+	The factory method can have any number of arguments. Autowiring is not
+	supported. Use indexed constructor-arg elements in conjunction with the
+	factory-method attribute.
+
+	Setter Injection can be used in conjunction with a factory method.
+	Method Injection cannot, as the factory method returns an instance,
+	which will be used when the container creates the bean.
+-->
+<!ATTLIST bean factory-method CDATA #IMPLIED>
+
+<!--
+	Alternative to class attribute for factory-method usage.
+	If this is specified, no class attribute should be used.
+	This should be set to the name of a bean in the current or
+	ancestor factories that contains the relevant factory method.
+	This allows the factory itself to be configured using Dependency
+	Injection, and an instance (rather than static) method to be used.
+-->
+<!ATTLIST bean factory-bean CDATA #IMPLIED>
+
+
+<!--
+	Bean definitions can specify zero or more constructor arguments.
+	This is an alternative to "autowire constructor".
+	Arguments correspond to either a specific index of the constructor argument
+	list or are supposed to be matched generically by type.
+
+	Note: A single generic argument value will just be used once, rather than
+	potentially matched multiple times (as of Spring 1.1).
+
+	constructor-arg elements are also used in conjunction with the factory-method
+	element to construct beans using static or instance factory methods.
+-->
+<!ELEMENT constructor-arg (
+	description?,
+	(bean | ref | idref | value | null | list | set | map | props)?
+)>
+
+<!--
+	The constructor-arg tag can have an optional index attribute,
+	to specify the exact index in the constructor argument list. Only needed
+	to avoid ambiguities, e.g. in case of 2 arguments of the same type.
+-->
+<!ATTLIST constructor-arg index CDATA #IMPLIED>
+
+<!--
+	The constructor-arg tag can have an optional type attribute,
+	to specify the exact type of the constructor argument. Only needed
+	to avoid ambiguities, e.g. in case of 2 single argument constructors
+	that can both be converted from a String.
+-->
+<!ATTLIST constructor-arg type CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a child element "ref bean=".
+-->
+<!ATTLIST constructor-arg ref CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a child element "value".
+-->
+<!ATTLIST constructor-arg value CDATA #IMPLIED>
+
+
+<!--
+	Bean definitions can have zero or more properties.
+	Property elements correspond to JavaBean setter methods exposed
+	by the bean classes. Spring supports primitives, references to other
+	beans in the same or related factories, lists, maps and properties.
+-->
+<!ELEMENT property (
+	description?,
+	(bean | ref | idref | value | null | list | set | map | props)?
+)>
+
+<!--
+	The property name attribute is the name of the JavaBean property.
+	This follows JavaBean conventions: a name of "age" would correspond
+	to setAge()/optional getAge() methods.
+-->
+<!ATTLIST property name CDATA #REQUIRED>
+
+<!--
+  A short-cut alternative to a child element "ref bean=".
+-->
+<!ATTLIST property ref CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a child element "value".
+-->
+<!ATTLIST property value CDATA #IMPLIED>
+
+
+<!--
+	A lookup method causes the IoC container to override the given method and return
+	the bean with the name given in the bean attribute. This is a form of Method Injection.
+	It's particularly useful as an alternative to implementing the BeanFactoryAware
+	interface, in order to be able to make getBean() calls for non-singleton instances
+	at runtime. In this case, Method Injection is a less invasive alternative.
+-->
+<!ELEMENT lookup-method EMPTY>
+
+<!--
+	Name of a lookup method. This method should take no arguments.
+-->
+<!ATTLIST lookup-method name CDATA #IMPLIED>
+
+<!--
+	Name of the bean in the current or ancestor factories that the lookup method
+	should resolve to. Often this bean will be a prototype, in which case the
+	lookup method will return a distinct instance on every invocation. This
+	is useful for single-threaded objects.
+-->
+<!ATTLIST lookup-method bean CDATA #IMPLIED>
+
+
+<!--
+	Similar to the lookup method mechanism, the replaced-method element is used to control
+	IoC container method overriding: Method Injection. This mechanism allows the overriding
+	of a method with arbitrary code. 
+-->
+<!ELEMENT replaced-method (
+	(arg-type)*
+)>
+
+<!--
+	Name of the method whose implementation should be replaced by the IoC container.
+	If this method is not overloaded, there's no need to use arg-type subelements.
+	If this method is overloaded, arg-type subelements must be used for all 
+	override definitions for the method.
+-->
+<!ATTLIST replaced-method name CDATA #IMPLIED>
+
+<!--
+	Bean name of an implementation of the MethodReplacer interface
+	in the current or ancestor factories. This may be a singleton or prototype
+	bean. If it's a prototype, a new instance will be used for each method replacement.
+	Singleton usage is the norm.
+-->
+<!ATTLIST replaced-method replacer CDATA #IMPLIED>
+
+<!--
+	Subelement of replaced-method identifying an argument for a replaced method
+	in the event of method overloading.
+-->
+<!ELEMENT arg-type (#PCDATA)>
+
+<!--
+	Specification of the type of an overloaded method argument as a String. 
+	For convenience, this may be a substring of the FQN. E.g. all the
+	following would match "java.lang.String":
+	- java.lang.String
+	- String
+	- Str
+	
+	As the number of arguments will be checked also, this convenience can often
+	be used to save typing.
+-->
+<!ATTLIST arg-type match CDATA #IMPLIED>
+
+
+<!--
+	Defines a reference to another bean in this factory or an external
+	factory (parent or included factory).
+-->
+<!ELEMENT ref EMPTY>
+
+<!--
+	References must specify a name of the target bean.
+	The "bean" attribute can reference any name from any bean in the context,
+	to be checked at runtime.
+	Local references, using the "local" attribute, have to use bean ids;
+	they can be checked by this DTD, thus should be preferred for references
+	within the same bean factory XML file.
+-->
+<!ATTLIST ref bean CDATA #IMPLIED>
+<!ATTLIST ref local IDREF #IMPLIED>
+<!ATTLIST ref parent CDATA #IMPLIED>
+
+
+<!--
+	Defines a string property value, which must also be the id of another
+	bean in this factory or an external factory (parent or included factory).
+	While a regular 'value' element could instead be used for the same effect,
+	using idref in this case allows validation of local bean ids by the xml
+	parser, and name completion by helper tools.
+-->
+<!ELEMENT idref EMPTY>
+
+<!--
+	ID refs must specify a name of the target bean.
+	The "bean" attribute can reference any name from any bean in the context,
+	potentially to be checked at runtime by bean factory implementations.
+	Local references, using the "local" attribute, have to use bean ids;
+	they can be checked by this DTD, thus should be preferred for references
+	within the same bean factory XML file.
+-->
+<!ATTLIST idref bean CDATA #IMPLIED>
+<!ATTLIST idref local IDREF #IMPLIED>
+
+
+<!--
+	Contains a string representation of a property value.
+	The property may be a string, or may be converted to the
+	required type using the JavaBeans PropertyEditor
+	machinery. This makes it possible for application developers
+	to write custom PropertyEditor implementations that can
+	convert strings to objects.
+
+	Note that this is recommended for simple objects only.
+	Configure more complex objects by populating JavaBean
+	properties with references to other beans.
+-->
+<!ELEMENT value (#PCDATA)>
+
+<!--
+	The value tag can have an optional type attribute, to specify the
+	exact type that the value should be converted to. Only needed
+	if the type of the target property or constructor argument is
+	too generic: for example, in case of a collection element.
+-->
+<!ATTLIST value type CDATA #IMPLIED>
+
+<!--
+	Denotes a Java null value. Necessary because an empty "value" tag
+	will resolve to an empty String, which will not be resolved to a
+	null value unless a special PropertyEditor does so.
+-->
+<!ELEMENT null (#PCDATA)>
+
+
+<!--
+	A list can contain multiple inner bean, ref, collection, or value elements.
+	Java lists are untyped, pending generics support in Java 1.5,
+	although references will be strongly typed.
+	A list can also map to an array type. The necessary conversion
+	is automatically performed by the BeanFactory.
+-->
+<!ELEMENT list (
+	(bean | ref | idref | value | null | list | set | map | props)*
+)>
+
+<!--
+	A set can contain multiple inner bean, ref, collection, or value elements.
+	Java sets are untyped, pending generics support in Java 1.5,
+	although references will be strongly typed.
+-->
+<!ELEMENT set (
+	(bean | ref | idref | value | null | list | set | map | props)*
+)>
+
+
+<!--
+	A Spring map is a mapping from a string key to object.
+	Maps may be empty.
+-->
+<!ELEMENT map (
+	(entry)*
+)>
+
+<!--
+	A map entry can be an inner bean, ref, value, or collection.
+	The key of the entry is given by the "key" attribute or child element.
+-->
+<!ELEMENT entry (
+  key?,
+	(bean | ref | idref | value | null | list | set | map | props)?
+)>
+
+<!--
+	Each map element must specify its key as attribute or as child element.
+	A key attribute is always a String value.
+-->
+<!ATTLIST entry key CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a "key" element with a "ref bean=" child element.
+-->
+<!ATTLIST entry key-ref CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a child element "value".
+-->
+<!ATTLIST entry value CDATA #IMPLIED>
+
+<!--
+  A short-cut alternative to a child element "ref bean=".
+-->
+<!ATTLIST entry value-ref CDATA #IMPLIED>
+
+<!--
+	A key element can contain an inner bean, ref, value, or collection.
+-->
+<!ELEMENT key (
+	(bean | ref | idref | value | null | list | set | map | props)
+)>
+
+
+<!--
+	Props elements differ from map elements in that values must be strings.
+	Props may be empty.
+-->
+<!ELEMENT props (
+	(prop)*
+)>
+
+<!--
+	Element content is the string value of the property.
+	Note that whitespace is trimmed off to avoid unwanted whitespace
+	caused by typical XML formatting.
+-->
+<!ELEMENT prop (#PCDATA)>
+
+<!--
+	Each property element must specify its key.
+-->
+<!ATTLIST prop key CDATA #REQUIRED>
+