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 018 019 package org.apache.commons.modeler; 020 021 022 import java.util.HashSet; 023 024 import javax.management.Notification; 025 import javax.management.NotificationFilter; 026 027 028 /** 029 * Special NotificationFilter that allows modeler to optimize its notifications. 030 * 031 * This class is immutable - after you construct it it'll filter based on 032 * a fixed set of notification names. 033 * 034 * The JMX specification requires the filters to be called before the 035 * notifications are sent. We can call this filter well in advance, when 036 * the listener is added. Based on the result we can maintain separate 037 * channels for each notification - and reduce the overhead. 038 * 039 * @author Costin Manolache 040 */ 041 public class FixedNotificationFilter implements NotificationFilter { 042 043 /** 044 * The set of attribute names that are accepted by this filter. If this 045 * list is empty, all attribute names are accepted. 046 */ 047 private HashSet names = new HashSet(); 048 String namesA[]=null; 049 050 /** 051 * Construct a new filter that accepts only the specified notification 052 * names. 053 * 054 * @param names Names of the notification types 055 */ 056 public FixedNotificationFilter(String names[]) { 057 super(); 058 } 059 060 /** 061 * Return the set of names that are accepted by this filter. If this 062 * filter accepts all attribute names, a zero length array will be 063 * returned. 064 */ 065 public String[] getNames() { 066 synchronized (names) { 067 return ((String[]) names.toArray(new String[names.size()])); 068 } 069 } 070 071 072 /** 073 * <p>Test whether notification enabled for this event. 074 * Return true if:</p> 075 * <ul> 076 * <li>Either the set of accepted names is empty (implying that all 077 * attribute names are of interest) or the set of accepted names 078 * includes the name of the attribute in this notification</li> 079 * </ul> 080 */ 081 public boolean isNotificationEnabled(Notification notification) { 082 083 if (notification == null) 084 return (false); 085 synchronized (names) { 086 if (names.size() < 1) 087 return (true); 088 else 089 return (names.contains(notification.getType())); 090 } 091 092 } 093 094 095 }