You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ac...@apache.org on 2006/01/24 11:24:03 UTC

svn commit: r371880 [2/3] - in /incubator/activemq/trunk: activemq-core/src/main/java/org/apache/activemq/broker/ activemq-core/src/main/java/org/apache/activemq/broker/console/ activemq-core/src/main/java/org/apache/activemq/broker/console/command/ ac...

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansAttributeQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansAttributeQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansAttributeQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansAttributeQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,148 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import javax.management.remote.JMXServiceURL;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXConnector;
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.MBeanServerConnection;
+import javax.management.ReflectionException;
+import javax.management.InstanceNotFoundException;
+import javax.management.AttributeList;
+import javax.management.Attribute;
+import javax.management.MBeanAttributeInfo;
+import javax.management.IntrospectionException;
+import java.util.Set;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.IOException;
+
+public class MBeansAttributeQueryFilter extends AbstractQueryFilter {
+    public static final String KEY_OBJECT_NAME_ATTRIBUTE = "Attribute:ObjectName:";
+
+    private JMXServiceURL jmxServiceUrl;
+    private Set           attribView;
+
+    /**
+     * Create an mbean attributes query filter that is able to select specific mbean attributes based on the object name to get.
+     * @param jmxServiceUrl - JMX service url to connect to.
+     * @param attribView - the attributes to extract
+     * @param next - the next query filter
+     */
+    public MBeansAttributeQueryFilter(JMXServiceURL jmxServiceUrl, Set attribView, MBeansObjectNameQueryFilter next) {
+        super(next);
+        this.jmxServiceUrl = jmxServiceUrl;
+        this.attribView    = attribView;
+    }
+
+    /**
+     * Filter the query by retrieving the attributes specified, this will modify the collection to a list of AttributeList
+     * @param queries - query list
+     * @return List of AttributeList, which includes the ObjectName, which has a key of MBeansAttributeQueryFilter.KEY_OBJECT_NAME_ATTRIBUTE
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        return getMBeanAttributesCollection(next.query(queries));
+    }
+
+    /**
+     * Retrieve the specified attributes of the mbean
+     * @param result - collection of ObjectInstances and/or ObjectNames
+     * @return List of AttributeList
+     * @throws IOException
+     * @throws ReflectionException
+     * @throws InstanceNotFoundException
+     * @throws NoSuchMethodException
+     */
+    protected List getMBeanAttributesCollection(Collection result) throws IOException, ReflectionException, InstanceNotFoundException, NoSuchMethodException, IntrospectionException {
+        List mbeansCollection = new ArrayList();
+
+        for (Iterator i=result.iterator(); i.hasNext();) {
+            Object mbean = i.next();
+            if (mbean instanceof ObjectInstance) {
+                mbeansCollection.add(getMBeanAttributes(((ObjectInstance)mbean).getObjectName(), attribView));
+            } else if (mbean instanceof ObjectName) {
+                mbeansCollection.add(getMBeanAttributes((ObjectName)mbean, attribView));
+            } else {
+                throw new NoSuchMethodException("Cannot get the mbean attributes for class: " + mbean.getClass().getName());
+            }
+        }
+
+        return mbeansCollection;
+    }
+
+    /**
+     * Retrieve the specified attributes of the mbean
+     * @param obj - mbean ObjectInstance
+     * @param attrView - list of attributes to retrieve
+     * @return AttributeList for the mbean
+     * @throws ReflectionException
+     * @throws InstanceNotFoundException
+     * @throws IOException
+     */
+    protected AttributeList getMBeanAttributes(ObjectInstance obj, Set attrView) throws ReflectionException, InstanceNotFoundException, IOException, IntrospectionException {
+        return getMBeanAttributes(obj.getObjectName(), attrView);
+    }
+
+    /**
+     * Retrieve the specified attributes of the mbean
+     * @param objName - mbean ObjectName
+     * @param attrView - list of attributes to retrieve
+     * @return AttributeList for the mbean
+     * @throws IOException
+     * @throws ReflectionException
+     * @throws InstanceNotFoundException
+     */
+    protected AttributeList getMBeanAttributes(ObjectName objName, Set attrView) throws IOException, ReflectionException, InstanceNotFoundException, IntrospectionException {
+        JMXConnector jmxConnector    = JMXConnectorFactory.connect(jmxServiceUrl);
+        MBeanServerConnection server = jmxConnector.getMBeanServerConnection();
+
+        // If no attribute view specified, get all attributes
+        String[] attribs;
+        if (attrView == null || attrView.isEmpty()) {
+            MBeanAttributeInfo[] infos = server.getMBeanInfo(objName).getAttributes();
+            attribs = new String[infos.length];
+
+            for (int i=0; i<infos.length; i++) {
+                if (infos[i].isReadable()) {
+                    attribs[i] = infos[i].getName();
+                }
+            }
+
+        // Get selected attributes
+        } else {
+
+            attribs = new String[attrView.size()];
+            int count = 0;
+            for (Iterator i=attrView.iterator(); i.hasNext();) {
+                attribs[count++] = (String)i.next();
+            }
+        }
+
+        AttributeList attribList = server.getAttributes(objName, attribs);
+
+        jmxConnector.close();
+
+        attribList.add(0, new Attribute(KEY_OBJECT_NAME_ATTRIBUTE, objName));
+
+        return attribList;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansObjectNameQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansObjectNameQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansObjectNameQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansObjectNameQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,161 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import javax.management.remote.JMXServiceURL;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.ObjectName;
+import javax.management.MalformedObjectNameException;
+import javax.management.MBeanServerConnection;
+import javax.management.QueryExp;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ArrayList;
+import java.net.MalformedURLException;
+import java.io.IOException;
+
+public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
+
+    public static final String DEFAULT_JMX_DOMAIN = "org.apache.activemq";
+    public static final String QUERY_EXP_PREFIX   = "MBeans.QueryExp.";
+
+    private JMXServiceURL jmxServiceUrl;
+
+    /**
+     * Creates an mbeans object name query filter that will query on the given JMX Service URL
+     * @param jmxUrl - JMX service URL to connect to
+     * @throws MalformedURLException
+     */
+    public MBeansObjectNameQueryFilter(String jmxUrl) throws MalformedURLException {
+        this(new JMXServiceURL(jmxUrl));
+    }
+
+    /**
+     * Creates an mbeans objecet name query filter that will query on the given JMX Service URL
+     * @param jmxUrl - JMX service URL to connect to
+     */
+    public MBeansObjectNameQueryFilter(JMXServiceURL jmxUrl) {
+        super(null);
+        this.jmxServiceUrl = jmxUrl;
+    }
+
+    /**
+     * Queries the JMX service using a mapping of keys and values to construct the object name
+     * @param queries - mapping of keys and values
+     * @return collection of ObjectInstance that matches the query
+     * @throws MalformedObjectNameException - if the given string is an invalid object name
+     * @throws IOException - if there is a problem querying the JMX context
+     */
+    public List query(List queries) throws MalformedObjectNameException, IOException {
+
+        // Query all mbeans
+        if (queries == null || queries.isEmpty()) {
+            return queryMBeans(new ObjectName(DEFAULT_JMX_DOMAIN + ":*"), null);
+        }
+
+        // Constructs object name query
+        String objNameQuery = "";
+        String queryExp = "";
+        for (Iterator i=queries.iterator(); i.hasNext();) {
+            String key = (String)i.next();
+            String val = "";
+            int pos = key.indexOf("=");
+            if (pos >= 0) {
+                val = key.substring(pos + 1);
+                key = key.substring(0, pos);
+            }
+
+            if (val.startsWith(QUERY_EXP_PREFIX)) {
+                // do nothing as of the moment
+            } else if (key != "" && val != "") {
+                objNameQuery = objNameQuery + key + "=" + val + ",";
+            }
+        }
+
+        // Append * to object name
+        objNameQuery = objNameQuery + "*";
+
+        return queryMBeans(new ObjectName(DEFAULT_JMX_DOMAIN + ":" + objNameQuery), queryExp);
+    }
+
+    /**
+     * Advance query that enables you to specify both the object name and the query expression to use.
+     * Note: Query expression is currently unsupported.
+     * @param objName - object name to use for query
+     * @param queryExpStr - query expression string
+     * @return set of mbeans that matches the query
+     * @throws IOException - if there is a problem querying the JMX context
+     */
+    protected List queryMBeans(ObjectName objName, String queryExpStr) throws IOException {
+        JMXConnector jmxConn = createJmxConnector();
+        MBeanServerConnection server = jmxConn.getMBeanServerConnection();
+
+        QueryExp queryExp = createQueryExp(queryExpStr);
+
+        // Convert mbeans set to list to make it standard throughout the query filter
+        List mbeans = new ArrayList(server.queryMBeans(objName, queryExp));
+
+        jmxConn.close();
+
+        return mbeans;
+    }
+
+    /**
+     * Get the JMX service URL the query is connecting to.
+     * @return JMX service URL
+     */
+    public JMXServiceURL getJmxServiceUrl() {
+        return jmxServiceUrl;
+    }
+
+    /**
+     * Sets the JMX service URL the query is going to connect to.
+     * @param jmxServiceUrl - new JMX service URL
+     */
+    public void setJmxServiceUrl(JMXServiceURL jmxServiceUrl) {
+        this.jmxServiceUrl = jmxServiceUrl;
+    }
+
+    /**
+     * Sets the JMX service URL the query is going to connect to.
+     * @param jmxServiceUrl - new JMX service URL
+     */
+    public void setJmxServiceUrl(String jmxServiceUrl) throws MalformedURLException {
+        setJmxServiceUrl(new JMXServiceURL(jmxServiceUrl));
+    }
+
+    /**
+     * Creates a JMX connector
+     * @return JMX connector
+     * @throws IOException
+     */
+    protected JMXConnector createJmxConnector() throws IOException {
+        return JMXConnectorFactory.connect(getJmxServiceUrl());
+    }
+
+    /**
+     * Creates a query expression based on the query expression string
+     * Note: currently unsupported
+     * @param queryExpStr - query expression string
+     * @return the created query expression
+     */
+    protected QueryExp createQueryExp(String queryExpStr) {
+        // Currently unsupported
+        return null;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansRegExQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansRegExQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansRegExQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MBeansRegExQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,127 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.AttributeList;
+import javax.management.Attribute;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.regex.Pattern;
+import java.lang.reflect.Method;
+
+public class MBeansRegExQueryFilter extends RegExQueryFilter {
+    /**
+     * Creates a regular expression query that is able to match the values of specific mbeans
+     * @param next - next query filter
+     */
+    public MBeansRegExQueryFilter(QueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Try to match the object data using the regular expression map. The regex map contains a key-value mapping of an attribute
+     * key to a regular expression the value of the key should match. The basic rule of matching is that the data must contain
+     * a property key that is included in the regex map, and that the value of the property key should match the regex specified.
+     * @param data - object data to match
+     * @param regex - regex map
+     * @return true if the data matches the regex map specified
+     * @throws Exception
+     */
+    protected boolean matches(Object data, Map regex) throws Exception {
+        // Use reflection to determine where the object should go
+        try {
+            Method method = this.getClass().getDeclaredMethod("matches", new Class[] {data.getClass(), Map.class});
+            return ((Boolean)method.invoke(this, new Object[] {data, regex})).booleanValue();
+        } catch (NoSuchMethodException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Try to match the object instance using the regular expression map
+     * @param data - object instance to match
+     * @param regex - regex map
+     * @return true if the object instance matches the regex map
+     */
+    protected boolean matches(ObjectInstance data, Map regex) {
+        return matches(data.getObjectName(), regex);
+    }
+
+    /**
+     * Try to match the object name instance using the regular expression map
+     * @param data - object name to match
+     * @param regex - regex map
+     * @return true if the object name matches the regex map
+     */
+    protected boolean matches(ObjectName data, Map regex) {
+        for (Iterator i=regex.keySet().iterator(); i.hasNext();) {
+            String key = (String)i.next();
+            String target = data.getKeyProperty(key);
+
+            // Try to match the value of the property of the object name
+            if (target != null && !((Pattern)regex.get(key)).matcher(target).matches()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Try to match the attribute list using teh regular expression map
+     * @param data - attribute list to match
+     * @param regex - regex map
+     * @return true if the attribute list matches the regex map
+     */
+    protected boolean matches(AttributeList data, Map regex) {
+        for (Iterator i=regex.keySet().iterator(); i.hasNext();) {
+            String key = (String)i.next();
+
+            // Try to match each regex to the attributes of the mbean including its ObjectName
+            for (Iterator j=data.iterator(); j.hasNext();) {
+                Attribute attrib = (Attribute)j.next();
+
+                // Try to match to the properties of the ObjectName
+                if (attrib.getName().equals(MBeansAttributeQueryFilter.KEY_OBJECT_NAME_ATTRIBUTE)) {
+                    String target = ((ObjectName)attrib.getValue()).getKeyProperty(key);
+
+                    if (target == null || !((Pattern)regex.get(key)).matcher(target).matches()) {
+                        return false;
+                    } else {
+                        // If match skip to the next regex
+                        break;
+                    }
+
+                // Try to match to the mbean attributes
+                } else if (attrib.getName().equals(key)) {
+                    if (!((Pattern)regex.get(key)).matcher(attrib.getValue().toString()).matches()) {
+                        return false;
+                    } else {
+                        // If match skip to the next regex
+                        break;
+                    }
+
+                // If mbean does not contain the specified attribute
+                } else {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MapTransformFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MapTransformFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MapTransformFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MapTransformFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,259 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import org.apache.activemq.broker.console.formatter.GlobalWriter;
+import org.apache.activemq.broker.console.AmqMessagesUtil;
+import org.apache.activemq.command.ActiveMQDestination;
+import org.apache.activemq.command.ActiveMQObjectMessage;
+import org.apache.activemq.command.ActiveMQBytesMessage;
+import org.apache.activemq.command.ActiveMQTextMessage;
+import org.apache.activemq.command.ActiveMQMapMessage;
+import org.apache.activemq.command.ActiveMQStreamMessage;
+import org.apache.activemq.command.ActiveMQMessage;
+
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.AttributeList;
+import javax.management.Attribute;
+import javax.jms.JMSException;
+import javax.jms.DeliveryMode;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Iterator;
+import java.util.Enumeration;
+import java.lang.reflect.Method;
+
+public class MapTransformFilter extends ResultTransformFilter {
+    /**
+     * Creates a Map transform filter that is able to transform a variety of objects to a properties map object
+     * @param next - the next query filter
+     */
+    public MapTransformFilter(QueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Transform the given object to a Map object
+     * @param object - object to transform
+     * @return map object
+     */
+    protected Object transformElement(Object object) throws Exception {
+        // Use reflection to determine how the object should be transformed
+        try {
+            Method method = this.getClass().getDeclaredMethod("transformToMap", new Class[] {object.getClass()});
+            return (Map)method.invoke(this, new Object[] {object});
+        } catch (NoSuchMethodException e) {
+            GlobalWriter.print("Unable to transform mbean of type: " + object.getClass().getName() + ". No corresponding transformToMap method found.");
+            return null;
+        }
+    }
+
+    /**
+     * Transform an ObjectInstance mbean to a Map
+     * @param obj - ObjectInstance format of an mbean
+     * @return map object
+     */
+    protected Map transformToMap(ObjectInstance obj) {
+        return transformToMap(obj.getObjectName());
+    }
+
+    /**
+     * Transform an ObjectName mbean to a Map
+     * @param objname - ObjectName format of an mbean
+     * @return map object
+     */
+    protected Map transformToMap(ObjectName objname) {
+        Properties props = new Properties();
+
+        // Parse object properties
+        Map objProps = objname.getKeyPropertyList();
+        for (Iterator i=objProps.keySet().iterator(); i.hasNext();) {
+            Object key = i.next();
+            Object val = objProps.get(key);
+            if (val != null) {
+                props.setProperty(key.toString(), val.toString());
+            }
+        }
+
+        return props;
+    }
+
+    /**
+     * Transform an Attribute List format of an mbean to a Map
+     * @param list - AttributeList format of an mbean
+     * @return map object
+     */
+    protected Map transformToMap(AttributeList list) {
+        Properties props = new Properties();
+        for (Iterator i=list.iterator(); i.hasNext();) {
+            Attribute attrib = (Attribute)i.next();
+
+            // If attribute is an ObjectName
+            if (attrib.getName().equals(MBeansAttributeQueryFilter.KEY_OBJECT_NAME_ATTRIBUTE)) {
+                props.putAll(transformToMap((ObjectName)attrib.getValue()));
+            } else {
+                if (attrib.getValue() != null) {
+                    props.setProperty(attrib.getName(), attrib.getValue().toString());
+                }
+            }
+        }
+
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQTextMessage to a Map
+     * @param msg - text message to trasnform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQTextMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        props.putAll(transformToMap((ActiveMQMessage)msg));
+        if (msg.getText() != null) {
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSText", msg.getText());
+        }
+
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQBytesMessage to a Map
+     * @param msg - bytes message to transform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQBytesMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        props.putAll(transformToMap((ActiveMQMessage)msg));
+
+        long bodyLength = msg.getBodyLength();
+        byte[] msgBody;
+        int i=0;
+        // Create separate bytes messages
+        for (i=0; i<(bodyLength/Integer.MAX_VALUE); i++) {
+            msgBody = new byte[Integer.MAX_VALUE];
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i+1), new String(msgBody));
+        }
+        msgBody = new byte[(int)(bodyLength % Integer.MAX_VALUE)];
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSBytes:" + (i+1), new String(msgBody));
+
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQMessage to a Map
+     * @param msg - object message to transform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQObjectMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        props.putAll(transformToMap((ActiveMQMessage)msg));
+        if (msg.getObject() != null) {
+            // Just add the class name and toString value of the object
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSObjectClass", msg.getObject().getClass().getName());
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSObjectString", msg.getObject().toString());
+        }
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQMapMessage to a Map
+     * @param msg - map message to transform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQMapMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        props.putAll(transformToMap((ActiveMQMessage)msg));
+
+        // Get map properties
+        Enumeration e = msg.getMapNames();
+        while (e.hasMoreElements()) {
+            String key = (String)e.nextElement();
+            Object val = msg.getObject(key);
+            if (val != null) {
+                props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + key, val.toString());
+            }
+        }
+
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQStreamMessage to a Map
+     * @param msg - stream message to transform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQStreamMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        props.putAll(transformToMap((ActiveMQMessage)msg));
+        // Just set the toString of the message as the body of the stream message
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_BODY_PREFIX + "JMSStreamMessage", msg.toString());
+
+        return props;
+    }
+
+    /**
+     * Transform an ActiveMQMessage to a Map
+     * @param msg - message to transform
+     * @return map object
+     * @throws JMSException
+     */
+    protected Map transformToMap(ActiveMQMessage msg) throws JMSException {
+        Properties props = new Properties();
+
+        // Get JMS properties
+        if (msg.getJMSCorrelationID() != null) {
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSCorrelationID", msg.getJMSCorrelationID());
+        }
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDeliveryMode", (msg.getJMSDeliveryMode()==DeliveryMode.PERSISTENT) ? "persistent" : "non-persistent");
+        if (msg.getJMSDestination() != null) {
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSDestination", ((ActiveMQDestination)msg.getJMSDestination()).getPhysicalName());
+        }
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSExpiration", Long.toString(msg.getJMSExpiration()));
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSMessageID", msg.getJMSMessageID());
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSPriority", Integer.toString(msg.getJMSPriority()));
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSRedelivered", Boolean.toString(msg.getJMSRedelivered()));
+        if (msg.getJMSReplyTo() != null) {
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSReplyTo", ((ActiveMQDestination)msg.getJMSReplyTo()).getPhysicalName());
+        }
+        props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSTimestamp", Long.toString(msg.getJMSTimestamp()));
+        if (msg.getJMSType() != null) {
+            props.setProperty(AmqMessagesUtil.JMS_MESSAGE_HEADER_PREFIX + "JMSType", msg.getJMSType());
+        }
+
+        // Get custom properties
+        Enumeration e = msg.getPropertyNames();
+        while (e.hasMoreElements()) {
+            String name = (String)e.nextElement();
+            if (msg.getObjectProperty(name) != null) {
+                props.setProperty(AmqMessagesUtil.JMS_MESSAGE_CUSTOM_PREFIX + name, msg.getObjectProperty(name).toString());
+            }
+        }
+
+        return props;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MessagesQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MessagesQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MessagesQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/MessagesQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,152 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import org.apache.activemq.command.ActiveMQTopic;
+import org.apache.activemq.command.ActiveMQQueue;
+import org.apache.activemq.ActiveMQConnectionFactory;
+
+import javax.jms.Destination;
+import javax.jms.Connection;
+import javax.jms.JMSException;
+import javax.jms.Session;
+import javax.jms.QueueBrowser;
+import java.net.URI;
+import java.util.Collections;
+import java.util.List;
+import java.util.Iterator;
+
+public class MessagesQueryFilter extends AbstractQueryFilter {
+
+    private URI brokerUrl;
+    private Destination destination;
+
+    /**
+     * Create a JMS message query filter
+     * @param brokerUrl - broker url to connect to
+     * @param destination - JMS destination to query
+     */
+    public MessagesQueryFilter(URI brokerUrl, Destination destination) {
+        super(null);
+        this.brokerUrl   = brokerUrl;
+        this.destination = destination;
+    }
+
+    /**
+     * Queries the specified destination using the message selector format query
+     * @param queries - message selector queries
+     * @return list messages that matches the selector
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        String selector = "";
+
+        // Convert to message selector
+        for (Iterator i=queries.iterator(); i.hasNext();) {
+            selector = selector + "(" + i.next().toString() + ") AND ";
+        }
+
+        // Remove last AND
+        if (selector != "") {
+            selector = selector.substring(0, selector.length() - 5);
+        }
+
+        if (destination instanceof ActiveMQQueue) {
+            return queryMessages((ActiveMQQueue)destination, selector);
+        } else {
+            return queryMessages((ActiveMQTopic)destination, selector);
+        }
+    }
+
+    /**
+     * Query the messages of a queue destination using a queue browser
+     * @param queue - queue destination
+     * @param selector - message selector
+     * @return list of messages that matches the selector
+     * @throws Exception
+     */
+    protected List queryMessages(ActiveMQQueue queue, String selector) throws Exception {
+        Connection conn = createConnection(getBrokerUrl());
+
+        Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        QueueBrowser browser = sess.createBrowser(queue, selector);
+
+        List messages = Collections.list(browser.getEnumeration());
+
+        conn.close();
+
+        return messages;
+    }
+
+    /**
+     * Query the messages of a topic destination using a message consumer
+     * @param topic - topic destination
+     * @param selector - message selector
+     * @return list of messages that matches the selector
+     * @throws Exception
+     */
+    protected List queryMessages(ActiveMQTopic topic, String selector) throws Exception {
+        // TODO: should we use a durable subscriber or a retroactive non-durable subscriber?
+        // TODO: if a durable subscriber is used, how do we manage it? subscribe/unsubscribe tasks?
+        return null;
+    }
+
+    /**
+     * Create and start a JMS connection
+     * @param brokerUrl - broker url to connect to.
+     * @return JMS connection
+     * @throws JMSException
+     */
+    protected Connection createConnection(URI brokerUrl) throws JMSException {
+        Connection conn = (new ActiveMQConnectionFactory(brokerUrl)).createConnection();
+        conn.start();
+        return conn;
+    }
+
+    /**
+     * Get the broker url being used.
+     * @return broker url
+     */
+    public URI getBrokerUrl() {
+        return brokerUrl;
+    }
+
+    /**
+     * Set the broker url to use.
+     * @param brokerUrl - broker url
+     */
+    public void setBrokerUrl(URI brokerUrl) {
+        this.brokerUrl = brokerUrl;
+    }
+
+    /**
+     * Get the destination being used.
+     * @return - JMS destination
+     */
+    public Destination getDestination() {
+        return destination;
+    }
+
+    /**
+     * Set the destination to use.
+     * @param destination - JMS destination
+     */
+    public void setDestination(Destination destination) {
+        this.destination = destination;
+    }
+
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/PropertiesViewFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/PropertiesViewFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/PropertiesViewFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/PropertiesViewFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,118 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.Set;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PropertiesViewFilter implements QueryFilter {
+    protected QueryFilter next;
+    protected Set viewFilter;
+
+    /**
+     * Creates a filter that will select the properties of a map object to view
+     * @param next - the next query filter that will return a collection of maps
+     */
+    public PropertiesViewFilter(QueryFilter next) {
+        this(null, next);
+    }
+
+    /**
+     * Creates a filter that will select the properties of a map object to view
+     * @param viewFilter - the properties to view
+     * @param next - the next query filter that will return a collection of maps
+     */
+    public PropertiesViewFilter(Set viewFilter, QueryFilter next) {
+        this.next = next;
+        this.viewFilter = viewFilter;
+    }
+
+    /**
+     * Filter the properties to view of the query result
+     * @param query - the query string
+     * @return list of objects that has been view filtered
+     */
+    public List query(String query) throws Exception {
+        return filterViewCollection(next.query(query), viewFilter);
+    }
+
+    /**
+     * Filter the properties to view of the query result
+     * @param queries - the query map
+     * @return list of objects that has been view filtered
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        return filterViewCollection(next.query(queries), viewFilter);
+    }
+
+    /**
+     * Filter the view of each element in the collection
+     * @param result - the lists to filter the view from
+     * @param viewFilter - the views to select
+     * @return lsit of objects whose view has been filtered
+     */
+    protected List filterViewCollection(Collection result, Set viewFilter) {
+        // Use a list to allow duplicate entries
+        List newCollection = new ArrayList();
+
+        for (Iterator i=result.iterator(); i.hasNext();) {
+            newCollection.add(filterView((Map)i.next()));
+        }
+
+        return newCollection;
+    }
+
+    /**
+     * Select only the attributes to view from the map data
+     * @param data - data to filter the view from
+     * @return - data with the view filtered
+     */
+    protected Map filterView(Map data) {
+        // If no view specified, display all attributes
+        if (viewFilter == null || viewFilter.isEmpty()) {
+            return data;
+        }
+
+        Map newData;
+        try {
+            // Lets try to use the same class as the original
+            newData = (Map)data.getClass().newInstance();
+        } catch (Exception e) {
+            // Lets use a default HashMap
+            newData = new HashMap();
+        }
+
+        // Filter the keys to view
+        for (Iterator i=viewFilter.iterator(); i.hasNext();) {
+            Object key = i.next();
+            Object val = data.get(key);
+
+            if (val != null) {
+                newData.put(key, val);
+            }
+        }
+
+        return newData;
+    }
+
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/QueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/QueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/QueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/QueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,39 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.List;
+
+public interface QueryFilter {
+    public static final String QUERY_DELIMETER = ",";
+
+    /**
+     * Interface for querying
+     * @param queryStr - the query string
+     * @return collection of objects that satisfies the query
+     * @throws Exception
+     */
+    public List query(String queryStr) throws Exception;
+
+    /**
+     * Interface for querying
+     * @param queries - list of individual queries
+     * @return collection of objects that satisfies the query
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception;
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/RegExQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/RegExQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/RegExQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/RegExQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,128 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.regex.Pattern;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public abstract class RegExQueryFilter extends AbstractQueryFilter {
+    public static final String REGEX_PREFIX = "REGEX:QUERY:";
+
+    /**
+     * Creates a regular expression query that is able to match an object using key-value pattern regex filtering
+     * @param next
+     */
+    protected RegExQueryFilter(QueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Separates the regular expressions queries from the usual queries. A query is a regex query, if it is key-value pair
+     * with the format <key>=<value>, and value is a pattern that satisfies the isRegularExpression method.
+     * @param queries - list of queries
+     * @return filtered objects that matches the regex query
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        Map regex = new HashMap();
+        List newQueries = new ArrayList();
+
+        // Lets parse for regular expression queries
+        for (Iterator i=queries.iterator(); i.hasNext();) {
+            // Get key-value pair
+            String token = (String)i.next();
+            String key = "";
+            String val = "";
+            int pos = token.indexOf("=");
+            if (pos >= 0) {
+                val = token.substring(pos + 1);
+                key = token.substring(0, pos);
+            }
+
+            // Add the regex query to list and make it a non-factor in the succeeding queries
+            if (isRegularExpression(val)) {
+                regex.put(key, compileQuery(val));
+
+            // Add the normal query to the query list
+            } else {
+                newQueries.add(token);
+            }
+        }
+
+        // Filter the result using the regular expressions specified
+        return filterCollectionUsingRegEx(regex, next.query(newQueries));
+    }
+
+    /**
+     * Checks if a given string is a regular expression query. Currently, a pattern is a regex query, if it starts with
+     * the RegExQueryFilter.REGEX_PREFIX.
+     * @param query
+     * @return
+     */
+    protected boolean isRegularExpression(String query) {
+        return query.startsWith(REGEX_PREFIX);
+    }
+
+    /**
+     * Compiles the regex query to a pattern.
+     * @param query - query string to compile
+     * @return regex pattern
+     */
+    protected Pattern compileQuery(String query) {
+        return Pattern.compile(query.substring(REGEX_PREFIX.length()));
+    }
+
+    /**
+     * Filter the specified colleciton using the regex patterns extracted.
+     * @param regex - regex map
+     * @param data - list of objects to filter
+     * @return filtered list of objects that matches the regex map
+     * @throws Exception
+     */
+    protected List filterCollectionUsingRegEx(Map regex, List data) throws Exception {
+        // No regular expressions filtering needed
+        if (regex==null || regex.isEmpty()) {
+            return data;
+        }
+
+        List filteredElems = new ArrayList();
+
+        // Get each data object to filter
+        for (Iterator i=data.iterator(); i.hasNext();) {
+            Object dataElem = i.next();
+            // If properties of data matches all the regex pattern, add it
+            if (matches(dataElem, regex)) {
+                filteredElems.add(dataElem);
+            }
+        }
+
+        return filteredElems;
+    }
+
+    /**
+     * Determines how the object is to be matched to the regex map.
+     * @param data - object to match
+     * @param regex - regex map
+     * @return true, if the object matches the regex map, false otherwise
+     * @throws Exception
+     */
+    protected abstract boolean matches(Object data, Map regex) throws Exception;
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/ResultTransformFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/ResultTransformFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/ResultTransformFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/ResultTransformFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,76 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public abstract class ResultTransformFilter implements QueryFilter {
+    private QueryFilter next;
+
+    /**
+     * Contructs a query filter that transform the format of the query result
+     * @param next - the query filter to retrieve the results from
+     */
+    protected ResultTransformFilter(QueryFilter next) {
+        this.next = next;
+    }
+
+    /**
+     * Transforms the queried results to a collection of different objects
+     * @param query - the query string
+     * @return collections of transformed objects
+     * @throws Exception
+     */
+    public List query(String query) throws Exception {
+        return transformList(next.query(query));
+    }
+
+    /**
+     * Transforms the queried results to a collection of different objects
+     * @param queries - the query map
+     * @return collections of transformed objects
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        return transformList(next.query(queries));
+    }
+
+    /**
+     * Transforms a collection to a collection of different objects.
+     * @param result - the collection to transform
+     * @return collection of properties objects
+     */
+    protected List transformList(List result) throws Exception {
+        List props = new ArrayList();
+
+        for (Iterator i=result.iterator(); i.hasNext();) {
+            props.add(transformElement(i.next()));
+        }
+
+        return props;
+    }
+
+    /**
+     * Transform a result object
+     * @param obj - the object instance to transform
+     * @return the transformed object
+     */
+    protected abstract Object transformElement(Object obj) throws Exception;
+
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/StubQueryFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/StubQueryFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/StubQueryFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/StubQueryFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,51 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.List;
+
+public class StubQueryFilter implements QueryFilter{
+    private List data;
+
+    /**
+     * Creates a stub query that returns the given collections as the query result
+     * @param data - the stub query result
+     */
+    public StubQueryFilter(List data) {
+        this.data = data;
+    }
+
+    /**
+     * Returns the provided stub data as a stub query result
+     * @param queryStr - not use
+     * @return the stub query result
+     * @throws Exception
+     */
+    public List query(String queryStr) throws Exception {
+        return data;
+    }
+
+    /**
+     * Returns the provided stub data as a stub query result
+     * @param queries - not use
+     * @return the stub query result
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        return data;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToMsgSelectorTransformFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToMsgSelectorTransformFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToMsgSelectorTransformFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToMsgSelectorTransformFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,68 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+public class WildcardToMsgSelectorTransformFilter extends WildcardTransformFilter{
+    /**
+     * Creates a filter that is able to transform a wildcard query to a message selector format
+     * @param next - next query filter
+     */
+    public WildcardToMsgSelectorTransformFilter(QueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Use to determine if a query string is a wildcard query. A query string is a wildcard query if it is a key-value
+     * pair with the format <key>=<value> and the value is enclosed in '' and contains '*' and '?'.
+     * @param query - query string
+     * @return true, if the query string is a wildcard query, false otherwise
+     */
+    protected boolean isWildcardQuery(String query) {
+        // If the query is a key=value pair
+        String key = query;
+        String val = "";
+        int pos = key.indexOf("=");
+        if (pos >= 0) {
+            val = key.substring(pos + 1);
+            key = key.substring(0, pos);
+        }
+
+        // If the value contains wildcards and is enclose by '
+        return val.startsWith("'") && val.endsWith("'") && ((val.indexOf("*") >= 0) || (val.indexOf("?") >= 0));
+    }
+
+    /**
+     * Transform a wildcard query to message selector format
+     * @param query - query string to transform
+     * @return message selector format string
+     */
+    protected String transformWildcardQuery(String query) {
+        // If the query is a key=value pair
+        String key = query;
+        String val = "";
+        int pos = key.indexOf("=");
+        if (pos >= 0) {
+            val = key.substring(pos + 1);
+            key = key.substring(0, pos);
+        }
+
+        val = val.replaceAll("[?]", "_");
+        val = val.replaceAll("[*]", "%");
+
+        return key + " LIKE " + val;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToRegExTransformFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToRegExTransformFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToRegExTransformFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardToRegExTransformFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,71 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+public class WildcardToRegExTransformFilter extends WildcardTransformFilter {
+    /**
+     * Creates a filter that is able to transform a wildcard query to a regular expression query string
+     * @param next - next query filter
+     */
+    public WildcardToRegExTransformFilter(RegExQueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Use to determine if a query string is a wildcard query. A query string is a wildcard query if it is a key-value
+     * pair with the format <key>=<value> and the value contains '*' and '?'.
+     * @param query - query string
+     * @return true, if the query string is a wildcard query, false otherwise
+     */
+    protected boolean isWildcardQuery(String query) {
+        // If the query is a key=value pair
+        String key = query;
+        String val = "";
+        int pos = key.indexOf("=");
+        if (pos >= 0) {
+            val = key.substring(pos + 1);
+            key = key.substring(0, pos);
+        }
+
+        // If the value contains wildcards
+        return ((val.indexOf("*") >= 0) || (val.indexOf("?") >= 0));
+    }
+
+    /**
+     * Transform a wildcard query to regular expression format
+     * @param query - query string to transform
+     * @return regex query string
+     */
+    protected String transformWildcardQuery(String query) {
+        // Get the key=value pair
+        String key = query;
+        String val = "";
+        int pos = key.indexOf("=");
+        if (pos >= 0) {
+            val = key.substring(pos + 1);
+            key = key.substring(0, pos);
+        }
+
+        val = val.replaceAll("[.]", "\\\\."); // Escape all dot characters. From (.) to (\.)
+        val = val.replaceAll("[?]", ".");     // Match single characters
+        val = val.replaceAll("[*]", ".*?");   // Match all characters, use reluctant quantifier
+        val = "(" + val +")";                 // Let's group the query for clarity
+        val = RegExQueryFilter.REGEX_PREFIX + val; // Flag as a regular expression query
+
+        return key + "=" + val;
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardTransformFilter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardTransformFilter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardTransformFilter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/filter/WildcardTransformFilter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,73 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.filter;
+
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class WildcardTransformFilter extends AbstractQueryFilter {
+
+    /**
+     * Creates a wildcard transform filter that is able to convert a wildcard expression (determined by isWildcardQuery)
+     * to a another query type (use transformWildcardQuery).
+     * @param next - the next query filter
+     */
+    protected WildcardTransformFilter(QueryFilter next) {
+        super(next);
+    }
+
+    /**
+     * Converts the query list to set of different queries
+     * @param queries - query list to transform
+     * @return - result of the query
+     * @throws Exception
+     */
+    public List query(List queries) throws Exception {
+        List newQueries = new ArrayList();
+
+        for (Iterator i=queries.iterator(); i.hasNext();) {
+            String queryToken = (String)i.next();
+
+            // Transform the wildcard query
+            if (isWildcardQuery(queryToken)) {
+                // Transform the value part only
+                newQueries.add(transformWildcardQuery(queryToken));
+
+            // Maintain the query as is
+            } else {
+                newQueries.add(queryToken);
+            }
+        }
+
+        return next.query(newQueries);
+    }
+
+    /**
+     * Use to determine is a query string is a wildcard query
+     * @param query - query string
+     * @return true, if the query string is a wildcard query, false otherwise
+     */
+    protected abstract boolean isWildcardQuery(String query);
+
+    /**
+     * Use to transform a wildcard query string to another query format
+     * @param query - query string to transform
+     * @return transformed query
+     */
+    protected abstract String transformWildcardQuery(String query);
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/CommandShellOutputFormatter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/CommandShellOutputFormatter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/CommandShellOutputFormatter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/CommandShellOutputFormatter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,243 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.formatter;
+
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.AttributeList;
+import javax.management.Attribute;
+import javax.jms.Message;
+import java.util.Map;
+import java.util.Collection;
+import java.util.Iterator;
+import java.io.PrintStream;
+import java.io.OutputStream;
+
+public class CommandShellOutputFormatter implements OutputFormatter {
+    private OutputStream outputStream;
+    private PrintStream out;
+
+    public CommandShellOutputFormatter(OutputStream out) {
+
+        this.outputStream = out;
+        if (out instanceof PrintStream) {
+            this.out = (PrintStream)out;
+        } else {
+            this.out = new PrintStream(out);
+        }
+    }
+
+    /**
+     * Retrieve the output stream being used by the formatter
+     * @return
+     */
+    public OutputStream getOutputStream() {
+        return outputStream;
+    }
+
+    /**
+     * Print an ObjectInstance format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(ObjectInstance mbean) {
+        printMBean(mbean.getObjectName());
+    }
+
+    /**
+     * Print an ObjectName format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(ObjectName mbean) {
+        printMBean(mbean.getKeyPropertyList());
+    }
+
+    /**
+     * Print an AttributeList format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(AttributeList mbean) {
+        for (Iterator i=mbean.iterator(); i.hasNext();) {
+            Attribute attrib = (Attribute)i.next();
+            if (attrib.getValue() instanceof ObjectName) {
+                printMBean((ObjectName)attrib.getValue());
+            } else if (attrib.getValue() instanceof ObjectInstance) {
+                printMBean((ObjectInstance)attrib.getValue());
+            } else {
+                out.println(attrib.getName() + " = " + attrib.getValue().toString());
+                out.println();
+            }
+        }
+    }
+
+    /**
+     * Print a Map format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(Map mbean) {
+        for (Iterator i=mbean.keySet().iterator(); i.hasNext();) {
+            String key = (String)i.next();
+            String val = mbean.get(key).toString();
+            out.println(key + " = " + val);
+        }
+        out.println();
+    }
+
+    /**
+     * Print a collection of mbean
+     * @param mbean - collection of mbeans
+     */
+    public void printMBean(Collection mbean) {
+        for (Iterator i=mbean.iterator(); i.hasNext();) {
+            Object obj = i.next();
+            if (obj instanceof ObjectInstance) {
+                printMBean((ObjectInstance)obj);
+            } else if (obj instanceof ObjectName) {
+                printMBean((ObjectName)obj);
+            } else if (obj instanceof Map) {
+                printMBean((Map)obj);
+            } else if (obj instanceof AttributeList) {
+                printMBean((AttributeList)obj);
+            } else if (obj instanceof Collection) {
+                printMessage((Collection)obj);
+            } else {
+                printException(new UnsupportedOperationException("Unknown mbean type: " + obj.getClass().getName()));
+            }
+        }
+    }
+
+    /**
+     * Print a Map format of a JMS message
+     * @param msg
+     */
+    public void printMessage(Map msg) {
+        for (Iterator i=msg.keySet().iterator(); i.hasNext();) {
+            String key = (String)i.next();
+            String val = msg.get(key).toString();
+            out.println(key + " = " + val);
+        }
+        out.println();
+    }
+
+    /**
+     * Print a Message format of a JMS message
+     * @param msg - JMS message to print
+     */
+    public void printMessage(Message msg) {
+        // TODO
+    }
+
+    /**
+     * Print a collection of JMS messages
+     * @param msg - collection of JMS messages
+     */
+    public void printMessage(Collection msg) {
+        for (Iterator i=msg.iterator(); i.hasNext();) {
+            Object obj = i.next();
+            if (obj instanceof Message) {
+                printMessage((Message)obj);
+            } else if (obj instanceof Map) {
+                printMessage((Map)obj);
+            } else if (obj instanceof Collection) {
+                printMessage((Collection)obj);
+            } else {
+                printException(new UnsupportedOperationException("Unknown message type: " + obj.getClass().getName()));
+            }
+        }
+    }
+
+    /**
+     * Print help messages
+     * @param helpMsgs - help messages to print
+     */
+    public void printHelp(String[] helpMsgs) {
+        for (int i=0; i<helpMsgs.length; i++) {
+            out.println(helpMsgs[i]);
+        }
+        out.println();
+    }
+
+    /**
+     * Print an information message
+     * @param info - information message to print
+     */
+    public void printInfo(String info) {
+        out.println("INFO: " + info);
+    }
+
+    /**
+     * Print an exception message
+     * @param e - exception to print
+     */
+    public void printException(Exception e) {
+        out.println("ERROR: " + e);
+    }
+
+    /**
+     * Print a version information
+     * @param version - version info to print
+     */
+    public void printVersion(String version) {
+        out.println("");
+        out.println("ActiveMQ " + version);
+        out.println("For help or more information please see: http://www.logicblaze.com");
+        out.println("");
+    }
+
+    /**
+     * Print a generic key value mapping
+     * @param map to print
+     */
+    public void print(Map map) {
+        for (Iterator i=map.keySet().iterator(); i.hasNext();) {
+            String key = (String)i.next();
+            String val = map.get(key).toString();
+            out.println(key + " = " + val);
+        }
+        out.println();
+    }
+
+    /**
+     * Print a generic array of strings
+     * @param strings - string array to print
+     */
+    public void print(String[] strings) {
+        for (int i=0; i<strings.length; i++) {
+            out.println(strings[i]);
+        }
+        out.println();
+    }
+
+    /**
+     * Print a collection of objects
+     * @param collection - collection to print
+     */
+    public void print(Collection collection) {
+        for (Iterator i=collection.iterator(); i.hasNext();) {
+            out.println(i.next().toString());
+        }
+        out.println();
+    }
+
+    /**
+     * Print a java string
+     * @param string - string to print
+     */
+    public void print(String string) {
+        out.println(string);
+    }
+
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/GlobalWriter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/GlobalWriter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/GlobalWriter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/GlobalWriter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,232 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.formatter;
+
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.AttributeList;
+import javax.jms.Message;
+import java.util.Map;
+import java.util.Collection;
+import java.io.OutputStream;
+
+public class GlobalWriter {
+    private static OutputFormatter formatter;
+
+    /**
+     * Creates a singleton global writer
+     */
+    private GlobalWriter() {
+    }
+
+    /**
+     * Maintains a global output formatter
+     * @param formatter - the output formatter to use
+     */
+    public static void instantiate(OutputFormatter formatter) {
+        if (GlobalWriter.formatter == null) {
+            GlobalWriter.formatter = formatter;
+        }
+    }
+
+    /**
+     * Retrieve the output stream being used by the global formatter
+     * @return
+     */
+    public static OutputStream getOutputStream() {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        return formatter.getOutputStream();
+    }
+
+    /**
+     * Print an ObjectInstance format of an mbean
+     * @param mbean - mbean to print
+     */
+    public static void printMBean(ObjectInstance mbean) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMBean(mbean);
+    }
+
+    /**
+     * Print an ObjectName format of an mbean
+     * @param mbean - mbean to print
+     */
+    public static void printMBean(ObjectName mbean) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMBean(mbean);
+    }
+
+    /**
+     * Print an AttributeList format of an mbean
+     * @param mbean - mbean to print
+     */
+    public static void printMBean(AttributeList mbean) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMBean(mbean);
+    }
+
+    /**
+     * Print a Map format of an mbean
+     * @param mbean
+     */
+    public static void printMBean(Map mbean) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMBean(mbean);
+    }
+
+    /**
+     * Print a Collection format of mbeans
+     * @param mbean - collection of mbeans
+     */
+    public static void printMBean(Collection mbean) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMBean(mbean);
+    }
+
+    /**
+     * Print a Map format of a JMS message
+     * @param msg
+     */
+    public static void printMessage(Map msg) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMessage(msg);
+    }
+
+    /**
+     * Print a Message format of a JMS message
+     * @param msg - JMS message to print
+     */
+    public static void printMessage(Message msg) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMessage(msg);
+    }
+
+    /**
+     * Print a collection of JMS messages
+     * @param msg - collection of JMS messages
+     */
+    public static void printMessage(Collection msg) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printMessage(msg);
+    }
+
+    /**
+     * Print help messages
+     * @param helpMsgs - help messages to print
+     */
+    public static void printHelp(String[] helpMsgs) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printHelp(helpMsgs);
+    }
+
+    /**
+     * Print an information message
+     * @param info - information message to print
+     */
+    public static void printInfo(String info) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printInfo(info);
+    }
+
+    /**
+     * Print an exception message
+     * @param e - exception to print
+     */
+    public static void printException(Exception e) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printException(e);
+    }
+
+    /**
+     * Print a version information
+     * @param version - version info to print
+     */
+    public static void printVersion(String version) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.printVersion(version);
+    }
+
+    /**
+     * Print a generic key value mapping
+     * @param map to print
+     */
+    public static void print(Map map) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.print(map);
+    }
+
+    /**
+     * Print a generic array of strings
+     * @param strings - string array to print
+     */
+    public static void print(String[] strings) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.print(strings);
+    }
+
+    /**
+     * Print a collection of objects
+     * @param collection - collection to print
+     */
+    public static void print(Collection collection) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.print(collection);
+    }
+
+    /**
+     * Print a java string
+     * @param string - string to print
+     */
+    public static void print(String string) {
+        if (formatter == null) {
+            throw new IllegalStateException("No OutputFormatter specified. Use GlobalWriter.instantiate(OutputFormatter).");
+        }
+        formatter.print(string);
+    }
+}

Added: incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/OutputFormatter.java
URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/OutputFormatter.java?rev=371880&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/OutputFormatter.java (added)
+++ incubator/activemq/trunk/activemq-core/src/main/java/org/apache/activemq/broker/console/formatter/OutputFormatter.java Tue Jan 24 02:23:34 2006
@@ -0,0 +1,130 @@
+/**
+ *
+ * Copyright 2005-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.activemq.broker.console.formatter;
+
+import javax.management.ObjectInstance;
+import javax.management.ObjectName;
+import javax.management.AttributeList;
+import javax.jms.Message;
+import java.util.Collection;
+import java.util.Map;
+import java.io.OutputStream;
+
+public interface OutputFormatter {
+
+    /**
+     * Retrieve the output stream being used by the formatter
+     * @return
+     */
+    public OutputStream getOutputStream();
+
+    /**
+     * Print an ObjectInstance format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(ObjectInstance mbean);
+
+    /**
+     * Print an ObjectName format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(ObjectName mbean);
+
+    /**
+     * Print an AttributeList format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(AttributeList mbean);
+
+    /**
+     * Print a Map format of an mbean
+     * @param mbean - mbean to print
+     */
+    public void printMBean(Map mbean);
+
+    /**
+     * Print a Collection format of mbeans
+     * @param mbean - collection of mbeans
+     */
+    public void printMBean(Collection mbean);
+
+    /**
+     * Print a Map format of a JMS message
+     * @param msg
+     */
+    public void printMessage(Map msg);
+
+    /**
+     * Print a Message format of a JMS message
+     * @param msg - JMS message to print
+     */
+    public void printMessage(Message msg);
+
+    /**
+     * Print a Collection format of JMS messages
+     * @param msg - collection of JMS messages
+     */
+    public void printMessage(Collection msg);
+
+    /**
+     * Print help messages
+     * @param helpMsgs - help messages to print
+     */
+    public void printHelp(String[] helpMsgs);
+
+    /**
+     * Print an information message
+     * @param info - information message to print
+     */
+    public void printInfo(String info);
+
+    /**
+     * Print an exception message
+     * @param e - exception to print
+     */
+    public void printException(Exception e);
+
+    /**
+     * Print a version information
+     * @param version - version info to print
+     */
+    public void printVersion(String version);
+
+    /**
+     * Print a generic key value mapping
+     * @param map to print
+     */
+    public void print(Map map);
+
+    /**
+     * Print a generic array of strings
+     * @param strings - string array to print
+     */
+    public void print(String[] strings);
+
+    /**
+     * Print a collection of objects
+     * @param collection - collection to print
+     */
+    public void print(Collection collection);
+
+    /**
+     * Print a java string
+     * @param string - string to print
+     */
+    public void print(String string);
+}