| /** |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.activemq.console.filter; |
| |
| import java.lang.reflect.Method; |
| import java.util.Iterator; |
| import java.util.Map; |
| import java.util.regex.Pattern; |
| |
| import javax.management.Attribute; |
| import javax.management.AttributeList; |
| import javax.management.ObjectInstance; |
| import javax.management.ObjectName; |
| |
| 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 { |
| // TODO why not just use instanceof? |
| |
| // 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 the 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; |
| } |
| } |