| /* |
| * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.jndi.ldap; |
| |
| import javax.naming.directory.SearchControls; |
| import javax.naming.event.*; |
| |
| /** |
| * This class holds the information in an event registration/deregistration |
| * request. This includes the name, filter, search controls and |
| * the different interfaces that the listener implements. This last piece |
| * of information determines which event(s) the listener is interested in. |
| *<p> |
| * It overrides equals() and hashCode() to use all these pieces of |
| * information so that it can be used correctly in a hashtable. |
| * |
| * @author Rosanna Lee |
| */ |
| final class NotifierArgs { |
| static final int ADDED_MASK = 0x1; |
| static final int REMOVED_MASK = 0x2; |
| static final int CHANGED_MASK = 0x4; |
| static final int RENAMED_MASK = 0x8; |
| |
| // these fields are package private; used by NamingEventNotifier |
| String name; |
| String filter; |
| SearchControls controls; |
| int mask; |
| |
| // package private |
| NotifierArgs(String name, int scope, NamingListener l) { |
| this(name, "(objectclass=*)", null, l); |
| |
| // if scope is not default, create search ctl and set it |
| if (scope != EventContext.ONELEVEL_SCOPE) { |
| controls = new SearchControls(); |
| controls.setSearchScope(scope); |
| } |
| } |
| |
| // package private |
| NotifierArgs(String name, String filter, SearchControls ctls, |
| NamingListener l) { |
| this.name = name; |
| this.filter = filter; |
| this.controls = ctls; |
| |
| if (l instanceof NamespaceChangeListener) { |
| mask |= ADDED_MASK|REMOVED_MASK|RENAMED_MASK; |
| } |
| if (l instanceof ObjectChangeListener) { |
| mask |= CHANGED_MASK; |
| } |
| } |
| |
| // checks name, filter, controls |
| public boolean equals(Object obj) { |
| if (obj instanceof NotifierArgs) { |
| NotifierArgs target = (NotifierArgs)obj; |
| return mask == target.mask && |
| name.equals(target.name) && filter.equals(target.filter) && |
| checkControls(target.controls); |
| } |
| return false; |
| } |
| |
| private boolean checkControls(SearchControls ctls) { |
| if ((controls == null || ctls == null)) { |
| return ctls == controls; |
| } |
| // ctls are nonempty |
| |
| return (controls.getSearchScope() == ctls.getSearchScope()) && |
| (controls.getTimeLimit() == ctls.getTimeLimit()) && |
| (controls.getDerefLinkFlag() == ctls.getDerefLinkFlag()) && |
| (controls.getReturningObjFlag() == ctls.getReturningObjFlag()) && |
| (controls.getCountLimit() == ctls.getCountLimit()) && |
| checkStringArrays(controls.getReturningAttributes(), |
| ctls.getReturningAttributes()); |
| } |
| |
| private static boolean checkStringArrays(String[] s1, String[] s2) { |
| if ((s1 == null) || (s2 == null)) { |
| return s1 == s2; |
| } |
| |
| // both are nonnull |
| if (s1.length != s2.length) { |
| return false; |
| } |
| |
| for (int i = 0; i < s1.length; i++) { |
| if (!s1[i].equals(s2[i])) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| // save from having to recalculate each time |
| private int sum = -1; |
| public int hashCode() { |
| if (sum == -1) |
| sum = mask + name.hashCode() + filter.hashCode() + controlsCode(); |
| return sum; |
| } |
| |
| // used in calculating hash code |
| private int controlsCode() { |
| if (controls == null) return 0; |
| |
| int total = controls.getTimeLimit() + (int)controls.getCountLimit() + |
| (controls.getDerefLinkFlag() ? 1 : 0) + |
| (controls.getReturningObjFlag() ? 1 : 0); |
| |
| String[] attrs = controls.getReturningAttributes(); |
| if (attrs != null) { |
| for (int i = 0; i < attrs.length; i++) { |
| total += attrs[i].hashCode(); |
| } |
| } |
| |
| return total; |
| } |
| } |