001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.core;
021
022 import org.apache.directory.shared.ldap.entry.ServerEntry;
023 import org.apache.directory.shared.ldap.name.DN;
024
025 /**
026 * An interface for managing referrals in the server
027 *
028 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
029 * @version $Rev$, $Date$
030 */
031 public interface ReferralManager
032 {
033 /**
034 * Get a read-lock on the referralManager.
035 * No read operation can be done on the referralManager if this
036 * method is not called before.
037 */
038 void lockRead();
039
040
041 /**
042 * Get a write-lock on the referralManager.
043 * No write operation can be done on the referralManager if this
044 * method is not called before.
045 */
046 void lockWrite();
047
048
049 /**
050 * Release the read-write lock on the referralManager.
051 * This method must be called after having read or modified the
052 * ReferralManager
053 */
054 void unlock();
055
056
057 /**
058 * Tells if a DN is a referral (its associated entry contains the Referral ObjectClass).
059 *
060 * It does not check that the associated entry inherits from a referral.
061 *
062 * @param dn The entry's DN we want to check
063 * @return <code>true</code> if the DN is associated with a referral
064 */
065 boolean isReferral( DN dn );
066
067
068 /**
069 * Tells if this DN has a parent which is a referral.
070 * <br>
071 * For instance, if cn=example, dc=acme, dc=org is the DN to check,
072 * and if dc=acme, dc=org is a referral, this this method will return true.
073 *
074 * @param dn The DN we want to check for a referral in its partents
075 * @return <code>true</code> if there is a parent referral
076 */
077 boolean hasParentReferral( DN dn );
078
079
080 /**
081 * Get the DN of the parent referral for a specific DN
082 *
083 * @param dn The DN from which we want to get the parent referral
084 * @return The parent referral of null if none is found
085 */
086 ServerEntry getParentReferral( DN dn );
087
088
089 /**
090 * Add a referral to the manager.
091 *
092 * @param dn The referral to add
093 */
094 void addReferral( ServerEntry entry );
095
096
097 /**
098 * Remove a referral from the manager.
099 *
100 * @param dn The referral to remove
101 */
102 void removeReferral( ServerEntry entry );
103
104
105 /**
106 * Initialize the manager, reading all the referrals from the base.
107 * The manager will search for every entries having a Referral ObjectClass.
108 *
109 * @param directoryService The associated LDAP service
110 * @param suffixes The partition list
111 * @exception If the initialization failed
112 */
113 void init( DirectoryService directoryService, String... suffixes ) throws Exception;
114
115
116 /**
117 * Remove a partition from the manager, reading all the referrals from the base.
118 * The manager will search for every entries having a Referral ObjectClass, and
119 * will remove them from the referrals table.
120 *
121 * @param directoryService The associated LDAP service
122 * @param suffixes The partition DN to remove
123 * @exception If the removal failed
124 */
125 void remove( DirectoryService directoryService, DN suffix ) throws Exception;
126 }