You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/06/22 19:43:55 UTC

svn commit: r787325 [1/2] - in /qpid/trunk/qpid/java: ./ management/console/ management/console/src/ management/console/src/main/ management/console/src/main/java/ management/console/src/main/java/org/ management/console/src/main/java/org/apache/ manag...

Author: tross
Date: Mon Jun 22 17:43:54 2009
New Revision: 787325

URL: http://svn.apache.org/viewvc?rev=787325&view=rev
Log:
QPID-1933 - Patch from Bryan Kearney
QMF Java Console

Added:
    qpid/trunk/qpid/java/management/console/
    qpid/trunk/qpid/java/management/console/build.xml
    qpid/trunk/qpid/java/management/console/src/
    qpid/trunk/qpid/java/management/console/src/main/
    qpid/trunk/qpid/java/management/console/src/main/java/
    qpid/trunk/qpid/java/management/console/src/main/java/org/
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/AbstractConsole.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Agent.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Broker.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ClassKey.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Console.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ConsoleException.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/EventSeverity.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/MethodResult.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ObjectID.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFEvent.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFObject.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaArgument.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaClass.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaMethod.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaProperty.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaStatistic.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaVariable.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SequenceManager.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Session.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Util.java
    qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/XMLUtil.java
Modified:
    qpid/trunk/qpid/java/build.deps
    qpid/trunk/qpid/java/build.xml

Modified: qpid/trunk/qpid/java/build.deps
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/build.deps?rev=787325&r1=787324&r2=787325&view=diff
==============================================================================
--- qpid/trunk/qpid/java/build.deps (original)
+++ qpid/trunk/qpid/java/build.deps Mon Jun 22 17:43:54 2009
@@ -87,6 +87,7 @@
 management-client.libs=${jsp.libs} ${log4j} ${slf4j-log4j} ${slf4j-api} ${commons-pool} ${geronimo-servlet} ${muse.libs} ${javassist} ${xalan} ${mina-core} ${mina-filter-ssl}
 
 management-agent.libs=${client.libs} ${commons-logging} ${geronimo-jms}
+management-console.libs=${client.libs} ${commons-logging} ${geronimo-jms}
 
 junit-toolkit.libs=${log4j} ${junit} ${slf4j-api}
 test.libs=${slf4j-log4j} ${junit-toolkit.libs}

Modified: qpid/trunk/qpid/java/build.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/build.xml?rev=787325&r1=787324&r2=787325&view=diff
==============================================================================
--- qpid/trunk/qpid/java/build.xml (original)
+++ qpid/trunk/qpid/java/build.xml Mon Jun 22 17:43:54 2009
@@ -25,7 +25,7 @@
   <property name="modules.core"       value="junit-toolkit common broker client tools"/>
   <property name="modules.examples"   value="client/example"/>
   <property name="modules.tests"      value="systests perftests integrationtests testkit"/>
-  <property name="modules.management" value="management/common management/client management/eclipse-plugin management/agent"/>
+  <property name="modules.management" value="management/common management/client management/eclipse-plugin management/agent management/console"/>
   <property name="modules.plugin"     value="broker-plugins"/>
   <property name="modules.management.tools" value="management/tools/qpid-cli"/>
   <property name="modules"            value="${modules.core}

Added: qpid/trunk/qpid/java/management/console/build.xml
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/build.xml?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/build.xml (added)
+++ qpid/trunk/qpid/java/management/console/build.xml Mon Jun 22 17:43:54 2009
@@ -0,0 +1,27 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements.  See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership.  The ASF licenses this file
+ - to you 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="QMF Console" default="build">
+
+    <property name="module.depends" value="common client"/>
+
+    <import file="../../module.xml"/>
+
+</project>

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/AbstractConsole.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/AbstractConsole.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/AbstractConsole.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/AbstractConsole.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,81 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+public class AbstractConsole implements Console
+{
+    public AbstractConsole()
+    {
+    }
+
+    public void agentRemoved(Agent agent)
+    {
+    }
+
+    public void brokerConnected(Broker broker)
+    {
+    }
+
+    public void brokerDisconnected(Broker broker)
+    {
+    }
+
+    public void brokerInformation(Broker broker)
+    {
+    }
+
+    public void eventRecieved(Broker broker, QMFEvent anEvent)
+    {
+    }
+
+    public void hearbeatRecieved(Agent agent, long timestamp)
+    {
+    }
+
+    public void methodResponse(Broker broker, long seq, MethodResult response)
+    {
+    }
+
+    public void newAgent(Agent agent)
+    {
+    }
+
+    public void newClass(short kind, ClassKey key)
+    {
+    }
+
+    public void newPackage(String packageName)
+    {
+    }
+
+    public void objectProperties(Broker broker, QMFObject obj)
+    {
+    }
+
+    public void objectStatistics(Broker broker, QMFObject obj)
+    {
+    }
+
+    public Class typeMapping(ClassKey key)
+    {
+        return QMFObject.class;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Agent.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Agent.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Agent.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Agent.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,116 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Agent
+{
+    private static Logger log = LoggerFactory.getLogger(Agent.class);
+
+    public static String AgentKey(long AgentBank, long BrokerBank)
+    {
+        return String.format("%s:%s", AgentBank, BrokerBank);
+    }
+
+    public static long getAgentBank(String routingKey)
+    {
+        String delim = ".";
+        return Long.parseLong(routingKey.split(java.util.regex.Pattern
+                .quote(delim))[3]);
+    }
+
+    public static long getBrokerBank(String routingKey)
+    {
+        String delim = ".";
+        return Long.parseLong(routingKey.split(java.util.regex.Pattern
+                .quote(delim))[2]);
+    }
+
+    public static String routingCode(long AgentBank, long BrokerBank)
+    {
+        return String.format("agent.%s.%s", BrokerBank, AgentBank);
+    }
+
+    private long agentBank;
+    private Broker broker;
+    private long brokerBank;
+    private String label;
+
+    public Agent(Broker broker, long agentBank, String label)
+    {
+        this.setBroker(broker);
+        this.setBrokerBank(broker.brokerBank());
+        this.setAgentBank(agentBank);
+        this.setlabel(label);
+    }
+
+    public final String agentKey()
+    {
+        return Agent.AgentKey(getAgentBank(), getBrokerBank());
+    }
+
+    public final long getAgentBank()
+    {
+        return agentBank;
+    }
+
+    public final Broker getBroker()
+    {
+        return broker;
+    }
+
+    public final long getBrokerBank()
+    {
+        return brokerBank;
+    }
+
+    public final String getlabel()
+    {
+        return label;
+    }
+
+    public final String routingCode()
+    {
+        return Agent.routingCode(getAgentBank(), getBrokerBank());
+    }
+
+    public final void setAgentBank(long value)
+    {
+        agentBank = value;
+    }
+
+    public final void setBroker(Broker value)
+    {
+        broker = value;
+    }
+
+    public final void setBrokerBank(long value)
+    {
+        brokerBank = value;
+    }
+
+    public final void setlabel(String value)
+    {
+        label = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Broker.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Broker.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Broker.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,505 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.UUID;
+
+import javax.jms.BytesMessage;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.qpid.client.AMQConnection;
+import org.apache.qpid.transport.codec.BBDecoder;
+import org.apache.qpid.transport.codec.BBEncoder;
+import org.apache.qpid.transport.codec.Decoder;
+import org.apache.qpid.transport.codec.Encoder;
+
+public class Broker implements MessageListener
+{
+    class HeaderInfo
+    {
+        boolean valid;
+        long sequence;
+        char opcode;
+
+        public String toString()
+        {
+            return String.format("%s Header with opcode %s and sequence %s",
+                    (valid ? "Valid" : "Invalid"), opcode, sequence);
+        }
+    }
+    private static Logger log = LoggerFactory.getLogger(Broker.class);
+    public static int SYNC_TIME = 60000;
+    // JMS Stuff
+    private javax.jms.Session session;
+    boolean sessionTransacted = false;
+    private String replyName;
+    private String topicName;
+    private MessageProducer prod;
+    private ArrayList<MessageConsumer> consumers = new ArrayList<MessageConsumer>();
+    private Queue reply;
+    private Queue topic;
+    private int acknowledgeMode = javax.jms.Session.AUTO_ACKNOWLEDGE;
+    // QMF Stuff
+    AMQConnection connection;
+    public String url;
+    public java.util.HashMap<String, Agent> Agents = new java.util.HashMap<String, Agent>();
+    private Session consoleSession;
+    private boolean connected = false;
+    private boolean syncInFlight = false;
+    private boolean topicBound = false;
+    private int reqsOutstanding = 0;
+    private Object lockObject = new Object();
+
+    UUID brokerId = UUID.randomUUID();
+
+    public Broker(org.apache.qpid.console.Session session, String url)
+    {
+        log.debug("Creating a new Broker for url " + url);
+        this.url = url;
+        consoleSession = session;
+        this.tryToConnect();
+    }
+
+    public int brokerBank()
+    {
+        return 1;
+    }
+
+    protected HeaderInfo CheckHeader(Decoder decoder)
+    {
+        HeaderInfo returnValue = new HeaderInfo();
+        returnValue.opcode = 'x';
+        returnValue.sequence = -1;
+        returnValue.valid = false;
+        if (decoder.hasRemaining())
+        {
+            char character = (char) decoder.readUint8();
+            if (character != 'A')
+            {
+                return returnValue;
+            }
+            character = (char) decoder.readUint8();
+            if (character != 'M')
+            {
+                return returnValue;
+            }
+            character = (char) decoder.readUint8();
+            if (character != '3')
+            {
+                return returnValue;
+            }
+            returnValue.valid = true;
+            returnValue.opcode = (char) decoder.readUint8();
+            returnValue.sequence = decoder.readUint32();
+        }
+        return returnValue;
+    }
+
+    public Encoder createEncoder(char opcode, long sequence)
+    {
+        return setHeader(new BBEncoder(1024), opcode, sequence);
+    }
+
+    public Message createMessage(Encoder enc)
+    {
+        try
+        {
+            byte[] buf = new byte[1024];
+            byte[] body = new byte[1024];
+            BBEncoder bbenc = (BBEncoder) enc;
+            BytesMessage msg = session.createBytesMessage();
+            ByteBuffer slice = bbenc.buffer();
+            while (slice.hasRemaining())
+            {
+                int n = Math.min(buf.length, slice.remaining());
+                slice.get(buf, 0, n);
+                msg.writeBytes(buf, 0, n);
+            }
+            return msg;
+        } catch (JMSException e)
+        {
+            throw new ConsoleException(e);
+        }
+    }
+
+    public void decrementOutstanding()
+    {
+        synchronized (lockObject)
+        {
+            this.reqsOutstanding -= 1;
+            if ((reqsOutstanding == 0) & !topicBound)
+            {
+                for (String key : consoleSession.bindingKeys())
+                {
+                    try
+                    {
+                        // this.clientSession.exchangeBind(topicName,
+                        // "qpid.mannagement", key) ;
+                        log.debug("Setting Topic Binding " + key);
+                        // topicName = "management://qpid.management//" + key;
+                        String rk = String.format("&routingkey='%s'", key);
+                        Queue aQueue = session.createQueue(topicName + rk);
+                        MessageConsumer cons = session.createConsumer(aQueue);
+                        cons.setMessageListener(this);
+                        consumers.add(cons);
+                    } catch (JMSException e)
+                    {
+                        throw new ConsoleException(e);
+                    }
+                }
+                topicBound = true;
+            }
+            if ((reqsOutstanding == 0) & syncInFlight)
+            {
+                syncInFlight = false;
+                lockObject.notifyAll();
+            }
+        }
+    }
+
+    private byte[] ensure(int capacity, byte[] body, int size)
+    {
+        if (capacity > body.length)
+        {
+            byte[] copy = new byte[capacity];
+            System.arraycopy(body, 0, copy, 0, size);
+            body = copy;
+        }
+        return body;
+    }
+
+    protected void finalize()
+    {
+        if (connected)
+        {
+            this.shutdown();
+        }
+    }
+
+    public boolean getSyncInFlight()
+    {
+        return syncInFlight;
+    }
+
+    public void incrementOutstanding()
+    {
+        synchronized (lockObject)
+        {
+            this.reqsOutstanding += 1;
+        }
+    }
+
+    public boolean isConnected()
+    {
+        return connected;
+    }
+
+    public void onMessage(Message msg)
+    {
+        Decoder decoder = readBody(msg);
+        HeaderInfo headerInfo = this.CheckHeader(decoder);
+        // log.debug(headerInfo.toString());
+        while (headerInfo.valid)
+        {
+            long seq = headerInfo.sequence;
+            switch (headerInfo.opcode)
+            {
+            case 'b':
+                consoleSession.handleBrokerResponse(this, decoder, seq);
+                break;
+            case 'p':
+                consoleSession.handlePackageIndicator(this, decoder, seq);
+                break;
+            case 'z':
+                consoleSession.handleCommandComplete(this, decoder, seq);
+                break;
+            case 'q':
+                consoleSession.handleClassIndicator(this, decoder, seq);
+                break;
+            case 'm':
+                consoleSession.handleMethodResponse(this, decoder, seq);
+                break;
+            case 'h':
+                consoleSession
+                        .handleHeartbeatIndicator(this, decoder, seq, msg);
+                break;
+            case 'e':
+                consoleSession.handleEventIndicator(this, decoder, seq);
+                break;
+            case 's':
+                consoleSession.handleSchemaResponse(this, decoder, seq);
+                break;
+            case 'c':
+                consoleSession.handleContentIndicator(this, decoder, seq, true,
+                        false);
+                break;
+            case 'i':
+                consoleSession.handleContentIndicator(this, decoder, seq,
+                        false, true);
+                break;
+            case 'g':
+                consoleSession.handleContentIndicator(this, decoder, seq, true,
+                        true);
+                break;
+            default:
+                log.error("Invalid message type recieved with opcode "
+                        + headerInfo.opcode);
+                break;
+            }
+            headerInfo = this.CheckHeader(decoder);
+        }
+    }
+
+    private Decoder readBody(Message message)
+    {
+        BytesMessage msg = (BytesMessage) message;
+        BBDecoder dec = new BBDecoder();
+        byte[] buf = new byte[1024];
+        byte[] body = new byte[1024];
+        int size = 0;
+        int n;
+        try
+        {
+            while ((n = msg.readBytes(buf)) > 0)
+            {
+                body = ensure(size + n, body, size);
+                System.arraycopy(buf, 0, body, size, n);
+                size += n;
+            }
+        } catch (JMSException e)
+        {
+            throw new ConsoleException(e);
+        }
+        dec.init(ByteBuffer.wrap(body, 0, size));
+        return dec;
+    }
+
+    public void send(Encoder enc)
+    {
+        this.send(this.createMessage(enc), "broker");
+    }
+
+    public void send(Message msg)
+    {
+        this.send(msg, "broker", -1);
+    }
+
+    public void send(Message msg, String routingKey)
+    {
+        this.send(msg, routingKey, -1);
+    }
+
+    public void send(Message msg, String routingKey, int ttl)
+    {
+        synchronized (lockObject)
+        {
+            try
+            {
+                log.debug(String.format("Sending message to routing key '%s'",
+                        routingKey));
+                String destName = String.format(
+                        "management://qpid.management//?routingkey='%s'",
+                        routingKey);
+                log.debug(destName);
+                Queue dest = session.createQueue(destName);
+                // Queue jmsReply = session
+                // createQueue("direct://amq.direct//?routingkey='reply-"
+                // + brokerId + "'");
+                if (ttl != -1)
+                {
+                    msg.setJMSExpiration(ttl);
+                }
+                msg.setJMSReplyTo(reply);
+                prod.send(dest, msg);
+            } catch (Exception e)
+            {
+                throw new ConsoleException(e);
+            }
+        }
+    }
+
+    protected Encoder setHeader(Encoder enc, char opcode, long sequence)
+    {
+        enc.writeUint8((short) 'A');
+        enc.writeUint8((short) 'M');
+        enc.writeUint8((short) '3');
+        enc.writeUint8((short) opcode);
+        enc.writeUint32(sequence);
+        return enc;
+    }
+
+    public void setSyncInFlight(boolean inFlight)
+    {
+        synchronized (lockObject)
+        {
+            syncInFlight = inFlight;
+            lockObject.notifyAll();
+        }
+    }
+
+    public void shutdown()
+    {
+        if (connected)
+        {
+            this.waitForStable();
+            try
+            {
+                session.close();
+                for (MessageConsumer cons : consumers)
+                {
+                    cons.close();
+                }
+                connection.close();
+            } catch (Exception e)
+            {
+                throw new ConsoleException(e);
+            } finally
+            {
+                this.connected = false;
+            }
+        }
+    }
+
+    protected void tryToConnect()
+    {
+        try
+        {
+            reqsOutstanding = 1;
+            Agent newAgent = new Agent(this, 0, "BrokerAgent");
+            Agents.put(newAgent.agentKey(), newAgent);
+            connection = new AMQConnection(url);
+            session = connection.createSession(sessionTransacted,
+                    acknowledgeMode);
+            replyName = String
+                    .format(
+                            "direct://amq.direct//reply-%s?exclusive='True'&autodelete='True'",
+                            brokerId);
+            topicName = String
+                    .format(
+                            "management://qpid.management//topic-%s?exclusive='True'&autodelete='True'",
+                            brokerId);
+            reply = session.createQueue(replyName);
+            MessageConsumer cons = session.createConsumer(reply);
+            cons.setMessageListener(this);
+            consumers.add(cons);
+            prod = session.createProducer(null);
+            topic = session.createQueue(topicName);
+            cons = session.createConsumer(topic);
+            cons.setMessageListener(this);
+            consumers.add(cons);
+            connection.start();
+            // Rest of the topic is bound later. Start er up
+        } catch (Exception e)
+        {
+            throw new ConsoleException(e);
+        }
+        connected = true;
+        consoleSession.handleBrokerConnect(this);
+        Encoder Encoder = createEncoder('B', 0);
+        this.send(Encoder);
+    }
+
+    public void updateAgent(QMFObject obj)
+    {
+        long agentBank = (Long) obj.GetProperty("agentBank");
+        long brokerBank = (Long) obj.GetProperty("brokerBank");
+        String key = Agent.AgentKey(agentBank, brokerBank);
+        if (obj.isDeleted())
+        {
+            if (Agents.containsKey(key))
+            {
+                Agent agent = Agents.get(key);
+                Agents.remove(key);
+                consoleSession.handleAgentRemoved(agent);
+            }
+        } else
+        {
+            if (!Agents.containsKey(key))
+            {
+                Agent newAgent = new Agent(this, agentBank, (String) obj
+                        .GetProperty("label"));
+                Agents.put(key, newAgent);
+                consoleSession.handleNewAgent(newAgent);
+            }
+        }
+    }
+
+    public void waitForStable()
+    {
+        synchronized (lockObject)
+        {
+            if (connected)
+            {
+                long start = System.currentTimeMillis();
+                syncInFlight = true;
+                while (reqsOutstanding != 0)
+                {
+                    log.debug("Waiting to recieve messages");
+                    try
+                    {
+                        lockObject.wait(SYNC_TIME);
+                    } catch (Exception e)
+                    {
+                        throw new ConsoleException(e);
+                    }
+                    long duration = System.currentTimeMillis() - start;
+                    if (duration > SYNC_TIME)
+                    {
+                        throw new ConsoleException(
+                                "Timeout waiting for Broker to Sync");
+                    }
+                }
+            }
+        }
+    }
+
+    public void waitForSync(int timeout)
+    {
+        synchronized (lockObject)
+        {
+            long start = System.currentTimeMillis();
+            while (syncInFlight)
+            {
+                try
+                {
+                    lockObject.wait(SYNC_TIME);
+                } catch (Exception e)
+                {
+                    throw new ConsoleException(e);
+                }
+            }
+            long duration = System.currentTimeMillis() - start;
+            if (duration > timeout)
+            {
+                throw new ConsoleException("Timeout waiting for Broker to Sync");
+            }
+        }
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ClassKey.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ClassKey.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ClassKey.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ClassKey.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,142 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import org.apache.qpid.transport.codec.Decoder;
+import org.apache.qpid.transport.codec.Encoder;
+
+public class ClassKey
+{
+    private String packageName;
+    private String className;
+    private long[] hash = new long[4];
+
+    public ClassKey(Decoder dec)
+    {
+        setPackageName(dec.readStr8());
+        setClassName(dec.readStr8());
+        hash[0] = dec.readUint32();
+        hash[1] = dec.readUint32();
+        hash[2] = dec.readUint32();
+        hash[3] = dec.readUint32();
+    }
+
+    public ClassKey(String keyString)
+    {
+        String delims = ":()";
+        String[] parts = keyString.split(java.util.regex.Pattern.quote(delims));
+        if (parts.length < 3)
+        {
+            throw new ConsoleException(
+                    "Invalid class key format. Format should be package:class(bytes)");
+        }
+        setPackageName(parts[0]);
+        setClassName(parts[1]);
+        delims = "-";
+        String[] bytes = parts[2].split(java.util.regex.Pattern.quote(delims));
+        if (bytes.length != 4)
+        {
+            throw new ConsoleException(
+                    "Invalid class key format. Bytes should be in the format HEX-HEX-HEX-HEX");
+        }
+        hash[0] = Long.parseLong(bytes[0], 16);
+        hash[1] = Long.parseLong(bytes[1], 16);
+        hash[2] = Long.parseLong(bytes[2], 16);
+        hash[3] = Long.parseLong(bytes[3], 16);
+    }
+
+    public void encode(Encoder enc)
+    {
+        enc.writeStr8(getPackageName());
+        enc.writeStr8(getClassName());
+        enc.writeUint32(hash[0]);
+        enc.writeUint32(hash[1]);
+        enc.writeUint32(hash[2]);
+        enc.writeUint32(hash[3]);
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (obj.getClass().equals(this.getClass()))
+        {
+            ClassKey other = (ClassKey) obj;
+            return (other.getKeyString().equals(this.getKeyString()));
+        } else
+        {
+            return false;
+        }
+    }
+
+    public final String getClassName()
+    {
+        return className;
+    }
+
+    public long[] getHash()
+    {
+        return hash;
+    }
+    
+    public String getHashString() {
+        return String.format("%08x-%08x-%08x-%08x", hash[0], hash[1],
+                hash[2], hash[3]);   
+    }
+
+    public String getKeyString()
+    {
+        String hashString = this.getHashString() ;
+        return String.format("%s:%s(%s)", getPackageName(), getClassName(),
+                hashString);
+    }
+
+    public String getPackageName()
+    {
+        return packageName;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return getKeyString().hashCode();
+    }
+
+    public void setClassName(String value)
+    {
+        className = value;
+    }
+
+    public void setHash(long[] hash)
+    {
+        this.hash = hash;
+    }
+
+    public void setPackageName(String value)
+    {
+        packageName = value;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.format("ClassKey: %s", getKeyString());
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Console.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Console.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Console.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/Console.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,51 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+public interface Console
+{
+    void agentRemoved(Agent agent);
+
+    void brokerConnected(Broker broker);
+
+    void brokerDisconnected(Broker broker);
+
+    void brokerInformation(Broker broker);
+
+    void eventRecieved(Broker broker, QMFEvent anEvent);
+
+    void hearbeatRecieved(Agent agent, long timestamp);
+
+    void methodResponse(Broker broker, long seq, MethodResult response);
+
+    void newAgent(Agent agent);
+
+    void newClass(short kind, ClassKey key);
+
+    void newPackage(String packageName);
+
+    void objectProperties(Broker broker, QMFObject obj);
+
+    void objectStatistics(Broker broker, QMFObject obj);
+
+    @SuppressWarnings("unchecked")
+    Class typeMapping(ClassKey key);
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ConsoleException.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ConsoleException.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ConsoleException.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ConsoleException.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,48 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.lang.RuntimeException;
+
+public class ConsoleException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public ConsoleException()
+    {
+        super();
+    }
+
+    public ConsoleException(String message)
+    {
+        super(message);
+    }
+
+    public ConsoleException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    public ConsoleException(Throwable cause)
+    {
+        super(cause);
+    }
+}

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/EventSeverity.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/EventSeverity.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/EventSeverity.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/EventSeverity.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+public enum EventSeverity
+{
+    EMER(0), ALERT(1), CRIT(2), ERROR(3), WARN(4), NOTIC(5), INFO(6), DEBUG(7);
+    private int intValue;
+
+    private EventSeverity(int value)
+    {
+        intValue = value;
+    }
+
+    public int getValue()
+    {
+        return intValue;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/MethodResult.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/MethodResult.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/MethodResult.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/MethodResult.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.HashMap;
+
+public class MethodResult
+{
+    private long returnCode;
+    private String text;
+    protected java.util.HashMap<String, Object> returnValues;
+
+    public MethodResult(long aCode, String aMsg,
+            java.util.HashMap<String, Object> args)
+    {
+        setReturnCode(aCode);
+        setText(aMsg);
+        returnValues = args;
+    }
+
+    public long getReturnCode()
+    {
+        return returnCode;
+    }
+
+    public Object getReturnValue(String name)
+    {
+        Object returnValue = null;
+        if (returnValues.containsKey(name))
+        {
+            returnValue = returnValues.get(name);
+        }
+        return returnValue;
+    }
+
+    public HashMap<String, Object> getReturnValues()
+    {
+        return returnValues;
+    }
+
+    public String getText()
+    {
+        return text;
+    }
+
+    public void setReturnCode(long value)
+    {
+        returnCode = value;
+    }
+
+    public void setText(String value)
+    {
+        text = value;
+    }
+
+    @Override
+    public String toString()
+    {
+        String returnString = "";
+        for (java.util.Map.Entry<String, Object> pair : returnValues.entrySet())
+        {
+            returnString = returnString
+                    + String.format("(Key: '%s' Value: '%s')", pair.getKey(),
+                            pair.getValue());
+        }
+        return String.format(
+                "MethodResult: ReturnCode=%s, Text=%s Values=[%s]",
+                getReturnCode(), getText(), returnString);
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ObjectID.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ObjectID.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ObjectID.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/ObjectID.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,93 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import org.apache.qpid.transport.codec.*;
+
+public class ObjectID
+{
+    protected long first;
+    protected long second;
+
+    public ObjectID()
+    {
+    }
+
+    public ObjectID(Decoder dec)
+    {
+        first = dec.readUint64();
+        second = dec.readUint64();
+    }
+
+    public ObjectID(long first, long second)
+    {
+        this.first = first;
+        this.second = second;
+    }
+
+    public long agentBank()
+    {
+        return (this.first & 0x000000000FFFFFFF);
+    }
+
+    public long brokerBank()
+    {
+        return (this.first & 0x0000FFFFF0000000L) >> 28;
+    }
+
+    public void encode(Encoder enc)
+    {
+        enc.writeUint64(first);
+        enc.writeUint64(second);
+    }
+
+    public long flags()
+    {
+        return (this.first & 0xF000000000000000L) >> 60;
+    }
+
+    public boolean isDurable()
+    {
+        return sequence() == 0;
+    }
+
+    public long objectNum()
+    {
+        return second;
+    }
+
+    public String routingCode()
+    {
+        return Agent.routingCode(agentBank(), brokerBank());
+    }
+
+    public long sequence()
+    {
+        return (this.first & 0x0FFF000000000000L) >> 48;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "" + flags() + "-" + sequence() + "-" + brokerBank() + "-"
+                + agentBank() + "-" + objectNum();
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFEvent.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFEvent.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFEvent.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFEvent.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,108 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.HashMap;
+
+import org.apache.qpid.transport.codec.*;
+
+public class QMFEvent
+{
+    private java.util.HashMap<String, Object> arguments;
+    private ClassKey classKey;
+    private Session session;
+    private EventSeverity severity;
+    // FIXME time?
+    private long timestamp;
+
+    public QMFEvent(Session session, Decoder dec)
+    {
+        setSession(session);
+        setClassKey(new ClassKey(dec));
+        setTimestamp(dec.readInt64());
+        setSeverity(EventSeverity.values()[dec.readUint8()]);
+        SchemaClass sClass = getSession().getSchema(getClassKey());
+        setArguments(new java.util.HashMap<String, Object>());
+        if (sClass != null)
+        {
+            for (SchemaArgument arg : sClass.arguments)
+            {
+                getArguments().put(arg.getName(),
+                        getSession().decodeValue(dec, arg.getType()));
+            }
+        }
+    }
+
+    public final Object GetArgument(String argName)
+    {
+        return getArguments().get(argName);
+    }
+
+    public final HashMap<String, Object> getArguments()
+    {
+        return arguments;
+    }
+
+    public final ClassKey getClassKey()
+    {
+        return classKey;
+    }
+
+    public final Session getSession()
+    {
+        return session;
+    }
+
+    public final EventSeverity getSeverity()
+    {
+        return severity;
+    }
+
+    public final long getTimestamp()
+    {
+        return timestamp;
+    }
+
+    public final void setArguments(java.util.HashMap<String, Object> value)
+    {
+        arguments = value;
+    }
+
+    public final void setClassKey(ClassKey value)
+    {
+        classKey = value;
+    }
+
+    public final void setSession(Session value)
+    {
+        session = value;
+    }
+
+    public final void setSeverity(EventSeverity value)
+    {
+        severity = value;
+    }
+
+    public final void setTimestamp(long value)
+    {
+        timestamp = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFObject.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFObject.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFObject.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/QMFObject.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,423 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map.Entry;
+
+import org.apache.qpid.transport.codec.Decoder;
+import org.apache.qpid.transport.codec.Encoder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import edu.emory.mathcs.backport.java.util.Arrays;
+
+public class QMFObject
+{
+    private static Logger log = LoggerFactory.getLogger(QMFObject.class);
+    protected SchemaClass schema;
+    private java.util.Date createTime;
+    private java.util.Date currentTime;
+    private java.util.Date deleteTime;
+    private ObjectID objectID;
+    private Session session;
+    private boolean managed;
+    public java.util.HashMap<String, Object> properties = new java.util.HashMap<String, Object>();
+    public java.util.HashMap<String, Object> statistics = new java.util.HashMap<String, Object>();
+
+    // This constructor is the "naked" constructor which creates
+    // an object without a session or a schema. It is used by
+    // subclasses which are auto generated
+    public QMFObject()
+    {
+    }
+
+    public QMFObject(QMFObject source)
+    {
+        this.setSession(source.getSession());
+        this.setSchema(source.getSchema());
+        this.managed = source.managed;
+        this.setCurrentTime(source.getCurrentTime());
+        this.setCreateTime(source.getCreateTime());
+        this.setDeleteTime(source.getDeleteTime());
+        this.setObjectID(source.getObjectID());
+        this.properties = source.properties;
+        this.statistics = source.statistics;
+    }
+
+    // This constructor is used by a session make object call to
+    // create a blank object from a schema.
+    public QMFObject(Session session, SchemaClass schema,
+            boolean hasProperties, boolean hasStats, boolean isManaged)
+    {
+        setSession(session);
+        setSchema(schema);
+        managed = isManaged;
+        if (hasProperties)
+        {
+            for (SchemaProperty prop : getSchema().getAllProperties())
+            {
+                Object propValue = null;
+                if (!prop.getOptional())
+                {
+                    propValue = Util.defaultValue(prop.getType());
+                }
+                this.setProperty(prop.getName(), propValue);
+            }
+        }
+        if (hasStats)
+        {
+            for (SchemaStatistic stat : getSchema().statistics)
+            {
+                setStatistic(stat.getName(), Util.defaultValue(stat.getType()));
+            }
+        }
+    }
+
+    // This constructor is used by the session to create an object based on a
+    // data
+    // stream by the agent.
+    public QMFObject(Session session, SchemaClass schema, Decoder dec,
+            boolean hasProperties, boolean hasStats, boolean isManaged)
+    {
+        setSession(session);
+        setSchema(schema);
+        managed = isManaged;
+        if (managed)
+        {
+            // FIXME DateTime or Uint64??
+            setCurrentTime(new java.util.Date(dec.readDatetime()));
+            setCreateTime(new java.util.Date(dec.readDatetime()));
+            setDeleteTime(new java.util.Date(dec.readDatetime()));
+            setObjectID(new ObjectID(dec));
+        }
+        if (hasProperties)
+        {
+            java.util.ArrayList<String> excluded = processPresenceMasks(dec,
+                    getSchema());
+            for (SchemaProperty prop : getSchema().getAllProperties())
+            {
+                if (excluded.contains(prop.getName()))
+                {
+                    // log.Debug(String.Format("Setting Property Default {0}",
+                    // prop.Name)) ;
+                    safeAddProperty(prop.getName(), null);
+                } else
+                {
+                    // log.Debug(String.Format("Setting Property {0}",
+                    // prop.Name)) ;
+                    safeAddProperty(prop.getName(), session.decodeValue(dec,
+                            prop.getType()));
+                }
+            }
+        }
+        if (hasStats)
+        {
+            for (SchemaStatistic stat : getSchema().getAllStatistics())
+            {
+                // log.Debug(String.Format("Setting Statistic {0}", stat.Name))
+                // ;
+                statistics.put(stat.getName(), session.decodeValue(dec, stat
+                        .getType()));
+            }
+        }
+    }
+
+    public final long agentBank()
+    {
+        return getObjectID().agentBank();
+    }
+
+    public final long brokerBank()
+    {
+        return getObjectID().brokerBank();
+    }
+
+    public final void encode(Encoder enc)
+    {
+        int mask = 0;
+        int bit = 0;
+        java.util.ArrayList<SchemaProperty> propsToEncode = new java.util.ArrayList<SchemaProperty>();
+        log.debug(String.format("Encoding class %s:%s", getSchema()
+                .getPackageName(), getSchema().getClassName()));
+        enc.writeUint8((short) 20);
+        getSchema().getKey().encode(enc);
+        for (SchemaProperty prop : getSchema().getAllProperties())
+        {
+            if (prop.getOptional())
+            {
+                if (bit == 0)
+                {
+                    bit = 1;
+                }
+                if ((properties.containsKey(prop.getName()))
+                        && (properties.get(prop.getName()) != null))
+                {
+                    mask |= bit;
+                    propsToEncode.add(prop);
+                } else
+                {
+                }
+                bit = bit << 1;
+                if (bit == 256)
+                {
+                    bit = 0;
+                    enc.writeUint8((short) mask);
+                    mask = 0;
+                }
+            } else
+            {
+                propsToEncode.add(prop);
+            }
+        }
+        if (bit != 0)
+        {
+            enc.writeUint8((short) mask);
+        }
+        for (SchemaProperty prop : propsToEncode)
+        {
+            Object obj = properties.get(prop.getName());
+            // log.Debug(String.Format("Encoding property {0}", prop.Name)) ;
+            getSession().encodeValue(enc, prop.getType(), obj);
+        }
+        for (SchemaStatistic stat : getSchema().statistics)
+        {
+            Object obj = statistics.get(stat.getName());
+            getSession().encodeValue(enc, stat.getType(), obj);
+        }
+        log.debug("Done");
+    }
+
+    public final Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public final Date getCurrentTime()
+    {
+        return currentTime;
+    }
+
+    public final Date getDeleteTime()
+    {
+        return deleteTime;
+    }
+
+    protected final ArrayList<SchemaMethod> getMethods()
+    {
+        return getSchema().getAllMethods();
+    }
+
+    public final ObjectID getObjectID()
+    {
+        return objectID;
+    }
+
+    public final Object GetProperty(String attributeName)
+    {
+        return properties.get(attributeName);
+    }
+
+    public SchemaClass getSchema()
+    {
+        return schema;
+    }
+
+    public final Session getSession()
+    {
+        return session;
+    }
+
+    protected final MethodResult internalInvokeMethod(String name,
+            List<Object> args, boolean synchronous, int timeToLive)
+    {
+        if (!managed)
+        {
+            throw new ConsoleException("Object is not Managed");
+        }
+        if (getSchema().getMethod(name) == null)
+        {
+            throw new ConsoleException(String.format(
+                    "Method named '%s' does not exist", name));
+        }
+        return getSession().invokeMethod(this, name, args, synchronous,
+                timeToLive);
+    }
+
+    public final MethodResult invokeMethod(String name, boolean synchronous,
+            int timeToLive, Object... args)
+    {
+        return this.internalInvokeMethod(name, Arrays.asList(args),
+                synchronous, timeToLive);
+    }
+
+    public final MethodResult invokeMethod(String name, boolean synchronous,
+            Object... args)
+    {
+        return this.internalInvokeMethod(name, Arrays.asList(args),
+                synchronous, Broker.SYNC_TIME);
+    }
+
+    public final MethodResult invokeMethod(String name, int timeToLive,
+            Object... args)
+    {
+        return this.internalInvokeMethod(name, Arrays.asList(args), true,
+                timeToLive);
+    }
+
+    public final MethodResult invokeMethod(String name, Object... args)
+    {
+        return this.internalInvokeMethod(name, Arrays.asList(args), true,
+                Broker.SYNC_TIME);
+    }
+
+    public final boolean isDeleted()
+    {
+        return !getDeleteTime().equals(new java.util.Date(0));
+    }
+
+    protected final ArrayList<String> processPresenceMasks(Decoder dec,
+            SchemaClass schema)
+    {
+        java.util.ArrayList<String> excludes = new java.util.ArrayList<String>();
+        short bit = 0;
+        short mask = 0;
+        for (SchemaProperty prop : getSchema().getAllProperties())
+        {
+            if (prop.getOptional())
+            {
+                // log.Debug(String.Format("Property named {0} is optional",
+                // prop.Name)) ;
+                if (bit == 0)
+                {
+                    mask = dec.readUint8();
+                    bit = 1;
+                }
+                if ((mask & bit) == 0)
+                {
+                    // log.Debug(String.Format("Property named {0} is not present",
+                    // prop.Name)) ;
+                    excludes.add(prop.getName());
+                }
+                bit *= 2;
+                if (bit == 256)
+                {
+                    bit = 0;
+                }
+            }
+        }
+        return excludes;
+    }
+
+    public final String routingKey()
+    {
+        return getObjectID().routingCode();
+    }
+
+    protected final void safeAddProperty(String propName, Object value)
+    {
+        if (properties.containsKey(propName))
+        {
+            properties.put(propName, value);
+        } else
+        {
+            properties.put(propName, value);
+        }
+    }
+
+    public final void setCreateTime(java.util.Date value)
+    {
+        createTime = value;
+    }
+
+    public final void setCurrentTime(java.util.Date value)
+    {
+        currentTime = value;
+    }
+
+    public final void setDeleteTime(java.util.Date value)
+    {
+        deleteTime = value;
+    }
+
+    public final void setObjectID(ObjectID value)
+    {
+        objectID = value;
+    }
+
+    public final void setProperty(String attributeName, Object newValue)
+    {
+        properties.put(attributeName, newValue);
+    }
+
+    public void setSchema(SchemaClass value)
+    {
+        schema = value;
+    }
+
+    public final void setSession(Session value)
+    {
+        session = value;
+    }
+
+    protected final void setStatistic(String attributeName, Object newValue)
+    {
+        statistics.put(attributeName, newValue);
+    }
+
+    @Override
+    public String toString()
+    {
+        String propertyString = "";
+        for (Entry<String, Object> pair : properties.entrySet())
+        {
+            propertyString = propertyString
+                    + String.format("(Name: '%0$s' Value: '%1$s')", pair
+                            .getKey(), pair.getValue());
+        }
+        String statsString = "";
+        for (Entry<String, Object> sPair : statistics.entrySet())
+        {
+            statsString = statsString
+                    + String.format("(Name: '%0$s' Value: '%1$s')", sPair
+                            .getKey(), sPair.getValue());
+        }
+        if (managed)
+        {
+            return String
+                    .format(
+                            "Managed QMFObject %0$s:%1$s(%2$s) Properties: [%3$s] Statistics: [%4$s])",
+                            getSchema().getPackageName(), getSchema()
+                                    .getClassName(), getObjectID(),
+                            propertyString, statsString);
+        } else
+        {
+            return String
+                    .format(
+                            "QMFObject %0$s:%1$s Properties: [%2$s] Statistics: [%3$s]",
+                            getSchema().getPackageName(), getSchema()
+                                    .getClassName(), propertyString,
+                            statsString);
+        }
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaArgument.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaArgument.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaArgument.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaArgument.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,65 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.Map;
+
+import org.apache.qpid.transport.codec.Decoder;
+
+public class SchemaArgument extends SchemaVariable
+{
+    private String direction;
+
+    public SchemaArgument(Decoder dec, boolean methodArg)
+    {
+        Map<String, Object> map = dec.readMap();
+        super.populateData(map);
+        if (map.containsKey("dir"))
+        {
+            setDirection((String) map.get("dir"));
+        }
+    }
+
+    public String getDirection()
+    {
+        return direction;
+    }
+
+    public boolean isBidirectional()
+    {
+        return getDirection().equals("IO");
+    }
+
+    public boolean isInput()
+    {
+        return getDirection().equals("I") | getDirection().equals("IO");
+    }
+
+    public boolean isOutput()
+    {
+        return getDirection().equals("O") | getDirection().equals("IO");
+    }
+
+    public void setDirection(String value)
+    {
+        direction = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaClass.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaClass.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaClass.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaClass.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,251 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;//
+
+import java.util.ArrayList;
+
+import org.apache.qpid.transport.codec.*;
+
+public class SchemaClass
+{
+    public static int CLASS_KIND_EVENT = 2;
+    public static int CLASS_KIND_TABLE = 1;
+    public ArrayList<SchemaArgument> arguments = new ArrayList<SchemaArgument>();
+    private ClassKey classKey;
+    private int kind;
+    private Session session;
+    private ClassKey superType;
+    public ArrayList<SchemaMethod> methods = new ArrayList<SchemaMethod>();
+    public ArrayList<SchemaProperty> properties = new ArrayList<SchemaProperty>();
+    public ArrayList<SchemaStatistic> statistics = new ArrayList<SchemaStatistic>();
+
+    public SchemaClass(int kind, ClassKey key, Decoder dec, Session session)
+    {
+        // System.Console.WriteLine(key.ClassName) ;
+        setKind(kind);
+        setSession(session);
+        this.setKey(key);
+        boolean hasSupertype = dec.readUint8() != 0;
+        if (kind == CLASS_KIND_TABLE)
+        {
+            int propCount = dec.readUint16();
+            int statCount = dec.readUint16();
+            int methodCount = dec.readUint16();
+            if (hasSupertype)
+            {
+                setSuperType(new ClassKey(dec));
+            }
+            for (int x = 0; x < propCount; x++)
+            {
+                properties.add(new SchemaProperty(dec));
+            }
+            for (int x = 0; x < statCount; x++)
+            {
+                statistics.add(new SchemaStatistic(dec));
+            }
+            for (int x = 0; x < methodCount; x++)
+            {
+                methods.add(new SchemaMethod(dec));
+            }
+        }
+        if (kind == CLASS_KIND_EVENT)
+        {
+            int argCount = dec.readUint16();
+            if (hasSupertype)
+            {
+                setSuperType(new ClassKey(dec));
+            }
+            for (int x = 0; x < argCount; x++)
+            {
+                arguments.add(new SchemaArgument(dec, false));
+            }
+        }
+    }
+
+    public ArrayList<SchemaMethod> getAllMethods()
+    {
+        if (getSuperType() == null)
+        {
+            return methods;
+        } else
+        {
+            ArrayList<SchemaMethod> allMethods = new ArrayList<SchemaMethod>(
+                    methods);
+            allMethods.addAll(getSession().getSchema(getSuperType())
+                    .getAllMethods());
+            return allMethods;
+        }
+    }
+
+    public ArrayList<SchemaProperty> getAllProperties()
+    {
+        if (getSuperType() == null)
+        {
+            return properties;
+        } else
+        {
+            ArrayList<SchemaProperty> allProperties = new ArrayList<SchemaProperty>(
+                    properties);
+            allProperties.addAll(getSession().getSchema(getSuperType())
+                    .getAllProperties());
+            return allProperties;
+        }
+    }
+
+    public ArrayList<SchemaStatistic> getAllStatistics()
+    {
+        if (getSuperType() == null)
+        {
+            return statistics;
+        } else
+        {
+            ArrayList<SchemaStatistic> allStats = new ArrayList<SchemaStatistic>(
+                    statistics);
+            allStats.addAll(getSession().getSchema(getSuperType())
+                    .getAllStatistics());
+            return allStats;
+        }
+    }
+
+    public String getClassKeyString()
+    {
+        return getKey().getKeyString();
+    }
+
+    public String getClassName()
+    {
+        return getKey().getClassName();
+    }
+
+    public ClassKey getKey()
+    {
+        return classKey;
+    }
+
+    public int getKind()
+    {
+        return kind;
+    }
+
+    public SchemaMethod getMethod(String name)
+    {
+        SchemaMethod returnValue = null;
+        for (SchemaMethod method : methods)
+        {
+            if (method.getName().equals(name))
+            {
+                returnValue = method;
+                break;
+            }
+        }
+        return returnValue;
+    }
+
+    public String getPackageName()
+    {
+        return getKey().getPackageName();
+    }
+
+    protected Session getSession()
+    {
+        return session;
+    }
+
+    public ClassKey getSuperType()
+    {
+        return superType;
+    }
+
+    public boolean hasSuperType()
+    {
+        return getSuperType() != null;
+    }
+
+    public void setKey(ClassKey value)
+    {
+        classKey = value;
+    }
+
+    public void setKind(int value)
+    {
+        kind = value;
+    }
+
+    protected void setSession(Session value)
+    {
+        session = value;
+    }
+
+    public void setSuperType(ClassKey value)
+    {
+        superType = value;
+    }
+    
+    public ArrayList<SchemaProperty> getProperties()
+    {
+        return properties;
+    }
+
+    public void setProperties(ArrayList<SchemaProperty> properties)
+    {
+        this.properties = properties;
+    }
+
+    public ArrayList<SchemaMethod> getMethods()
+    {
+        return methods;
+    }
+
+    public void setMethods(ArrayList<SchemaMethod> methods)
+    {
+        this.methods = methods;
+    }
+
+    public ArrayList<SchemaStatistic> getStatistics()
+    {
+        return statistics;
+    }
+
+    public void setStatistics(ArrayList<SchemaStatistic> statistics)
+    {
+        this.statistics = statistics;
+    }
+
+    public ArrayList<SchemaArgument> getArguments()
+    {
+        return arguments;
+    }
+
+    public void setArguments(ArrayList<SchemaArgument> arguments)
+    {
+        this.arguments = arguments;
+    }
+
+    public ClassKey getClassKey()
+    {
+        return classKey;
+    }
+
+    public void setClassKey(ClassKey classKey)
+    {
+        this.classKey = classKey;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaMethod.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaMethod.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaMethod.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaMethod.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,125 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;//
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.apache.qpid.transport.codec.*;
+
+public class SchemaMethod
+{
+    public ArrayList<SchemaArgument> Arguments = new ArrayList<SchemaArgument>();
+    private int m_ArgCount;
+    private int m_BidirectionalArgCount;
+    private String m_Description;
+    private int m_InputArgCount;
+    private String m_Name;
+    private int m_OutputArgCount;
+
+    public SchemaMethod(Decoder dec)
+    {
+        Map<String, Object> map = dec.readMap();
+        setName((String) map.get("name"));
+        setArgCount((Integer) map.get("argCount"));
+        if (map.containsKey("desc"))
+        {
+            setDescription((String) map.get("desc"));
+        }
+        for (int x = 0; x < getArgCount(); x++)
+        {
+            SchemaArgument arg = new SchemaArgument(dec, true);
+            Arguments.add(arg);
+            if (arg.isInput())
+            {
+                setInputArgCount(getInputArgCount() + 1);
+            }
+            if (arg.isOutput())
+            {
+                setOutputArgCount(getOutputArgCount() + 1);
+            }
+            if (arg.isBidirectional())
+            {
+                setBidirectionalArgCount(getBidirectionalArgCount() + 1);
+            }
+        }
+    }
+
+    public final int getArgCount()
+    {
+        return m_ArgCount;
+    }
+
+    public final int getBidirectionalArgCount()
+    {
+        return m_BidirectionalArgCount;
+    }
+
+    public final String getDescription()
+    {
+        return m_Description;
+    }
+
+    public final int getInputArgCount()
+    {
+        return m_InputArgCount;
+    }
+
+    public final String getName()
+    {
+        return m_Name;
+    }
+
+    public final int getOutputArgCount()
+    {
+        return m_OutputArgCount;
+    }
+
+    public final void setArgCount(int value)
+    {
+        m_ArgCount = value;
+    }
+
+    public final void setBidirectionalArgCount(int value)
+    {
+        m_BidirectionalArgCount = value;
+    }
+
+    public final void setDescription(String value)
+    {
+        m_Description = value;
+    }
+
+    public final void setInputArgCount(int value)
+    {
+        m_InputArgCount = value;
+    }
+
+    public final void setName(String value)
+    {
+        m_Name = value;
+    }
+
+    public final void setOutputArgCount(int value)
+    {
+        m_OutputArgCount = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaProperty.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaProperty.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaProperty.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaProperty.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,81 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.Map;
+
+import org.apache.qpid.transport.codec.*;
+
+public class SchemaProperty extends SchemaVariable
+{
+    private int access;
+    private boolean index;
+    private boolean optional;
+
+    public SchemaProperty(Decoder dec)
+    {
+        Map<String, Object> map = dec.readMap();
+        super.populateData(map);
+        setName((String) map.get("name"));
+        if (map.containsKey("optional"))
+        {
+            setOptional((Integer) map.get("optional") != 0);
+        }
+        if (map.containsKey("index"))
+        {
+            setIndex((Integer) map.get("index") != 0);
+        }
+        if (map.containsKey("access"))
+        {
+            setAccess((Integer) map.get("access"));
+        }
+    }
+
+    public int getAccess()
+    {
+        return access;
+    }
+
+    public boolean getIndex()
+    {
+        return index;
+    }
+
+    public boolean getOptional()
+    {
+        return optional;
+    }
+
+    public void setAccess(int value)
+    {
+        access = value;
+    }
+
+    public void setIndex(boolean value)
+    {
+        index = value;
+    }
+
+    public void setOptional(boolean value)
+    {
+        optional = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaStatistic.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaStatistic.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaStatistic.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaStatistic.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;//
+
+import java.util.Map;
+
+import org.apache.qpid.transport.codec.*;
+
+public class SchemaStatistic
+{
+    private String description;
+    private String name;
+    private short type;
+    private String unit;
+
+    public SchemaStatistic(Decoder dec)
+    {
+        Map<String, Object> map = dec.readMap();
+        setName((String) map.get("name"));
+        setType(Short.parseShort("" + map.get("type")));
+        if (map.containsKey("unit"))
+        {
+            setUnit((String) map.get("unit"));
+        }
+        if (map.containsKey("description"))
+        {
+            setDescription((String) map.get("description"));
+        }
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public short getType()
+    {
+        return type;
+    }
+
+    public String getUnit()
+    {
+        return unit;
+    }
+
+    public void setDescription(String value)
+    {
+        description = value;
+    }
+
+    public void setName(String value)
+    {
+        name = value;
+    }
+
+    public void setType(short value)
+    {
+        type = value;
+    }
+
+    public void setUnit(String value)
+    {
+        unit = value;
+    }
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaVariable.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaVariable.java?rev=787325&view=auto
==============================================================================
--- qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaVariable.java (added)
+++ qpid/trunk/qpid/java/management/console/src/main/java/org/apache/qpid/console/SchemaVariable.java Mon Jun 22 17:43:54 2009
@@ -0,0 +1,185 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.console;
+
+import java.util.Map;
+
+public abstract class SchemaVariable
+{
+    private String defaultVariable;
+    private String description;
+    private Integer max;
+    private Integer maxLength;
+    private Integer min;
+    private String name;
+    private String refClass;
+    private String refPackage;
+    private short type;
+    private String unit;
+
+    public SchemaVariable()
+    {
+    }
+
+    public String getDefault()
+    {
+        return defaultVariable;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public Integer getMax()
+    {
+        return max;
+    }
+
+    public Integer getMaxLength()
+    {
+        return maxLength;
+    }
+
+    public Integer getMin()
+    {
+        return min;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public String getRefClass()
+    {
+        return refClass;
+    }
+
+    public String getRefPackage()
+    {
+        return refPackage;
+    }
+
+    public short getType()
+    {
+        return type;
+    }
+
+    public String getUnit()
+    {
+        return unit;
+    }
+
+    protected void populateData(Map<String, Object> map)
+    {
+        if (map.containsKey("name"))
+        {
+            setName((String) map.get("name"));
+        }
+        if (map.containsKey("type"))
+        {
+            setType(Short.parseShort(("" + map.get("type"))));
+        }
+        if (map.containsKey("unit"))
+        {
+            setUnit((String) map.get("unit"));
+        }
+        if (map.containsKey("min"))
+        {
+            setMin((Integer) map.get("min"));
+        }
+        if (map.containsKey("max"))
+        {
+            setMax((Integer) map.get("max"));
+        }
+        if (map.containsKey("maxlen"))
+        {
+            setMaxLength((Integer) map.get("maxlen"));
+        }
+        if (map.containsKey("description"))
+        {
+            setDescription((String) map.get("description"));
+        }
+        if (map.containsKey("refClass"))
+        {
+            setRefClass((String) map.get("refClass"));
+        }
+        if (map.containsKey("refPackage"))
+        {
+            setRefPackage((String) map.get("refPackage"));
+        }
+        if (map.containsKey("Default"))
+        {
+            setDefault((String) map.get("default"));
+        }
+    }
+
+    public void setDefault(String value)
+    {
+        defaultVariable = value;
+    }
+
+    public void setDescription(String value)
+    {
+        description = value;
+    }
+
+    public void setMax(Integer value)
+    {
+        max = value;
+    }
+
+    public void setMaxLength(Integer value)
+    {
+        maxLength = value;
+    }
+
+    public void setMin(Integer value)
+    {
+        min = value;
+    }
+
+    public void setName(String value)
+    {
+        name = value;
+    }
+
+    public void setRefClass(String value)
+    {
+        refClass = value;
+    }
+
+    public void setRefPackage(String value)
+    {
+        refPackage = value;
+    }
+
+    public void setType(short value)
+    {
+        type = value;
+    }
+
+    public void setUnit(String value)
+    {
+        unit = value;
+    }
+}
\ No newline at end of file



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org