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 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 }