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.AttributeChangeNotification;
025 import javax.management.Notification;
026 import javax.management.NotificationFilter;
027
028
029 /**
030 * <p>Implementation of <code>NotificationFilter</code> for attribute change
031 * notifications. This class is used by <code>BaseModelMBean</code> to
032 * construct attribute change notification event filters when a filter is not
033 * supplied by the application.</p>
034 *
035 * @author Craig R. McClanahan
036 * @version $Revision: 480402 $ $Date: 2006-11-29 05:43:23 +0100 (Wed, 29 Nov 2006) $
037 */
038
039 public class BaseAttributeFilter implements NotificationFilter {
040
041
042 // ----------------------------------------------------------- Constructors
043
044
045 /**
046 * Construct a new filter that accepts only the specified attribute
047 * name.
048 *
049 * @param name Name of the attribute to be accepted by this filter, or
050 * <code>null</code> to accept all attribute names
051 */
052 public BaseAttributeFilter(String name) {
053
054 super();
055 if (name != null)
056 addAttribute(name);
057
058 }
059
060
061 // ----------------------------------------------------- Instance Variables
062
063
064 /**
065 * The set of attribute names that are accepted by this filter. If this
066 * list is empty, all attribute names are accepted.
067 */
068 private HashSet names = new HashSet();
069
070
071 // --------------------------------------------------------- Public Methods
072
073
074 /**
075 * Add a new attribute name to the set of names accepted by this filter.
076 *
077 * @param name Name of the attribute to be accepted
078 */
079 public void addAttribute(String name) {
080
081 synchronized (names) {
082 names.add(name);
083 }
084
085 }
086
087
088 /**
089 * Clear all accepted names from this filter, so that it will accept
090 * all attribute names.
091 */
092 public void clear() {
093
094 synchronized (names) {
095 names.clear();
096 }
097
098 }
099
100
101 /**
102 * Return the set of names that are accepted by this filter. If this
103 * filter accepts all attribute names, a zero length array will be
104 * returned.
105 */
106 public String[] getNames() {
107
108 synchronized (names) {
109 return ((String[]) names.toArray(new String[names.size()]));
110 }
111
112 }
113
114
115 /**
116 * <p>Test whether notification enabled for this event.
117 * Return true if:</p>
118 * <ul>
119 * <li>This is an attribute change notification</li>
120 * <li>Either the set of accepted names is empty (implying that all
121 * attribute names are of interest) or the set of accepted names
122 * includes the name of the attribute in this notification</li>
123 * </ul>
124 */
125 public boolean isNotificationEnabled(Notification notification) {
126
127 if (notification == null)
128 return (false);
129 if (!(notification instanceof AttributeChangeNotification))
130 return (false);
131 AttributeChangeNotification acn =
132 (AttributeChangeNotification) notification;
133 if (!AttributeChangeNotification.ATTRIBUTE_CHANGE.equals(acn.getType()))
134 return (false);
135 synchronized (names) {
136 if (names.size() < 1)
137 return (true);
138 else
139 return (names.contains(acn.getAttributeName()));
140 }
141
142 }
143
144
145 /**
146 * Remove an attribute name from the set of names accepted by this
147 * filter.
148 *
149 * @param name Name of the attribute to be removed
150 */
151 public void removeAttribute(String name) {
152
153 synchronized (names) {
154 names.remove(name);
155 }
156
157 }
158
159
160 }