001/*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License").  You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
010 * or http://forgerock.org/license/CDDLv1.0.html.
011 * See the License for the specific language governing permissions
012 * and limitations under the License.
013 *
014 * When distributing Covered Code, include this CDDL HEADER in each
015 * file and include the License file at legal-notices/CDDLv1_0.txt.
016 * If applicable, add the following below this CDDL HEADER, with the
017 * fields enclosed by brackets "[]" replaced with your own identifying
018 * information:
019 *      Portions Copyright [yyyy] [name of copyright owner]
020 *
021 * CDDL HEADER END
022 *
023 *
024 *      Copyright 2008 Sun Microsystems, Inc.
025 */
026package org.opends.server.admin.std.meta;
027
028
029
030import java.util.Collection;
031import java.util.SortedSet;
032import org.forgerock.opendj.config.server.ConfigException;
033import org.opends.server.admin.AdministratorAction;
034import org.opends.server.admin.AliasDefaultBehaviorProvider;
035import org.opends.server.admin.BooleanPropertyDefinition;
036import org.opends.server.admin.ClassPropertyDefinition;
037import org.opends.server.admin.client.AuthorizationException;
038import org.opends.server.admin.client.CommunicationException;
039import org.opends.server.admin.client.ConcurrentModificationException;
040import org.opends.server.admin.client.IllegalManagedObjectNameException;
041import org.opends.server.admin.client.ManagedObject;
042import org.opends.server.admin.client.ManagedObjectDecodingException;
043import org.opends.server.admin.client.MissingMandatoryPropertiesException;
044import org.opends.server.admin.client.OperationRejectedException;
045import org.opends.server.admin.condition.Conditions;
046import org.opends.server.admin.DefaultBehaviorProvider;
047import org.opends.server.admin.DefinedDefaultBehaviorProvider;
048import org.opends.server.admin.DefinitionDecodingException;
049import org.opends.server.admin.DNPropertyDefinition;
050import org.opends.server.admin.DurationPropertyDefinition;
051import org.opends.server.admin.EnumPropertyDefinition;
052import org.opends.server.admin.GenericConstraint;
053import org.opends.server.admin.InstantiableRelationDefinition;
054import org.opends.server.admin.IntegerPropertyDefinition;
055import org.opends.server.admin.ManagedObjectAlreadyExistsException;
056import org.opends.server.admin.ManagedObjectDefinition;
057import org.opends.server.admin.ManagedObjectNotFoundException;
058import org.opends.server.admin.PropertyException;
059import org.opends.server.admin.PropertyOption;
060import org.opends.server.admin.PropertyProvider;
061import org.opends.server.admin.server.ConfigurationAddListener;
062import org.opends.server.admin.server.ConfigurationChangeListener;
063import org.opends.server.admin.server.ConfigurationDeleteListener;
064import org.opends.server.admin.server.ServerManagedObject;
065import org.opends.server.admin.SizePropertyDefinition;
066import org.opends.server.admin.std.client.BackendIndexCfgClient;
067import org.opends.server.admin.std.client.BackendVLVIndexCfgClient;
068import org.opends.server.admin.std.client.JEBackendCfgClient;
069import org.opends.server.admin.std.meta.BackendCfgDefn.WritabilityMode;
070import org.opends.server.admin.std.server.BackendCfg;
071import org.opends.server.admin.std.server.BackendIndexCfg;
072import org.opends.server.admin.std.server.BackendVLVIndexCfg;
073import org.opends.server.admin.std.server.JEBackendCfg;
074import org.opends.server.admin.std.server.PluggableBackendCfg;
075import org.opends.server.admin.StringPropertyDefinition;
076import org.opends.server.admin.Tag;
077import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
078import org.opends.server.types.DN;
079
080
081
082/**
083 * An interface for querying the JE Backend managed object definition
084 * meta information.
085 * <p>
086 * A JE Backend stores application data in a Berkeley DB Java Edition
087 * database.
088 */
089public final class JEBackendCfgDefn extends ManagedObjectDefinition<JEBackendCfgClient, JEBackendCfg> {
090
091  // The singleton configuration definition instance.
092  private static final JEBackendCfgDefn INSTANCE = new JEBackendCfgDefn();
093
094
095
096  // The "db-cache-percent" property definition.
097  private static final IntegerPropertyDefinition PD_DB_CACHE_PERCENT;
098
099
100
101  // The "db-cache-size" property definition.
102  private static final SizePropertyDefinition PD_DB_CACHE_SIZE;
103
104
105
106  // The "db-checkpointer-bytes-interval" property definition.
107  private static final SizePropertyDefinition PD_DB_CHECKPOINTER_BYTES_INTERVAL;
108
109
110
111  // The "db-checkpointer-wakeup-interval" property definition.
112  private static final DurationPropertyDefinition PD_DB_CHECKPOINTER_WAKEUP_INTERVAL;
113
114
115
116  // The "db-cleaner-min-utilization" property definition.
117  private static final IntegerPropertyDefinition PD_DB_CLEANER_MIN_UTILIZATION;
118
119
120
121  // The "db-directory" property definition.
122  private static final StringPropertyDefinition PD_DB_DIRECTORY;
123
124
125
126  // The "db-directory-permissions" property definition.
127  private static final StringPropertyDefinition PD_DB_DIRECTORY_PERMISSIONS;
128
129
130
131  // The "db-evictor-core-threads" property definition.
132  private static final IntegerPropertyDefinition PD_DB_EVICTOR_CORE_THREADS;
133
134
135
136  // The "db-evictor-keep-alive" property definition.
137  private static final DurationPropertyDefinition PD_DB_EVICTOR_KEEP_ALIVE;
138
139
140
141  // The "db-evictor-lru-only" property definition.
142  private static final BooleanPropertyDefinition PD_DB_EVICTOR_LRU_ONLY;
143
144
145
146  // The "db-evictor-max-threads" property definition.
147  private static final IntegerPropertyDefinition PD_DB_EVICTOR_MAX_THREADS;
148
149
150
151  // The "db-evictor-nodes-per-scan" property definition.
152  private static final IntegerPropertyDefinition PD_DB_EVICTOR_NODES_PER_SCAN;
153
154
155
156  // The "db-log-filecache-size" property definition.
157  private static final IntegerPropertyDefinition PD_DB_LOG_FILECACHE_SIZE;
158
159
160
161  // The "db-log-file-max" property definition.
162  private static final SizePropertyDefinition PD_DB_LOG_FILE_MAX;
163
164
165
166  // The "db-logging-file-handler-on" property definition.
167  private static final BooleanPropertyDefinition PD_DB_LOGGING_FILE_HANDLER_ON;
168
169
170
171  // The "db-logging-level" property definition.
172  private static final StringPropertyDefinition PD_DB_LOGGING_LEVEL;
173
174
175
176  // The "db-num-cleaner-threads" property definition.
177  private static final IntegerPropertyDefinition PD_DB_NUM_CLEANER_THREADS;
178
179
180
181  // The "db-num-lock-tables" property definition.
182  private static final IntegerPropertyDefinition PD_DB_NUM_LOCK_TABLES;
183
184
185
186  // The "db-run-cleaner" property definition.
187  private static final BooleanPropertyDefinition PD_DB_RUN_CLEANER;
188
189
190
191  // The "db-txn-no-sync" property definition.
192  private static final BooleanPropertyDefinition PD_DB_TXN_NO_SYNC;
193
194
195
196  // The "db-txn-write-no-sync" property definition.
197  private static final BooleanPropertyDefinition PD_DB_TXN_WRITE_NO_SYNC;
198
199
200
201  // The "disk-full-threshold" property definition.
202  private static final SizePropertyDefinition PD_DISK_FULL_THRESHOLD;
203
204
205
206  // The "disk-low-threshold" property definition.
207  private static final SizePropertyDefinition PD_DISK_LOW_THRESHOLD;
208
209
210
211  // The "java-class" property definition.
212  private static final ClassPropertyDefinition PD_JAVA_CLASS;
213
214
215
216  // The "je-property" property definition.
217  private static final StringPropertyDefinition PD_JE_PROPERTY;
218
219
220
221  // Build the "db-cache-percent" property definition.
222  static {
223      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-cache-percent");
224      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-cache-percent"));
225      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("50");
226      builder.setDefaultBehaviorProvider(provider);
227      builder.setUpperLimit(90);
228      builder.setLowerLimit(1);
229      PD_DB_CACHE_PERCENT = builder.getInstance();
230      INSTANCE.registerPropertyDefinition(PD_DB_CACHE_PERCENT);
231  }
232
233
234
235  // Build the "db-cache-size" property definition.
236  static {
237      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "db-cache-size");
238      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-cache-size"));
239      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("0 MB");
240      builder.setDefaultBehaviorProvider(provider);
241      builder.setLowerLimit("0 MB");
242      PD_DB_CACHE_SIZE = builder.getInstance();
243      INSTANCE.registerPropertyDefinition(PD_DB_CACHE_SIZE);
244  }
245
246
247
248  // Build the "db-checkpointer-bytes-interval" property definition.
249  static {
250      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "db-checkpointer-bytes-interval");
251      builder.setOption(PropertyOption.ADVANCED);
252      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "db-checkpointer-bytes-interval"));
253      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("500mb");
254      builder.setDefaultBehaviorProvider(provider);
255      builder.setUpperLimit("9223372036854775807b");
256      builder.setLowerLimit("0b");
257      PD_DB_CHECKPOINTER_BYTES_INTERVAL = builder.getInstance();
258      INSTANCE.registerPropertyDefinition(PD_DB_CHECKPOINTER_BYTES_INTERVAL);
259  }
260
261
262
263  // Build the "db-checkpointer-wakeup-interval" property definition.
264  static {
265      DurationPropertyDefinition.Builder builder = DurationPropertyDefinition.createBuilder(INSTANCE, "db-checkpointer-wakeup-interval");
266      builder.setOption(PropertyOption.ADVANCED);
267      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-checkpointer-wakeup-interval"));
268      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("30s");
269      builder.setDefaultBehaviorProvider(provider);
270      builder.setBaseUnit("s");
271      builder.setUpperLimit("4294");
272      builder.setLowerLimit("1");
273      PD_DB_CHECKPOINTER_WAKEUP_INTERVAL = builder.getInstance();
274      INSTANCE.registerPropertyDefinition(PD_DB_CHECKPOINTER_WAKEUP_INTERVAL);
275  }
276
277
278
279  // Build the "db-cleaner-min-utilization" property definition.
280  static {
281      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-cleaner-min-utilization");
282      builder.setOption(PropertyOption.ADVANCED);
283      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-cleaner-min-utilization"));
284      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("50");
285      builder.setDefaultBehaviorProvider(provider);
286      builder.setUpperLimit(90);
287      builder.setLowerLimit(0);
288      PD_DB_CLEANER_MIN_UTILIZATION = builder.getInstance();
289      INSTANCE.registerPropertyDefinition(PD_DB_CLEANER_MIN_UTILIZATION);
290  }
291
292
293
294  // Build the "db-directory" property definition.
295  static {
296      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "db-directory");
297      builder.setOption(PropertyOption.MANDATORY);
298      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-directory"));
299      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("db");
300      builder.setDefaultBehaviorProvider(provider);
301      PD_DB_DIRECTORY = builder.getInstance();
302      INSTANCE.registerPropertyDefinition(PD_DB_DIRECTORY);
303  }
304
305
306
307  // Build the "db-directory-permissions" property definition.
308  static {
309      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "db-directory-permissions");
310      builder.setOption(PropertyOption.ADVANCED);
311      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "db-directory-permissions"));
312      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("700");
313      builder.setDefaultBehaviorProvider(provider);
314      builder.setPattern("^7[0-7][0-7]$", "MODE");
315      PD_DB_DIRECTORY_PERMISSIONS = builder.getInstance();
316      INSTANCE.registerPropertyDefinition(PD_DB_DIRECTORY_PERMISSIONS);
317  }
318
319
320
321  // Build the "db-evictor-core-threads" property definition.
322  static {
323      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-evictor-core-threads");
324      builder.setOption(PropertyOption.ADVANCED);
325      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-evictor-core-threads"));
326      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("1");
327      builder.setDefaultBehaviorProvider(provider);
328      builder.setUpperLimit(2147483647);
329      builder.setLowerLimit(0);
330      PD_DB_EVICTOR_CORE_THREADS = builder.getInstance();
331      INSTANCE.registerPropertyDefinition(PD_DB_EVICTOR_CORE_THREADS);
332  }
333
334
335
336  // Build the "db-evictor-keep-alive" property definition.
337  static {
338      DurationPropertyDefinition.Builder builder = DurationPropertyDefinition.createBuilder(INSTANCE, "db-evictor-keep-alive");
339      builder.setOption(PropertyOption.ADVANCED);
340      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-evictor-keep-alive"));
341      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("600s");
342      builder.setDefaultBehaviorProvider(provider);
343      builder.setBaseUnit("s");
344      builder.setUpperLimit("86400");
345      builder.setLowerLimit("1");
346      PD_DB_EVICTOR_KEEP_ALIVE = builder.getInstance();
347      INSTANCE.registerPropertyDefinition(PD_DB_EVICTOR_KEEP_ALIVE);
348  }
349
350
351
352  // Build the "db-evictor-lru-only" property definition.
353  static {
354      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-evictor-lru-only");
355      builder.setOption(PropertyOption.ADVANCED);
356      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-evictor-lru-only"));
357      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("false");
358      builder.setDefaultBehaviorProvider(provider);
359      PD_DB_EVICTOR_LRU_ONLY = builder.getInstance();
360      INSTANCE.registerPropertyDefinition(PD_DB_EVICTOR_LRU_ONLY);
361  }
362
363
364
365  // Build the "db-evictor-max-threads" property definition.
366  static {
367      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-evictor-max-threads");
368      builder.setOption(PropertyOption.ADVANCED);
369      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-evictor-max-threads"));
370      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("10");
371      builder.setDefaultBehaviorProvider(provider);
372      builder.setUpperLimit(2147483647);
373      builder.setLowerLimit(1);
374      PD_DB_EVICTOR_MAX_THREADS = builder.getInstance();
375      INSTANCE.registerPropertyDefinition(PD_DB_EVICTOR_MAX_THREADS);
376  }
377
378
379
380  // Build the "db-evictor-nodes-per-scan" property definition.
381  static {
382      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-evictor-nodes-per-scan");
383      builder.setOption(PropertyOption.ADVANCED);
384      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-evictor-nodes-per-scan"));
385      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("10");
386      builder.setDefaultBehaviorProvider(provider);
387      builder.setUpperLimit(1000);
388      builder.setLowerLimit(1);
389      PD_DB_EVICTOR_NODES_PER_SCAN = builder.getInstance();
390      INSTANCE.registerPropertyDefinition(PD_DB_EVICTOR_NODES_PER_SCAN);
391  }
392
393
394
395  // Build the "db-log-filecache-size" property definition.
396  static {
397      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-log-filecache-size");
398      builder.setOption(PropertyOption.ADVANCED);
399      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-log-filecache-size"));
400      DefaultBehaviorProvider<Integer> provider = new DefinedDefaultBehaviorProvider<Integer>("100");
401      builder.setDefaultBehaviorProvider(provider);
402      builder.setUpperLimit(2147483647);
403      builder.setLowerLimit(3);
404      PD_DB_LOG_FILECACHE_SIZE = builder.getInstance();
405      INSTANCE.registerPropertyDefinition(PD_DB_LOG_FILECACHE_SIZE);
406  }
407
408
409
410  // Build the "db-log-file-max" property definition.
411  static {
412      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "db-log-file-max");
413      builder.setOption(PropertyOption.ADVANCED);
414      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-log-file-max"));
415      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("100mb");
416      builder.setDefaultBehaviorProvider(provider);
417      builder.setUpperLimit("4gib");
418      builder.setLowerLimit("1mb");
419      PD_DB_LOG_FILE_MAX = builder.getInstance();
420      INSTANCE.registerPropertyDefinition(PD_DB_LOG_FILE_MAX);
421  }
422
423
424
425  // Build the "db-logging-file-handler-on" property definition.
426  static {
427      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-logging-file-handler-on");
428      builder.setOption(PropertyOption.ADVANCED);
429      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-logging-file-handler-on"));
430      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("true");
431      builder.setDefaultBehaviorProvider(provider);
432      PD_DB_LOGGING_FILE_HANDLER_ON = builder.getInstance();
433      INSTANCE.registerPropertyDefinition(PD_DB_LOGGING_FILE_HANDLER_ON);
434  }
435
436
437
438  // Build the "db-logging-level" property definition.
439  static {
440      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "db-logging-level");
441      builder.setOption(PropertyOption.ADVANCED);
442      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-logging-level"));
443      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("CONFIG");
444      builder.setDefaultBehaviorProvider(provider);
445      PD_DB_LOGGING_LEVEL = builder.getInstance();
446      INSTANCE.registerPropertyDefinition(PD_DB_LOGGING_LEVEL);
447  }
448
449
450
451  // Build the "db-num-cleaner-threads" property definition.
452  static {
453      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-num-cleaner-threads");
454      builder.setOption(PropertyOption.ADVANCED);
455      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-num-cleaner-threads"));
456      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<Integer>(INSTANCE, "db-num-cleaner-threads"));
457      builder.setLowerLimit(1);
458      PD_DB_NUM_CLEANER_THREADS = builder.getInstance();
459      INSTANCE.registerPropertyDefinition(PD_DB_NUM_CLEANER_THREADS);
460  }
461
462
463
464  // Build the "db-num-lock-tables" property definition.
465  static {
466      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "db-num-lock-tables");
467      builder.setOption(PropertyOption.ADVANCED);
468      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "db-num-lock-tables"));
469      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<Integer>(INSTANCE, "db-num-lock-tables"));
470      builder.setUpperLimit(32767);
471      builder.setLowerLimit(1);
472      PD_DB_NUM_LOCK_TABLES = builder.getInstance();
473      INSTANCE.registerPropertyDefinition(PD_DB_NUM_LOCK_TABLES);
474  }
475
476
477
478  // Build the "db-run-cleaner" property definition.
479  static {
480      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-run-cleaner");
481      builder.setOption(PropertyOption.ADVANCED);
482      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-run-cleaner"));
483      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("true");
484      builder.setDefaultBehaviorProvider(provider);
485      PD_DB_RUN_CLEANER = builder.getInstance();
486      INSTANCE.registerPropertyDefinition(PD_DB_RUN_CLEANER);
487  }
488
489
490
491  // Build the "db-txn-no-sync" property definition.
492  static {
493      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-txn-no-sync");
494      builder.setOption(PropertyOption.ADVANCED);
495      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-txn-no-sync"));
496      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("false");
497      builder.setDefaultBehaviorProvider(provider);
498      PD_DB_TXN_NO_SYNC = builder.getInstance();
499      INSTANCE.registerPropertyDefinition(PD_DB_TXN_NO_SYNC);
500  }
501
502
503
504  // Build the "db-txn-write-no-sync" property definition.
505  static {
506      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "db-txn-write-no-sync");
507      builder.setOption(PropertyOption.ADVANCED);
508      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "db-txn-write-no-sync"));
509      DefaultBehaviorProvider<Boolean> provider = new DefinedDefaultBehaviorProvider<Boolean>("true");
510      builder.setDefaultBehaviorProvider(provider);
511      PD_DB_TXN_WRITE_NO_SYNC = builder.getInstance();
512      INSTANCE.registerPropertyDefinition(PD_DB_TXN_WRITE_NO_SYNC);
513  }
514
515
516
517  // Build the "disk-full-threshold" property definition.
518  static {
519      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "disk-full-threshold");
520      builder.setOption(PropertyOption.ADVANCED);
521      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "disk-full-threshold"));
522      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("100 megabytes");
523      builder.setDefaultBehaviorProvider(provider);
524      builder.setLowerLimit("0");
525      PD_DISK_FULL_THRESHOLD = builder.getInstance();
526      INSTANCE.registerPropertyDefinition(PD_DISK_FULL_THRESHOLD);
527  }
528
529
530
531  // Build the "disk-low-threshold" property definition.
532  static {
533      SizePropertyDefinition.Builder builder = SizePropertyDefinition.createBuilder(INSTANCE, "disk-low-threshold");
534      builder.setOption(PropertyOption.ADVANCED);
535      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "disk-low-threshold"));
536      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("200 megabytes");
537      builder.setDefaultBehaviorProvider(provider);
538      builder.setLowerLimit("0");
539      PD_DISK_LOW_THRESHOLD = builder.getInstance();
540      INSTANCE.registerPropertyDefinition(PD_DISK_LOW_THRESHOLD);
541  }
542
543
544
545  // Build the "java-class" property definition.
546  static {
547      ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
548      builder.setOption(PropertyOption.MANDATORY);
549      builder.setOption(PropertyOption.ADVANCED);
550      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class"));
551      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.backends.jeb.JEBackend");
552      builder.setDefaultBehaviorProvider(provider);
553      builder.addInstanceOf("org.opends.server.api.Backend");
554      PD_JAVA_CLASS = builder.getInstance();
555      INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
556  }
557
558
559
560  // Build the "je-property" property definition.
561  static {
562      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "je-property");
563      builder.setOption(PropertyOption.MULTI_VALUED);
564      builder.setOption(PropertyOption.ADVANCED);
565      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "je-property"));
566      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
567      PD_JE_PROPERTY = builder.getInstance();
568      INSTANCE.registerPropertyDefinition(PD_JE_PROPERTY);
569  }
570
571
572
573  // Register the tags associated with this managed object definition.
574  static {
575    INSTANCE.registerTag(Tag.valueOf("database"));
576  }
577
578
579
580  // Register the constraints associated with this managed object definition.
581  static {
582    INSTANCE.registerConstraint(new GenericConstraint(INSTANCE, 1, Conditions.implies(Conditions.contains("enabled", "true"), Conditions.not(Conditions.and(Conditions.contains("db-txn-no-sync", "true"), Conditions.contains("db-txn-write-no-sync", "true"))))));
583  }
584
585
586
587  /**
588   * Get the JE Backend configuration definition singleton.
589   *
590   * @return Returns the JE Backend configuration definition
591   *         singleton.
592   */
593  public static JEBackendCfgDefn getInstance() {
594    return INSTANCE;
595  }
596
597
598
599  /**
600   * Private constructor.
601   */
602  private JEBackendCfgDefn() {
603    super("je-backend", PluggableBackendCfgDefn.getInstance());
604  }
605
606
607
608  /**
609   * {@inheritDoc}
610   */
611  public JEBackendCfgClient createClientConfiguration(
612      ManagedObject<? extends JEBackendCfgClient> impl) {
613    return new JEBackendCfgClientImpl(impl);
614  }
615
616
617
618  /**
619   * {@inheritDoc}
620   */
621  public JEBackendCfg createServerConfiguration(
622      ServerManagedObject<? extends JEBackendCfg> impl) {
623    return new JEBackendCfgServerImpl(impl);
624  }
625
626
627
628  /**
629   * {@inheritDoc}
630   */
631  public Class<JEBackendCfg> getServerConfigurationClass() {
632    return JEBackendCfg.class;
633  }
634
635
636
637  /**
638   * Get the "backend-id" property definition.
639   * <p>
640   * Specifies a name to identify the associated backend.
641   * <p>
642   * The name must be unique among all backends in the server. The
643   * backend ID may not be altered after the backend is created in the
644   * server.
645   *
646   * @return Returns the "backend-id" property definition.
647   */
648  public StringPropertyDefinition getBackendIdPropertyDefinition() {
649    return PluggableBackendCfgDefn.getInstance().getBackendIdPropertyDefinition();
650  }
651
652
653
654  /**
655   * Get the "base-dn" property definition.
656   * <p>
657   * Specifies the base DN(s) for the data that the backend handles.
658   * <p>
659   * A single backend may be responsible for one or more base DNs.
660   * Note that no two backends may have the same base DN although one
661   * backend may have a base DN that is below a base DN provided by
662   * another backend (similar to the use of sub-suffixes in the Sun
663   * Java System Directory Server). If any of the base DNs is
664   * subordinate to a base DN for another backend, then all base DNs
665   * for that backend must be subordinate to that same base DN.
666   *
667   * @return Returns the "base-dn" property definition.
668   */
669  public DNPropertyDefinition getBaseDNPropertyDefinition() {
670    return PluggableBackendCfgDefn.getInstance().getBaseDNPropertyDefinition();
671  }
672
673
674
675  /**
676   * Get the "compact-encoding" property definition.
677   * <p>
678   * Indicates whether the backend should use a compact form when
679   * encoding entries by compressing the attribute descriptions and
680   * object class sets.
681   * <p>
682   * Note that this property applies only to the entries themselves
683   * and does not impact the index data.
684   *
685   * @return Returns the "compact-encoding" property definition.
686   */
687  public BooleanPropertyDefinition getCompactEncodingPropertyDefinition() {
688    return PluggableBackendCfgDefn.getInstance().getCompactEncodingPropertyDefinition();
689  }
690
691
692
693  /**
694   * Get the "db-cache-percent" property definition.
695   * <p>
696   * Specifies the percentage of JVM memory to allocate to the
697   * database cache.
698   * <p>
699   * Specifies the percentage of memory available to the JVM that
700   * should be used for caching database contents. Note that this is
701   * only used if the value of the db-cache-size property is set to "0
702   * MB". Otherwise, the value of that property is used instead to
703   * control the cache size configuration.
704   *
705   * @return Returns the "db-cache-percent" property definition.
706   */
707  public IntegerPropertyDefinition getDBCachePercentPropertyDefinition() {
708    return PD_DB_CACHE_PERCENT;
709  }
710
711
712
713  /**
714   * Get the "db-cache-size" property definition.
715   * <p>
716   * The amount of JVM memory to allocate to the database cache.
717   * <p>
718   * Specifies the amount of memory that should be used for caching
719   * database contents. A value of "0 MB" indicates that the
720   * db-cache-percent property should be used instead to specify the
721   * cache size.
722   *
723   * @return Returns the "db-cache-size" property definition.
724   */
725  public SizePropertyDefinition getDBCacheSizePropertyDefinition() {
726    return PD_DB_CACHE_SIZE;
727  }
728
729
730
731  /**
732   * Get the "db-checkpointer-bytes-interval" property definition.
733   * <p>
734   * Specifies the maximum number of bytes that may be written to the
735   * database before it is forced to perform a checkpoint.
736   * <p>
737   * This can be used to bound the recovery time that may be required
738   * if the database environment is opened without having been properly
739   * closed. If this property is set to a non-zero value, the
740   * checkpointer wakeup interval is not used. To use time-based
741   * checkpointing, set this property to zero.
742   *
743   * @return Returns the "db-checkpointer-bytes-interval" property definition.
744   */
745  public SizePropertyDefinition getDBCheckpointerBytesIntervalPropertyDefinition() {
746    return PD_DB_CHECKPOINTER_BYTES_INTERVAL;
747  }
748
749
750
751  /**
752   * Get the "db-checkpointer-wakeup-interval" property definition.
753   * <p>
754   * Specifies the maximum length of time that may pass between
755   * checkpoints.
756   * <p>
757   * Note that this is only used if the value of the checkpointer
758   * bytes interval is zero.
759   *
760   * @return Returns the "db-checkpointer-wakeup-interval" property definition.
761   */
762  public DurationPropertyDefinition getDBCheckpointerWakeupIntervalPropertyDefinition() {
763    return PD_DB_CHECKPOINTER_WAKEUP_INTERVAL;
764  }
765
766
767
768  /**
769   * Get the "db-cleaner-min-utilization" property definition.
770   * <p>
771   * Specifies the occupancy percentage for "live" data in this
772   * backend's database.
773   * <p>
774   * When the amount of "live" data in the database drops below this
775   * value, cleaners will act to increase the occupancy percentage by
776   * compacting the database.
777   *
778   * @return Returns the "db-cleaner-min-utilization" property definition.
779   */
780  public IntegerPropertyDefinition getDBCleanerMinUtilizationPropertyDefinition() {
781    return PD_DB_CLEANER_MIN_UTILIZATION;
782  }
783
784
785
786  /**
787   * Get the "db-directory" property definition.
788   * <p>
789   * Specifies the path to the filesystem directory that is used to
790   * hold the Berkeley DB Java Edition database files containing the
791   * data for this backend.
792   * <p>
793   * The path may be either an absolute path or a path relative to the
794   * directory containing the base of the OpenDJ directory server
795   * installation. The path may be any valid directory path in which
796   * the server has appropriate permissions to read and write files and
797   * has sufficient space to hold the database contents.
798   *
799   * @return Returns the "db-directory" property definition.
800   */
801  public StringPropertyDefinition getDBDirectoryPropertyDefinition() {
802    return PD_DB_DIRECTORY;
803  }
804
805
806
807  /**
808   * Get the "db-directory-permissions" property definition.
809   * <p>
810   * Specifies the permissions that should be applied to the directory
811   * containing the server database files.
812   * <p>
813   * They should be expressed as three-digit octal values, which is
814   * the traditional representation for UNIX file permissions. The
815   * three digits represent the permissions that are available for the
816   * directory's owner, group members, and other users (in that order),
817   * and each digit is the octal representation of the read, write, and
818   * execute bits. Note that this only impacts permissions on the
819   * database directory and not on the files written into that
820   * directory. On UNIX systems, the user's umask controls permissions
821   * given to the database files.
822   *
823   * @return Returns the "db-directory-permissions" property definition.
824   */
825  public StringPropertyDefinition getDBDirectoryPermissionsPropertyDefinition() {
826    return PD_DB_DIRECTORY_PERMISSIONS;
827  }
828
829
830
831  /**
832   * Get the "db-evictor-core-threads" property definition.
833   * <p>
834   * Specifies the core number of threads in the eviction thread pool.
835   * <p>
836   * Specifies the core number of threads in the eviction thread pool.
837   * These threads help keep memory usage within cache bounds,
838   * offloading work from application threads. db-evictor-core-threads,
839   * db-evictor-max-threads and db-evictor-keep-alive are used to
840   * configure the core, max and keepalive attributes for the eviction
841   * thread pool.
842   *
843   * @return Returns the "db-evictor-core-threads" property definition.
844   */
845  public IntegerPropertyDefinition getDBEvictorCoreThreadsPropertyDefinition() {
846    return PD_DB_EVICTOR_CORE_THREADS;
847  }
848
849
850
851  /**
852   * Get the "db-evictor-keep-alive" property definition.
853   * <p>
854   * The duration that excess threads in the eviction thread pool will
855   * stay idle. After this period, idle threads will terminate.
856   * <p>
857   * The duration that excess threads in the eviction thread pool will
858   * stay idle. After this period, idle threads will terminate.
859   * db-evictor-core-threads, db-evictor-max-threads and
860   * db-evictor-keep-alive are used to configure the core, max and
861   * keepalive attributes for the eviction thread pool.
862   *
863   * @return Returns the "db-evictor-keep-alive" property definition.
864   */
865  public DurationPropertyDefinition getDBEvictorKeepAlivePropertyDefinition() {
866    return PD_DB_EVICTOR_KEEP_ALIVE;
867  }
868
869
870
871  /**
872   * Get the "db-evictor-lru-only" property definition.
873   * <p>
874   * Indicates whether the database should evict existing data from
875   * the cache based on an LRU policy (where the least recently used
876   * information will be evicted first).
877   * <p>
878   * If set to "false", then the eviction keeps internal nodes of the
879   * underlying Btree in the cache over leaf nodes, even if the leaf
880   * nodes have been accessed more recently. This may be a better
881   * configuration for databases in which only a very small portion of
882   * the data is cached.
883   *
884   * @return Returns the "db-evictor-lru-only" property definition.
885   */
886  public BooleanPropertyDefinition getDBEvictorLruOnlyPropertyDefinition() {
887    return PD_DB_EVICTOR_LRU_ONLY;
888  }
889
890
891
892  /**
893   * Get the "db-evictor-max-threads" property definition.
894   * <p>
895   * Specifies the maximum number of threads in the eviction thread
896   * pool.
897   * <p>
898   * Specifies the maximum number of threads in the eviction thread
899   * pool. These threads help keep memory usage within cache bounds,
900   * offloading work from application threads. db-evictor-core-threads,
901   * db-evictor-max-threads and db-evictor-keep-alive are used to
902   * configure the core, max and keepalive attributes for the eviction
903   * thread pool.
904   *
905   * @return Returns the "db-evictor-max-threads" property definition.
906   */
907  public IntegerPropertyDefinition getDBEvictorMaxThreadsPropertyDefinition() {
908    return PD_DB_EVICTOR_MAX_THREADS;
909  }
910
911
912
913  /**
914   * Get the "db-evictor-nodes-per-scan" property definition.
915   * <p>
916   * Specifies the number of Btree nodes that should be evicted from
917   * the cache in a single pass if it is determined that it is
918   * necessary to free existing data in order to make room for new
919   * information.
920   * <p>
921   * Changes to this property do not take effect until the backend is
922   * restarted. It is recommended that you also change this property
923   * when you set db-evictor-lru-only to false. This setting controls
924   * the number of Btree nodes that are considered, or sampled, each
925   * time a node is evicted. A setting of 10 often produces good
926   * results, but this may vary from application to application. The
927   * larger the nodes per scan, the more accurate the algorithm.
928   * However, don't set it too high. When considering larger numbers of
929   * nodes for each eviction, the evictor may delay the completion of a
930   * given database operation, which impacts the response time of the
931   * application thread. In JE 4.1 and later, setting this value too
932   * high in an application that is largely CPU bound can reduce the
933   * effectiveness of cache eviction. It's best to start with the
934   * default value, and increase it gradually to see if it is
935   * beneficial for your application.
936   *
937   * @return Returns the "db-evictor-nodes-per-scan" property definition.
938   */
939  public IntegerPropertyDefinition getDBEvictorNodesPerScanPropertyDefinition() {
940    return PD_DB_EVICTOR_NODES_PER_SCAN;
941  }
942
943
944
945  /**
946   * Get the "db-log-filecache-size" property definition.
947   * <p>
948   * Specifies the size of the file handle cache.
949   * <p>
950   * The file handle cache is used to keep as much opened log files as
951   * possible. When the cache is smaller than the number of logs, the
952   * database needs to close some handles and open log files it needs,
953   * resulting in less optimal performances. Ideally, the size of the
954   * cache should be higher than the number of files contained in the
955   * database. Make sure the OS number of open files per process is
956   * also tuned appropriately.
957   *
958   * @return Returns the "db-log-filecache-size" property definition.
959   */
960  public IntegerPropertyDefinition getDBLogFilecacheSizePropertyDefinition() {
961    return PD_DB_LOG_FILECACHE_SIZE;
962  }
963
964
965
966  /**
967   * Get the "db-log-file-max" property definition.
968   * <p>
969   * Specifies the maximum size for a database log file.
970   *
971   * @return Returns the "db-log-file-max" property definition.
972   */
973  public SizePropertyDefinition getDBLogFileMaxPropertyDefinition() {
974    return PD_DB_LOG_FILE_MAX;
975  }
976
977
978
979  /**
980   * Get the "db-logging-file-handler-on" property definition.
981   * <p>
982   * Indicates whether the database should maintain a je.info file in
983   * the same directory as the database log directory.
984   * <p>
985   * This file contains information about the internal processing
986   * performed by the underlying database.
987   *
988   * @return Returns the "db-logging-file-handler-on" property definition.
989   */
990  public BooleanPropertyDefinition getDBLoggingFileHandlerOnPropertyDefinition() {
991    return PD_DB_LOGGING_FILE_HANDLER_ON;
992  }
993
994
995
996  /**
997   * Get the "db-logging-level" property definition.
998   * <p>
999   * Specifies the log level that should be used by the database when
1000   * it is writing information into the je.info file.
1001   * <p>
1002   * The database trace logging level is (in increasing order of
1003   * verbosity) chosen from: OFF, SEVERE, WARNING, INFO, CONFIG, FINE,
1004   * FINER, FINEST, ALL.
1005   *
1006   * @return Returns the "db-logging-level" property definition.
1007   */
1008  public StringPropertyDefinition getDBLoggingLevelPropertyDefinition() {
1009    return PD_DB_LOGGING_LEVEL;
1010  }
1011
1012
1013
1014  /**
1015   * Get the "db-num-cleaner-threads" property definition.
1016   * <p>
1017   * Specifies the number of threads that the backend should maintain
1018   * to keep the database log files at or near the desired utilization.
1019   * <p>
1020   * In environments with high write throughput, multiple cleaner
1021   * threads may be required to maintain the desired utilization.
1022   *
1023   * @return Returns the "db-num-cleaner-threads" property definition.
1024   */
1025  public IntegerPropertyDefinition getDBNumCleanerThreadsPropertyDefinition() {
1026    return PD_DB_NUM_CLEANER_THREADS;
1027  }
1028
1029
1030
1031  /**
1032   * Get the "db-num-lock-tables" property definition.
1033   * <p>
1034   * Specifies the number of lock tables that are used by the
1035   * underlying database.
1036   * <p>
1037   * This can be particularly important to help improve scalability by
1038   * avoiding contention on systems with large numbers of CPUs. The
1039   * value of this configuration property should be set to a prime
1040   * number that is less than or equal to the number of worker threads
1041   * configured for use in the server.
1042   *
1043   * @return Returns the "db-num-lock-tables" property definition.
1044   */
1045  public IntegerPropertyDefinition getDBNumLockTablesPropertyDefinition() {
1046    return PD_DB_NUM_LOCK_TABLES;
1047  }
1048
1049
1050
1051  /**
1052   * Get the "db-run-cleaner" property definition.
1053   * <p>
1054   * Indicates whether the cleaner threads should be enabled to
1055   * compact the database.
1056   * <p>
1057   * The cleaner threads are used to periodically compact the database
1058   * when it reaches a percentage of occupancy lower than the amount
1059   * specified by the db-cleaner-min-utilization property. They
1060   * identify database files with a low percentage of live data, and
1061   * relocate their remaining live data to the end of the log.
1062   *
1063   * @return Returns the "db-run-cleaner" property definition.
1064   */
1065  public BooleanPropertyDefinition getDBRunCleanerPropertyDefinition() {
1066    return PD_DB_RUN_CLEANER;
1067  }
1068
1069
1070
1071  /**
1072   * Get the "db-txn-no-sync" property definition.
1073   * <p>
1074   * Indicates whether database writes should be primarily written to
1075   * an internal buffer but not immediately written to disk.
1076   * <p>
1077   * Setting the value of this configuration attribute to "true" may
1078   * improve write performance but could cause the most recent changes
1079   * to be lost if the OpenDJ directory server or the underlying JVM
1080   * exits abnormally, or if an OS or hardware failure occurs (a
1081   * behavior similar to running with transaction durability disabled
1082   * in the Sun Java System Directory Server).
1083   *
1084   * @return Returns the "db-txn-no-sync" property definition.
1085   */
1086  public BooleanPropertyDefinition getDBTxnNoSyncPropertyDefinition() {
1087    return PD_DB_TXN_NO_SYNC;
1088  }
1089
1090
1091
1092  /**
1093   * Get the "db-txn-write-no-sync" property definition.
1094   * <p>
1095   * Indicates whether the database should synchronously flush data as
1096   * it is written to disk.
1097   * <p>
1098   * If this value is set to "false", then all data written to disk is
1099   * synchronously flushed to persistent storage and thereby providing
1100   * full durability. If it is set to "true", then data may be cached
1101   * for a period of time by the underlying operating system before
1102   * actually being written to disk. This may improve performance, but
1103   * could cause the most recent changes to be lost in the event of an
1104   * underlying OS or hardware failure (but not in the case that the
1105   * OpenDJ directory server or the JVM exits abnormally).
1106   *
1107   * @return Returns the "db-txn-write-no-sync" property definition.
1108   */
1109  public BooleanPropertyDefinition getDBTxnWriteNoSyncPropertyDefinition() {
1110    return PD_DB_TXN_WRITE_NO_SYNC;
1111  }
1112
1113
1114
1115  /**
1116   * Get the "disk-full-threshold" property definition.
1117   * <p>
1118   * Full disk threshold to limit database updates
1119   * <p>
1120   * When the available free space on the disk used by this database
1121   * instance falls below the value specified, no updates are permitted
1122   * and the server returns an UNWILLING_TO_PERFORM error. Updates are
1123   * allowed again as soon as free space rises above the threshold.
1124   *
1125   * @return Returns the "disk-full-threshold" property definition.
1126   */
1127  public SizePropertyDefinition getDiskFullThresholdPropertyDefinition() {
1128    return PD_DISK_FULL_THRESHOLD;
1129  }
1130
1131
1132
1133  /**
1134   * Get the "disk-low-threshold" property definition.
1135   * <p>
1136   * Low disk threshold to limit database updates
1137   * <p>
1138   * Specifies the "low" free space on the disk. When the available
1139   * free space on the disk used by this database instance falls below
1140   * the value specified, protocol updates on this database are
1141   * permitted only by a user with the BYPASS_LOCKDOWN privilege.
1142   *
1143   * @return Returns the "disk-low-threshold" property definition.
1144   */
1145  public SizePropertyDefinition getDiskLowThresholdPropertyDefinition() {
1146    return PD_DISK_LOW_THRESHOLD;
1147  }
1148
1149
1150
1151  /**
1152   * Get the "enabled" property definition.
1153   * <p>
1154   * Indicates whether the backend is enabled in the server.
1155   * <p>
1156   * If a backend is not enabled, then its contents are not accessible
1157   * when processing operations.
1158   *
1159   * @return Returns the "enabled" property definition.
1160   */
1161  public BooleanPropertyDefinition getEnabledPropertyDefinition() {
1162    return PluggableBackendCfgDefn.getInstance().getEnabledPropertyDefinition();
1163  }
1164
1165
1166
1167  /**
1168   * Get the "entries-compressed" property definition.
1169   * <p>
1170   * Indicates whether the backend should attempt to compress entries
1171   * before storing them in the database.
1172   * <p>
1173   * Note that this property applies only to the entries themselves
1174   * and does not impact the index data. Further, the effectiveness of
1175   * the compression is based on the type of data contained in the
1176   * entry.
1177   *
1178   * @return Returns the "entries-compressed" property definition.
1179   */
1180  public BooleanPropertyDefinition getEntriesCompressedPropertyDefinition() {
1181    return PluggableBackendCfgDefn.getInstance().getEntriesCompressedPropertyDefinition();
1182  }
1183
1184
1185
1186  /**
1187   * Get the "index-entry-limit" property definition.
1188   * <p>
1189   * Specifies the maximum number of entries that is allowed to match
1190   * a given index key before that particular index key is no longer
1191   * maintained.
1192   * <p>
1193   * This property is analogous to the ALL IDs threshold in the Sun
1194   * Java System Directory Server. Note that this is the default limit
1195   * for the backend, and it may be overridden on a per-attribute
1196   * basis.A value of 0 means there is no limit.
1197   *
1198   * @return Returns the "index-entry-limit" property definition.
1199   */
1200  public IntegerPropertyDefinition getIndexEntryLimitPropertyDefinition() {
1201    return PluggableBackendCfgDefn.getInstance().getIndexEntryLimitPropertyDefinition();
1202  }
1203
1204
1205
1206  /**
1207   * Get the "index-filter-analyzer-enabled" property definition.
1208   * <p>
1209   * Indicates whether to gather statistical information about the
1210   * search filters processed by the directory server while evaluating
1211   * the usage of indexes.
1212   * <p>
1213   * Analyzing indexes requires gathering search filter usage patterns
1214   * from user requests, especially for values as specified in the
1215   * filters and subsequently looking the status of those values into
1216   * the index files. When a search requests is processed, internal or
1217   * user generated, a first phase uses indexes to find potential
1218   * entries to be returned. Depending on the search filter, if the
1219   * index of one of the specified attributes matches too many entries
1220   * (exceeds the index entry limit), the search becomes non-indexed.
1221   * In any case, all entries thus gathered (or the entire DIT) are
1222   * matched against the filter for actually returning the search
1223   * result.
1224   *
1225   * @return Returns the "index-filter-analyzer-enabled" property definition.
1226   */
1227  public BooleanPropertyDefinition getIndexFilterAnalyzerEnabledPropertyDefinition() {
1228    return PluggableBackendCfgDefn.getInstance().getIndexFilterAnalyzerEnabledPropertyDefinition();
1229  }
1230
1231
1232
1233  /**
1234   * Get the "index-filter-analyzer-max-filters" property definition.
1235   * <p>
1236   * The maximum number of search filter statistics to keep.
1237   * <p>
1238   * When the maximum number of search filter is reached, the least
1239   * used one will be deleted.
1240   *
1241   * @return Returns the "index-filter-analyzer-max-filters" property definition.
1242   */
1243  public IntegerPropertyDefinition getIndexFilterAnalyzerMaxFiltersPropertyDefinition() {
1244    return PluggableBackendCfgDefn.getInstance().getIndexFilterAnalyzerMaxFiltersPropertyDefinition();
1245  }
1246
1247
1248
1249  /**
1250   * Get the "java-class" property definition.
1251   * <p>
1252   * Specifies the fully-qualified name of the Java class that
1253   * provides the backend implementation.
1254   *
1255   * @return Returns the "java-class" property definition.
1256   */
1257  public ClassPropertyDefinition getJavaClassPropertyDefinition() {
1258    return PD_JAVA_CLASS;
1259  }
1260
1261
1262
1263  /**
1264   * Get the "je-property" property definition.
1265   * <p>
1266   * Specifies the database and environment properties for the
1267   * Berkeley DB Java Edition database serving the data for this
1268   * backend.
1269   * <p>
1270   * Any Berkeley DB Java Edition property can be specified using the
1271   * following form: property-name=property-value. Refer to OpenDJ
1272   * documentation for further information on related properties, their
1273   * implications, and range values. The definitive identification of
1274   * all the property parameters is available in the example.properties
1275   * file of Berkeley DB Java Edition distribution.
1276   *
1277   * @return Returns the "je-property" property definition.
1278   */
1279  public StringPropertyDefinition getJEPropertyPropertyDefinition() {
1280    return PD_JE_PROPERTY;
1281  }
1282
1283
1284
1285  /**
1286   * Get the "preload-time-limit" property definition.
1287   * <p>
1288   * Specifies the length of time that the backend is allowed to spend
1289   * "pre-loading" data when it is initialized.
1290   * <p>
1291   * The pre-load process is used to pre-populate the database cache,
1292   * so that it can be more quickly available when the server is
1293   * processing requests. A duration of zero means there is no
1294   * pre-load.
1295   *
1296   * @return Returns the "preload-time-limit" property definition.
1297   */
1298  public DurationPropertyDefinition getPreloadTimeLimitPropertyDefinition() {
1299    return PluggableBackendCfgDefn.getInstance().getPreloadTimeLimitPropertyDefinition();
1300  }
1301
1302
1303
1304  /**
1305   * Get the "writability-mode" property definition.
1306   * <p>
1307   * Specifies the behavior that the backend should use when
1308   * processing write operations.
1309   *
1310   * @return Returns the "writability-mode" property definition.
1311   */
1312  public EnumPropertyDefinition<WritabilityMode> getWritabilityModePropertyDefinition() {
1313    return PluggableBackendCfgDefn.getInstance().getWritabilityModePropertyDefinition();
1314  }
1315
1316
1317
1318  /**
1319   * Get the "backend-indexes" relation definition.
1320   *
1321   * @return Returns the "backend-indexes" relation definition.
1322   */
1323  public InstantiableRelationDefinition<BackendIndexCfgClient,BackendIndexCfg> getBackendIndexesRelationDefinition() {
1324    return PluggableBackendCfgDefn.getInstance().getBackendIndexesRelationDefinition();
1325  }
1326
1327
1328
1329  /**
1330   * Get the "backend-vlv-indexes" relation definition.
1331   *
1332   * @return Returns the "backend-vlv-indexes" relation definition.
1333   */
1334  public InstantiableRelationDefinition<BackendVLVIndexCfgClient,BackendVLVIndexCfg> getBackendVLVIndexesRelationDefinition() {
1335    return PluggableBackendCfgDefn.getInstance().getBackendVLVIndexesRelationDefinition();
1336  }
1337
1338
1339
1340  /**
1341   * Managed object client implementation.
1342   */
1343  private static class JEBackendCfgClientImpl implements
1344    JEBackendCfgClient {
1345
1346    // Private implementation.
1347    private ManagedObject<? extends JEBackendCfgClient> impl;
1348
1349
1350
1351    // Private constructor.
1352    private JEBackendCfgClientImpl(
1353        ManagedObject<? extends JEBackendCfgClient> impl) {
1354      this.impl = impl;
1355    }
1356
1357
1358
1359    /**
1360     * {@inheritDoc}
1361     */
1362    public String getBackendId() {
1363      return impl.getPropertyValue(INSTANCE.getBackendIdPropertyDefinition());
1364    }
1365
1366
1367
1368    /**
1369     * {@inheritDoc}
1370     */
1371    public void setBackendId(String value) throws PropertyException {
1372      impl.setPropertyValue(INSTANCE.getBackendIdPropertyDefinition(), value);
1373    }
1374
1375
1376
1377    /**
1378     * {@inheritDoc}
1379     */
1380    public SortedSet<DN> getBaseDN() {
1381      return impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
1382    }
1383
1384
1385
1386    /**
1387     * {@inheritDoc}
1388     */
1389    public void setBaseDN(Collection<DN> values) {
1390      impl.setPropertyValues(INSTANCE.getBaseDNPropertyDefinition(), values);
1391    }
1392
1393
1394
1395    /**
1396     * {@inheritDoc}
1397     */
1398    public boolean isCompactEncoding() {
1399      return impl.getPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition());
1400    }
1401
1402
1403
1404    /**
1405     * {@inheritDoc}
1406     */
1407    public void setCompactEncoding(Boolean value) {
1408      impl.setPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition(), value);
1409    }
1410
1411
1412
1413    /**
1414     * {@inheritDoc}
1415     */
1416    public int getDBCachePercent() {
1417      return impl.getPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition());
1418    }
1419
1420
1421
1422    /**
1423     * {@inheritDoc}
1424     */
1425    public void setDBCachePercent(Integer value) {
1426      impl.setPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition(), value);
1427    }
1428
1429
1430
1431    /**
1432     * {@inheritDoc}
1433     */
1434    public long getDBCacheSize() {
1435      return impl.getPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition());
1436    }
1437
1438
1439
1440    /**
1441     * {@inheritDoc}
1442     */
1443    public void setDBCacheSize(Long value) {
1444      impl.setPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition(), value);
1445    }
1446
1447
1448
1449    /**
1450     * {@inheritDoc}
1451     */
1452    public long getDBCheckpointerBytesInterval() {
1453      return impl.getPropertyValue(INSTANCE.getDBCheckpointerBytesIntervalPropertyDefinition());
1454    }
1455
1456
1457
1458    /**
1459     * {@inheritDoc}
1460     */
1461    public void setDBCheckpointerBytesInterval(Long value) {
1462      impl.setPropertyValue(INSTANCE.getDBCheckpointerBytesIntervalPropertyDefinition(), value);
1463    }
1464
1465
1466
1467    /**
1468     * {@inheritDoc}
1469     */
1470    public long getDBCheckpointerWakeupInterval() {
1471      return impl.getPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition());
1472    }
1473
1474
1475
1476    /**
1477     * {@inheritDoc}
1478     */
1479    public void setDBCheckpointerWakeupInterval(Long value) {
1480      impl.setPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition(), value);
1481    }
1482
1483
1484
1485    /**
1486     * {@inheritDoc}
1487     */
1488    public int getDBCleanerMinUtilization() {
1489      return impl.getPropertyValue(INSTANCE.getDBCleanerMinUtilizationPropertyDefinition());
1490    }
1491
1492
1493
1494    /**
1495     * {@inheritDoc}
1496     */
1497    public void setDBCleanerMinUtilization(Integer value) {
1498      impl.setPropertyValue(INSTANCE.getDBCleanerMinUtilizationPropertyDefinition(), value);
1499    }
1500
1501
1502
1503    /**
1504     * {@inheritDoc}
1505     */
1506    public String getDBDirectory() {
1507      return impl.getPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition());
1508    }
1509
1510
1511
1512    /**
1513     * {@inheritDoc}
1514     */
1515    public void setDBDirectory(String value) {
1516      impl.setPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition(), value);
1517    }
1518
1519
1520
1521    /**
1522     * {@inheritDoc}
1523     */
1524    public String getDBDirectoryPermissions() {
1525      return impl.getPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition());
1526    }
1527
1528
1529
1530    /**
1531     * {@inheritDoc}
1532     */
1533    public void setDBDirectoryPermissions(String value) {
1534      impl.setPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition(), value);
1535    }
1536
1537
1538
1539    /**
1540     * {@inheritDoc}
1541     */
1542    public int getDBEvictorCoreThreads() {
1543      return impl.getPropertyValue(INSTANCE.getDBEvictorCoreThreadsPropertyDefinition());
1544    }
1545
1546
1547
1548    /**
1549     * {@inheritDoc}
1550     */
1551    public void setDBEvictorCoreThreads(Integer value) {
1552      impl.setPropertyValue(INSTANCE.getDBEvictorCoreThreadsPropertyDefinition(), value);
1553    }
1554
1555
1556
1557    /**
1558     * {@inheritDoc}
1559     */
1560    public long getDBEvictorKeepAlive() {
1561      return impl.getPropertyValue(INSTANCE.getDBEvictorKeepAlivePropertyDefinition());
1562    }
1563
1564
1565
1566    /**
1567     * {@inheritDoc}
1568     */
1569    public void setDBEvictorKeepAlive(Long value) {
1570      impl.setPropertyValue(INSTANCE.getDBEvictorKeepAlivePropertyDefinition(), value);
1571    }
1572
1573
1574
1575    /**
1576     * {@inheritDoc}
1577     */
1578    public boolean isDBEvictorLruOnly() {
1579      return impl.getPropertyValue(INSTANCE.getDBEvictorLruOnlyPropertyDefinition());
1580    }
1581
1582
1583
1584    /**
1585     * {@inheritDoc}
1586     */
1587    public void setDBEvictorLruOnly(Boolean value) {
1588      impl.setPropertyValue(INSTANCE.getDBEvictorLruOnlyPropertyDefinition(), value);
1589    }
1590
1591
1592
1593    /**
1594     * {@inheritDoc}
1595     */
1596    public int getDBEvictorMaxThreads() {
1597      return impl.getPropertyValue(INSTANCE.getDBEvictorMaxThreadsPropertyDefinition());
1598    }
1599
1600
1601
1602    /**
1603     * {@inheritDoc}
1604     */
1605    public void setDBEvictorMaxThreads(Integer value) {
1606      impl.setPropertyValue(INSTANCE.getDBEvictorMaxThreadsPropertyDefinition(), value);
1607    }
1608
1609
1610
1611    /**
1612     * {@inheritDoc}
1613     */
1614    public int getDBEvictorNodesPerScan() {
1615      return impl.getPropertyValue(INSTANCE.getDBEvictorNodesPerScanPropertyDefinition());
1616    }
1617
1618
1619
1620    /**
1621     * {@inheritDoc}
1622     */
1623    public void setDBEvictorNodesPerScan(Integer value) {
1624      impl.setPropertyValue(INSTANCE.getDBEvictorNodesPerScanPropertyDefinition(), value);
1625    }
1626
1627
1628
1629    /**
1630     * {@inheritDoc}
1631     */
1632    public int getDBLogFilecacheSize() {
1633      return impl.getPropertyValue(INSTANCE.getDBLogFilecacheSizePropertyDefinition());
1634    }
1635
1636
1637
1638    /**
1639     * {@inheritDoc}
1640     */
1641    public void setDBLogFilecacheSize(Integer value) {
1642      impl.setPropertyValue(INSTANCE.getDBLogFilecacheSizePropertyDefinition(), value);
1643    }
1644
1645
1646
1647    /**
1648     * {@inheritDoc}
1649     */
1650    public long getDBLogFileMax() {
1651      return impl.getPropertyValue(INSTANCE.getDBLogFileMaxPropertyDefinition());
1652    }
1653
1654
1655
1656    /**
1657     * {@inheritDoc}
1658     */
1659    public void setDBLogFileMax(Long value) {
1660      impl.setPropertyValue(INSTANCE.getDBLogFileMaxPropertyDefinition(), value);
1661    }
1662
1663
1664
1665    /**
1666     * {@inheritDoc}
1667     */
1668    public boolean isDBLoggingFileHandlerOn() {
1669      return impl.getPropertyValue(INSTANCE.getDBLoggingFileHandlerOnPropertyDefinition());
1670    }
1671
1672
1673
1674    /**
1675     * {@inheritDoc}
1676     */
1677    public void setDBLoggingFileHandlerOn(Boolean value) {
1678      impl.setPropertyValue(INSTANCE.getDBLoggingFileHandlerOnPropertyDefinition(), value);
1679    }
1680
1681
1682
1683    /**
1684     * {@inheritDoc}
1685     */
1686    public String getDBLoggingLevel() {
1687      return impl.getPropertyValue(INSTANCE.getDBLoggingLevelPropertyDefinition());
1688    }
1689
1690
1691
1692    /**
1693     * {@inheritDoc}
1694     */
1695    public void setDBLoggingLevel(String value) {
1696      impl.setPropertyValue(INSTANCE.getDBLoggingLevelPropertyDefinition(), value);
1697    }
1698
1699
1700
1701    /**
1702     * {@inheritDoc}
1703     */
1704    public Integer getDBNumCleanerThreads() {
1705      return impl.getPropertyValue(INSTANCE.getDBNumCleanerThreadsPropertyDefinition());
1706    }
1707
1708
1709
1710    /**
1711     * {@inheritDoc}
1712     */
1713    public void setDBNumCleanerThreads(Integer value) {
1714      impl.setPropertyValue(INSTANCE.getDBNumCleanerThreadsPropertyDefinition(), value);
1715    }
1716
1717
1718
1719    /**
1720     * {@inheritDoc}
1721     */
1722    public Integer getDBNumLockTables() {
1723      return impl.getPropertyValue(INSTANCE.getDBNumLockTablesPropertyDefinition());
1724    }
1725
1726
1727
1728    /**
1729     * {@inheritDoc}
1730     */
1731    public void setDBNumLockTables(Integer value) {
1732      impl.setPropertyValue(INSTANCE.getDBNumLockTablesPropertyDefinition(), value);
1733    }
1734
1735
1736
1737    /**
1738     * {@inheritDoc}
1739     */
1740    public boolean isDBRunCleaner() {
1741      return impl.getPropertyValue(INSTANCE.getDBRunCleanerPropertyDefinition());
1742    }
1743
1744
1745
1746    /**
1747     * {@inheritDoc}
1748     */
1749    public void setDBRunCleaner(Boolean value) {
1750      impl.setPropertyValue(INSTANCE.getDBRunCleanerPropertyDefinition(), value);
1751    }
1752
1753
1754
1755    /**
1756     * {@inheritDoc}
1757     */
1758    public boolean isDBTxnNoSync() {
1759      return impl.getPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition());
1760    }
1761
1762
1763
1764    /**
1765     * {@inheritDoc}
1766     */
1767    public void setDBTxnNoSync(Boolean value) {
1768      impl.setPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition(), value);
1769    }
1770
1771
1772
1773    /**
1774     * {@inheritDoc}
1775     */
1776    public boolean isDBTxnWriteNoSync() {
1777      return impl.getPropertyValue(INSTANCE.getDBTxnWriteNoSyncPropertyDefinition());
1778    }
1779
1780
1781
1782    /**
1783     * {@inheritDoc}
1784     */
1785    public void setDBTxnWriteNoSync(Boolean value) {
1786      impl.setPropertyValue(INSTANCE.getDBTxnWriteNoSyncPropertyDefinition(), value);
1787    }
1788
1789
1790
1791    /**
1792     * {@inheritDoc}
1793     */
1794    public long getDiskFullThreshold() {
1795      return impl.getPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition());
1796    }
1797
1798
1799
1800    /**
1801     * {@inheritDoc}
1802     */
1803    public void setDiskFullThreshold(Long value) {
1804      impl.setPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition(), value);
1805    }
1806
1807
1808
1809    /**
1810     * {@inheritDoc}
1811     */
1812    public long getDiskLowThreshold() {
1813      return impl.getPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition());
1814    }
1815
1816
1817
1818    /**
1819     * {@inheritDoc}
1820     */
1821    public void setDiskLowThreshold(Long value) {
1822      impl.setPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition(), value);
1823    }
1824
1825
1826
1827    /**
1828     * {@inheritDoc}
1829     */
1830    public Boolean isEnabled() {
1831      return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
1832    }
1833
1834
1835
1836    /**
1837     * {@inheritDoc}
1838     */
1839    public void setEnabled(boolean value) {
1840      impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
1841    }
1842
1843
1844
1845    /**
1846     * {@inheritDoc}
1847     */
1848    public boolean isEntriesCompressed() {
1849      return impl.getPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition());
1850    }
1851
1852
1853
1854    /**
1855     * {@inheritDoc}
1856     */
1857    public void setEntriesCompressed(Boolean value) {
1858      impl.setPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition(), value);
1859    }
1860
1861
1862
1863    /**
1864     * {@inheritDoc}
1865     */
1866    public int getIndexEntryLimit() {
1867      return impl.getPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition());
1868    }
1869
1870
1871
1872    /**
1873     * {@inheritDoc}
1874     */
1875    public void setIndexEntryLimit(Integer value) {
1876      impl.setPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition(), value);
1877    }
1878
1879
1880
1881    /**
1882     * {@inheritDoc}
1883     */
1884    public boolean isIndexFilterAnalyzerEnabled() {
1885      return impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition());
1886    }
1887
1888
1889
1890    /**
1891     * {@inheritDoc}
1892     */
1893    public void setIndexFilterAnalyzerEnabled(Boolean value) {
1894      impl.setPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition(), value);
1895    }
1896
1897
1898
1899    /**
1900     * {@inheritDoc}
1901     */
1902    public int getIndexFilterAnalyzerMaxFilters() {
1903      return impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition());
1904    }
1905
1906
1907
1908    /**
1909     * {@inheritDoc}
1910     */
1911    public void setIndexFilterAnalyzerMaxFilters(Integer value) {
1912      impl.setPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition(), value);
1913    }
1914
1915
1916
1917    /**
1918     * {@inheritDoc}
1919     */
1920    public String getJavaClass() {
1921      return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
1922    }
1923
1924
1925
1926    /**
1927     * {@inheritDoc}
1928     */
1929    public void setJavaClass(String value) {
1930      impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
1931    }
1932
1933
1934
1935    /**
1936     * {@inheritDoc}
1937     */
1938    public SortedSet<String> getJEProperty() {
1939      return impl.getPropertyValues(INSTANCE.getJEPropertyPropertyDefinition());
1940    }
1941
1942
1943
1944    /**
1945     * {@inheritDoc}
1946     */
1947    public void setJEProperty(Collection<String> values) {
1948      impl.setPropertyValues(INSTANCE.getJEPropertyPropertyDefinition(), values);
1949    }
1950
1951
1952
1953    /**
1954     * {@inheritDoc}
1955     */
1956    public long getPreloadTimeLimit() {
1957      return impl.getPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition());
1958    }
1959
1960
1961
1962    /**
1963     * {@inheritDoc}
1964     */
1965    public void setPreloadTimeLimit(Long value) {
1966      impl.setPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition(), value);
1967    }
1968
1969
1970
1971    /**
1972     * {@inheritDoc}
1973     */
1974    public WritabilityMode getWritabilityMode() {
1975      return impl.getPropertyValue(INSTANCE.getWritabilityModePropertyDefinition());
1976    }
1977
1978
1979
1980    /**
1981     * {@inheritDoc}
1982     */
1983    public void setWritabilityMode(WritabilityMode value) {
1984      impl.setPropertyValue(INSTANCE.getWritabilityModePropertyDefinition(), value);
1985    }
1986
1987
1988
1989    /**
1990     * {@inheritDoc}
1991     */
1992    public String[] listBackendIndexes() throws ConcurrentModificationException,
1993        AuthorizationException, CommunicationException {
1994      return impl.listChildren(INSTANCE.getBackendIndexesRelationDefinition());
1995    }
1996
1997
1998
1999    /**
2000     * {@inheritDoc}
2001     */
2002    public BackendIndexCfgClient getBackendIndex(String name)
2003        throws DefinitionDecodingException, ManagedObjectDecodingException,
2004        ManagedObjectNotFoundException, ConcurrentModificationException,
2005        AuthorizationException, CommunicationException {
2006      return impl.getChild(INSTANCE.getBackendIndexesRelationDefinition(), name).getConfiguration();
2007    }
2008
2009
2010
2011    /**
2012     * {@inheritDoc}
2013     */
2014    public <M extends BackendIndexCfgClient> M createBackendIndex(
2015        ManagedObjectDefinition<M, ? extends BackendIndexCfg> d, String name, Collection<PropertyException> exceptions) throws IllegalManagedObjectNameException {
2016      return impl.createChild(INSTANCE.getBackendIndexesRelationDefinition(), d, name, exceptions).getConfiguration();
2017    }
2018
2019
2020
2021    /**
2022     * {@inheritDoc}
2023     */
2024    public void removeBackendIndex(String name)
2025        throws ManagedObjectNotFoundException, ConcurrentModificationException,
2026        OperationRejectedException, AuthorizationException, CommunicationException {
2027      impl.removeChild(INSTANCE.getBackendIndexesRelationDefinition(), name);
2028    }
2029
2030
2031
2032    /**
2033     * {@inheritDoc}
2034     */
2035    public String[] listBackendVLVIndexes() throws ConcurrentModificationException,
2036        AuthorizationException, CommunicationException {
2037      return impl.listChildren(INSTANCE.getBackendVLVIndexesRelationDefinition());
2038    }
2039
2040
2041
2042    /**
2043     * {@inheritDoc}
2044     */
2045    public BackendVLVIndexCfgClient getBackendVLVIndex(String name)
2046        throws DefinitionDecodingException, ManagedObjectDecodingException,
2047        ManagedObjectNotFoundException, ConcurrentModificationException,
2048        AuthorizationException, CommunicationException {
2049      return impl.getChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name).getConfiguration();
2050    }
2051
2052
2053
2054    /**
2055     * {@inheritDoc}
2056     */
2057    public <M extends BackendVLVIndexCfgClient> M createBackendVLVIndex(
2058        ManagedObjectDefinition<M, ? extends BackendVLVIndexCfg> d, String name, Collection<PropertyException> exceptions) throws IllegalManagedObjectNameException {
2059      return impl.createChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), d, name, exceptions).getConfiguration();
2060    }
2061
2062
2063
2064    /**
2065     * {@inheritDoc}
2066     */
2067    public void removeBackendVLVIndex(String name)
2068        throws ManagedObjectNotFoundException, ConcurrentModificationException,
2069        OperationRejectedException, AuthorizationException, CommunicationException {
2070      impl.removeChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name);
2071    }
2072
2073
2074
2075    /**
2076     * {@inheritDoc}
2077     */
2078    public ManagedObjectDefinition<? extends JEBackendCfgClient, ? extends JEBackendCfg> definition() {
2079      return INSTANCE;
2080    }
2081
2082
2083
2084    /**
2085     * {@inheritDoc}
2086     */
2087    public PropertyProvider properties() {
2088      return impl;
2089    }
2090
2091
2092
2093    /**
2094     * {@inheritDoc}
2095     */
2096    public void commit() throws ManagedObjectAlreadyExistsException,
2097        MissingMandatoryPropertiesException, ConcurrentModificationException,
2098        OperationRejectedException, AuthorizationException,
2099        CommunicationException {
2100      impl.commit();
2101    }
2102
2103
2104
2105    /** {@inheritDoc} */
2106    public String toString() {
2107      return impl.toString();
2108    }
2109  }
2110
2111
2112
2113  /**
2114   * Managed object server implementation.
2115   */
2116  private static class JEBackendCfgServerImpl implements
2117    JEBackendCfg {
2118
2119    // Private implementation.
2120    private ServerManagedObject<? extends JEBackendCfg> impl;
2121
2122    // The value of the "backend-id" property.
2123    private final String pBackendId;
2124
2125    // The value of the "base-dn" property.
2126    private final SortedSet<DN> pBaseDN;
2127
2128    // The value of the "compact-encoding" property.
2129    private final boolean pCompactEncoding;
2130
2131    // The value of the "db-cache-percent" property.
2132    private final int pDBCachePercent;
2133
2134    // The value of the "db-cache-size" property.
2135    private final long pDBCacheSize;
2136
2137    // The value of the "db-checkpointer-bytes-interval" property.
2138    private final long pDBCheckpointerBytesInterval;
2139
2140    // The value of the "db-checkpointer-wakeup-interval" property.
2141    private final long pDBCheckpointerWakeupInterval;
2142
2143    // The value of the "db-cleaner-min-utilization" property.
2144    private final int pDBCleanerMinUtilization;
2145
2146    // The value of the "db-directory" property.
2147    private final String pDBDirectory;
2148
2149    // The value of the "db-directory-permissions" property.
2150    private final String pDBDirectoryPermissions;
2151
2152    // The value of the "db-evictor-core-threads" property.
2153    private final int pDBEvictorCoreThreads;
2154
2155    // The value of the "db-evictor-keep-alive" property.
2156    private final long pDBEvictorKeepAlive;
2157
2158    // The value of the "db-evictor-lru-only" property.
2159    private final boolean pDBEvictorLruOnly;
2160
2161    // The value of the "db-evictor-max-threads" property.
2162    private final int pDBEvictorMaxThreads;
2163
2164    // The value of the "db-evictor-nodes-per-scan" property.
2165    private final int pDBEvictorNodesPerScan;
2166
2167    // The value of the "db-log-filecache-size" property.
2168    private final int pDBLogFilecacheSize;
2169
2170    // The value of the "db-log-file-max" property.
2171    private final long pDBLogFileMax;
2172
2173    // The value of the "db-logging-file-handler-on" property.
2174    private final boolean pDBLoggingFileHandlerOn;
2175
2176    // The value of the "db-logging-level" property.
2177    private final String pDBLoggingLevel;
2178
2179    // The value of the "db-num-cleaner-threads" property.
2180    private final Integer pDBNumCleanerThreads;
2181
2182    // The value of the "db-num-lock-tables" property.
2183    private final Integer pDBNumLockTables;
2184
2185    // The value of the "db-run-cleaner" property.
2186    private final boolean pDBRunCleaner;
2187
2188    // The value of the "db-txn-no-sync" property.
2189    private final boolean pDBTxnNoSync;
2190
2191    // The value of the "db-txn-write-no-sync" property.
2192    private final boolean pDBTxnWriteNoSync;
2193
2194    // The value of the "disk-full-threshold" property.
2195    private final long pDiskFullThreshold;
2196
2197    // The value of the "disk-low-threshold" property.
2198    private final long pDiskLowThreshold;
2199
2200    // The value of the "enabled" property.
2201    private final boolean pEnabled;
2202
2203    // The value of the "entries-compressed" property.
2204    private final boolean pEntriesCompressed;
2205
2206    // The value of the "index-entry-limit" property.
2207    private final int pIndexEntryLimit;
2208
2209    // The value of the "index-filter-analyzer-enabled" property.
2210    private final boolean pIndexFilterAnalyzerEnabled;
2211
2212    // The value of the "index-filter-analyzer-max-filters" property.
2213    private final int pIndexFilterAnalyzerMaxFilters;
2214
2215    // The value of the "java-class" property.
2216    private final String pJavaClass;
2217
2218    // The value of the "je-property" property.
2219    private final SortedSet<String> pJEProperty;
2220
2221    // The value of the "preload-time-limit" property.
2222    private final long pPreloadTimeLimit;
2223
2224    // The value of the "writability-mode" property.
2225    private final WritabilityMode pWritabilityMode;
2226
2227
2228
2229    // Private constructor.
2230    private JEBackendCfgServerImpl(ServerManagedObject<? extends JEBackendCfg> impl) {
2231      this.impl = impl;
2232      this.pBackendId = impl.getPropertyValue(INSTANCE.getBackendIdPropertyDefinition());
2233      this.pBaseDN = impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
2234      this.pCompactEncoding = impl.getPropertyValue(INSTANCE.getCompactEncodingPropertyDefinition());
2235      this.pDBCachePercent = impl.getPropertyValue(INSTANCE.getDBCachePercentPropertyDefinition());
2236      this.pDBCacheSize = impl.getPropertyValue(INSTANCE.getDBCacheSizePropertyDefinition());
2237      this.pDBCheckpointerBytesInterval = impl.getPropertyValue(INSTANCE.getDBCheckpointerBytesIntervalPropertyDefinition());
2238      this.pDBCheckpointerWakeupInterval = impl.getPropertyValue(INSTANCE.getDBCheckpointerWakeupIntervalPropertyDefinition());
2239      this.pDBCleanerMinUtilization = impl.getPropertyValue(INSTANCE.getDBCleanerMinUtilizationPropertyDefinition());
2240      this.pDBDirectory = impl.getPropertyValue(INSTANCE.getDBDirectoryPropertyDefinition());
2241      this.pDBDirectoryPermissions = impl.getPropertyValue(INSTANCE.getDBDirectoryPermissionsPropertyDefinition());
2242      this.pDBEvictorCoreThreads = impl.getPropertyValue(INSTANCE.getDBEvictorCoreThreadsPropertyDefinition());
2243      this.pDBEvictorKeepAlive = impl.getPropertyValue(INSTANCE.getDBEvictorKeepAlivePropertyDefinition());
2244      this.pDBEvictorLruOnly = impl.getPropertyValue(INSTANCE.getDBEvictorLruOnlyPropertyDefinition());
2245      this.pDBEvictorMaxThreads = impl.getPropertyValue(INSTANCE.getDBEvictorMaxThreadsPropertyDefinition());
2246      this.pDBEvictorNodesPerScan = impl.getPropertyValue(INSTANCE.getDBEvictorNodesPerScanPropertyDefinition());
2247      this.pDBLogFilecacheSize = impl.getPropertyValue(INSTANCE.getDBLogFilecacheSizePropertyDefinition());
2248      this.pDBLogFileMax = impl.getPropertyValue(INSTANCE.getDBLogFileMaxPropertyDefinition());
2249      this.pDBLoggingFileHandlerOn = impl.getPropertyValue(INSTANCE.getDBLoggingFileHandlerOnPropertyDefinition());
2250      this.pDBLoggingLevel = impl.getPropertyValue(INSTANCE.getDBLoggingLevelPropertyDefinition());
2251      this.pDBNumCleanerThreads = impl.getPropertyValue(INSTANCE.getDBNumCleanerThreadsPropertyDefinition());
2252      this.pDBNumLockTables = impl.getPropertyValue(INSTANCE.getDBNumLockTablesPropertyDefinition());
2253      this.pDBRunCleaner = impl.getPropertyValue(INSTANCE.getDBRunCleanerPropertyDefinition());
2254      this.pDBTxnNoSync = impl.getPropertyValue(INSTANCE.getDBTxnNoSyncPropertyDefinition());
2255      this.pDBTxnWriteNoSync = impl.getPropertyValue(INSTANCE.getDBTxnWriteNoSyncPropertyDefinition());
2256      this.pDiskFullThreshold = impl.getPropertyValue(INSTANCE.getDiskFullThresholdPropertyDefinition());
2257      this.pDiskLowThreshold = impl.getPropertyValue(INSTANCE.getDiskLowThresholdPropertyDefinition());
2258      this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
2259      this.pEntriesCompressed = impl.getPropertyValue(INSTANCE.getEntriesCompressedPropertyDefinition());
2260      this.pIndexEntryLimit = impl.getPropertyValue(INSTANCE.getIndexEntryLimitPropertyDefinition());
2261      this.pIndexFilterAnalyzerEnabled = impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerEnabledPropertyDefinition());
2262      this.pIndexFilterAnalyzerMaxFilters = impl.getPropertyValue(INSTANCE.getIndexFilterAnalyzerMaxFiltersPropertyDefinition());
2263      this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
2264      this.pJEProperty = impl.getPropertyValues(INSTANCE.getJEPropertyPropertyDefinition());
2265      this.pPreloadTimeLimit = impl.getPropertyValue(INSTANCE.getPreloadTimeLimitPropertyDefinition());
2266      this.pWritabilityMode = impl.getPropertyValue(INSTANCE.getWritabilityModePropertyDefinition());
2267    }
2268
2269
2270
2271    /**
2272     * {@inheritDoc}
2273     */
2274    public void addJEChangeListener(
2275        ConfigurationChangeListener<JEBackendCfg> listener) {
2276      impl.registerChangeListener(listener);
2277    }
2278
2279
2280
2281    /**
2282     * {@inheritDoc}
2283     */
2284    public void removeJEChangeListener(
2285        ConfigurationChangeListener<JEBackendCfg> listener) {
2286      impl.deregisterChangeListener(listener);
2287    }
2288    /**
2289     * {@inheritDoc}
2290     */
2291    public void addPluggableChangeListener(
2292        ConfigurationChangeListener<PluggableBackendCfg> listener) {
2293      impl.registerChangeListener(listener);
2294    }
2295
2296
2297
2298    /**
2299     * {@inheritDoc}
2300     */
2301    public void removePluggableChangeListener(
2302        ConfigurationChangeListener<PluggableBackendCfg> listener) {
2303      impl.deregisterChangeListener(listener);
2304    }
2305    /**
2306     * {@inheritDoc}
2307     */
2308    public void addChangeListener(
2309        ConfigurationChangeListener<BackendCfg> listener) {
2310      impl.registerChangeListener(listener);
2311    }
2312
2313
2314
2315    /**
2316     * {@inheritDoc}
2317     */
2318    public void removeChangeListener(
2319        ConfigurationChangeListener<BackendCfg> listener) {
2320      impl.deregisterChangeListener(listener);
2321    }
2322
2323
2324
2325    /**
2326     * {@inheritDoc}
2327     */
2328    public String getBackendId() {
2329      return pBackendId;
2330    }
2331
2332
2333
2334    /**
2335     * {@inheritDoc}
2336     */
2337    public SortedSet<DN> getBaseDN() {
2338      return pBaseDN;
2339    }
2340
2341
2342
2343    /**
2344     * {@inheritDoc}
2345     */
2346    public boolean isCompactEncoding() {
2347      return pCompactEncoding;
2348    }
2349
2350
2351
2352    /**
2353     * {@inheritDoc}
2354     */
2355    public int getDBCachePercent() {
2356      return pDBCachePercent;
2357    }
2358
2359
2360
2361    /**
2362     * {@inheritDoc}
2363     */
2364    public long getDBCacheSize() {
2365      return pDBCacheSize;
2366    }
2367
2368
2369
2370    /**
2371     * {@inheritDoc}
2372     */
2373    public long getDBCheckpointerBytesInterval() {
2374      return pDBCheckpointerBytesInterval;
2375    }
2376
2377
2378
2379    /**
2380     * {@inheritDoc}
2381     */
2382    public long getDBCheckpointerWakeupInterval() {
2383      return pDBCheckpointerWakeupInterval;
2384    }
2385
2386
2387
2388    /**
2389     * {@inheritDoc}
2390     */
2391    public int getDBCleanerMinUtilization() {
2392      return pDBCleanerMinUtilization;
2393    }
2394
2395
2396
2397    /**
2398     * {@inheritDoc}
2399     */
2400    public String getDBDirectory() {
2401      return pDBDirectory;
2402    }
2403
2404
2405
2406    /**
2407     * {@inheritDoc}
2408     */
2409    public String getDBDirectoryPermissions() {
2410      return pDBDirectoryPermissions;
2411    }
2412
2413
2414
2415    /**
2416     * {@inheritDoc}
2417     */
2418    public int getDBEvictorCoreThreads() {
2419      return pDBEvictorCoreThreads;
2420    }
2421
2422
2423
2424    /**
2425     * {@inheritDoc}
2426     */
2427    public long getDBEvictorKeepAlive() {
2428      return pDBEvictorKeepAlive;
2429    }
2430
2431
2432
2433    /**
2434     * {@inheritDoc}
2435     */
2436    public boolean isDBEvictorLruOnly() {
2437      return pDBEvictorLruOnly;
2438    }
2439
2440
2441
2442    /**
2443     * {@inheritDoc}
2444     */
2445    public int getDBEvictorMaxThreads() {
2446      return pDBEvictorMaxThreads;
2447    }
2448
2449
2450
2451    /**
2452     * {@inheritDoc}
2453     */
2454    public int getDBEvictorNodesPerScan() {
2455      return pDBEvictorNodesPerScan;
2456    }
2457
2458
2459
2460    /**
2461     * {@inheritDoc}
2462     */
2463    public int getDBLogFilecacheSize() {
2464      return pDBLogFilecacheSize;
2465    }
2466
2467
2468
2469    /**
2470     * {@inheritDoc}
2471     */
2472    public long getDBLogFileMax() {
2473      return pDBLogFileMax;
2474    }
2475
2476
2477
2478    /**
2479     * {@inheritDoc}
2480     */
2481    public boolean isDBLoggingFileHandlerOn() {
2482      return pDBLoggingFileHandlerOn;
2483    }
2484
2485
2486
2487    /**
2488     * {@inheritDoc}
2489     */
2490    public String getDBLoggingLevel() {
2491      return pDBLoggingLevel;
2492    }
2493
2494
2495
2496    /**
2497     * {@inheritDoc}
2498     */
2499    public Integer getDBNumCleanerThreads() {
2500      return pDBNumCleanerThreads;
2501    }
2502
2503
2504
2505    /**
2506     * {@inheritDoc}
2507     */
2508    public Integer getDBNumLockTables() {
2509      return pDBNumLockTables;
2510    }
2511
2512
2513
2514    /**
2515     * {@inheritDoc}
2516     */
2517    public boolean isDBRunCleaner() {
2518      return pDBRunCleaner;
2519    }
2520
2521
2522
2523    /**
2524     * {@inheritDoc}
2525     */
2526    public boolean isDBTxnNoSync() {
2527      return pDBTxnNoSync;
2528    }
2529
2530
2531
2532    /**
2533     * {@inheritDoc}
2534     */
2535    public boolean isDBTxnWriteNoSync() {
2536      return pDBTxnWriteNoSync;
2537    }
2538
2539
2540
2541    /**
2542     * {@inheritDoc}
2543     */
2544    public long getDiskFullThreshold() {
2545      return pDiskFullThreshold;
2546    }
2547
2548
2549
2550    /**
2551     * {@inheritDoc}
2552     */
2553    public long getDiskLowThreshold() {
2554      return pDiskLowThreshold;
2555    }
2556
2557
2558
2559    /**
2560     * {@inheritDoc}
2561     */
2562    public boolean isEnabled() {
2563      return pEnabled;
2564    }
2565
2566
2567
2568    /**
2569     * {@inheritDoc}
2570     */
2571    public boolean isEntriesCompressed() {
2572      return pEntriesCompressed;
2573    }
2574
2575
2576
2577    /**
2578     * {@inheritDoc}
2579     */
2580    public int getIndexEntryLimit() {
2581      return pIndexEntryLimit;
2582    }
2583
2584
2585
2586    /**
2587     * {@inheritDoc}
2588     */
2589    public boolean isIndexFilterAnalyzerEnabled() {
2590      return pIndexFilterAnalyzerEnabled;
2591    }
2592
2593
2594
2595    /**
2596     * {@inheritDoc}
2597     */
2598    public int getIndexFilterAnalyzerMaxFilters() {
2599      return pIndexFilterAnalyzerMaxFilters;
2600    }
2601
2602
2603
2604    /**
2605     * {@inheritDoc}
2606     */
2607    public String getJavaClass() {
2608      return pJavaClass;
2609    }
2610
2611
2612
2613    /**
2614     * {@inheritDoc}
2615     */
2616    public SortedSet<String> getJEProperty() {
2617      return pJEProperty;
2618    }
2619
2620
2621
2622    /**
2623     * {@inheritDoc}
2624     */
2625    public long getPreloadTimeLimit() {
2626      return pPreloadTimeLimit;
2627    }
2628
2629
2630
2631    /**
2632     * {@inheritDoc}
2633     */
2634    public WritabilityMode getWritabilityMode() {
2635      return pWritabilityMode;
2636    }
2637
2638
2639
2640    /**
2641     * {@inheritDoc}
2642     */
2643    public String[] listBackendIndexes() {
2644      return impl.listChildren(INSTANCE.getBackendIndexesRelationDefinition());
2645    }
2646
2647
2648
2649    /**
2650     * {@inheritDoc}
2651     */
2652    public BackendIndexCfg getBackendIndex(String name) throws ConfigException {
2653      return impl.getChild(INSTANCE.getBackendIndexesRelationDefinition(), name).getConfiguration();
2654    }
2655
2656
2657
2658    /**
2659     * {@inheritDoc}
2660     */
2661    public void addBackendIndexAddListener(
2662        ConfigurationAddListener<BackendIndexCfg> listener) throws ConfigException {
2663      impl.registerAddListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
2664    }
2665
2666
2667
2668    /**
2669     * {@inheritDoc}
2670     */
2671    public void removeBackendIndexAddListener(
2672        ConfigurationAddListener<BackendIndexCfg> listener) {
2673      impl.deregisterAddListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
2674    }
2675
2676
2677
2678    /**
2679     * {@inheritDoc}
2680     */
2681    public void addBackendIndexDeleteListener(
2682        ConfigurationDeleteListener<BackendIndexCfg> listener) throws ConfigException {
2683      impl.registerDeleteListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
2684    }
2685
2686
2687
2688    /**
2689     * {@inheritDoc}
2690     */
2691    public void removeBackendIndexDeleteListener(
2692        ConfigurationDeleteListener<BackendIndexCfg> listener) {
2693      impl.deregisterDeleteListener(INSTANCE.getBackendIndexesRelationDefinition(), listener);
2694    }
2695
2696
2697
2698    /**
2699     * {@inheritDoc}
2700     */
2701    public String[] listBackendVLVIndexes() {
2702      return impl.listChildren(INSTANCE.getBackendVLVIndexesRelationDefinition());
2703    }
2704
2705
2706
2707    /**
2708     * {@inheritDoc}
2709     */
2710    public BackendVLVIndexCfg getBackendVLVIndex(String name) throws ConfigException {
2711      return impl.getChild(INSTANCE.getBackendVLVIndexesRelationDefinition(), name).getConfiguration();
2712    }
2713
2714
2715
2716    /**
2717     * {@inheritDoc}
2718     */
2719    public void addBackendVLVIndexAddListener(
2720        ConfigurationAddListener<BackendVLVIndexCfg> listener) throws ConfigException {
2721      impl.registerAddListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
2722    }
2723
2724
2725
2726    /**
2727     * {@inheritDoc}
2728     */
2729    public void removeBackendVLVIndexAddListener(
2730        ConfigurationAddListener<BackendVLVIndexCfg> listener) {
2731      impl.deregisterAddListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
2732    }
2733
2734
2735
2736    /**
2737     * {@inheritDoc}
2738     */
2739    public void addBackendVLVIndexDeleteListener(
2740        ConfigurationDeleteListener<BackendVLVIndexCfg> listener) throws ConfigException {
2741      impl.registerDeleteListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
2742    }
2743
2744
2745
2746    /**
2747     * {@inheritDoc}
2748     */
2749    public void removeBackendVLVIndexDeleteListener(
2750        ConfigurationDeleteListener<BackendVLVIndexCfg> listener) {
2751      impl.deregisterDeleteListener(INSTANCE.getBackendVLVIndexesRelationDefinition(), listener);
2752    }
2753
2754
2755
2756    /**
2757     * {@inheritDoc}
2758     */
2759    public Class<? extends JEBackendCfg> configurationClass() {
2760      return JEBackendCfg.class;
2761    }
2762
2763
2764
2765    /**
2766     * {@inheritDoc}
2767     */
2768    public DN dn() {
2769      return impl.getDN();
2770    }
2771
2772
2773
2774    /** {@inheritDoc} */
2775    public String toString() {
2776      return impl.toString();
2777    }
2778  }
2779}