KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > ldap > server > schema > GlobalAttributeTypeRegistry


1 /*
2  * Copyright 2004 The Apache Software Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */

17 package org.apache.ldap.server.schema;
18
19
20 import org.apache.ldap.common.schema.AttributeType;
21 import org.apache.ldap.common.util.JoinIterator;
22 import org.apache.ldap.server.SystemPartition;
23 import org.apache.ldap.server.schema.bootstrap.BootstrapAttributeTypeRegistry;
24
25 import javax.naming.NamingException JavaDoc;
26 import java.util.HashMap JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.Map JavaDoc;
29
30
31 /**
32  * A plain old java object implementation of an AttributeTypeRegistry.
33  *
34  * @author <a HREF="mailto:dev@directory.apache.org">Apache Directory Project</a>
35  * @version $Rev: 169198 $
36  */

37 public class GlobalAttributeTypeRegistry implements AttributeTypeRegistry
38 {
39     /** maps an OID to an AttributeType */
40     private final Map JavaDoc byOid;
41     /** maps an OID to a schema name*/
42     private final Map JavaDoc oidToSchema;
43     /** the registry used to resolve names to OIDs */
44     private final OidRegistry oidRegistry;
45     /** monitor notified via callback events */
46     private AttributeTypeRegistryMonitor monitor;
47     /** the underlying bootstrap registry to delegate on misses to */
48     private BootstrapAttributeTypeRegistry bootstrap;
49     /** the system partition where we keep attributeType updates */
50     private SystemPartition systemPartition;
51
52
53     // ------------------------------------------------------------------------
54
// C O N S T R U C T O R S
55
// ------------------------------------------------------------------------
56

57
58     /**
59      * Creates a GlobalAttributeTypeRegistry which accesses data stored within
60      * the system partition and within the bootstrapping registry to service
61      * AttributeType lookup requests.
62      *
63      * @param systemPartition the system database partition under ou=system
64      * @param bootstrap the bootstrapping registry to delegate to
65      */

66     public GlobalAttributeTypeRegistry( SystemPartition systemPartition,
67             BootstrapAttributeTypeRegistry bootstrap, OidRegistry oidRegistry )
68     {
69         this.byOid = new HashMap JavaDoc();
70         this.oidToSchema = new HashMap JavaDoc();
71         this.monitor = new AttributeTypeRegistryMonitorAdapter();
72
73         this.oidRegistry = oidRegistry;
74         if ( this.oidRegistry == null )
75         {
76             throw new NullPointerException JavaDoc( "the OID registry cannot be null" ) ;
77         }
78
79         this.bootstrap = bootstrap;
80         if ( this.bootstrap == null )
81         {
82             throw new NullPointerException JavaDoc( "the bootstrap registry cannot be null" ) ;
83         }
84
85         this.systemPartition = systemPartition;
86         if ( this.systemPartition == null )
87         {
88             throw new NullPointerException JavaDoc( "the system partition cannot be null" ) ;
89         }
90     }
91
92
93     /**
94      * Sets the monitor that is to be notified via callback events.
95      *
96      * @param monitor the new monitor to notify of notable events
97      */

98     public void setMonitor( AttributeTypeRegistryMonitor monitor )
99     {
100         this.monitor = monitor;
101     }
102
103
104     // ------------------------------------------------------------------------
105
// Service Methods
106
// ------------------------------------------------------------------------
107

108
109     public void register( String JavaDoc schema, AttributeType attributeType ) throws NamingException JavaDoc
110     {
111         if ( byOid.containsKey( attributeType.getOid() ) ||
112              bootstrap.hasAttributeType( attributeType.getOid() ) )
113         {
114             NamingException JavaDoc e = new NamingException JavaDoc( "attributeType w/ OID " +
115                 attributeType.getOid() + " has already been registered!" );
116             monitor.registerFailed( attributeType, e );
117             throw e;
118         }
119
120         String JavaDoc[] names = attributeType.getNames();
121         for ( int ii = 0; ii < names.length; ii++ )
122         {
123             oidRegistry.register( names[ii], attributeType.getOid() );
124         }
125
126         oidToSchema.put( attributeType.getOid(), schema );
127         byOid.put( attributeType.getOid(), attributeType );
128         monitor.registered( attributeType );
129     }
130
131
132     public AttributeType lookup( String JavaDoc id ) throws NamingException JavaDoc
133     {
134         id = oidRegistry.getOid( id );
135
136         if ( ! ( byOid.containsKey( id ) || bootstrap.hasAttributeType( id ) ) )
137         {
138             NamingException JavaDoc e = new NamingException JavaDoc( "attributeType w/ OID "
139                 + id + " not registered!" );
140             monitor.lookupFailed( id, e );
141             throw e;
142         }
143
144         AttributeType attributeType = ( AttributeType ) byOid.get( id );
145
146         if ( attributeType == null )
147         {
148             attributeType = bootstrap.lookup( id );
149         }
150
151         monitor.lookedUp( attributeType );
152         return attributeType;
153     }
154
155
156     public boolean hasAttributeType( String JavaDoc id )
157     {
158         try
159         {
160
161             if ( oidRegistry.hasOid( id ) )
162             {
163                 return byOid.containsKey( oidRegistry.getOid( id ) ) ||
164                        bootstrap.hasAttributeType( id );
165             }
166         }
167         catch ( NamingException JavaDoc e )
168         {
169             return false;
170         }
171
172         return false;
173     }
174
175
176     public String JavaDoc getSchemaName( String JavaDoc id ) throws NamingException JavaDoc
177     {
178         id = oidRegistry.getOid( id );
179
180         if ( oidToSchema.containsKey( id ) )
181         {
182             return ( String JavaDoc ) oidToSchema.get( id );
183         }
184
185         if ( bootstrap.getSchemaName( id ) != null )
186         {
187             return bootstrap.getSchemaName( id );
188         }
189
190         throw new NamingException JavaDoc( "OID " + id + " not found in oid to " +
191             "schema name map!" );
192     }
193
194
195     public Iterator list()
196     {
197         return new JoinIterator( new Iterator[]
198             { byOid.values().iterator(),bootstrap.list() } );
199     }
200 }
201
Popular Tags