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 *     https://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 */
020package org.apache.directory.api.ldap.codec.api;
021
022
023import java.util.Iterator;
024import java.util.Map;
025
026import org.apache.directory.api.asn1.DecoderException;
027import org.apache.directory.api.asn1.EncoderException;
028import org.apache.directory.api.ldap.model.message.Control;
029import org.apache.directory.api.ldap.model.message.ExtendedRequest;
030import org.apache.directory.api.ldap.model.message.ExtendedResponse;
031import org.apache.mina.filter.codec.ProtocolCodecFactory;
032
033
034/**
035 * The service interface for the LDAP codec. It gathers all the supported controls and extended operations.
036 *
037 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
038 * @version $Rev$, $Date$
039 */
040public interface LdapApiService
041{
042    /** The default codec factory */
043    String DEFAULT_PROTOCOL_CODEC_FACTORY =
044        "org.apache.directory.api.ldap.codec.protocol.mina.LdapProtocolCodecFactory";
045
046
047    // ------------------------------------------------------------------------
048    // Control Methods
049    // ------------------------------------------------------------------------
050
051    /**
052     * Returns an Iterator over the OID Strings of registered request controls.
053     *
054     * @return The registered control OID Strings
055     */
056    Iterator<String> registeredRequestControls();
057
058
059    /**
060     * Returns an Iterator over the OID Strings of registered response controls.
061     *
062     * @return The registered control OID Strings
063     */
064    Iterator<String> registeredResponseControls();
065
066
067    /**
068     * Checks if a control has been registered. It will check in both the
069     * request and response control maps.
070     *
071     * @param oid The Control OID we are looking for
072     * @return The OID of the control to check for registration
073     */
074    boolean isControlRegistered( String oid );
075
076
077    /**
078     * Registers an request {@link ControlFactory} with this service.
079     *
080     * @param factory The control factory
081     * @return The registered control factory
082     */
083    ControlFactory<?> registerRequestControl( ControlFactory<?> factory );
084
085
086    /**
087     * Registers an response {@link ControlFactory} with this service.
088     *
089     * @param factory The control factory
090     * @return The registered control factory
091     */
092    ControlFactory<?> registerResponseControl( ControlFactory<?> factory );
093
094
095    /**
096     * Unregisters a request {@link ControlFactory} with this service.
097     *
098     * @param oid The oid of the control the factory is associated with.
099     * @return The unregistered control factory
100     */
101    ControlFactory<?> unregisterRequestControl( String oid );
102
103
104    /**
105     * Unregisters a response {@link ControlFactory} with this service.
106     *
107     * @param oid The oid of the control the factory is associated with.
108     * @return The unregistered control factory
109     */
110    ControlFactory<?> unregisterResponseControl( String oid );
111
112
113    /**
114     * Creates a JNDI control from the ldap model's control.
115     *
116     * @param modelControl The model's control.
117     * @return The JNDI control.
118     * @throws EncoderException if there are problems encoding the modelControl.
119     */
120    javax.naming.ldap.Control toJndiControl( Control modelControl ) throws EncoderException;
121
122
123    /**
124     * Creates a model request control from the JNDI request control.
125     *
126     * @param jndiControl The JNDI control.
127     * @return The model request control.
128     * @throws DecoderException if there are problems decoding the value of the JNDI control.
129     */
130    Control fromJndiRequestControl( javax.naming.ldap.Control jndiControl ) throws DecoderException;
131
132
133    /**
134     * Creates a model response control from the JNDI response control.
135     *
136     * @param jndiControl The JNDI response control.
137     * @return The model control.
138     * @throws DecoderException if there are problems decoding the value of the JNDI control.
139     */
140    Control fromJndiResponseControl( javax.naming.ldap.Control jndiControl ) throws DecoderException;
141
142
143    /**
144     * @return the request controlFactories
145     */
146    Map<String, ControlFactory<? extends Control>> getRequestControlFactories();
147
148
149    /**
150     * @return the response controlFactories
151     */
152    Map<String, ControlFactory<? extends Control>> getResponseControlFactories();
153
154
155    // ------------------------------------------------------------------------
156    // Extended Request Methods
157    // ------------------------------------------------------------------------
158    /**
159     * Returns an Iterator over the OID Strings of registered extended
160     * requests.
161     *
162     * @return The registered extended request OID Strings
163     */
164    Iterator<String> registeredExtendedRequests();
165    
166    
167    /**
168     * Returns an Iterator over the OID Strings of registered extended
169     * responses.
170     *
171     * @return The registered extended response OID Strings
172     */
173    Iterator<String> registeredExtendedResponses();
174
175
176    /**
177     * Registers an {@link ExtendedOperationFactory} for generating extended request
178     * response pairs.
179     *
180     * @param factory The extended request factory
181     * @return The registered factory if one existed for the oid
182     */
183    ExtendedOperationFactory registerExtendedRequest( ExtendedOperationFactory factory );
184
185
186    /**
187     * Registers an {@link ExtendedOperationFactory} for generating extended response
188     * response pairs.
189     *
190     * @param factory The extended response factory
191     * @return The registered factory if one existed for the oid
192     */
193    ExtendedOperationFactory registerExtendedResponse( ExtendedOperationFactory factory );
194
195
196    /**
197     * Unregisters an {@link ExtendedOperationFactory} for generating extended
198     * request response pairs.
199     *
200     * @param oid The extended request oid
201     * @return The registered factory if one existed for the oid
202     */
203    ExtendedOperationFactory unregisterExtendedRequest( String oid );
204
205
206    /**
207     * Unregisters an {@link ExtendedOperationFactory} for generating extended
208     * responses.
209     *
210     * @param oid The extended response oid
211     * @return The registered factory if one existed for the oid
212     */
213    ExtendedOperationFactory unregisterExtendedResponse( String oid );
214
215
216    /**
217     * Checks to see if an extended request operation is registered.
218     *
219     * @param oid The object identifier for the extended request operation
220     * @return true if registered, false if not
221     */
222    boolean isExtendedRequestRegistered( String oid );
223
224
225    /**
226     * Checks to see if an extended response operation is registered.
227     *
228     * @param oid The object identifier for the extended response operation
229     * @return true if registered, false if not
230     */
231    boolean isExtendedResponseRegistered( String oid );
232    
233    
234    /**
235     * @return the extendedRequestFactories
236     */
237    Map<String, ExtendedOperationFactory> getExtendedRequestFactories();
238
239
240    /**
241     * @return the extendedResponseFactories
242     */
243    Map<String, ExtendedOperationFactory> getExtendedResponseFactories();
244
245
246    // ------------------------------------------------------------------------
247    // Intermediate Response Methods
248    // ------------------------------------------------------------------------
249
250    /**
251     * Returns an Iterator over the OID Strings of registered intermediate
252     * responses.
253     *
254     * @return The registered Intermediate response OID Strings
255     */
256    Iterator<String> registeredIntermediateResponses();
257
258
259    /**
260     * Registers an {@link IntermediateOperationFactory} for generating intermediate response
261     *
262     * @param factory The intermediate response factory
263     * @return The displaced factory if one existed for the oid
264     */
265    IntermediateOperationFactory registerIntermediateResponse( IntermediateOperationFactory factory );
266
267
268    /**
269     * Unregisters an {@link IntermediateOperationFactory} for generating intermediate
270     * response
271     *
272     * @param oid The intermediate response oid
273     * @return The displaced factory if one existed for the oid
274     */
275    IntermediateOperationFactory unregisterIntermediateResponse( String oid );
276
277
278    /**
279     * Checks to see if an intermediate response is registered.
280     *
281     * @param oid The object identifier for the intermediate response
282     * @return true if registered, false if not
283     */
284    boolean isIntermediateResponseRegistered( String oid );
285
286
287    /**
288     * @return the intermediateResponseFactories
289     */
290    Map<String, IntermediateOperationFactory> getIntermediateResponseFactories();
291
292
293    // ------------------------------------------------------------------------
294    // Extended Response Methods
295    // ------------------------------------------------------------------------
296
297    /**
298     * Creates a model ExtendedResponse from the JNDI ExtendedResponse.
299     *
300     * @param jndiResponse The JNDI ExtendedResponse
301     * @return The model ExtendedResponse
302     * @throws DecoderException if the response value cannot be decoded.
303     */
304    ExtendedResponse fromJndi( javax.naming.ldap.ExtendedResponse jndiResponse ) throws DecoderException;
305
306
307    /**
308     * Creates a JNDI {@link javax.naming.ldap.ExtendedResponse} from the model
309     * {@link ExtendedResponse}.
310     *
311     * @param modelResponse The extended response to convert
312     * @return A JNDI extended response
313     * @throws EncoderException If the conversion failed
314     */
315    javax.naming.ldap.ExtendedResponse toJndi( ExtendedResponse modelResponse ) throws EncoderException;
316
317
318    /**
319     * Creates a model ExtendedResponse from the JNDI ExtendedRequest.
320     *
321     * @param jndiRequest The JNDI ExtendedRequest
322     * @return The model ExtendedRequest
323     * @throws DecoderException if the request value cannot be decoded.
324     */
325    ExtendedRequest fromJndi( javax.naming.ldap.ExtendedRequest jndiRequest ) throws DecoderException;
326
327
328    /**
329     * Creates a JNDI {@link javax.naming.ldap.ExtendedRequest} from the model
330     * {@link ExtendedRequest}.
331     *
332     * @param modelRequest The extended request to convert
333     * @return A JNDI extended request
334     * @throws EncoderException If the conversion failed
335     */
336    javax.naming.ldap.ExtendedRequest toJndi( ExtendedRequest modelRequest ) throws EncoderException;
337
338
339    // ------------------------------------------------------------------------
340    // Other Methods
341    // ------------------------------------------------------------------------
342
343    /**
344     * Creates a new LDAP {@link ProtocolCodecFactory}.
345     *
346     * @return the {@link ProtocolCodecFactory}
347     */
348    ProtocolCodecFactory getProtocolCodecFactory();
349
350
351    /**
352     * Registers a ProtocolCodecFactory with this LdapCodecService.
353     *
354     * @param factory The factory being registered.
355     * @return The previously set {@link ProtocolCodecFactory}, or null if
356     * none had been set earlier.
357     */
358    ProtocolCodecFactory registerProtocolCodecFactory( ProtocolCodecFactory factory );
359}