001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.activemq.console.filter;
018    
019    import java.io.IOException;
020    import java.util.ArrayList;
021    import java.util.Iterator;
022    import java.util.List;
023    
024    import javax.management.MBeanServerConnection;
025    import javax.management.MalformedObjectNameException;
026    import javax.management.ObjectName;
027    import javax.management.QueryExp;
028    
029    public class MBeansObjectNameQueryFilter extends AbstractQueryFilter {
030    
031        public static final String DEFAULT_JMX_DOMAIN = "org.apache.activemq";
032        public static final String QUERY_EXP_PREFIX = "MBeans.QueryExp.";
033    
034        private MBeanServerConnection jmxConnection;
035    
036        /**
037         * Creates an mbeans object name query filter that will query on the given
038         * JMX connection
039         * 
040         * @param jmxConnection - JMX connection to use
041         */
042        public MBeansObjectNameQueryFilter(MBeanServerConnection jmxConnection) {
043            super(null);
044            this.jmxConnection = jmxConnection;
045        }
046    
047        /**
048         * Queries the JMX service using a mapping of keys and values to construct
049         * the object name
050         * 
051         * @param queries - mapping of keys and values
052         * @return collection of ObjectInstance that matches the query
053         * @throws MalformedObjectNameException - if the given string is an invalid
054         *                 object name
055         * @throws IOException - if there is a problem querying the JMX context
056         */
057        public List query(List queries) throws MalformedObjectNameException, IOException {
058            // Query all mbeans
059            if (queries == null || queries.isEmpty()) {
060                return queryMBeans(new ObjectName(DEFAULT_JMX_DOMAIN + ":*"), null);
061            }
062    
063            // Constructs object name query
064            String objNameQuery = "";
065            String queryExp = "";
066            String delimiter = "";
067            for (Iterator i = queries.iterator(); i.hasNext();) {
068                String key = (String)i.next();
069                String val = "";
070                int pos = key.indexOf("=");
071                if (pos >= 0) {
072                    val = key.substring(pos + 1);
073                    key = key.substring(0, pos);
074                } else {
075                    objNameQuery += delimiter + key;
076                }
077    
078                if (val.startsWith(QUERY_EXP_PREFIX)) {
079                    // do nothing as of the moment
080                } else if (!key.equals("") && !val.equals("")) {
081                    objNameQuery += delimiter + key + "=" + val;
082                    delimiter = ",";
083                }
084            }
085    
086            return queryMBeans(new ObjectName(DEFAULT_JMX_DOMAIN + ":" + objNameQuery), queryExp);
087        }
088    
089        /**
090         * Advance query that enables you to specify both the object name and the
091         * query expression to use. Note: Query expression is currently unsupported.
092         * 
093         * @param objName - object name to use for query
094         * @param queryExpStr - query expression string
095         * @return set of mbeans that matches the query
096         * @throws IOException - if there is a problem querying the JMX context
097         */
098        protected List queryMBeans(ObjectName objName, String queryExpStr) throws IOException {
099            QueryExp queryExp = createQueryExp(queryExpStr);
100    
101            // Convert mbeans set to list to make it standard throughout the query
102            // filter
103            List mbeans = new ArrayList(jmxConnection.queryMBeans(objName, queryExp));
104    
105            return mbeans;
106        }
107    
108        /**
109         * Creates a query expression based on the query expression string Note:
110         * currently unsupported
111         * 
112         * @param queryExpStr - query expression string
113         * @return the created query expression
114         */
115        protected QueryExp createQueryExp(String queryExpStr) {
116            // Currently unsupported
117            return null;
118        }
119    }