001/*
002 * The contents of this file are subject to the terms of the Common Development and
003 * Distribution License (the License). You may not use this file except in compliance with the
004 * License.
005 *
006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
007 * specific language governing permission and limitations under the License.
008 *
009 * When distributing Covered Software, include this CDDL Header Notice in each file and include
010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
011 * Header, with the fields enclosed by brackets [] replaced by your own identifying
012 * information: "Portions Copyright [year] [name of copyright owner]".
013 *
014 * Copyright 2008 Sun Microsystems, Inc.
015 */
016package org.forgerock.opendj.server.config.meta;
017
018
019
020import java.util.Collection;
021import java.util.SortedSet;
022import org.forgerock.opendj.config.AdministratorAction;
023import org.forgerock.opendj.config.BooleanPropertyDefinition;
024import org.forgerock.opendj.config.ClassPropertyDefinition;
025import org.forgerock.opendj.config.client.ConcurrentModificationException;
026import org.forgerock.opendj.config.client.IllegalManagedObjectNameException;
027import org.forgerock.opendj.config.client.ManagedObject;
028import org.forgerock.opendj.config.client.ManagedObjectDecodingException;
029import org.forgerock.opendj.config.client.MissingMandatoryPropertiesException;
030import org.forgerock.opendj.config.client.OperationRejectedException;
031import org.forgerock.opendj.config.DefaultBehaviorProvider;
032import org.forgerock.opendj.config.DefinedDefaultBehaviorProvider;
033import org.forgerock.opendj.config.DefinitionDecodingException;
034import org.forgerock.opendj.config.DNPropertyDefinition;
035import org.forgerock.opendj.config.DurationPropertyDefinition;
036import org.forgerock.opendj.config.EnumPropertyDefinition;
037import org.forgerock.opendj.config.InstantiableRelationDefinition;
038import org.forgerock.opendj.config.IntegerPropertyDefinition;
039import org.forgerock.opendj.config.ManagedObjectAlreadyExistsException;
040import org.forgerock.opendj.config.ManagedObjectDefinition;
041import org.forgerock.opendj.config.ManagedObjectNotFoundException;
042import org.forgerock.opendj.config.PropertyException;
043import org.forgerock.opendj.config.PropertyOption;
044import org.forgerock.opendj.config.PropertyProvider;
045import org.forgerock.opendj.config.server.ConfigException;
046import org.forgerock.opendj.config.server.ConfigurationAddListener;
047import org.forgerock.opendj.config.server.ConfigurationChangeListener;
048import org.forgerock.opendj.config.server.ConfigurationDeleteListener;
049import org.forgerock.opendj.config.server.ServerManagedObject;
050import org.forgerock.opendj.config.SizePropertyDefinition;
051import org.forgerock.opendj.config.StringPropertyDefinition;
052import org.forgerock.opendj.config.Tag;
053import org.forgerock.opendj.ldap.DN;
054import org.forgerock.opendj.ldap.LdapException;
055import org.forgerock.opendj.server.config.client.BackendIndexCfgClient;
056import org.forgerock.opendj.server.config.client.BackendVLVIndexCfgClient;
057import org.forgerock.opendj.server.config.client.PDBBackendCfgClient;
058import org.forgerock.opendj.server.config.meta.BackendCfgDefn.WritabilityMode;
059import org.forgerock.opendj.server.config.server.BackendCfg;
060import org.forgerock.opendj.server.config.server.BackendIndexCfg;
061import org.forgerock.opendj.server.config.server.BackendVLVIndexCfg;
062import org.forgerock.opendj.server.config.server.PDBBackendCfg;
063import org.forgerock.opendj.server.config.server.PluggableBackendCfg;
064
065
066
067/**
068 * An interface for querying the PDB Backend managed object definition
069 * meta information.
070 * <p>
071 * A PDB Backend stores application data in a Persistit database.
072 */
073public final class PDBBackendCfgDefn extends ManagedObjectDefinition<PDBBackendCfgClient, PDBBackendCfg> {
074
075  /** The singleton configuration definition instance. */
076  private static final PDBBackendCfgDefn INSTANCE = new PDBBackendCfgDefn();
077
078
079
080  /** The "db-cache-percent" property definition. */
081  private static final IntegerPropertyDefinition PD_DB_CACHE_PERCENT;
082
083
084
085  /** The "db-cache-size" property definition. */
086  private static final SizePropertyDefinition PD_DB_CACHE_SIZE;
087
088
089
090  /** The "db-checkpointer-wakeup-interval" property definition. */
091  private static final DurationPropertyDefinition PD_DB_CHECKPOINTER_WAKEUP_INTERVAL;
092
093
094
095  /** The "db-directory" property definition. */
096  private static final StringPropertyDefinition PD_DB_DIRECTORY;
097
098
099
100  /** The "db-directory-permissions" property definition. */
101  private static final StringPropertyDefinition PD_DB_DIRECTORY_PERMISSIONS;
102
103
104
105  /** The "db-txn-no-sync" property definition. */
106  private static final BooleanPropertyDefinition PD_DB_TXN_NO_SYNC;
107
108
109
110  /** The "disk-full-threshold" property definition. */
111  private static final SizePropertyDefinition PD_DISK_FULL_THRESHOLD;
112
113
114
115  /** The "disk-low-threshold" property definition. */
116  private static final SizePropertyDefinition PD_DISK_LOW_THRESHOLD;
117
118
119
120  /** The "java-class" property definition. */
121  private static final ClassPropertyDefinition PD_JAVA_CLASS;
122
123
124
125  /** Build the "db-cache-percent" property definition. */
126  static {
127      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-cache-percent");
128      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-cache-percent"));
129      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("50");
130      builder.setDefaultBehaviorProvider(provider);
131      builder.setUpperLimit(90);
132      builder.setLowerLimit(1);
133      PD_DB_CACHE_PERCENT = builder.getInstance();
134      INSTANCE.registerPropertyDefinition(PD_DB_CACHE_PERCENT);
135  }
136
137
138
139  /** Build the "db-cache-size" property definition. */
140  static {
141      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "db-cache-size");
142      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-cache-size"));
143      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("0 MB");
144      builder.setDefaultBehaviorProvider(provider);
145      builder.setLowerLimit("0 MB");
146      PD_DB_CACHE_SIZE = builder.getInstance();
147      INSTANCE.registerPropertyDefinition(PD_DB_CACHE_SIZE);
148  }
149
150
151
152  /** Build the "db-checkpointer-wakeup-interval" property definition. */
153  static {
154      DurationPropertyDefinition.Builder builder = DurationPropertyDefinition.createBuilder(INSTANCE, "db-checkpointer-wakeup-interval");
155      builder.setOption(PropertyOption.ADVANCED);
156      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-checkpointer-wakeup-interval"));
157      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("15s");
158      builder.setDefaultBehaviorProvider(provider);
159      builder.setBaseUnit("s");
160      builder.setUpperLimit("3600");
161      builder.setLowerLimit("10");
162      PD_DB_CHECKPOINTER_WAKEUP_INTERVAL = builder.getInstance();
163      INSTANCE.registerPropertyDefinition(PD_DB_CHECKPOINTER_WAKEUP_INTERVAL);
164  }
165
166
167
168  /** Build the "db-directory" property definition. */
169  static {
170      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "db-directory");
171      builder.setOption(PropertyOption.MANDATORY);
172      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-directory"));
173      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("db");
174      builder.setDefaultBehaviorProvider(provider);
175      PD_DB_DIRECTORY = builder.getInstance();
176      INSTANCE.registerPropertyDefinition(PD_DB_DIRECTORY);
177  }
178
179
180
181  /** Build the "db-directory-permissions" property definition. */
182  static {
183      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "db-directory-permissions");
184      builder.setOption(PropertyOption.ADVANCED);
185      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "db-directory-permissions"));
186      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("700");
187      builder.setDefaultBehaviorProvider(provider);
188      builder.setPattern("^7[0-7][0-7]$", "MODE");
189      PD_DB_DIRECTORY_PERMISSIONS = builder.getInstance();
190      INSTANCE.registerPropertyDefinition(PD_DB_DIRECTORY_PERMISSIONS);
191  }
192
193
194
195  /** Build the "db-txn-no-sync" property definition. */
196  static {
197      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-txn-no-sync");
198      builder.setOption(PropertyOption.ADVANCED);
199      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-txn-no-sync"));
200      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("true");
201      builder.setDefaultBehaviorProvider(provider);
202      PD_DB_TXN_NO_SYNC = builder.getInstance();
203      INSTANCE.registerPropertyDefinition(PD_DB_TXN_NO_SYNC);
204  }
205
206
207
208  /** Build the "disk-full-threshold" property definition. */
209  static {
210      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "disk-full-threshold");
211      builder.setOption(PropertyOption.ADVANCED);
212      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "disk-full-threshold"));
213      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("100 megabytes");
214      builder.setDefaultBehaviorProvider(provider);
215      builder.setLowerLimit("0");
216      PD_DISK_FULL_THRESHOLD = builder.getInstance();
217      INSTANCE.registerPropertyDefinition(PD_DISK_FULL_THRESHOLD);
218  }
219
220
221
222  /** Build the "disk-low-threshold" property definition. */
223  static {
224      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "disk-low-threshold");
225      builder.setOption(PropertyOption.ADVANCED);
226      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "disk-low-threshold"));
227      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("200 megabytes");
228      builder.setDefaultBehaviorProvider(provider);
229      builder.setLowerLimit("0");
230      PD_DISK_LOW_THRESHOLD = builder.getInstance();
231      INSTANCE.registerPropertyDefinition(PD_DISK_LOW_THRESHOLD);
232  }
233
234
235
236  /** Build the "java-class" property definition. */
237  static {
238      ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
239      builder.setOption(PropertyOption.MANDATORY);
240      builder.setOption(PropertyOption.ADVANCED);
241      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class"));
242      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.backends.pdb.PDBBackend");
243      builder.setDefaultBehaviorProvider(provider);
244      builder.addInstanceOf("org.opends.server.api.Backend");
245      PD_JAVA_CLASS = builder.getInstance();
246      INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
247  }
248
249
250
251  // Register the tags associated with this managed object definition.
252  static {
253    INSTANCE.registerTag(Tag.valueOf("database"));
254  }
255
256
257
258  /**
259   * Get the PDB Backend configuration definition singleton.
260   *
261   * @return Returns the PDB Backend configuration definition
262   *         singleton.
263   */
264  public static PDBBackendCfgDefn getInstance() {
265    return INSTANCE;
266  }
267
268
269
270  /**
271   * Private constructor.
272   */
273  private PDBBackendCfgDefn() {
274    super("pdb-backend", PluggableBackendCfgDefn.getInstance());
275  }
276
277
278
279  /** {@inheritDoc} */
280  public PDBBackendCfgClient createClientConfiguration(
281      ManagedObject<? extends PDBBackendCfgClient> impl) {
282    return new PDBBackendCfgClientImpl(impl);
283  }
284
285
286
287  /** {@inheritDoc} */
288  public PDBBackendCfg createServerConfiguration(
289      ServerManagedObject<? extends PDBBackendCfg> impl) {
290    return new PDBBackendCfgServerImpl(impl);
291  }
292
293
294
295  /** {@inheritDoc} */
296  public Class<PDBBackendCfg> getServerConfigurationClass() {
297    return PDBBackendCfg.class;
298  }
299
300
301
302  /**
303   * Get the "backend-id" property definition.
304   * <p>
305   * Specifies a name to identify the associated backend.
306   * <p>
307   * The name must be unique among all backends in the server. The
308   * backend ID may not be altered after the backend is created in the
309   * server.
310   *
311   * @return Returns the "backend-id" property definition.
312   */
313  public StringPropertyDefinition getBackendIdPropertyDefinition() {
314    return PluggableBackendCfgDefn.getInstance().getBackendIdPropertyDefinition();
315  }
316
317
318
319  /**
320   * Get the "base-dn" property definition.
321   * <p>
322   * Specifies the base DN(s) for the data that the backend handles.
323   * <p>
324   * A single backend may be responsible for one or more base DNs.
325   * Note that no two backends may have the same base DN although one
326   * backend may have a base DN that is below a base DN provided by
327   * another backend (similar to the use of sub-suffixes in the Sun
328   * Java System Directory Server). If any of the base DNs is
329   * subordinate to a base DN for another backend, then all base DNs
330   * for that backend must be subordinate to that same base DN.
331   *
332   * @return Returns the "base-dn" property definition.
333   */
334  public DNPropertyDefinition getBaseDNPropertyDefinition() {
335    return PluggableBackendCfgDefn.getInstance().getBaseDNPropertyDefinition();
336  }
337
338
339
340  /**
341   * Get the "compact-encoding" property definition.
342   * <p>
343   * Indicates whether the backend should use a compact form when
344   * encoding entries by compressing the attribute descriptions and
345   * object class sets.
346   * <p>
347   * Note that this property applies only to the entries themselves
348   * and does not impact the index data.
349   *
350   * @return Returns the "compact-encoding" property definition.
351   */
352  public BooleanPropertyDefinition getCompactEncodingPropertyDefinition() {
353    return PluggableBackendCfgDefn.getInstance().getCompactEncodingPropertyDefinition();
354  }
355
356
357
358  /**
359   * Get the "db-cache-percent" property definition.
360   * <p>
361   * Specifies the percentage of JVM memory to allocate to the
362   * database cache.
363   * <p>
364   * Specifies the percentage of memory available to the JVM that
365   * should be used for caching database contents. Note that this is
366   * only used if the value of the db-cache-size property is set to "0
367   * MB". Otherwise, the value of that property is used instead to
368   * control the cache size configuration.
369   *
370   * @return Returns the "db-cache-percent" property definition.
371   */
372  public IntegerPropertyDefinition getDBCachePercentPropertyDefinition() {
373    return PD_DB_CACHE_PERCENT;
374  }
375
376
377
378  /**
379   * Get the "db-cache-size" property definition.
380   * <p>
381   * The amount of JVM memory to allocate to the database cache.
382   * <p>
383   * Specifies the amount of memory that should be used for caching
384   * database contents. A value of "0 MB" indicates that the
385   * db-cache-percent property should be used instead to specify the
386   * cache size.
387   *
388   * @return Returns the "db-cache-size" property definition.
389   */
390  public SizePropertyDefinition getDBCacheSizePropertyDefinition() {
391    return PD_DB_CACHE_SIZE;
392  }
393
394
395
396  /**
397   * Get the "db-checkpointer-wakeup-interval" property definition.
398   * <p>
399   * Specifies the maximum length of time that may pass between
400   * checkpoints.
401   * <p>
402   * This setting controls the elapsed time between attempts to write
403   * a checkpoint to the journal. A longer interval allows more updates
404   * to accumulate in buffers before they are required to be written to
405   * disk, but also potentially causes recovery from an abrupt
406   * termination (crash) to take more time.
407   *
408   * @return Returns the "db-checkpointer-wakeup-interval" property definition.
409   */
410  public DurationPropertyDefinition getDBCheckpointerWakeupIntervalPropertyDefinition() {
411    return PD_DB_CHECKPOINTER_WAKEUP_INTERVAL;
412  }
413
414
415
416  /**
417   * Get the "db-directory" property definition.
418   * <p>
419   * Specifies the path to the filesystem directory that is used to
420   * hold the Persistit database files containing the data for this
421   * backend.
422   * <p>
423   * The path may be either an absolute path or a path relative to the
424   * directory containing the base of the OpenDJ directory server
425   * installation. The path may be any valid directory path in which
426   * the server has appropriate permissions to read and write files and
427   * has sufficient space to hold the database contents.
428   *
429   * @return Returns the "db-directory" property definition.
430   */
431  public StringPropertyDefinition getDBDirectoryPropertyDefinition() {
432    return PD_DB_DIRECTORY;
433  }
434
435
436
437  /**
438   * Get the "db-directory-permissions" property definition.
439   * <p>
440   * Specifies the permissions that should be applied to the directory
441   * containing the server database files.
442   * <p>
443   * They should be expressed as three-digit octal values, which is
444   * the traditional representation for UNIX file permissions. The
445   * three digits represent the permissions that are available for the
446   * directory's owner, group members, and other users (in that order),
447   * and each digit is the octal representation of the read, write, and
448   * execute bits. Note that this only impacts permissions on the
449   * database directory and not on the files written into that
450   * directory. On UNIX systems, the user's umask controls permissions
451   * given to the database files.
452   *
453   * @return Returns the "db-directory-permissions" property definition.
454   */
455  public StringPropertyDefinition getDBDirectoryPermissionsPropertyDefinition() {
456    return PD_DB_DIRECTORY_PERMISSIONS;
457  }
458
459
460
461  /**
462   * Get the "db-txn-no-sync" property definition.
463   * <p>
464   * Indicates whether database writes should be primarily written to
465   * an internal buffer but not immediately written to disk.
466   * <p>
467   * Setting the value of this configuration attribute to "true" may
468   * improve write performance but could cause the most recent changes
469   * to be lost if the OpenDJ directory server or the underlying JVM
470   * exits abnormally, or if an OS or hardware failure occurs (a
471   * behavior similar to running with transaction durability disabled
472   * in the Sun Java System Directory Server).
473   *
474   * @return Returns the "db-txn-no-sync" property definition.
475   */
476  public BooleanPropertyDefinition getDBTxnNoSyncPropertyDefinition() {
477    return PD_DB_TXN_NO_SYNC;
478  }
479
480
481
482  /**
483   * Get the "disk-full-threshold" property definition.
484   * <p>
485   * Full disk threshold to limit database updates
486   * <p>
487   * When the available free space on the disk used by this database
488   * instance falls below the value specified, no updates are permitted
489   * and the server returns an UNWILLING_TO_PERFORM error. Updates are
490   * allowed again as soon as free space rises above the threshold.
491   *
492   * @return Returns the "disk-full-threshold" property definition.
493   */
494  public SizePropertyDefinition getDiskFullThresholdPropertyDefinition() {
495    return PD_DISK_FULL_THRESHOLD;
496  }
497
498
499
500  /**
501   * Get the "disk-low-threshold" property definition.
502   * <p>
503   * Low disk threshold to limit database updates
504   * <p>
505   * Specifies the "low" free space on the disk. When the available
506   * free space on the disk used by this database instance falls below
507   * the value specified, protocol updates on this database are
508   * permitted only by a user with the BYPASS_LOCKDOWN privilege.
509   *
510   * @return Returns the "disk-low-threshold" property definition.
511   */
512  public SizePropertyDefinition getDiskLowThresholdPropertyDefinition() {
513    return PD_DISK_LOW_THRESHOLD;
514  }
515
516
517
518  /**
519   * Get the "enabled" property definition.
520   * <p>
521   * Indicates whether the backend is enabled in the server.
522   * <p>
523   * If a backend is not enabled, then its contents are not accessible
524   * when processing operations.
525   *
526   * @return Returns the "enabled" property definition.
527   */
528  public BooleanPropertyDefinition getEnabledPropertyDefinition() {
529    return PluggableBackendCfgDefn.getInstance().getEnabledPropertyDefinition();
530  }
531
532
533
534  /**
535   * Get the "entries-compressed" property definition.
536   * <p>
537   * Indicates whether the backend should attempt to compress entries
538   * before storing them in the database.
539   * <p>
540   * Note that this property applies only to the entries themselves
541   * and does not impact the index data. Further, the effectiveness of
542   * the compression is based on the type of data contained in the
543   * entry.
544   *
545   * @return Returns the "entries-compressed" property definition.
546   */
547  public BooleanPropertyDefinition getEntriesCompressedPropertyDefinition() {
548    return PluggableBackendCfgDefn.getInstance().getEntriesCompressedPropertyDefinition();
549  }
550
551
552
553  /**
554   * Get the "index-entry-limit" property definition.
555   * <p>
556   * Specifies the maximum number of entries that is allowed to match
557   * a given index key before that particular index key is no longer
558   * maintained.
559   * <p>
560   * This property is analogous to the ALL IDs threshold in the Sun
561   * Java System Directory Server. Note that this is the default limit
562   * for the backend, and it may be overridden on a per-attribute
563   * basis.A value of 0 means there is no limit.
564   *
565   * @return Returns the "index-entry-limit" property definition.
566   */
567  public IntegerPropertyDefinition getIndexEntryLimitPropertyDefinition() {
568    return PluggableBackendCfgDefn.getInstance().getIndexEntryLimitPropertyDefinition();
569  }
570
571
572
573  /**
574   * Get the "index-filter-analyzer-enabled" property definition.
575   * <p>
576   * Indicates whether to gather statistical information about the
577   * search filters processed by the directory server while evaluating
578   * the usage of indexes.
579   * <p>
580   * Analyzing indexes requires gathering search filter usage patterns
581   * from user requests, especially for values as specified in the
582   * filters and subsequently looking the status of those values into
583   * the index files. When a search requests is processed, internal or
584   * user generated, a first phase uses indexes to find potential
585   * entries to be returned. Depending on the search filter, if the
586   * index of one of the specified attributes matches too many entries
587   * (exceeds the index entry limit), the search becomes non-indexed.
588   * In any case, all entries thus gathered (or the entire DIT) are
589   * matched against the filter for actually returning the search
590   * result.
591   *
592   * @return Returns the "index-filter-analyzer-enabled" property definition.
593   */
594  public BooleanPropertyDefinition getIndexFilterAnalyzerEnabledPropertyDefinition() {
595    return PluggableBackendCfgDefn.getInstance().getIndexFilterAnalyzerEnabledPropertyDefinition();
596  }
597
598
599
600  /**
601   * Get the "index-filter-analyzer-max-filters" property definition.
602   * <p>
603   * The maximum number of search filter statistics to keep.
604   * <p>
605   * When the maximum number of search filter is reached, the least
606   * used one will be deleted.
607   *
608   * @return Returns the "index-filter-analyzer-max-filters" property definition.
609   */
610  public IntegerPropertyDefinition getIndexFilterAnalyzerMaxFiltersPropertyDefinition() {
611    return PluggableBackendCfgDefn.getInstance().getIndexFilterAnalyzerMaxFiltersPropertyDefinition();
612  }
613
614
615
616  /**
617   * Get the "java-class" property definition.
618   * <p>
619   * Specifies the fully-qualified name of the Java class that
620   * provides the backend implementation.
621   *
622   * @return Returns the "java-class" property definition.
623   */
624  public ClassPropertyDefinition getJavaClassPropertyDefinition() {
625    return PD_JAVA_CLASS;
626  }
627
628
629
630  /**
631   * Get the "preload-time-limit" property definition.
632   * <p>
633   * Specifies the length of time that the backend is allowed to spend
634   * "pre-loading" data when it is initialized.
635   * <p>
636   * The pre-load process is used to pre-populate the database cache,
637   * so that it can be more quickly available when the server is
638   * processing requests. A duration of zero means there is no
639   * pre-load.
640   *
641   * @return Returns the "preload-time-limit" property definition.
642   */
643  public DurationPropertyDefinition getPreloadTimeLimitPropertyDefinition() {
644    return PluggableBackendCfgDefn.getInstance().getPreloadTimeLimitPropertyDefinition();
645  }
646
647
648
649  /**
650   * Get the "writability-mode" property definition.
651   * <p>
652   * Specifies the behavior that the backend should use when
653   * processing write operations.
654   *
655   * @return Returns the "writability-mode" property definition.
656   */
657  public EnumPropertyDefinition<WritabilityMode> getWritabilityModePropertyDefinition() {
658    return PluggableBackendCfgDefn.getInstance().getWritabilityModePropertyDefinition();
659  }
660
661
662
663  /**
664   * Get the "backend-indexes" relation definition.
665   *
666   * @return Returns the "backend-indexes" relation definition.
667   */
668  public InstantiableRelationDefinition<BackendIndexCfgClient,BackendIndexCfg> getBackendIndexesRelationDefinition() {
669    return PluggableBackendCfgDefn.getInstance().getBackendIndexesRelationDefinition();
670  }
671
672
673
674  /**
675   * Get the "backend-vlv-indexes" relation definition.
676   *
677   * @return Returns the "backend-vlv-indexes" relation definition.
678   */
679  public InstantiableRelationDefinition<BackendVLVIndexCfgClient,BackendVLVIndexCfg> getBackendVLVIndexesRelationDefinition() {
680    return PluggableBackendCfgDefn.getInstance().getBackendVLVIndexesRelationDefinition();
681  }
682
683
684
685  /**
686   * Managed object client implementation.
687   */
688  private static class PDBBackendCfgClientImpl implements
689    PDBBackendCfgClient {
690
691    /** Private implementation. */
692    private ManagedObject<? extends PDBBackendCfgClient> impl;
693
694
695
696    /** Private constructor. */
697    private PDBBackendCfgClientImpl(
698        ManagedObject<? extends PDBBackendCfgClient> impl) {
699      this.impl = impl;
700    }
701
702
703
704    /** {@inheritDoc} */
705    public String getBackendId() {
706      return impl.getPropertyValue(INSTANCE.getBackendIdPropertyDefinition());
707    }
708
709
710
711    /** {@inheritDoc} */
712    public void setBackendId(String value) throws PropertyException {
713      impl.setPropertyValue(INSTANCE.getBackendIdPropertyDefinition(), value);
714    }
715
716
717
718    /** {@inheritDoc} */
719    public SortedSet<DN> getBaseDN() {
720      return impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
721    }
722
723
724
725    /** {@inheritDoc} */
726    public void setBaseDN(Collection<DN> values) {
727      impl.setPropertyValues(INSTANCE.getBaseDNPropertyDefinition(), values);
728    }
729
730
731
732    /** {@inheritDoc} */
733    public boolean isCompactEncoding() {
734      return impl.getPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition());
735    }
736
737
738
739    /** {@inheritDoc} */
740    public void setCompactEncoding(Boolean value) {
741      impl.setPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition(), value);
742    }
743
744
745
746    /** {@inheritDoc} */
747    public int getDBCachePercent() {
748      return impl.getPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition());
749    }
750
751
752
753    /** {@inheritDoc} */
754    public void setDBCachePercent(Integer value) {
755      impl.setPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition(), value);
756    }
757
758
759
760    /** {@inheritDoc} */
761    public long getDBCacheSize() {
762      return impl.getPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition());
763    }
764
765
766
767    /** {@inheritDoc} */
768    public void setDBCacheSize(Long value) {
769      impl.setPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition(), value);
770    }
771
772
773
774    /** {@inheritDoc} */
775    public long getDBCheckpointerWakeupInterval() {
776      return impl.getPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition());
777    }
778
779
780
781    /** {@inheritDoc} */
782    public void setDBCheckpointerWakeupInterval(Long value) {
783      impl.setPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition(), value);
784    }
785
786
787
788    /** {@inheritDoc} */
789    public String getDBDirectory() {
790      return impl.getPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition());
791    }
792
793
794
795    /** {@inheritDoc} */
796    public void setDBDirectory(String value) {
797      impl.setPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition(), value);
798    }
799
800
801
802    /** {@inheritDoc} */
803    public String getDBDirectoryPermissions() {
804      return impl.getPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition());
805    }
806
807
808
809    /** {@inheritDoc} */
810    public void setDBDirectoryPermissions(String value) {
811      impl.setPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition(), value);
812    }
813
814
815
816    /** {@inheritDoc} */
817    public boolean isDBTxnNoSync() {
818      return impl.getPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition());
819    }
820
821
822
823    /** {@inheritDoc} */
824    public void setDBTxnNoSync(Boolean value) {
825      impl.setPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition(), value);
826    }
827
828
829
830    /** {@inheritDoc} */
831    public long getDiskFullThreshold() {
832      return impl.getPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition());
833    }
834
835
836
837    /** {@inheritDoc} */
838    public void setDiskFullThreshold(Long value) {
839      impl.setPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition(), value);
840    }
841
842
843
844    /** {@inheritDoc} */
845    public long getDiskLowThreshold() {
846      return impl.getPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition());
847    }
848
849
850
851    /** {@inheritDoc} */
852    public void setDiskLowThreshold(Long value) {
853      impl.setPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition(), value);
854    }
855
856
857
858    /** {@inheritDoc} */
859    public Boolean isEnabled() {
860      return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
861    }
862
863
864
865    /** {@inheritDoc} */
866    public void setEnabled(boolean value) {
867      impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
868    }
869
870
871
872    /** {@inheritDoc} */
873    public boolean isEntriesCompressed() {
874      return impl.getPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition());
875    }
876
877
878
879    /** {@inheritDoc} */
880    public void setEntriesCompressed(Boolean value) {
881      impl.setPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition(), value);
882    }
883
884
885
886    /** {@inheritDoc} */
887    public int getIndexEntryLimit() {
888      return impl.getPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition());
889    }
890
891
892
893    /** {@inheritDoc} */
894    public void setIndexEntryLimit(Integer value) {
895      impl.setPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition(), value);
896    }
897
898
899
900    /** {@inheritDoc} */
901    public boolean isIndexFilterAnalyzerEnabled() {
902      return impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition());
903    }
904
905
906
907    /** {@inheritDoc} */
908    public void setIndexFilterAnalyzerEnabled(Boolean value) {
909      impl.setPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition(), value);
910    }
911
912
913
914    /** {@inheritDoc} */
915    public int getIndexFilterAnalyzerMaxFilters() {
916      return impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition());
917    }
918
919
920
921    /** {@inheritDoc} */
922    public void setIndexFilterAnalyzerMaxFilters(Integer value) {
923      impl.setPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition(), value);
924    }
925
926
927
928    /** {@inheritDoc} */
929    public String getJavaClass() {
930      return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
931    }
932
933
934
935    /** {@inheritDoc} */
936    public void setJavaClass(String value) {
937      impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
938    }
939
940
941
942    /** {@inheritDoc} */
943    public long getPreloadTimeLimit() {
944      return impl.getPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition());
945    }
946
947
948
949    /** {@inheritDoc} */
950    public void setPreloadTimeLimit(Long value) {
951      impl.setPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition(), value);
952    }
953
954
955
956    /** {@inheritDoc} */
957    public WritabilityMode getWritabilityMode() {
958      return impl.getPropertyValue(INSTANCE.getWritabilityModePropertyDefinition());
959    }
960
961
962
963    /** {@inheritDoc} */
964    public void setWritabilityMode(WritabilityMode value) {
965      impl.setPropertyValue(INSTANCE.getWritabilityModePropertyDefinition(), value);
966    }
967
968
969
970    /** {@inheritDoc} */
971    public String[] listBackendIndexes() throws ConcurrentModificationException,
972        LdapException {
973      return impl.listChildren(INSTANCE.getBackendIndexesRelationDefinition());
974    }
975
976
977
978    /** {@inheritDoc} */
979    public BackendIndexCfgClient getBackendIndex(String name)
980        throws DefinitionDecodingException, ManagedObjectDecodingException,
981        ManagedObjectNotFoundException, ConcurrentModificationException,
982        LdapException {
983      return impl.getChild(INSTANCE.getBackendIndexesRelationDefinition(), name).getConfiguration();
984    }
985
986
987
988    /** {@inheritDoc} */
989    public <M extends BackendIndexCfgClient> M createBackendIndex(
990        ManagedObjectDefinition<M, ? extends BackendIndexCfg> d, String name, Collection<PropertyException> exceptions) throws IllegalManagedObjectNameException {
991      return impl.createChild(INSTANCE.getBackendIndexesRelationDefinition(), d, name, exceptions).getConfiguration();
992    }
993
994
995
996    /** {@inheritDoc} */
997    public void removeBackendIndex(String name)
998        throws ManagedObjectNotFoundException, ConcurrentModificationException,
999        OperationRejectedException, LdapException {
1000      impl.removeChild(INSTANCE.getBackendIndexesRelationDefinition(), name);
1001    }
1002
1003
1004
1005    /** {@inheritDoc} */
1006    public String[] listBackendVLVIndexes() throws ConcurrentModificationException,
1007        LdapException {
1008      return impl.listChildren(INSTANCE.getBackendVLVIndexesRelationDefinition());
1009    }
1010
1011
1012
1013    /** {@inheritDoc} */
1014    public BackendVLVIndexCfgClient getBackendVLVIndex(String name)
1015        throws DefinitionDecodingException, ManagedObjectDecodingException,
1016        ManagedObjectNotFoundException, ConcurrentModificationException,
1017        LdapException {
1018      return impl.getChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name).getConfiguration();
1019    }
1020
1021
1022
1023    /** {@inheritDoc} */
1024    public <M extends BackendVLVIndexCfgClient> M createBackendVLVIndex(
1025        ManagedObjectDefinition<M, ? extends BackendVLVIndexCfg> d, String name, Collection<PropertyException> exceptions) throws IllegalManagedObjectNameException {
1026      return impl.createChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), d, name, exceptions).getConfiguration();
1027    }
1028
1029
1030
1031    /** {@inheritDoc} */
1032    public void removeBackendVLVIndex(String name)
1033        throws ManagedObjectNotFoundException, ConcurrentModificationException,
1034        OperationRejectedException, LdapException {
1035      impl.removeChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name);
1036    }
1037
1038
1039
1040    /** {@inheritDoc} */
1041    public ManagedObjectDefinition<? extends PDBBackendCfgClient, ? extends PDBBackendCfg> definition() {
1042      return INSTANCE;
1043    }
1044
1045
1046
1047    /** {@inheritDoc} */
1048    public PropertyProvider properties() {
1049      return impl;
1050    }
1051
1052
1053
1054    /** {@inheritDoc} */
1055    public void commit() throws ManagedObjectAlreadyExistsException,
1056        MissingMandatoryPropertiesException, ConcurrentModificationException,
1057        OperationRejectedException, LdapException {
1058      impl.commit();
1059    }
1060
1061
1062
1063    /** {@inheritDoc} */
1064    public String toString() {
1065      return impl.toString();
1066    }
1067  }
1068
1069
1070
1071  /**
1072   * Managed object server implementation.
1073   */
1074  private static class PDBBackendCfgServerImpl implements
1075    PDBBackendCfg {
1076
1077    /** Private implementation. */
1078    private ServerManagedObject<? extends PDBBackendCfg> impl;
1079
1080    /** The value of the "backend-id" property. */
1081    private final String pBackendId;
1082
1083    /** The value of the "base-dn" property. */
1084    private final SortedSet<DN> pBaseDN;
1085
1086    /** The value of the "compact-encoding" property. */
1087    private final boolean pCompactEncoding;
1088
1089    /** The value of the "db-cache-percent" property. */
1090    private final int pDBCachePercent;
1091
1092    /** The value of the "db-cache-size" property. */
1093    private final long pDBCacheSize;
1094
1095    /** The value of the "db-checkpointer-wakeup-interval" property. */
1096    private final long pDBCheckpointerWakeupInterval;
1097
1098    /** The value of the "db-directory" property. */
1099    private final String pDBDirectory;
1100
1101    /** The value of the "db-directory-permissions" property. */
1102    private final String pDBDirectoryPermissions;
1103
1104    /** The value of the "db-txn-no-sync" property. */
1105    private final boolean pDBTxnNoSync;
1106
1107    /** The value of the "disk-full-threshold" property. */
1108    private final long pDiskFullThreshold;
1109
1110    /** The value of the "disk-low-threshold" property. */
1111    private final long pDiskLowThreshold;
1112
1113    /** The value of the "enabled" property. */
1114    private final boolean pEnabled;
1115
1116    /** The value of the "entries-compressed" property. */
1117    private final boolean pEntriesCompressed;
1118
1119    /** The value of the "index-entry-limit" property. */
1120    private final int pIndexEntryLimit;
1121
1122    /** The value of the "index-filter-analyzer-enabled" property. */
1123    private final boolean pIndexFilterAnalyzerEnabled;
1124
1125    /** The value of the "index-filter-analyzer-max-filters" property. */
1126    private final int pIndexFilterAnalyzerMaxFilters;
1127
1128    /** The value of the "java-class" property. */
1129    private final String pJavaClass;
1130
1131    /** The value of the "preload-time-limit" property. */
1132    private final long pPreloadTimeLimit;
1133
1134    /** The value of the "writability-mode" property. */
1135    private final WritabilityMode pWritabilityMode;
1136
1137
1138
1139    /** Private constructor. */
1140    private PDBBackendCfgServerImpl(ServerManagedObject<? extends PDBBackendCfg> impl) {
1141      this.impl = impl;
1142      this.pBackendId = impl.getPropertyValue(INSTANCE.getBackendIdPropertyDefinition());
1143      this.pBaseDN = impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
1144      this.pCompactEncoding = impl.getPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition());
1145      this.pDBCachePercent = impl.getPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition());
1146      this.pDBCacheSize = impl.getPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition());
1147      this.pDBCheckpointerWakeupInterval = impl.getPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition());
1148      this.pDBDirectory = impl.getPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition());
1149      this.pDBDirectoryPermissions = impl.getPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition());
1150      this.pDBTxnNoSync = impl.getPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition());
1151      this.pDiskFullThreshold = impl.getPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition());
1152      this.pDiskLowThreshold = impl.getPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition());
1153      this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
1154      this.pEntriesCompressed = impl.getPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition());
1155      this.pIndexEntryLimit = impl.getPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition());
1156      this.pIndexFilterAnalyzerEnabled = impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition());
1157      this.pIndexFilterAnalyzerMaxFilters = impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition());
1158      this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
1159      this.pPreloadTimeLimit = impl.getPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition());
1160      this.pWritabilityMode = impl.getPropertyValue(INSTANCE.getWritabilityModePropertyDefinition());
1161    }
1162
1163
1164
1165    /** {@inheritDoc} */
1166    public void addPDBChangeListener(
1167        ConfigurationChangeListener<PDBBackendCfg> listener) {
1168      impl.registerChangeListener(listener);
1169    }
1170
1171
1172
1173    /** {@inheritDoc} */
1174    public void removePDBChangeListener(
1175        ConfigurationChangeListener<PDBBackendCfg> listener) {
1176      impl.deregisterChangeListener(listener);
1177    }
1178    /** {@inheritDoc} */
1179    public void addPluggableChangeListener(
1180        ConfigurationChangeListener<PluggableBackendCfg> listener) {
1181      impl.registerChangeListener(listener);
1182    }
1183
1184
1185
1186    /** {@inheritDoc} */
1187    public void removePluggableChangeListener(
1188        ConfigurationChangeListener<PluggableBackendCfg> listener) {
1189      impl.deregisterChangeListener(listener);
1190    }
1191    /** {@inheritDoc} */
1192    public void addChangeListener(
1193        ConfigurationChangeListener<BackendCfg> listener) {
1194      impl.registerChangeListener(listener);
1195    }
1196
1197
1198
1199    /** {@inheritDoc} */
1200    public void removeChangeListener(
1201        ConfigurationChangeListener<BackendCfg> listener) {
1202      impl.deregisterChangeListener(listener);
1203    }
1204
1205
1206
1207    /** {@inheritDoc} */
1208    public String getBackendId() {
1209      return pBackendId;
1210    }
1211
1212
1213
1214    /** {@inheritDoc} */
1215    public SortedSet<DN> getBaseDN() {
1216      return pBaseDN;
1217    }
1218
1219
1220
1221    /** {@inheritDoc} */
1222    public boolean isCompactEncoding() {
1223      return pCompactEncoding;
1224    }
1225
1226
1227
1228    /** {@inheritDoc} */
1229    public int getDBCachePercent() {
1230      return pDBCachePercent;
1231    }
1232
1233
1234
1235    /** {@inheritDoc} */
1236    public long getDBCacheSize() {
1237      return pDBCacheSize;
1238    }
1239
1240
1241
1242    /** {@inheritDoc} */
1243    public long getDBCheckpointerWakeupInterval() {
1244      return pDBCheckpointerWakeupInterval;
1245    }
1246
1247
1248
1249    /** {@inheritDoc} */
1250    public String getDBDirectory() {
1251      return pDBDirectory;
1252    }
1253
1254
1255
1256    /** {@inheritDoc} */
1257    public String getDBDirectoryPermissions() {
1258      return pDBDirectoryPermissions;
1259    }
1260
1261
1262
1263    /** {@inheritDoc} */
1264    public boolean isDBTxnNoSync() {
1265      return pDBTxnNoSync;
1266    }
1267
1268
1269
1270    /** {@inheritDoc} */
1271    public long getDiskFullThreshold() {
1272      return pDiskFullThreshold;
1273    }
1274
1275
1276
1277    /** {@inheritDoc} */
1278    public long getDiskLowThreshold() {
1279      return pDiskLowThreshold;
1280    }
1281
1282
1283
1284    /** {@inheritDoc} */
1285    public boolean isEnabled() {
1286      return pEnabled;
1287    }
1288
1289
1290
1291    /** {@inheritDoc} */
1292    public boolean isEntriesCompressed() {
1293      return pEntriesCompressed;
1294    }
1295
1296
1297
1298    /** {@inheritDoc} */
1299    public int getIndexEntryLimit() {
1300      return pIndexEntryLimit;
1301    }
1302
1303
1304
1305    /** {@inheritDoc} */
1306    public boolean isIndexFilterAnalyzerEnabled() {
1307      return pIndexFilterAnalyzerEnabled;
1308    }
1309
1310
1311
1312    /** {@inheritDoc} */
1313    public int getIndexFilterAnalyzerMaxFilters() {
1314      return pIndexFilterAnalyzerMaxFilters;
1315    }
1316
1317
1318
1319    /** {@inheritDoc} */
1320    public String getJavaClass() {
1321      return pJavaClass;
1322    }
1323
1324
1325
1326    /** {@inheritDoc} */
1327    public long getPreloadTimeLimit() {
1328      return pPreloadTimeLimit;
1329    }
1330
1331
1332
1333    /** {@inheritDoc} */
1334    public WritabilityMode getWritabilityMode() {
1335      return pWritabilityMode;
1336    }
1337
1338
1339
1340    /** {@inheritDoc} */
1341    public String[] listBackendIndexes() {
1342      return impl.listChildren(INSTANCE.getBackendIndexesRelationDefinition());
1343    }
1344
1345
1346
1347    /** {@inheritDoc} */
1348    public BackendIndexCfg getBackendIndex(String name) throws ConfigException {
1349      return impl.getChild(INSTANCE.getBackendIndexesRelationDefinition(), name).getConfiguration();
1350    }
1351
1352
1353
1354    /** {@inheritDoc} */
1355    public void addBackendIndexAddListener(
1356        ConfigurationAddListener<BackendIndexCfg> listener) throws ConfigException {
1357      impl.registerAddListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
1358    }
1359
1360
1361
1362    /** {@inheritDoc} */
1363    public void removeBackendIndexAddListener(
1364        ConfigurationAddListener<BackendIndexCfg> listener) {
1365      impl.deregisterAddListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
1366    }
1367
1368
1369
1370    /** {@inheritDoc} */
1371    public void addBackendIndexDeleteListener(
1372        ConfigurationDeleteListener<BackendIndexCfg> listener) throws ConfigException {
1373      impl.registerDeleteListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
1374    }
1375
1376
1377
1378    /** {@inheritDoc} */
1379    public void removeBackendIndexDeleteListener(
1380        ConfigurationDeleteListener<BackendIndexCfg> listener) {
1381      impl.deregisterDeleteListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
1382    }
1383
1384
1385
1386    /** {@inheritDoc} */
1387    public String[] listBackendVLVIndexes() {
1388      return impl.listChildren(INSTANCE.getBackendVLVIndexesRelationDefinition());
1389    }
1390
1391
1392
1393    /** {@inheritDoc} */
1394    public BackendVLVIndexCfg getBackendVLVIndex(String name) throws ConfigException {
1395      return impl.getChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name).getConfiguration();
1396    }
1397
1398
1399
1400    /** {@inheritDoc} */
1401    public void addBackendVLVIndexAddListener(
1402        ConfigurationAddListener<BackendVLVIndexCfg> listener) throws ConfigException {
1403      impl.registerAddListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
1404    }
1405
1406
1407
1408    /** {@inheritDoc} */
1409    public void removeBackendVLVIndexAddListener(
1410        ConfigurationAddListener<BackendVLVIndexCfg> listener) {
1411      impl.deregisterAddListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
1412    }
1413
1414
1415
1416    /** {@inheritDoc} */
1417    public void addBackendVLVIndexDeleteListener(
1418        ConfigurationDeleteListener<BackendVLVIndexCfg> listener) throws ConfigException {
1419      impl.registerDeleteListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
1420    }
1421
1422
1423
1424    /** {@inheritDoc} */
1425    public void removeBackendVLVIndexDeleteListener(
1426        ConfigurationDeleteListener<BackendVLVIndexCfg> listener) {
1427      impl.deregisterDeleteListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
1428    }
1429
1430
1431
1432    /** {@inheritDoc} */
1433    public Class<? extends PDBBackendCfg> configurationClass() {
1434      return PDBBackendCfg.class;
1435    }
1436
1437
1438
1439    /** {@inheritDoc} */
1440    public DN dn() {
1441      return impl.getDN();
1442    }
1443
1444
1445
1446    /** {@inheritDoc} */
1447    public String toString() {
1448      return impl.toString();
1449    }
1450  }
1451}