/* * 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; } }