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 */
017package org.apache.activemq.console.filter;
018
019import java.io.IOException;
020import java.util.ArrayList;
021import java.util.Iterator;
022import java.util.List;
023
024import javax.management.MBeanServerConnection;
025import javax.management.MalformedObjectNameException;
026import javax.management.ObjectName;
027import javax.management.QueryExp;
028
029public 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        for (Iterator i = queries.iterator(); i.hasNext();) {
067            String key = (String)i.next();
068            String val = "";
069            int pos = key.indexOf("=");
070            if (pos >= 0) {
071                val = key.substring(pos + 1);
072                key = key.substring(0, pos);
073            }
074
075            if (val.startsWith(QUERY_EXP_PREFIX)) {
076                // do nothing as of the moment
077            } else if (!key.equals("") && !val.equals("")) {
078                objNameQuery = objNameQuery + key + "=" + val + ",";
079            }
080        }
081
082        // Append * to object name
083        objNameQuery = objNameQuery + "*";
084
085        return queryMBeans(new ObjectName(DEFAULT_JMX_DOMAIN + ":" + objNameQuery), queryExp);
086    }
087
088    /**
089     * Advance query that enables you to specify both the object name and the
090     * query expression to use. Note: Query expression is currently unsupported.
091     * 
092     * @param objName - object name to use for query
093     * @param queryExpStr - query expression string
094     * @return set of mbeans that matches the query
095     * @throws IOException - if there is a problem querying the JMX context
096     */
097    protected List queryMBeans(ObjectName objName, String queryExpStr) throws IOException {
098        QueryExp queryExp = createQueryExp(queryExpStr);
099
100        // Convert mbeans set to list to make it standard throughout the query
101        // filter
102        List mbeans = new ArrayList(jmxConnection.queryMBeans(objName, queryExp));
103
104        return mbeans;
105    }
106
107    /**
108     * Creates a query expression based on the query expression string Note:
109     * currently unsupported
110     * 
111     * @param queryExpStr - query expression string
112     * @return the created query expression
113     */
114    protected QueryExp createQueryExp(String queryExpStr) {
115        // Currently unsupported
116        return null;
117    }
118}