1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.directory.server.core;
21
22
23 import org.apache.directory.server.core.authn.LdapPrincipal;
24 import org.apache.directory.server.core.changelog.ChangeLog;
25 import org.apache.directory.server.core.entry.ServerEntry;
26 import org.apache.directory.server.core.entry.ServerEntryFactory;
27 import org.apache.directory.server.core.event.EventService;
28 import org.apache.directory.server.core.interceptor.Interceptor;
29 import org.apache.directory.server.core.interceptor.InterceptorChain;
30 import org.apache.directory.server.core.partition.Partition;
31 import org.apache.directory.server.core.partition.PartitionNexus;
32 import org.apache.directory.server.core.schema.SchemaService;
33 import org.apache.directory.server.schema.registries.Registries;
34 import org.apache.directory.shared.ldap.ldif.LdifEntry;
35 import org.apache.directory.shared.ldap.name.LdapDN;
36
37 import java.io.File;
38 import java.util.List;
39 import java.util.Set;
40
41
42 /**
43 * Provides JNDI service to {@link AbstractContextFactory}.
44 *
45 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
46 * @version $Rev: 679219 $, $Date: 2008-07-24 00:45:05 +0200 (Do, 24 Jul 2008) $
47 */
48 public interface DirectoryService extends ServerEntryFactory
49 {
50 String JNDI_KEY = DirectoryService.class.getName();
51
52 /**
53 * Reverts the server's state to an earlier revision. Note that the revsion number
54 * still increases to revert back even though the state reverted to is the same.
55 * Note that implementations may lock the server from making changes or searching
56 * the directory until this operation has completed.
57 *
58 * @param revision the revision number to revert to
59 * @return the new revision reached by applying all changes needed to revert to the
60 * original state
61 * @throws Exception if there are problems reverting back to the earlier state
62 * @throws IllegalArgumentException if the revision provided is greater than the current
63 * revision or less than 0
64 * @throws UnsupportedOperationException if this feature is not supported by the
65 * change log
66 */
67 long revert( long revision ) throws Exception;
68
69
70 /**
71 * Reverts the server's state to the latest tagged snapshot if one was taken. If
72 * there is no tag a illegal state exception will result. If the latest revision
73 * is not earlier than the current revision (both are same), then no changes were
74 * made to the directory to be reverted. In this case we return the current
75 * revision and do nothiig loggin the fact that we ignored the request to revert.
76 *
77 * @return the new revision reached by applying all changes needed to revert
78 * to the new state or the same version before this call if no revert actually
79 * took place
80 * @throws Exception if there are problems reverting back to the earlier state
81 * @throws UnsupportedOperationException if this feature is not supported by the
82 * change log
83 */
84 long revert() throws Exception;
85
86
87 PartitionNexus getPartitionNexus();
88
89
90 InterceptorChain getInterceptorChain();
91
92
93 void addPartition( Partition partition ) throws Exception;
94
95
96 void removePartition( Partition partition ) throws Exception;
97
98
99 Registries getRegistries();
100
101
102 void setRegistries( Registries registries );
103
104
105 SchemaService getSchemaService();
106
107
108 void setSchemaService( SchemaService schemaService );
109
110
111 EventService getEventService();
112
113
114 void setEventService( EventService eventService );
115
116
117 /**
118 * Starts up this service.
119 *
120 * @throws Exception if failed to start up
121 */
122 void startup() throws Exception;
123
124
125 /**
126 * Shuts down this service.
127 *
128 * @throws Exception if failed to shut down
129 */
130 void shutdown() throws Exception;
131
132
133 /**
134 * Calls {@link Partition#sync()} for all registered {@link Partition}s.
135 * @throws Exception if synchronization failed
136 */
137 void sync() throws Exception;
138
139
140 /**
141 * Returns <tt>true</tt> if this service is started.
142 * @return true if the service has started, false otherwise
143 */
144 boolean isStarted();
145
146
147 CoreSession getAdminSession() throws Exception;
148
149
150 /**
151 * Gets a logical session to perform operations on this DirectoryService
152 * as the anonymous user. This bypasses authentication without
153 * propagating a bind operation into the core.
154 *
155 * @return a logical session as the anonymous user
156 */
157 CoreSession getSession() throws Exception;
158
159
160 /**
161 * Gets a logical session to perform operations on this DirectoryService
162 * as a specific user. This bypasses authentication without propagating
163 * a bind operation into the core.
164 *
165 * @return a logical session as a specific user
166 */
167 CoreSession getSession( LdapPrincipal principal ) throws Exception;
168
169
170 /**
171 * Gets a logical session to perform operations on this DirectoryService
172 * as a specific user with a separate authorization principal. This
173 * bypasses authentication without propagating a bind operation into the
174 * core.
175 *
176 * @return a logical session as a specific user
177 */
178 CoreSession getSession( LdapDN principalDn, byte[] credentials ) throws Exception;
179
180
181 /**
182 * Gets a logical session to perform operations on this DirectoryService
183 * as a specific user with a separate authorization principal. This
184 * bypasses authentication without propagating a bind operation into the
185 * core.
186 *
187 * @return a logical session as a specific user
188 */
189 CoreSession getSession( LdapDN principalDn, byte[] credentials, String saslMechanism, String saslAuthId )
190 throws Exception;
191
192
193 void setInstanceId( String instanceId );
194
195
196 String getInstanceId();
197
198
199 /**
200 * Gets the {@link Partition}s used by this DirectoryService.
201 *
202 * @return the set of partitions used
203 */
204 Set<? extends Partition> getPartitions();
205
206
207 /**
208 * Sets {@link Partition}s used by this DirectoryService.
209 *
210 * @param partitions the partitions to used
211 */
212 void setPartitions( Set<? extends Partition> partitions );
213
214
215 /**
216 * Returns <tt>true</tt> if access control checks are enabled.
217 *
218 * @return true if access control checks are enabled, false otherwise
219 */
220 boolean isAccessControlEnabled();
221
222
223 /**
224 * Sets whether to enable basic access control checks or not.
225 *
226 * @param accessControlEnabled true to enable access control checks, false otherwise
227 */
228 void setAccessControlEnabled( boolean accessControlEnabled );
229
230
231 /**
232 * Returns <tt>true</tt> if anonymous access is allowed on entries besides the RootDSE.
233 * If the access control subsystem is enabled then access to some entries may not be
234 * allowed even when full anonymous access is enabled.
235 *
236 * @return true if anonymous access is allowed on entries besides the RootDSE, false
237 * if anonymous access is allowed to all entries.
238 */
239 boolean isAllowAnonymousAccess();
240
241
242 /**
243 * Sets whether to allow anonymous access to entries other than the RootDSE. If the
244 * access control subsystem is enabled then access to some entries may not be allowed
245 * even when full anonymous access is enabled.
246 *
247 * @param enableAnonymousAccess true to enable anonymous access, false to disable it
248 */
249 void setAllowAnonymousAccess( boolean enableAnonymousAccess );
250
251
252 /**
253 * Returns interceptors in the server.
254 *
255 * @return the interceptors in the server.
256 */
257 List<Interceptor> getInterceptors();
258
259
260 /**
261 * Sets the interceptors in the server.
262 *
263 * @param interceptors the interceptors to be used in the server.
264 */
265 void setInterceptors( List<Interceptor> interceptors );
266
267
268 /**
269 * Returns test directory entries({@link LdifEntry}) to be loaded while
270 * bootstrapping.
271 *
272 * @return test entries to load during bootstrapping
273 */
274 List<LdifEntry> getTestEntries();
275
276
277 /**
278 * Sets test directory entries({@link Attributes}) to be loaded while
279 * bootstrapping.
280 *
281 * @param testEntries the test entries to load while bootstrapping
282 */
283 void setTestEntries( List<? extends LdifEntry> testEntries );
284
285
286 /**
287 * Returns working directory (counterpart of <tt>var/lib</tt>) where partitions are
288 * stored by default.
289 *
290 * @return the directory where partition's are stored.
291 */
292 File getWorkingDirectory();
293
294
295 /**
296 * Sets working directory (counterpart of <tt>var/lib</tt>) where partitions are stored
297 * by default.
298 *
299 * @param workingDirectory the directory where the server's partitions are stored by default.
300 */
301 void setWorkingDirectory( File workingDirectory );
302
303
304 /**
305 * Sets the shutdown hook flag which controls whether or not this DirectoryService
306 * registers a JVM shutdown hook to flush caches and synchronize to disk safely. This is
307 * enabled by default.
308 *
309 * @param shutdownHookEnabled true to enable the shutdown hook, false to disable
310 */
311 void setShutdownHookEnabled( boolean shutdownHookEnabled );
312
313
314 /**
315 * Checks to see if this DirectoryService has registered a JVM shutdown hook
316 * to flush caches and synchronize to disk safely. This is enabled by default.
317 *
318 * @return true if a shutdown hook is registered, false if it is not
319 */
320 boolean isShutdownHookEnabled();
321
322
323 void setExitVmOnShutdown( boolean exitVmOnShutdown );
324
325
326 boolean isExitVmOnShutdown();
327
328
329 void setMaxSizeLimit( int maxSizeLimit );
330
331
332 int getMaxSizeLimit();
333
334
335 void setMaxTimeLimit( int maxTimeLimit );
336
337
338 int getMaxTimeLimit();
339
340
341 void setSystemPartition( Partition systemPartition );
342
343
344 Partition getSystemPartition();
345
346
347 boolean isDenormalizeOpAttrsEnabled();
348
349
350 void setDenormalizeOpAttrsEnabled( boolean denormalizeOpAttrsEnabled );
351
352
353 /**
354 * Gets the ChangeLog service for this DirectoryService used for tracking
355 * changes (revisions) to the server and using them to revert the server
356 * to earier revisions.
357 *
358 * @return the change log service
359 */
360 ChangeLog getChangeLog();
361
362
363 /**
364 * Sets the ChangeLog service for this DirectoryService used for tracking
365 * changes (revisions) to the server and using them to revert the server
366 * to earier revisions.
367 *
368 * @param changeLog the change log service to set
369 */
370 void setChangeLog( ChangeLog changeLog );
371
372
373 /**
374 * Create a new ServerEntry.
375 *
376 * @param ldif the String representing the attributes, in LDIF format
377 * @param dn the DN for this new entry
378 */
379 ServerEntry newEntry( String ldif, String dn );
380
381
382 /**
383 * Gets the operation manager.
384 */
385 OperationManager getOperationManager();
386 }