From 36e213444660f0a74ed415adeab490a5f3d50a6f Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Fri, 09 Oct 2015 11:40:06 +0000
Subject: [PATCH] OPENDJ-1791 Implement a tool like dbtest for the pluggable backend
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DefaultIndex.java | 17
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/State.java | 9
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DnKeyFormat.java | 20
opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRuleImpl.java | 8
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/TreeName.java | 11
opendj-server-legacy/src/messages/org/opends/messages/tool_fr.properties | 53
opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java | 10
opendj-server-legacy/resource/bin/backendtool | 36
opendj-server-legacy/src/messages/org/opends/messages/tool_zh_CN.properties | 52
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendTool.java | 1455 +++++++++++++++++++++++++++++++++
opendj-server-legacy/pom.xml | 9
opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DistinguishedNameEqualityMatchingRuleImpl.java | 2
opendj-server-legacy/src/messages/org/opends/messages/tool_pl.properties | 26
opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java | 23
opendj-server-legacy/src/messages/org/opends/messages/tool.properties | 104 +
opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java | 87 +
opendj-server-legacy/src/messages/org/opends/messages/tool_ca_ES.properties | 22
opendj-server-legacy/src/messages/org/opends/messages/tool_es.properties | 51
opendj-server-legacy/src/messages/org/opends/messages/tool_ko.properties | 49
opendj-server-legacy/src/main/docbkx/man-pages/backendtool-examples.xml | 53 +
opendj-server-legacy/src/main/docbkx/man-pages/variablelist-backendtool-index-status.xml | 124 ++
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Count.java | 25
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java | 21
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java | 12
opendj-server-legacy/src/messages/org/opends/messages/tool_zh_TW.properties | 49
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java | 30
opendj-server-legacy/src/messages/org/opends/messages/tool_de.properties | 51
opendj-server-legacy/src/messages/org/opends/messages/tool_ja.properties | 58
opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/OnDiskMergeImporterTest.java | 2
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java | 3
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2URI.java | 25
opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBStorage.java | 24
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Tree.java | 27
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java | 25
opendj-server-legacy/src/main/docbkx/man-pages/index.xml | 3
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AbstractTree.java | 20
opendj-server-legacy/resource/bin/backendtool.bat | 32
37 files changed, 2,339 insertions(+), 289 deletions(-)
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java
index 605cdd9..013008a 100755
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteString.java
@@ -443,6 +443,29 @@
}
}
+ /**
+ * Returns a 7-bit ASCII string representation.
+ * Non-ASCII characters will be expanded to percent (%) hexadecimal value.
+ * @return a 7-bit ASCII string representation
+ */
+ public String toASCIIString() {
+ if (length == 0) {
+ return "";
+ }
+
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ byte b = buffer[offset + i];
+ if (StaticUtils.isPrintable(b)) {
+ sb.append((char) b);
+ } else {
+ sb.append('%');
+ sb.append(StaticUtils.byteToHex(b));
+ }
+ }
+ return sb.toString();
+ }
+
private static byte hexToByte(final String value, final char c1, final char c2) {
byte b;
switch (c1) {
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
index fe1c5e9..0fd0c9d 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/DN.java
@@ -912,6 +912,16 @@
}
/**
+ * Returns an ASCII printable string representation.
+ *
+ * @param seq a normalized DN
+ * @return an ASCII printable string representation
+ */
+ public static String normalizedToASCII(ByteSequence seq) {
+ return seq.toByteString().toASCIIString();
+ }
+
+ /**
* Retrieves a normalized string representation of this DN.
* <p>
* This representation is safe to use in an URL or in a file name.
diff --git a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DistinguishedNameEqualityMatchingRuleImpl.java b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DistinguishedNameEqualityMatchingRuleImpl.java
index b8fad5b..16c6b19 100644
--- a/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DistinguishedNameEqualityMatchingRuleImpl.java
+++ b/opendj-core/src/main/java/org/forgerock/opendj/ldap/schema/DistinguishedNameEqualityMatchingRuleImpl.java
@@ -57,6 +57,6 @@
@Override
public String keyToHumanReadableString(ByteSequence key) {
- return key.toString();
+ return key.toByteString().toASCIIString();
}
}
diff --git a/opendj-server-legacy/pom.xml b/opendj-server-legacy/pom.xml
index f5cf65a..32006b3 100644
--- a/opendj-server-legacy/pom.xml
+++ b/opendj-server-legacy/pom.xml
@@ -1583,6 +1583,15 @@
</tool>
<tool>
+ <name>backendtool</name>
+ <application>org.opends.server.backends.pluggable.BackendTool</application>
+ <trailingSectionPaths>
+ <trailingSectionPath>exit-codes-0-gt0.xml</trailingSectionPath>
+ <trailingSectionPath>backendtool-examples.xml</trailingSectionPath>
+ </trailingSectionPaths>
+ </tool>
+
+ <tool>
<name>dbtest</name>
<application>org.opends.server.backends.jeb.DBTest</application>
<trailingSectionPaths>
diff --git a/opendj-server-legacy/resource/bin/backendtool b/opendj-server-legacy/resource/bin/backendtool
new file mode 100644
index 0000000..0add8c1
--- /dev/null
+++ b/opendj-server-legacy/resource/bin/backendtool
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+# or http://forgerock.org/license/CDDLv1.0.html.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at legal-notices/CDDLv1_0.txt.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information:
+# Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Portions Copyright 2015 ForgeRock AS
+
+
+# This script may be used to debug Pluggable backends in the Directory Server.
+OPENDJ_INVOKE_CLASS="org.opends.server.backends.pluggable.BackendTool"
+export OPENDJ_INVOKE_CLASS
+
+SCRIPT_NAME="backendtool"
+export SCRIPT_NAME
+
+SCRIPT_DIR=`dirname "${0}"`
+"${SCRIPT_DIR}/../lib/_server-script.sh" "${@}"
diff --git a/opendj-server-legacy/resource/bin/backendtool.bat b/opendj-server-legacy/resource/bin/backendtool.bat
new file mode 100644
index 0000000..8bab9c7
--- /dev/null
+++ b/opendj-server-legacy/resource/bin/backendtool.bat
@@ -0,0 +1,32 @@
+
+@echo off
+rem CDDL HEADER START
+rem
+rem The contents of this file are subject to the terms of the
+rem Common Development and Distribution License, Version 1.0 only
+rem (the "License"). You may not use this file except in compliance
+rem with the License.
+rem
+rem You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+rem or http://forgerock.org/license/CDDLv1.0.html.
+rem See the License for the specific language governing permissions
+rem and limitations under the License.
+rem
+rem When distributing Covered Code, include this CDDL HEADER in each
+rem file and include the License file at legal-notices/CDDLv1_0.txt.
+rem If applicable, add the following below this CDDL HEADER, with the
+rem fields enclosed by brackets "[]" replaced with your own identifying
+rem information:
+rem Portions Copyright [yyyy] [name of copyright owner]
+rem
+rem CDDL HEADER END
+rem
+rem
+rem Portions Copyright 2015 ForgeRock AS
+
+setlocal
+
+set OPENDJ_INVOKE_CLASS="org.opends.server.backends.pluggable.BackendTool"
+set SCRIPT_NAME=backendtool
+for %%i in (%~sf0) do call "%%~dPsi\..\lib\_server-script.bat" %*
+
diff --git a/opendj-server-legacy/src/main/docbkx/man-pages/backendtool-examples.xml b/opendj-server-legacy/src/main/docbkx/man-pages/backendtool-examples.xml
new file mode 100644
index 0000000..fe14982
--- /dev/null
+++ b/opendj-server-legacy/src/main/docbkx/man-pages/backendtool-examples.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at legal-notices/CDDLv1_0.txt.
+ ! If applicable, add the following below this CDDL HEADER, with the
+ ! fields enclosed by brackets "[]" replaced with your own identifying
+ ! information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2015 ForgeRock AS.
+ !
+-->
+<refsect1 xmlns="http://docbook.org/ns/docbook"
+ version="5.0" xml:lang="en"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://docbook.org/ns/docbook
+ http://docbook.org/xml/5.0/xsd/docbook.xsd">
+ <title>Examples</title>
+
+ <para>
+ The following example displays index information.
+ </para>
+
+ <screen>
+$ <userinput>bin/backendtool dump-tree -n userRoot -b dc=example,dc=com -t id2childrencount </userinput>
+<computeroutput>
+ Key (len 2): 1#52
+ Value (len 8): 1
+ Key (len 2): 2#52
+ Value (len 8): 500000
+ Key (len 9): Total Children Count
+ Value (len 8): 500001
+
+ Total Records: 3
+ Total / Average Key Size: 13 bytes / 4 bytes
+ Total / Average Data Size: 24 bytes / 8 bytes
+</computeroutput>
+ </screen>
+</refsect1>
diff --git a/opendj-server-legacy/src/main/docbkx/man-pages/index.xml b/opendj-server-legacy/src/main/docbkx/man-pages/index.xml
index 4967d33..2fa6514 100644
--- a/opendj-server-legacy/src/main/docbkx/man-pages/index.xml
+++ b/opendj-server-legacy/src/main/docbkx/man-pages/index.xml
@@ -63,6 +63,9 @@
<xinclude:include href="man-backup.xml">
<xinclude:fallback><!-- Failed to include page --></xinclude:fallback>
</xinclude:include>
+ <xinclude:include href="man-backendtool.xml">
+ <xinclude:fallback><!-- Failed to include page --></xinclude:fallback>
+ </xinclude:include>
<xinclude:include href="man-base64.xml">
<xinclude:fallback><!-- Failed to include page --></xinclude:fallback>
</xinclude:include>
diff --git a/opendj-server-legacy/src/main/docbkx/man-pages/variablelist-backendtool-index-status.xml b/opendj-server-legacy/src/main/docbkx/man-pages/variablelist-backendtool-index-status.xml
new file mode 100644
index 0000000..42a758c
--- /dev/null
+++ b/opendj-server-legacy/src/main/docbkx/man-pages/variablelist-backendtool-index-status.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ! CDDL HEADER START
+ !
+ ! The contents of this file are subject to the terms of the
+ ! Common Development and Distribution License, Version 1.0 only
+ ! (the "License"). You may not use this file except in compliance
+ ! with the License.
+ !
+ ! You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ ! or http://forgerock.org/license/CDDLv1.0.html.
+ ! See the License for the specific language governing permissions
+ ! and limitations under the License.
+ !
+ ! When distributing Covered Code, include this CDDL HEADER in each
+ ! file and include the License file at legal-notices/CDDLv1_0.txt.
+ ! If applicable, add the following below this CDDL HEADER, with the
+ ! fields enclosed by brackets "[]" replaced with your own identifying
+ ! information:
+ ! Portions Copyright [yyyy] [name of copyright owner]
+ !
+ ! CDDL HEADER END
+ !
+ ! Copyright 2015 ForgeRock AS.
+ !
+-->
+<variablelist
+ xmlns='http://docbook.org/ns/docbook' version='5.0' xml:lang='en'
+ xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
+ xsi:schemaLocation='http://docbook.org/ns/docbook
+ http://docbook.org/xml/5.0/xsd/docbook.xsd'>
+
+ <para>
+ When you run the 'list-index-status' command, the result is a table, followed by a "Total",
+ which is the total number of indexes, followed by a list of indexes with "Over index-entry-limit keys" to
+ show the values for which the number of entries exceeded the index entry limit.
+ The table has the following columns.
+ </para>
+
+ <varlistentry>
+ <term>Index Name</term>
+ <listitem>
+ <para>
+ Name of the index, which takes the form <replaceable>attr.type</replaceable> for attribute indexes,
+ and vlv.<replaceable>name</replaceable> for VLV indexes.
+ Some indexes are for OpenDJ directory server's internal use.
+ </para>
+
+ <para>
+ Example: <literal>givenName.caseIgnoreSubstringsMatch:6</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Tree Name</term>
+ <listitem>
+ <para>
+ Name of the backend tree, which reflects how OpenDJ directory server organizes the data in the database.
+ </para>
+
+ <para>
+ Example: <literal>/dc=example,dc=com/givenName.caseIgnoreSubstringsMatch:6</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Index Valid</term>
+ <listitem>
+ <para>
+ This is <literal>true</literal> for valid indexes. If this is <literal>false</literal>, the index might be degraded.
+ Verify the index, and rebuild the index if necessary.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Record Count</term>
+ <listitem>
+ <para>
+ Number of indexed keys.
+ Use the <command>backendtool dump-tree</command> command to see how many entry IDs correspond to each key.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Over Index Entry Limit</term>
+ <listitem>
+ <para>
+ Number of keys for which there are too many values to maintain an index, based on the index entry limit.
+ This is recorded as <literal>-</literal> for VLV indexes.
+ </para>
+
+ <para>
+ In other words, with the default index entry limit of 4000, if every user in your large directory has
+ an email address ending in <literal>@example.com</literal>, and a substring index with default substring
+ length of 6 is maintained for <literal>mail</literal>, then OpenDJ directory server does not maintain indexes
+ for keys corresponding to substrings in <literal>@example.com</literal>.
+ </para>
+
+ <para>
+ As a result, an LDAP search with the filter <literal>"(mail=*@example.com)"</literal> becomes an unindexed search
+ even though a substring index exists for the mail attribute.
+ By default OpenDJ directory server does not allow unindexed searches except by privileged users.
+ This is usually exactly the behavior you want in order to prevent client applications
+ from sending searches that return every user in the directory for example.
+ Clients should refine their search filters instead.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>95%, 90%, 85%</term>
+ <listitem>
+ <para>
+ Number of keys for which the number of values is approaching the index entry limit, having at least the specified
+ percentage.
+ This is a measure of how full the entry ID lists are.
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
index 5e6df1a..fe2f8ee 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/jeb/DBTest.java
@@ -85,7 +85,7 @@
/**
* This program provides a utility that may be used to debug a JE backend. This
- * tool provides the ability list various containers in the backend as well as
+ * tool provides the ability to list various containers in the backend as well as
* dump the contents of database containers. This will be
* a process that is intended to run separate from Directory Server and not
* internally within the server process (e.g., via the tasks interface).
@@ -248,11 +248,11 @@
sub = new SubCommand(parser, "list-entry-containers",
- INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS.get());
backendID =
new StringArgument("backendid", 'n', "backendID", true, false, true,
INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
- INFO_DESCRIPTION_DBTEST_BACKEND_ID.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get());
sub.addArgument(backendID);
@@ -261,13 +261,13 @@
backendID =
new StringArgument("backendid", 'n', "backendID", true, false, true,
INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
- INFO_DESCRIPTION_DBTEST_BACKEND_ID.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get());
sub.addArgument(backendID);
baseDN =
new StringArgument("basedn", 'b', "baseDN", false,
false, true, INFO_BASEDN_PLACEHOLDER.get(), null,
null,
- INFO_DESCRIPTION_DBTEST_BASE_DN.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get());
sub.addArgument(baseDN);
@@ -276,71 +276,71 @@
backendID =
new StringArgument("backendid", 'n', "backendID", true, false, true,
INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
- INFO_DESCRIPTION_DBTEST_BACKEND_ID.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get());
sub.addArgument(backendID);
baseDN =
new StringArgument("basedn", 'b', "baseDN", true,
false, true, INFO_BASEDN_PLACEHOLDER.get(), null,
null,
- INFO_DESCRIPTION_DBTEST_BASE_DN.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get());
sub.addArgument(baseDN);
databaseName =
new StringArgument("databasename", 'd', "databaseName", true,
false, true, INFO_DATABASE_NAME_PLACEHOLDER.get(),
null, null,
- INFO_DESCRIPTION_DBTEST_DATABASE_NAME.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME.get());
sub.addArgument(databaseName);
skipDecode =
new BooleanArgument("skipdecode", 'p', "skipDecode",
- INFO_DESCRIPTION_DBTEST_SKIP_DECODE.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE.get());
sub.addArgument(skipDecode);
statsOnly =
new BooleanArgument("statsonly", 'q', "statsOnly",
- INFO_DESCRIPTION_DBTEST_STATS_ONLY.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY.get());
sub.addArgument(statsOnly);
maxKeyValue = new StringArgument("maxkeyvalue", 'K', "maxKeyValue", false,
false, true,
INFO_MAX_KEY_VALUE_PLACEHOLDER.get(),
null, null,
- INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get());
sub.addArgument(maxKeyValue);
minKeyValue = new StringArgument("minkeyvalue", 'k', "minKeyValue", false,
false, true,
INFO_MIN_KEY_VALUE_PLACEHOLDER.get(),
null,
null,
- INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get());
sub.addArgument(minKeyValue);
maxDataSize = new IntegerArgument("maxdatasize", 'S', "maxDataSize",
false, false, true,
INFO_MAX_DATA_SIZE_PLACEHOLDER.get(),
-1,
null,
- INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE.get());
sub.addArgument(maxDataSize);
minDataSize = new IntegerArgument("mindatasize", 's', "minDataSize",
false, false, true,
INFO_MIN_DATA_SIZE_PLACEHOLDER.get(),
-1,
null,
- INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE.get());
sub.addArgument(minDataSize);
sub = new SubCommand(parser, "list-index-status",
- INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS.get());
sub.setDocDescriptionSupplement(
SUPPLEMENT_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS.get());
backendID =
new StringArgument("backendid", 'n', "backendID", true, false, true,
INFO_BACKENDNAME_PLACEHOLDER.get(), null, null,
- INFO_DESCRIPTION_DBTEST_BACKEND_ID.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get());
sub.addArgument(backendID);
baseDN =
new StringArgument("basedn", 'b', "baseDN", true,
true, true, INFO_BASEDN_PLACEHOLDER.get(), null,
null,
- INFO_DESCRIPTION_DBTEST_BASE_DN.get());
+ INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get());
sub.addArgument(baseDN);
subCommandsInitialized = true;
@@ -489,7 +489,7 @@
// Make sure that we have a sub-command.
if (parser.getSubCommand() == null)
{
- parser.displayMessageAndUsageReference(err, ERR_DBTEST_MISSING_SUBCOMMAND.get());
+ parser.displayMessageAndUsageReference(err, ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND.get());
return 1;
}
@@ -541,7 +541,7 @@
// Create a table of their properties.
TableBuilder builder = new TableBuilder();
- builder.appendHeading(INFO_LABEL_DBTEST_BACKEND_ID.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_BACKEND_ID.get());
builder.appendHeading(INFO_LABEL_DBTEST_DB_DIRECTORY.get());
for(Map.Entry<LocalDBBackendCfg, BackendImpl> backend :
@@ -575,13 +575,13 @@
StringBuilder failureReason = new StringBuilder();
if (! LockFileManager.acquireSharedLock(lockFile, failureReason))
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
return 1;
}
}
catch (Exception e)
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
return 1;
}
@@ -603,9 +603,9 @@
TableBuilder builder = new TableBuilder();
int count = 0;
- builder.appendHeading(INFO_LABEL_DBTEST_BASE_DN.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_BASE_DN.get());
builder.appendHeading(INFO_LABEL_DBTEST_JE_DATABASE_PREFIX.get());
- builder.appendHeading(INFO_LABEL_DBTEST_ENTRY_COUNT.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_ENTRY_COUNT.get());
for(EntryContainer ec : rc.getEntryContainers())
{
@@ -651,7 +651,7 @@
}
catch(DirectoryException de)
{
- printWrappedText(err, ERR_DBTEST_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
return 1;
}
}
@@ -663,13 +663,13 @@
StringBuilder failureReason = new StringBuilder();
if (! LockFileManager.acquireSharedLock(lockFile, failureReason))
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
return 1;
}
}
catch (Exception e)
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
return 1;
}
@@ -695,14 +695,14 @@
builder.appendHeading(INFO_LABEL_DBTEST_DATABASE_NAME.get());
builder.appendHeading(INFO_LABEL_DBTEST_DATABASE_TYPE.get());
builder.appendHeading(INFO_LABEL_DBTEST_JE_DATABASE_NAME.get());
- builder.appendHeading(INFO_LABEL_DBTEST_ENTRY_COUNT.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_ENTRY_COUNT.get());
if(base != null)
{
EntryContainer ec = rc.getEntryContainer(base);
if(ec == null)
{
- printWrappedText(err, ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
return 1;
}
@@ -773,12 +773,13 @@
StringBuilder failureReason = new StringBuilder();
if (!LockFileManager.releaseLock(lockFile, failureReason))
{
- printWrappedText(err, WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ printWrappedText(err, WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
}
}
catch (Exception e)
{
- printWrappedText(err, WARN_DBTEST_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
+ printWrappedText(err, WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND.get(
+ backend.getBackendID(), getExceptionMessage(e)));
}
}
@@ -804,7 +805,7 @@
return null;
}
}
- printWrappedText(err, ERR_DBTEST_NO_BACKENDS_FOR_ID.get(backendID));
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID.get(backendID));
return null;
}
@@ -825,7 +826,7 @@
}
catch(DirectoryException de)
{
- printWrappedText(err, ERR_DBTEST_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
return 1;
}
}
@@ -837,13 +838,13 @@
StringBuilder failureReason = new StringBuilder();
if (! LockFileManager.acquireSharedLock(lockFile, failureReason))
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
return 1;
}
}
catch (Exception e)
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
return 1;
}
@@ -866,11 +867,11 @@
TableBuilder builder = new TableBuilder();
int count = 0;
- builder.appendHeading(INFO_LABEL_DBTEST_INDEX_NAME.get());
- builder.appendHeading(INFO_LABEL_DBTEST_INDEX_TYPE.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_NAME.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE.get());
builder.appendHeading(INFO_LABEL_DBTEST_JE_DATABASE_NAME.get());
- builder.appendHeading(INFO_LABEL_DBTEST_INDEX_STATUS.get());
- builder.appendHeading(INFO_LABEL_DBTEST_JE_RECORD_COUNT.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_RECORD_COUNT.get());
builder.appendHeading(
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT.get());
builder.appendHeading(LocalizableMessage.raw("95%"));
@@ -881,7 +882,7 @@
EntryContainer ec = rc.getEntryContainer(base);
if(ec == null)
{
- printWrappedText(err, ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
return 1;
}
@@ -1023,7 +1024,7 @@
}
catch(DirectoryException de)
{
- printWrappedText(err, ERR_DBTEST_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_DECODE_BASE_DN.get(baseDN.getValue(), getExceptionMessage(de)));
return 1;
}
@@ -1034,13 +1035,13 @@
StringBuilder failureReason = new StringBuilder();
if (! LockFileManager.acquireSharedLock(lockFile, failureReason))
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
return 1;
}
}
catch (Exception e)
{
- printWrappedText(err, ERR_DBTEST_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), getExceptionMessage(e)));
return 1;
}
@@ -1061,7 +1062,7 @@
EntryContainer ec = rc.getEntryContainer(base);
if(ec == null)
{
- printWrappedText(err, ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
return 1;
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBStorage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBStorage.java
index 804b39d..23295b0 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBStorage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pdb/PDBStorage.java
@@ -697,7 +697,7 @@
private Exchange getNewExchange(final TreeName treeName, final boolean create) throws PersistitException
{
- return db.getExchange(volume, mangleTreeName(treeName), create);
+ return db.getExchange(volume, treeName.toString(), create);
}
private StorageImpl newStorageImpl() {
@@ -894,23 +894,6 @@
return new ImporterImpl();
}
- private static String mangleTreeName(final TreeName treeName)
- {
- String name = treeName.toString();
-
- StringBuilder mangled = new StringBuilder(name.length());
- for (int idx = 0; idx < name.length(); idx++)
- {
- char ch = name.charAt(idx);
- if (ch == '=' || ch == ',')
- {
- ch = '_';
- }
- mangled.append(ch);
- }
- return mangled.toString();
- }
-
@Override
public void write(final WriteOperation operation) throws Exception
{
@@ -1129,7 +1112,10 @@
final Set<TreeName> results = new HashSet<>(treeNames.length);
for (String treeName : treeNames)
{
- results.add(TreeName.valueOf(treeName));
+ if (!treeName.equals("_classIndex"))
+ {
+ results.add(TreeName.valueOf(treeName));
+ }
}
return results;
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AbstractTree.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AbstractTree.java
index 48f7940..5ed59dc 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AbstractTree.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AbstractTree.java
@@ -26,6 +26,7 @@
*/
package org.opends.server.backends.pluggable;
+import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.backends.pluggable.spi.ReadableTransaction;
import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
import org.opends.server.backends.pluggable.spi.TreeName;
@@ -87,4 +88,23 @@
{
return name.compareTo(o.getName());
}
+
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return key.toString();
+ }
+
+ @Override
+ public String valueToString(ByteString value)
+ {
+ return value.toString();
+ }
+
+ @Override
+ public ByteString generateKey(String key)
+ {
+ return ByteString.valueOf(key.getBytes());
+ }
}
+
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
index fb40abd..28f0626 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -188,6 +188,27 @@
}
}
}
+
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return indexer.keyToHumanReadableString(key);
+ }
+
+ @Override
+ public ByteString generateKey(String key)
+ {
+ try
+ {
+ SortedSet<ByteString> keys = new TreeSet<>();
+ indexer.createKeys(Schema.getDefaultSchema(), ByteString.valueOf(key.getBytes()), keys);
+ return keys.first();
+ }
+ catch (DecodeException e)
+ {
+ return super.generateKey(key);
+ }
+ }
}
/** The key bytes used for the presence index as a {@link ByteString}. */
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
index f941ce7..1aca1d5 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendImpl.java
@@ -1006,8 +1006,7 @@
* that is not related to the server
* configuration.
*/
- private final RootContainer getReadOnlyRootContainer()
- throws ConfigException, InitializationException
+ RootContainer getReadOnlyRootContainer() throws ConfigException, InitializationException
{
return newRootContainer(AccessMode.READ_ONLY);
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendTool.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendTool.java
new file mode 100644
index 0000000..1396b63
--- /dev/null
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/BackendTool.java
@@ -0,0 +1,1455 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ * Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ * Portions Copyright 2015 ForgeRock AS.
+ */
+package org.opends.server.backends.pluggable;
+
+import static org.opends.messages.ToolMessages.*;
+import static org.opends.server.util.StaticUtils.*;
+
+import static com.forgerock.opendj.cli.ArgumentConstants.*;
+import static com.forgerock.opendj.cli.Utils.*;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.config.SizeUnit;
+import org.forgerock.opendj.config.server.ConfigException;
+import org.forgerock.opendj.ldap.ByteString;
+import org.forgerock.util.Option;
+import org.forgerock.util.Options;
+import org.opends.server.admin.std.server.BackendCfg;
+import org.opends.server.admin.std.server.PluggableBackendCfg;
+import org.opends.server.api.Backend;
+import org.opends.server.backends.pluggable.spi.Cursor;
+import org.opends.server.backends.pluggable.spi.ReadOperation;
+import org.opends.server.backends.pluggable.spi.ReadableTransaction;
+import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
+import org.opends.server.backends.pluggable.spi.TreeName;
+import org.opends.server.core.CoreConfigManager;
+import org.opends.server.core.DirectoryServer;
+import org.opends.server.core.DirectoryServer.DirectoryServerVersionHandler;
+import org.opends.server.core.LockFileManager;
+import org.opends.server.extensions.ConfigFileHandler;
+import org.opends.server.loggers.JDKLogging;
+import org.opends.server.tools.BackendToolUtils;
+import org.opends.server.types.DN;
+import org.opends.server.types.DirectoryException;
+import org.opends.server.types.InitializationException;
+import org.opends.server.types.NullOutputStream;
+import org.opends.server.util.BuildVersion;
+import org.opends.server.util.StaticUtils;
+
+import com.forgerock.opendj.cli.Argument;
+import com.forgerock.opendj.cli.ArgumentException;
+import com.forgerock.opendj.cli.BooleanArgument;
+import com.forgerock.opendj.cli.CommonArguments;
+import com.forgerock.opendj.cli.IntegerArgument;
+import com.forgerock.opendj.cli.StringArgument;
+import com.forgerock.opendj.cli.SubCommand;
+import com.forgerock.opendj.cli.SubCommandArgumentParser;
+import com.forgerock.opendj.cli.TableBuilder;
+import com.forgerock.opendj.cli.TextTablePrinter;
+
+/**
+ * This program provides a utility that may be used to debug a Pluggable Backend.
+ * This tool provides the ability to:
+ * <ul>
+ * <li>list root containers</li>
+ * <li>list entry containers</li>
+ * <li>list Trees in a Backend or Storage</li>
+ * <li>gather information about Backend indexes</li>
+ * <li>dump the contents of a Tree either at the Backend or the Storage layer.</li>
+ * </ul>
+ * This will be a process that is intended to run outside of Directory Server and not
+ * internally within the server process (e.g., via the tasks interface); it still
+ * requires configuration information and access to Directory Server instance data.
+ */
+public class BackendTool
+{
+ /**
+ * Collects all necessary interaction interfaces with either a Backend using TreeNames
+ * or a storage using Trees.
+ */
+ interface TreeKeyValue
+ {
+ /**
+ * Returns a key given a string representation of it.
+ *
+ * @param data a string representation of the key.
+ * Prefixing with "0x" will interpret the rest of the string as an hex dump
+ * of the intended value.
+ * @return a key given a string representation of it
+ */
+ ByteString getTreeKey(String data);
+
+ /**
+ * Returns a printable string for the given key.
+ *
+ * @param key a key from the Tree
+ * @return a printable string for the given key
+ */
+ String keyDecoder(ByteString key);
+
+ /**
+ * Returns a printable string for the given value.
+ *
+ * @param value a value from the tree
+ * @return a printable string for the given value
+ */
+ String valueDecoder(ByteString value);
+
+ /**
+ * Returns the TreeName for this storage Tree.
+ *
+ * @return the TreeName for this storage Tree
+ */
+ TreeName getTreeName();
+ }
+
+ /** Stays at the storage level when cursoring Trees. */
+ static class StorageTreeKeyValue implements TreeKeyValue
+ {
+ private TreeName treeName;
+
+ public StorageTreeKeyValue(TreeName treeName)
+ {
+ this.treeName = treeName;
+ }
+
+ @Override
+ public TreeName getTreeName()
+ {
+ return treeName;
+ }
+
+ @Override
+ public ByteString getTreeKey(String data)
+ {
+ return ByteString.valueOf(data);
+ }
+
+ @Override
+ public String keyDecoder(ByteString key)
+ {
+ throw new UnsupportedOperationException(ERR_BACKEND_TOOL_DECODER_NOT_AVAILABLE.get().toString());
+ }
+
+ @Override
+ public String valueDecoder(ByteString value)
+ {
+ throw new UnsupportedOperationException(ERR_BACKEND_TOOL_DECODER_NOT_AVAILABLE.get().toString());
+ }
+ }
+
+ /** Delegate key semantics to the backend. */
+ static class BackendTreeKeyValue implements TreeKeyValue
+ {
+ private TreeName name;
+ private Tree tree;
+
+ public BackendTreeKeyValue(Tree tree)
+ {
+ this.tree = tree;
+ this.name = tree.getName();
+ }
+
+ @Override
+ public ByteString getTreeKey(String data)
+ {
+ if (data.length() == 0)
+ {
+ return ByteString.empty();
+ }
+ return tree.generateKey(data);
+ }
+
+ @Override
+ public String keyDecoder(ByteString key)
+ {
+ return tree.keyToString(key);
+ }
+
+ @Override
+ public String valueDecoder(ByteString value)
+ {
+ return tree.valueToString(value);
+ }
+
+ @Override
+ public TreeName getTreeName()
+ {
+ return name;
+ }
+ }
+
+ /** Statistics collector. */
+ class TreeStats
+ {
+ final long count;
+ final long totalKeySize;
+ final long totalDataSize;
+
+ TreeStats(long count, long tks, long tds)
+ {
+ this.count = count;
+ this.totalKeySize = tks;
+ this.totalDataSize = tds;
+ }
+ }
+
+ private static final Option<Boolean> DUMP_DECODE_VALUE = Option.withDefault(true);
+ private static final Option<Boolean> DUMP_STATS_ONLY = Option.withDefault(false);
+ private static final Option<Boolean> DUMP_SINGLE_LINE = Option.withDefault(false);
+ private static final Option<Argument> DUMP_MIN_KEY_VALUE = Option.of(Argument.class, null);
+ private static final Option<Argument> DUMP_MAX_KEY_VALUE = Option.of(Argument.class, null);
+ private static final Option<Boolean> DUMP_MIN_KEY_VALUE_IS_HEX = Option.withDefault(false);
+ private static final Option<Boolean> DUMP_MAX_KEY_VALUE_IS_HEX = Option.withDefault(false);
+ private static final Option<Integer> DUMP_MIN_DATA_SIZE = Option.of(Integer.class, 0);
+ private static final Option<Integer> DUMP_MAX_DATA_SIZE = Option.of(Integer.class, Integer.MAX_VALUE);
+ private static final Option<Integer> DUMP_INDENT = Option.of(Integer.class, 4);
+
+ private static final String LIST_STORAGE_TREES = "list-storage-trees";
+ private static final String DUMP_STORAGE_TREE = "dump-storage-tree";
+ private static final String LIST_BACKEND_TREES = "list-trees";
+ private static final String DUMP_TREE = "dump-tree";
+ private static final String LIST_ROOT_CONTAINERS = "list-root-containers";
+ private static final String LIST_ENTRY_CONTAINERS = "list-entry-containers";
+ private static final String LIST_INDEX_STATUS = "list-index-status";
+ private static final String BACKENDID_NAME = "backendid";
+ private static final String BACKENDID = "backendID";
+ private static final String BASEDN_NAME = "basedn";
+ private static final String BASEDN = "baseDN";
+ private static final String USESIUNITS_NAME = "usesiunits";
+ private static final String USESIUNITS = "useSIUnits";
+ private static final String MAXDATASIZE_NAME = "maxdatasize";
+ private static final String MAXDATASIZE = "maxDataSize";
+ private static final String MAXKEYVALUE_NAME = "maxkeyvalue";
+ private static final String MAXKEYVALUE = "maxKeyValue";
+ private static final String MAXHEXKEYVALUE_NAME = "maxhexkeyvalue";
+ private static final String MAXHEXKEYVALUE = "maxHexKeyValue";
+ private static final String MINDATASIZE_NAME = "mindatasize";
+ private static final String MINDATASIZE = "minDataSize";
+ private static final String MINKEYVALUE_NAME = "minkeyvalue";
+ private static final String MINKEYVALUE = "minKeyValue";
+ private static final String MINHEXKEYVALUE_NAME = "minhexkeyvalue";
+ private static final String MINHEXKEYVALUE = "minHexKeyValue";
+ private static final String SKIPDECODE_NAME = "skipdecode";
+ private static final String SKIPDECODE = "skipDecode";
+ private static final String STATSONLY_NAME = "statsonly";
+ private static final String STATSONLY = "statsOnly";
+ private static final String TREENAME_NAME = "treename";
+ private static final String TREENAME = "treeName";
+ private static final String SINGLELINE_NAME = "singleline";
+ private static final String SINGLELINE = "singleLine";
+
+ private static final int INDENT = 4;
+ private static final String HEXDUMP_LINE_FORMAT = "%s%s %s%n";
+
+ /** The error stream which this application should use. */
+ private final PrintStream err;
+ /** The output stream which this application should use. */
+ private final PrintStream out;
+
+ /** The command-line argument parser. */
+ private final SubCommandArgumentParser parser;
+ /** The argument which should be used to request usage information. */
+ private BooleanArgument showUsageArgument;
+ /** The argument which should be used to specify the config class. */
+ private StringArgument configClass;
+ /** The argument which should be used to specify the config file. */
+ private StringArgument configFile;
+
+ /** Flag indicating whether or not the sub-commands have already been initialized. */
+ private boolean subCommandsInitialized;
+ /** Flag indicating whether or not the global arguments have already been initialized. */
+ private boolean globalArgumentsInitialized;
+
+ private DirectoryServer directoryServer;
+
+ /**
+ * Provides the command-line arguments to the main application for
+ * processing.
+ *
+ * @param args The set of command-line arguments provided to this
+ * program.
+ */
+ public static void main(String[] args)
+ {
+ int exitCode = main(args, System.out, System.err);
+ if (exitCode != 0)
+ {
+ System.exit(filterExitCode(exitCode));
+ }
+ }
+
+ /**
+ * Provides the command-line arguments to the main application for
+ * processing and returns the exit code as an integer.
+ *
+ * @param args The set of command-line arguments provided to this
+ * program.
+ * @param outStream The output stream for standard output.
+ * @param errStream The output stream for standard error.
+ * @return Zero to indicate that the program completed successfully,
+ * or non-zero to indicate that an error occurred.
+ */
+ public static int main(String[] args, OutputStream outStream, OutputStream errStream)
+ {
+ BackendTool app = new BackendTool(outStream, errStream);
+ return app.run(args);
+ }
+
+ /**
+ * Creates a new dsconfig application instance.
+ *
+ * @param out The application output stream.
+ * @param err The application error stream.
+ */
+ public BackendTool(OutputStream out, OutputStream err)
+ {
+ this.out = NullOutputStream.wrapOrNullStream(out);
+ this.err = NullOutputStream.wrapOrNullStream(err);
+ JDKLogging.disableLogging();
+
+ LocalizableMessage toolDescription = INFO_DESCRIPTION_BACKEND_TOOL.get();
+ this.parser = new SubCommandArgumentParser(getClass().getName(), toolDescription, false);
+ this.parser.setShortToolDescription(REF_SHORT_DESC_BACKEND_TOOL.get());
+ this.parser.setVersionHandler(new DirectoryServerVersionHandler());
+ }
+
+ /**
+ * Registers the global arguments with the argument parser.
+ *
+ * @throws ArgumentException If a global argument could not be registered.
+ */
+ private void initializeGlobalArguments() throws ArgumentException
+ {
+ if (!globalArgumentsInitialized)
+ {
+ configClass =
+ new StringArgument("configclass", OPTION_SHORT_CONFIG_CLASS, OPTION_LONG_CONFIG_CLASS, true, false, true,
+ INFO_CONFIGCLASS_PLACEHOLDER.get(), ConfigFileHandler.class.getName(), null,
+ INFO_DESCRIPTION_CONFIG_CLASS.get());
+ configClass.setHidden(true);
+
+ configFile =
+ new StringArgument("configfile", 'f', "configFile", true, false, true, INFO_CONFIGFILE_PLACEHOLDER.get(),
+ null, null, INFO_DESCRIPTION_CONFIG_FILE.get());
+ configFile.setHidden(true);
+
+ showUsageArgument = CommonArguments.getShowUsage();
+
+ // Register the global arguments.
+ parser.addGlobalArgument(showUsageArgument);
+ parser.setUsageArgument(showUsageArgument, out);
+ parser.addGlobalArgument(configClass);
+ parser.addGlobalArgument(configFile);
+
+ globalArgumentsInitialized = true;
+ }
+ }
+
+ /**
+ * Registers the sub-commands with the argument parser.
+ *
+ * @throws ArgumentException If a sub-command could not be created.
+ */
+ private void initializeSubCommands() throws ArgumentException
+ {
+ if (!subCommandsInitialized)
+ {
+ SubCommand sub;
+
+ sub = new SubCommand(parser, LIST_ROOT_CONTAINERS,
+ INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS.get());
+
+ sub = new SubCommand(parser, LIST_ENTRY_CONTAINERS,
+ INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS.get());
+ addBackendArgument(sub);
+
+ sub = new SubCommand(parser, LIST_STORAGE_TREES, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_STORAGE_TREES.get());
+ addBackendArgument(sub);
+ BooleanArgument useSIUnits =
+ new BooleanArgument(USESIUNITS_NAME, 'u', USESIUNITS, INFO_DESCRIPTION_BACKEND_TOOL_USE_SI_UNITS.get());
+ sub.addArgument(useSIUnits);
+
+ sub = new SubCommand(parser, LIST_BACKEND_TREES, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_TREES.get());
+ addBackendBaseDNArguments(sub, false, false, true);
+
+ sub = new SubCommand(parser, DUMP_STORAGE_TREE, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_STORAGE_TREE.get());
+ addBackendArgument(sub);
+ addDumpSubCommandArguments(sub);
+ BooleanArgument singleLine =
+ new BooleanArgument(SINGLELINE_NAME, 'l', SINGLELINE, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_SINGLE_LINE.get());
+ sub.addArgument(singleLine);
+
+ sub = new SubCommand(parser, DUMP_TREE, INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_TREE.get());
+ addBackendBaseDNArguments(sub, true, false, true);
+ addDumpSubCommandArguments(sub);
+ BooleanArgument skipDecode =
+ new BooleanArgument(SKIPDECODE_NAME, 'p', SKIPDECODE, INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE.get());
+ sub.addArgument(skipDecode);
+
+ sub = new SubCommand(parser, LIST_INDEX_STATUS, INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS.get());
+ sub.setDocDescriptionSupplement(SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS.get());
+ addBackendBaseDNArguments(sub, true, true, true);
+
+ subCommandsInitialized = true;
+ }
+ }
+
+ private void addBackendArgument(SubCommand sub) throws ArgumentException
+ {
+ sub.addArgument(
+ new StringArgument(BACKENDID_NAME, 'n', BACKENDID, true, false, true, INFO_BACKENDNAME_PLACEHOLDER.get(), null,
+ null, INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID.get()));
+ }
+
+ private void addBackendBaseDNArguments(SubCommand sub, boolean isRequired, boolean isMultiValued, boolean needsValue)
+ throws ArgumentException
+ {
+ addBackendArgument(sub);
+ sub.addArgument(new StringArgument(BASEDN_NAME, 'b', BASEDN, isRequired, isMultiValued, needsValue,
+ INFO_BASEDN_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN.get()));
+ }
+
+ private void addDumpSubCommandArguments(SubCommand sub) throws ArgumentException
+ {
+ sub.addArgument(
+ new StringArgument(TREENAME_NAME, 't', TREENAME, true, false, true, INFO_DATABASE_NAME_PLACEHOLDER.get(), null,
+ null, INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME.get()));
+ sub.addArgument(new BooleanArgument(STATSONLY_NAME, 'q', STATSONLY,
+ INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY.get()));
+ sub.addArgument(newMaxKeyValueArg());
+ sub.addArgument(newMinKeyValueArg());
+ sub.addArgument(new StringArgument(MAXHEXKEYVALUE_NAME, 'X', MAXHEXKEYVALUE, false, false, true,
+ INFO_MAX_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get()));
+ sub.addArgument(new StringArgument(MINHEXKEYVALUE_NAME, 'x', MINHEXKEYVALUE, false, false, true,
+ INFO_MIN_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get()));
+ sub.addArgument(new IntegerArgument(MAXDATASIZE_NAME, 'S', MAXDATASIZE, false, false, true,
+ INFO_MAX_DATA_SIZE_PLACEHOLDER.get(), -1, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE.get()));
+ sub.addArgument(new IntegerArgument(MINDATASIZE_NAME, 's', MINDATASIZE, false, false, true,
+ INFO_MIN_DATA_SIZE_PLACEHOLDER.get(), -1, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE.get()));
+ }
+
+ private StringArgument newMinKeyValueArg() throws ArgumentException
+ {
+ return new StringArgument(MINKEYVALUE_NAME, 'k', MINKEYVALUE, false, false, true,
+ INFO_MIN_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE.get());
+ }
+
+ private StringArgument newMaxKeyValueArg() throws ArgumentException
+ {
+ return new StringArgument(MAXKEYVALUE_NAME, 'K', MAXKEYVALUE, false, false, true,
+ INFO_MAX_KEY_VALUE_PLACEHOLDER.get(), null, null, INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE.get());
+ }
+
+ /**
+ * Parses the provided command-line arguments and makes the
+ * appropriate changes to the Directory Server configuration.
+ *
+ * @param args The command-line arguments provided to this program.
+ * @return The exit code from the configuration processing. A
+ * nonzero value indicates that there was some kind of
+ * problem during the configuration processing.
+ */
+ private int run(String[] args)
+ {
+ // Register global arguments and sub-commands.
+ try
+ {
+ initializeGlobalArguments();
+ initializeSubCommands();
+ }
+ catch (ArgumentException e)
+ {
+ printWrappedText(err, ERR_CANNOT_INITIALIZE_ARGS.get(e.getMessage()));
+ return 1;
+ }
+
+ try
+ {
+ parser.parseArguments(args);
+ }
+ catch (ArgumentException ae)
+ {
+ parser.displayMessageAndUsageReference(err, ERR_ERROR_PARSING_ARGS.get(ae.getMessage()));
+ return 1;
+ }
+
+ if (parser.usageOrVersionDisplayed())
+ {
+ return 0;
+ }
+
+ if (parser.getSubCommand() == null)
+ {
+ parser.displayMessageAndUsageReference(err, ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND.get());
+ return 1;
+ }
+
+ try
+ {
+ BuildVersion.checkVersionMismatch();
+ }
+ catch (InitializationException e)
+ {
+ printWrappedText(err, e.getMessageObject());
+ return 1;
+ }
+
+ // Perform the initial bootstrap of the Directory Server and process the configuration.
+ directoryServer = DirectoryServer.getInstance();
+ try
+ {
+ DirectoryServer.bootstrapClient();
+ DirectoryServer.initializeJMX();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_SERVER_BOOTSTRAP_ERROR.get(getStartUpExceptionMessage(e)));
+ return 1;
+ }
+
+ try
+ {
+ directoryServer.initializeConfiguration(configClass.getValue(), configFile.getValue());
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_CANNOT_LOAD_CONFIG.get(getStartUpExceptionMessage(e)));
+ return 1;
+ }
+
+ try
+ {
+ directoryServer.initializeSchema();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_CANNOT_LOAD_SCHEMA.get(getStartUpExceptionMessage(e)));
+ return 1;
+ }
+
+ try
+ {
+ CoreConfigManager coreConfigManager = new CoreConfigManager(directoryServer.getServerContext());
+ coreConfigManager.initializeCoreConfig();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_CANNOT_INITIALIZE_CORE_CONFIG.get(getStartUpExceptionMessage(e)));
+ return 1;
+ }
+
+ try
+ {
+ directoryServer.initializeCryptoManager();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_CANNOT_INITIALIZE_CRYPTO_MANAGER.get(getStartUpExceptionMessage(e)));
+ return 1;
+ }
+
+ SubCommand subCommand = parser.getSubCommand();
+ if (LIST_ROOT_CONTAINERS.equals(subCommand.getName()))
+ {
+ return listRootContainers();
+ }
+ BackendImpl backend = getBackendById(subCommand.getArgument(BACKENDID_NAME));
+ if (backend == null)
+ {
+ return 1;
+ }
+ RootContainer rootContainer = getAndLockRootContainer(backend);
+ if (rootContainer == null)
+ {
+ return 1;
+ }
+ try
+ {
+ switch (subCommand.getName())
+ {
+ case LIST_ENTRY_CONTAINERS:
+ return listEntryContainers(rootContainer);
+ case LIST_STORAGE_TREES:
+ return listStorageTrees(rootContainer, subCommand.getArgument(USESIUNITS_NAME));
+ case LIST_BACKEND_TREES:
+ return listBackendTrees(rootContainer, backend, subCommand.getArgument(BASEDN_NAME));
+ case DUMP_STORAGE_TREE:
+ return dumpTree(rootContainer, backend, subCommand, false);
+ case DUMP_TREE:
+ return dumpTree(rootContainer, backend, subCommand, true);
+ case LIST_INDEX_STATUS:
+ return listIndexStatus(rootContainer, backend, subCommand.getArgument(BASEDN_NAME));
+ default:
+ return 1;
+ }
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_EXECUTING_COMMAND.get(subCommand.getName(),
+ StaticUtils.stackTraceToString(e)));
+ return 1;
+ }
+ finally
+ {
+ close(rootContainer);
+ releaseExclusiveLock(backend);
+ }
+ }
+
+ private String getStartUpExceptionMessage(Exception e)
+ {
+ if (e instanceof ConfigException || e instanceof InitializationException)
+ {
+ return e.getMessage();
+ }
+ return getExceptionMessage(e).toString();
+ }
+
+ private int dumpTree(RootContainer rc, BackendImpl backend, SubCommand subCommand, boolean isBackendTree)
+ throws ArgumentException, DirectoryException
+ {
+ Options options = Options.defaultOptions();
+ if (!setDumpTreeOptionArguments(subCommand, options))
+ {
+ return 1;
+ }
+ if (isBackendTree)
+ {
+ return dumpBackendTree(rc, backend, subCommand.getArgument(BASEDN_NAME), subCommand.getArgument(TREENAME_NAME),
+ options);
+ }
+ return dumpStorageTree(rc, backend, subCommand.getArgument(TREENAME_NAME), options);
+ }
+
+ private boolean setDumpTreeOptionArguments(SubCommand subCommand, Options options) throws ArgumentException
+ {
+ try
+ {
+ Argument arg = subCommand.getArgument(SINGLELINE_NAME);
+ if (arg != null && arg.isPresent())
+ {
+ options.set(DUMP_SINGLE_LINE, true);
+ }
+ if (subCommand.getArgument(STATSONLY_NAME).isPresent())
+ {
+ options.set(DUMP_STATS_ONLY, true);
+ }
+ arg = subCommand.getArgument(SKIPDECODE_NAME);
+ if (arg == null || arg.isPresent())
+ {
+ options.set(DUMP_DECODE_VALUE, false);
+ }
+ if (subCommand.getArgument(MINDATASIZE_NAME).isPresent())
+ {
+ options.set(DUMP_MIN_DATA_SIZE, subCommand.getArgument(MINDATASIZE_NAME).getIntValue());
+ }
+ if (subCommand.getArgument(MAXDATASIZE_NAME).isPresent())
+ {
+ options.set(DUMP_MAX_DATA_SIZE, subCommand.getArgument(MAXDATASIZE_NAME).getIntValue());
+ }
+
+ options.set(DUMP_MIN_KEY_VALUE, subCommand.getArgument(MINKEYVALUE_NAME));
+ if (subCommand.getArgument(MINHEXKEYVALUE_NAME).isPresent())
+ {
+ if (subCommand.getArgument(MINKEYVALUE_NAME).isPresent())
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ONLY_ONE_MIN_KEY.get());
+ return false;
+ }
+ options.set(DUMP_MIN_KEY_VALUE_IS_HEX, true);
+ options.set(DUMP_MIN_KEY_VALUE, subCommand.getArgument(MINHEXKEYVALUE_NAME));
+ }
+
+ options.set(DUMP_MAX_KEY_VALUE, subCommand.getArgument(MAXKEYVALUE_NAME));
+ if (subCommand.getArgument(MAXHEXKEYVALUE_NAME).isPresent())
+ {
+ if (subCommand.getArgument(MAXKEYVALUE_NAME).isPresent())
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ONLY_ONE_MAX_KEY.get());
+ return false;
+ }
+ options.set(DUMP_MAX_KEY_VALUE_IS_HEX, true);
+ options.set(DUMP_MAX_KEY_VALUE, subCommand.getArgument(MAXHEXKEYVALUE_NAME));
+ }
+ return true;
+ }
+ catch (ArgumentException ae)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_PROCESSING_ARGUMENT.get(StaticUtils.stackTraceToString(ae)));
+ throw ae;
+ }
+ }
+
+ private int listRootContainers()
+ {
+ TableBuilder builder = new TableBuilder();
+
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_BACKEND_ID.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_STORAGE.get());
+
+ final Map<PluggableBackendCfg, BackendImpl> pluggableBackends = getPluggableBackends();
+ for (Map.Entry<PluggableBackendCfg, BackendImpl> backend : pluggableBackends.entrySet())
+ {
+ builder.startRow();
+ builder.appendCell(backend.getValue().getBackendID());
+ builder.appendCell(backend.getKey().getJavaClass());
+ }
+
+ builder.print(new TextTablePrinter(out));
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL.get(pluggableBackends.size()).toString());
+
+ return 0;
+ }
+
+ private int listEntryContainers(RootContainer rc)
+ {
+ try
+ {
+ TableBuilder builder = new TableBuilder();
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_BASE_DN.get());
+ Collection<EntryContainer> entryContainers = rc.getEntryContainers();
+ for (EntryContainer ec : entryContainers)
+ {
+ builder.startRow();
+ builder.appendCell(ec.getBaseDN());
+ }
+
+ builder.print(new TextTablePrinter(out));
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL.get(entryContainers.size()).toString());
+
+ return 0;
+ }
+ catch (StorageRuntimeException de)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_ENTRY_CONTAINERS.get(stackTraceToSingleLineString(de)));
+ return 1;
+ }
+ }
+
+ private int listStorageTrees(RootContainer rc, Argument useSIUnits)
+ {
+ try
+ {
+ TableBuilder builder = new TableBuilder();
+
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_STORAGE_TREE_NAME.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_TOTAL_KEYS.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_KEYS_SIZE.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_VALUES_SIZE.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_TOTAL_SIZES.get());
+
+ SortedSet<TreeName> treeNames = new TreeSet<>(rc.getStorage().listTrees());
+ for (TreeName tree: treeNames)
+ {
+ builder.startRow();
+ builder.appendCell(tree);
+ appendStorageTreeStats(builder, rc, new StorageTreeKeyValue(tree), useSIUnits.isPresent());
+ }
+
+ builder.print(new TextTablePrinter(out));
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL.get(treeNames.size()).toString());
+
+ return 0;
+ }
+ catch (StorageRuntimeException de)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_LISTING_TREES.get(stackTraceToSingleLineString(de)));
+ return 1;
+ }
+ }
+
+ private void appendStorageTreeStats(TableBuilder builder, RootContainer rc, TreeKeyValue targetTree,
+ boolean useSIUnit)
+ {
+ Options options = Options.defaultOptions();
+ options.set(DUMP_STATS_ONLY, true);
+ try
+ {
+ options.set(DUMP_MIN_KEY_VALUE, newMinKeyValueArg());
+ options.set(DUMP_MAX_KEY_VALUE, newMaxKeyValueArg());
+ TreeStats treeStats = cursorTreeToDump(rc, targetTree, options);
+ builder.appendCell(treeStats.count);
+ builder.appendCell(appendKeyValueSize(treeStats.totalKeySize, useSIUnit));
+ builder.appendCell(appendKeyValueSize(treeStats.totalDataSize, useSIUnit));
+ builder.appendCell(appendKeyValueSize(treeStats.totalKeySize + treeStats.totalDataSize, useSIUnit));
+ }
+ catch (Exception e)
+ {
+ appendStatsNoData(builder, 3);
+ }
+ }
+
+ private String appendKeyValueSize(long size, boolean useSIUnit)
+ {
+ if (useSIUnit && size > SizeUnit.KILO_BYTES.getSize())
+ {
+ NumberFormat format = NumberFormat.getNumberInstance();
+ format.setMaximumFractionDigits(2);
+ SizeUnit unit = SizeUnit.getBestFitUnit(size);
+ return format.format(unit.fromBytes(size)) + " " + unit;
+ }
+ else
+ {
+ return String.valueOf(size);
+ }
+ }
+
+ private int listBackendTrees(RootContainer rc, BackendImpl backend, Argument baseDNArg) throws DirectoryException
+ {
+ DN base = null;
+ if (baseDNArg.isPresent())
+ {
+ base = getBaseDNFromArg(baseDNArg);
+ }
+
+ try
+ {
+ TableBuilder builder = new TableBuilder();
+ int count = 0;
+
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_NAME.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_RECORD_COUNT.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_BACKEND_TREE_NAME.get());
+
+ if (base != null)
+ {
+ EntryContainer ec = rc.getEntryContainer(base);
+ if (ec == null)
+ {
+ return printEntryContainerError(backend, base);
+ }
+ count = appendTreeRows(builder, ec);
+ }
+ else
+ {
+ for (EntryContainer ec : rc.getEntryContainers())
+ {
+ builder.startRow();
+ builder.appendCell("Base DN: " + ec.getBaseDN());
+ count += appendTreeRows(builder, ec);
+ }
+ }
+
+ builder.print(new TextTablePrinter(out));
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL.get(count).toString());
+
+ return 0;
+ }
+ catch (StorageRuntimeException de)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_LISTING_TREES.get(stackTraceToSingleLineString(de)));
+ return 1;
+ }
+ }
+
+ private int printEntryContainerError(BackendImpl backend, DN base)
+ {
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN.get(base, backend.getBackendID()));
+ return 1;
+ }
+
+ private DN getBaseDNFromArg(Argument baseDNArg) throws DirectoryException
+ {
+ try
+ {
+ return DN.valueOf(baseDNArg.getValue());
+ }
+ catch (DirectoryException de)
+ {
+ printWrappedText(err, ERR_BACKEND_DEBUG_DECODE_BASE_DN.get(baseDNArg.getValue(), getExceptionMessage(de)));
+ throw de;
+ }
+ }
+
+ private RootContainer getAndLockRootContainer(BackendImpl backend)
+ {
+ try
+ {
+ String lockFile = LockFileManager.getBackendLockFileName(backend);
+ StringBuilder failureReason = new StringBuilder();
+ if (!LockFileManager.acquireExclusiveLock(lockFile, failureReason))
+ {
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ return null;
+ }
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND.get(backend.getBackendID(), StaticUtils
+ .getExceptionMessage(e)));
+ return null;
+ }
+
+ try
+ {
+ return backend.getReadOnlyRootContainer();
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND.get(backend.getBackendID(),
+ stackTraceToSingleLineString(e)));
+ return null;
+ }
+ }
+
+ private int appendTreeRows(TableBuilder builder, EntryContainer ec)
+ {
+ int count = 0;
+ for (final Tree tree : ec.listTrees())
+ {
+ builder.startRow();
+ builder.appendCell(tree.getName().getIndexId());
+ builder.appendCell(tree.getClass().getSimpleName());
+ builder.appendCell(getTreeRecordCount(ec, tree));
+ builder.appendCell(tree.getName());
+ count++;
+ }
+ return count;
+ }
+
+ private long getTreeRecordCount(EntryContainer ec, final Tree tree)
+ {
+ try
+ {
+ return ec.getRootContainer().getStorage().read(new ReadOperation<Long>()
+ {
+ @Override
+ public Long run(ReadableTransaction txn) throws Exception
+ {
+ return tree.getRecordCount(txn);
+ }
+ });
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_TREE.get(stackTraceToSingleLineString(e)));
+ return -1;
+ }
+ }
+
+ private void close(RootContainer rc)
+ {
+ try
+ {
+ rc.close();
+ }
+ catch (StorageRuntimeException ignored)
+ {
+ // Ignore.
+ }
+ }
+
+ private void releaseExclusiveLock(BackendImpl backend)
+ {
+ try
+ {
+ String lockFile = LockFileManager.getBackendLockFileName(backend);
+ StringBuilder failureReason = new StringBuilder();
+ if (!LockFileManager.releaseLock(lockFile, failureReason))
+ {
+ printWrappedText(err, WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(), failureReason));
+ }
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND.get(backend.getBackendID(),
+ StaticUtils.getExceptionMessage(e)));
+ }
+ }
+
+ private BackendImpl getBackendById(Argument backendIdArg)
+ {
+ final String backendID = backendIdArg.getValue();
+ final Map<PluggableBackendCfg, BackendImpl> pluggableBackends = getPluggableBackends();
+
+ for (Map.Entry<PluggableBackendCfg, BackendImpl> backend : pluggableBackends.entrySet())
+ {
+ final BackendImpl b = backend.getValue();
+ if (b.getBackendID().equalsIgnoreCase(backendID))
+ {
+ try
+ {
+ b.configureBackend(backend.getKey(), directoryServer.getServerContext());
+ return b;
+ }
+ catch (ConfigException ce)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_CANNOT_CONFIGURE_BACKEND.get(backendID, ce));
+ return null;
+ }
+ }
+ }
+
+ printWrappedText(err, ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID.get(backendID));
+ return null;
+ }
+
+ private int listIndexStatus(RootContainer rc, BackendImpl backend, Argument baseDNArg) throws DirectoryException
+ {
+ DN base = getBaseDNFromArg(baseDNArg);
+
+ try
+ {
+ // Create a table of their properties.
+ TableBuilder builder = new TableBuilder();
+ int count = 0;
+
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_NAME.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_BACKEND_TREE_NAME.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_DEBUG_RECORD_COUNT.get());
+ builder.appendHeading(INFO_LABEL_BACKEND_TOOL_INDEX_UNDEFINED_RECORD_COUNT.get());
+ builder.appendHeading(LocalizableMessage.raw("95%"));
+ builder.appendHeading(LocalizableMessage.raw("90%"));
+ builder.appendHeading(LocalizableMessage.raw("85%"));
+
+ EntryContainer ec = rc.getEntryContainer(base);
+ if (ec == null)
+ {
+ return printEntryContainerError(backend, base);
+ }
+
+ Map<Index, StringBuilder> undefinedKeys = new HashMap<>();
+ for (AttributeIndex attrIndex : ec.getAttributeIndexes())
+ {
+ for (AttributeIndex.MatchingRuleIndex index : attrIndex.getNameToIndexes().values())
+ {
+ builder.startRow();
+ builder.appendCell(index.getName().getIndexId());
+ builder.appendCell(index.getName());
+ builder.appendCell(index.isTrusted());
+ if (index.isTrusted())
+ {
+ appendIndexStats(builder, ec, index, undefinedKeys);
+ }
+ else
+ {
+ appendStatsNoData(builder, 5);
+ }
+ count++;
+ }
+ }
+
+ for (VLVIndex vlvIndex : ec.getVLVIndexes())
+ {
+ builder.startRow();
+ builder.appendCell(vlvIndex.getName().getIndexId());
+ builder.appendCell(vlvIndex.getName());
+ builder.appendCell(vlvIndex.isTrusted());
+ builder.appendCell(getTreeRecordCount(ec, vlvIndex));
+ appendStatsNoData(builder, 4);
+ count++;
+ }
+
+ builder.print(new TextTablePrinter(out));
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL.get(count).toString());
+ for (Map.Entry<Index, StringBuilder> e : undefinedKeys.entrySet())
+ {
+ out.format(INFO_LABEL_BACKEND_TOOL_INDEX.get(e.getKey().getName()).toString());
+ out.format(INFO_LABEL_BACKEND_TOOL_OVER_INDEX_LIMIT_KEYS.get(e.getValue()).toString());
+ }
+ return 0;
+ }
+ catch (StorageRuntimeException de)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_TREE.get(stackTraceToSingleLineString(de)));
+ return 1;
+ }
+ }
+
+ private void appendStatsNoData(TableBuilder builder, int columns)
+ {
+ while (columns > 0)
+ {
+ builder.appendCell("-");
+ columns--;
+ }
+ }
+
+ private void appendIndexStats(final TableBuilder builder, EntryContainer ec, final Index index,
+ final Map<Index, StringBuilder> undefinedKeys)
+ {
+ final long entryLimit = index.getIndexEntryLimit();
+
+ try
+ {
+ ec.getRootContainer().getStorage().read(new ReadOperation<Void>()
+ {
+ @Override
+ public Void run(ReadableTransaction txn) throws Exception
+ {
+ long eighty = 0;
+ long ninety = 0;
+ long ninetyFive = 0;
+ long invalidIDSet = 0;
+ long undefined = 0;
+ long count = 0;
+ BackendTreeKeyValue keyDecoder = new BackendTreeKeyValue(index);
+ try (Cursor<ByteString, EntryIDSet> cursor = index.openCursor(txn))
+ {
+ while (cursor.next())
+ {
+ count++;
+ EntryIDSet entryIDSet = null;
+ try
+ {
+ entryIDSet = cursor.getValue();
+ }
+ catch (Exception e)
+ {
+ invalidIDSet++;
+ continue;
+ }
+
+ if (entryIDSet.isDefined())
+ {
+ if (entryIDSet.size() >= entryLimit * 0.8)
+ {
+ if (entryIDSet.size() >= entryLimit * 0.95)
+ {
+ ninetyFive++;
+ }
+ else if (entryIDSet.size() >= entryLimit * 0.9)
+ {
+ ninety++;
+ }
+ else
+ {
+ eighty++;
+ }
+ }
+ }
+ else
+ {
+ undefined++;
+ StringBuilder keyList = undefinedKeys.get(index);
+ if (keyList == null)
+ {
+ keyList = new StringBuilder();
+ undefinedKeys.put(index, keyList);
+ }
+ else
+ {
+ keyList.append(" ");
+ }
+ keyList.append("[").append(keyDecoder.keyDecoder(cursor.getKey())).append("]");
+ }
+ }
+ }
+ builder.appendCell(count);
+ builder.appendCell(undefined);
+ builder.appendCell(ninetyFive);
+ builder.appendCell(ninety);
+ builder.appendCell(eighty);
+ return null;
+ }
+ });
+ }
+ catch (Exception e)
+ {
+ appendStatsNoData(builder, 5);
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_TREE.get(index.getName()));
+ }
+ }
+
+ private int dumpStorageTree(RootContainer rc, BackendImpl backend, Argument treeNameArg, Options options)
+ {
+ TreeName targetTree = getStorageTreeName(treeNameArg, rc);
+ if (targetTree == null)
+ {
+ printWrappedText(err,
+ ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_IN_STORAGE.get(treeNameArg.getValue(), backend.getBackendID()));
+ return 1;
+ }
+
+ try
+ {
+ dumpActualTree(rc, new StorageTreeKeyValue(targetTree), options);
+ return 0;
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_TREE.get(stackTraceToSingleLineString(e)));
+ return 1;
+ }
+ }
+
+ private TreeName getStorageTreeName(Argument treeNameArg, RootContainer rc)
+ {
+ for (TreeName tree : rc.getStorage().listTrees())
+ {
+ if (treeNameArg.getValue().equals(tree.toString()))
+ {
+ return tree;
+ }
+ }
+ return null;
+ }
+
+ private int dumpBackendTree(RootContainer rc, BackendImpl backend, Argument baseDNArg, Argument treeNameArg,
+ Options options) throws DirectoryException
+ {
+ DN base = getBaseDNFromArg(baseDNArg);
+
+ EntryContainer ec = rc.getEntryContainer(base);
+ if (ec == null)
+ {
+ return printEntryContainerError(backend, base);
+ }
+
+ Tree targetTree = getBackendTree(treeNameArg, ec);
+ if (targetTree == null)
+ {
+ printWrappedText(err,
+ ERR_BACKEND_TOOL_NO_TREE_FOR_NAME.get(treeNameArg.getValue(), base, backend.getBackendID()));
+ return 1;
+ }
+
+ try
+ {
+ dumpActualTree(rc, new BackendTreeKeyValue(targetTree), options);
+ return 0;
+ }
+ catch (Exception e)
+ {
+ printWrappedText(err, ERR_BACKEND_TOOL_ERROR_READING_TREE.get(stackTraceToSingleLineString(e)));
+ return 1;
+ }
+ }
+
+ private Tree getBackendTree(Argument treeNameArg, EntryContainer ec)
+ {
+ for (Tree tree : ec.listTrees())
+ {
+ if (treeNameArg.getValue().contains(tree.getName().getIndexId())
+ || treeNameArg.getValue().equals(tree.getName().toString()))
+ {
+ return tree;
+ }
+ }
+ return null;
+ }
+
+ private void dumpActualTree(RootContainer rc, final TreeKeyValue target, final Options options) throws Exception
+ {
+ TreeStats treeStats = cursorTreeToDump(rc, target, options);
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL_RECORDS.get(treeStats.count).toString());
+ if (treeStats.count > 0)
+ {
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL_KEY_SIZE_AND_AVG.get(
+ treeStats.totalKeySize, treeStats.totalKeySize / treeStats.count).toString());
+ out.format(INFO_LABEL_BACKEND_TOOL_TOTAL_DATA_SIZE_AND_AVG.get(
+ treeStats.totalDataSize, treeStats.totalDataSize / treeStats.count).toString());
+ }
+ }
+
+ private TreeStats cursorTreeToDump(RootContainer rc, final TreeKeyValue target, final Options options)
+ throws Exception
+ {
+ return rc.getStorage().read(new ReadOperation<TreeStats>()
+ {
+ @Override
+ public TreeStats run(ReadableTransaction txn) throws Exception
+ {
+ long count = 0;
+ long totalKeySize = 0;
+ long totalDataSize = 0;
+ try (final Cursor<ByteString, ByteString> cursor = txn.openCursor(target.getTreeName()))
+ {
+ ByteString key;
+ ByteString maxKey = null;
+ ByteString value;
+ boolean maxKeyReached = false;
+
+ if (options.get(DUMP_MIN_KEY_VALUE).isPresent())
+ {
+ key = getMinOrMaxKey(options, DUMP_MIN_KEY_VALUE, DUMP_MIN_KEY_VALUE_IS_HEX);
+ if (!cursor.positionToKeyOrNext(key))
+ {
+ return new TreeStats(0, 0, 0);
+ }
+ }
+ else
+ {
+ if (!cursor.next())
+ {
+ return new TreeStats(0, 0, 0);
+ }
+ }
+
+ if (options.get(DUMP_MAX_KEY_VALUE).isPresent())
+ {
+ maxKey = getMinOrMaxKey(options, DUMP_MAX_KEY_VALUE, DUMP_MAX_KEY_VALUE_IS_HEX);
+ }
+
+ do
+ {
+ key = cursor.getKey();
+ maxKeyReached = key.equals(maxKey);
+ value = cursor.getValue();
+ long valueLen = value.length();
+ if (options.get(DUMP_MIN_DATA_SIZE) <= valueLen && valueLen <= options.get(DUMP_MAX_DATA_SIZE))
+ {
+ count++;
+ int keyLen = key.length();
+ totalKeySize += keyLen;
+ totalDataSize += valueLen;
+ if (!options.get(DUMP_STATS_ONLY))
+ {
+ if (options.get(DUMP_DECODE_VALUE))
+ {
+ String k = target.keyDecoder(key);
+ String v = target.valueDecoder(value);
+ out.format(INFO_LABEL_BACKEND_TOOL_KEY_FORMAT.get(keyLen) + " %s%n"
+ + INFO_LABEL_BACKEND_TOOL_VALUE_FORMAT.get(valueLen) + " %s%n", k, v);
+ }
+ else
+ {
+ hexDumpRecord(key, value, out, options);
+ }
+ }
+ }
+ }
+ while (cursor.next() && !maxKeyReached);
+ }
+ catch (Exception e)
+ {
+ out.format(ERR_BACKEND_TOOL_CURSOR_AT_KEY_NUMBER.get(count, e.getCause()).toString());
+ e.printStackTrace(out);
+ out.format("%n");
+ throw e;
+ }
+ return new TreeStats(count, totalKeySize, totalDataSize);
+ }
+
+ private ByteString getMinOrMaxKey(Options options, Option<Argument> keyOpt, Option<Boolean> isHexKey)
+ {
+ ByteString key;
+ if (options.get(isHexKey))
+ {
+ key = ByteString.valueOfHex(options.get(keyOpt).getValue());
+ }
+ else
+ {
+ key = target.getTreeKey(options.get(keyOpt).getValue());
+ }
+ return key;
+ }
+ });
+ }
+
+ final void hexDumpRecord(ByteString key, ByteString value, PrintStream out, Options options)
+ {
+ if (options.get(DUMP_SINGLE_LINE))
+ {
+ out.format(INFO_LABEL_BACKEND_TOOL_KEY_FORMAT.get(key.length()) + " ");
+ toHexDumpSingleLine(out, key);
+ out.format(INFO_LABEL_BACKEND_TOOL_VALUE_FORMAT.get(value.length()) + " ");
+ toHexDumpSingleLine(out, value);
+ }
+ else
+ {
+ out.format(INFO_LABEL_BACKEND_TOOL_KEY_FORMAT.get(key.length()) + "%n");
+ toHexDumpWithAsciiCompact(key, options.get(DUMP_INDENT), out);
+ out.format(INFO_LABEL_BACKEND_TOOL_VALUE_FORMAT.get(value.length()) + "%n");
+ toHexDumpWithAsciiCompact(value, options.get(DUMP_INDENT), out);
+ }
+ }
+
+ final void toHexDumpSingleLine(PrintStream out, ByteString data)
+ {
+ for (int i = 0; i < data.length(); i++)
+ {
+ out.format("%s", StaticUtils.byteToHex(data.byteAt(i)));
+ }
+ out.format("%n");
+ }
+
+ final void toHexDumpWithAsciiCompact(ByteString data, int indent, PrintStream out)
+ {
+ StringBuilder hexDump = new StringBuilder();
+ StringBuilder indentBuilder = new StringBuilder();
+ StringBuilder asciiDump = new StringBuilder();
+ for (int i = 0; i < indent; i++)
+ {
+ indentBuilder.append(' ');
+ }
+ int pos = 0;
+ while (pos < data.length())
+ {
+ byte val = data.byteAt(pos);
+ hexDump.append(StaticUtils.byteToHex(val));
+ hexDump.append(' ');
+ asciiDump.append(val >= ' ' ? (char)val : ".");
+ pos++;
+ if (pos % 16 == 0)
+ {
+ out.format(HEXDUMP_LINE_FORMAT, indentBuilder.toString(), hexDump.toString(), asciiDump.toString());
+ hexDump.setLength(0);
+ asciiDump.setLength(0);
+ }
+ }
+ while (pos % 16 != 0)
+ {
+ hexDump.append(" ");
+ pos++;
+ }
+ out.format(HEXDUMP_LINE_FORMAT, indentBuilder.toString(), hexDump.toString(), asciiDump.toString());
+ }
+
+ private static Map<PluggableBackendCfg, BackendImpl> getPluggableBackends()
+ {
+ ArrayList<Backend> backendList = new ArrayList<>();
+ ArrayList<BackendCfg> entryList = new ArrayList<>();
+ ArrayList<List<DN>> dnList = new ArrayList<>();
+ BackendToolUtils.getBackends(backendList, entryList, dnList);
+
+ final Map<PluggableBackendCfg, BackendImpl> pluggableBackends = new LinkedHashMap<>();
+ for (int i = 0; i < backendList.size(); i++)
+ {
+ Backend<?> backend = backendList.get(i);
+ if (backend instanceof BackendImpl)
+ {
+ pluggableBackends.put((PluggableBackendCfg) entryList.get(i), (BackendImpl) backend);
+ }
+ }
+ return pluggableBackends;
+ }
+}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java
index afadc3e..903b98f 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java
@@ -209,6 +209,31 @@
return nbSeparator == 1;
}
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return key.length() > 0 ? keyToDNString(key) : baseDN.toString();
+ }
+
+ @Override
+ public String valueToString(ByteString value)
+ {
+ return new EntryID(value).toString();
+ }
+
+ @Override
+ public ByteString generateKey(String key)
+ {
+ try
+ {
+ return toKey(DN.valueOf(key));
+ }
+ catch (Exception e)
+ {
+ return ByteString.valueOf(key.getBytes());
+ }
+ }
+
/**
* Decorator overriding the next() behavior to iterate through children of the entry pointed by the given cursor at
* creation.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2URI.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2URI.java
index db9c584..0b59449 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2URI.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2URI.java
@@ -419,6 +419,31 @@
}
}
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return key.toString();
+ }
+
+ @Override public String valueToString(ByteString value)
+ {
+ final Map.Entry<DN, List<String>> dnAndUris = decode(value);
+ return dnAndUris.getValue().toString();
+ }
+
+ @Override
+ public ByteString generateKey(String key)
+ {
+ try
+ {
+ return toKey(DN.valueOf(key));
+ }
+ catch (DirectoryException e)
+ {
+ return ByteString.empty();
+ }
+ }
+
/**
* Checks whether the target of an operation is a referral entry and throws
* a Directory referral exception if it is.
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DefaultIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DefaultIndex.java
index b224b91..cfc6bf6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DefaultIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DefaultIndex.java
@@ -109,6 +109,23 @@
}
@Override
+ public String valueToString(ByteString value)
+ {
+ StringBuilder sb = new StringBuilder();
+ final EntryIDSet eIDSet = decodeValue(ByteString.empty(), value);
+ eIDSet.toString(sb);
+ if (eIDSet.isDefined())
+ {
+ for(EntryID entryID : eIDSet)
+ {
+ sb.append(" ");
+ sb.append(entryID);
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
public final Cursor<ByteString, EntryIDSet> openCursor(ReadableTransaction txn)
{
checkNotNull(txn, "txn must not be null");
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DnKeyFormat.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DnKeyFormat.java
index 9ee3fb5..5fa29b9 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DnKeyFormat.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DnKeyFormat.java
@@ -26,6 +26,8 @@
*/
package org.opends.server.backends.pluggable;
+import static org.forgerock.opendj.ldap.DN.normalizedToASCII;
+
import org.forgerock.opendj.ldap.ByteSequence;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
@@ -58,7 +60,7 @@
// and find the first unescaped NORMALIZED_RDN_SEPARATOR
for (int i = dnKey.length() - 1; i >= 0; i--)
{
- if (dnKey.byteAt(i) == DN.NORMALIZED_RDN_SEPARATOR && i - 1 >= 0 && dnKey.byteAt(i - 1) != DN.NORMALIZED_ESC_BYTE)
+ if (positionIsRDNSeparator(dnKey, i))
{
return i;
}
@@ -86,6 +88,22 @@
return builder.toByteString();
}
+ /**
+ * Returns a best effort conversion from key to a human readable DN.
+ * @param key the index key
+ * @return a best effort conversion from key to a human readable DN.
+ */
+ static String keyToDNString(ByteString key)
+ {
+ return normalizedToASCII(key);
+ }
+
+ private static boolean positionIsRDNSeparator(ByteSequence key, int index)
+ {
+ return index > 0
+ && key.byteAt(index) == DN.NORMALIZED_RDN_SEPARATOR && key.byteAt(index - 1) != DN.NORMALIZED_ESC_BYTE;
+ }
+
static ByteStringBuilder beforeKey(final ByteSequence key)
{
final ByteStringBuilder beforeKey = new ByteStringBuilder(key.length() + 1);
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Count.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Count.java
index e974319..172d8f8 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Count.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Count.java
@@ -25,10 +25,11 @@
package org.opends.server.backends.pluggable;
import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteSequenceReader;
import org.forgerock.opendj.ldap.ByteString;
import org.forgerock.opendj.ldap.ByteStringBuilder;
-import org.forgerock.util.Function;
import org.forgerock.util.Reject;
+import org.forgerock.util.Function;
import org.forgerock.util.promise.NeverThrowsException;
import org.opends.server.backends.pluggable.spi.Cursor;
import org.opends.server.backends.pluggable.spi.Importer;
@@ -145,6 +146,28 @@
return value.toLong();
}
+ @Override
+ public String keyToString(ByteString key)
+ {
+ ByteSequenceReader keyReader = key.asReader();
+ long keyID = keyReader.getCompactUnsigned();
+ long shardBucket = keyReader.getCompactUnsigned();
+ return (keyID == TOTAL_COUNT_ENTRY_ID.longValue() ? "Total Children Count" : keyID) + "#" + shardBucket;
+ }
+
+ @Override
+ public String valueToString(ByteString value)
+ {
+ return String.valueOf(fromValue(value));
+ }
+
+ @Override
+ public ByteString generateKey(String data)
+ {
+ EntryID entryID = new EntryID(Long.parseLong(data));
+ return entryID.toByteString();
+ }
+
/**
* Get the counter value for the specified key
* @param txn The transaction
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
index 49d9a0d..b46ec46 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/ID2Entry.java
@@ -376,13 +376,13 @@
* @throws StorageRuntimeException If an error occurs in the storage.
*/
public boolean containsEntryID(ReadableTransaction txn, EntryID entryID)
- {
+ {
checkNotNull(txn, "txn must not be null");
checkNotNull(entryID, "entryID must not be null");
try(final Cursor<ByteString, ByteString> cursor = txn.openCursor(getName())) {
return cursor.positionToKey(entryID.toByteString());
}
- }
+ }
private Entry get0(EntryID entryID, ByteString value) throws DirectoryException
{
@@ -414,4 +414,30 @@
{
this.dataConfig = dataConfig;
}
+
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return new EntryID(key).toString();
+ }
+
+ @Override
+ public String valueToString(ByteString value)
+ {
+ try
+ {
+ return "\n" + get0(new EntryID(-1), value).toString();
+ }
+ catch (Exception e)
+ {
+ return e.getMessage();
+ }
+ }
+
+ @Override
+ public ByteString generateKey(String data)
+ {
+ EntryID entryID = new EntryID(Long.parseLong(data));
+ return entryID.toByteString();
+ }
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/State.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/State.java
index 2900c4d..fba991c 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/State.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/State.java
@@ -27,6 +27,7 @@
package org.opends.server.backends.pluggable;
import static org.forgerock.util.Reject.*;
+import static org.forgerock.util.Utils.joinAsString;
import java.util.Arrays;
import java.util.Collection;
@@ -50,7 +51,7 @@
{
/**
* Use COMPACTED serialization for new indexes.
- * @see {@link EntryIDSet.EntryIDSetCompactCodec}
+ * @see {@link EntryIDSet.EntryIDSetCodecV2}
*/
private static final Collection<IndexFlag> DEFAULT_FLAGS = Collections.unmodifiableCollection(Arrays
.asList(IndexFlag.COMPACTED));
@@ -182,6 +183,12 @@
});
}
+ @Override
+ public String valueToString(ByteString value)
+ {
+ return joinAsString(" ", decodeFlagsOrGetDefault(value));
+ }
+
/**
* Remove a record from the entry tree.
*
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Tree.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Tree.java
index cfce19e..479fc52 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Tree.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/Tree.java
@@ -26,6 +26,7 @@
*/
package org.opends.server.backends.pluggable;
+import org.forgerock.opendj.ldap.ByteString;
import org.opends.server.backends.pluggable.spi.ReadableTransaction;
import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
import org.opends.server.backends.pluggable.spi.TreeName;
@@ -76,4 +77,30 @@
* @return name for this tree.
*/
TreeName getName();
+
+ /**
+ * Returns a printable, semantically meaningful if possible, representation of a Tree key.
+ *
+ * @param key a key as used by the Tree
+ * @return a printable, semantically meaningful if possible, representation of a Tree key.
+ */
+ String keyToString(ByteString key);
+
+ /**
+ * Returns a printable, semantically meaningful if possible, representation of a Tree key.
+ *
+ * @param value a key as used by the Tree
+ * @return a printable, semantically meaningful if possible, representation of a Tree key.
+ */
+ String valueToString(ByteString value);
+
+ /**
+ * Returns a key given a string representation of a value.
+ * Since the key is typically used for cursoring, out of many possible keys only one is needed,
+ * potentially the lowest key.
+ *
+ * @param key the specified key as a string
+ * @return a key given a string representation of a value
+ */
+ ByteString generateKey(String key);
}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
index bdbc409..504a75e 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/VLVIndex.java
@@ -848,6 +848,18 @@
builder.append(separator);
}
+ @Override
+ public String keyToString(ByteString key)
+ {
+ return String.valueOf(decodeEntryIDFromVLVKey(key));
+ }
+
+ @Override
+ public String valueToString(ByteString value)
+ {
+ return "N/A";
+ }
+
void closeAndDelete(WriteableTransaction txn)
{
close();
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/TreeName.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/TreeName.java
index 3d8e306..7a575ce 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/TreeName.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/spi/TreeName.java
@@ -25,6 +25,8 @@
*/
package org.opends.server.backends.pluggable.spi;
+import org.forgerock.util.Reject;
+
/**
* Represents the name of a tree (key-value store) in a database.
* A tree name is made of the baseDN it is part of, and the identifier of the index it represents.
@@ -60,8 +62,11 @@
*/
public static TreeName valueOf(String treeName)
{
- final String[] split = treeName.split("/");
- return new TreeName(split[0], split[1]);
+ int lastSlash = treeName.lastIndexOf('/');
+ Reject.ifTrue(lastSlash < 2 || treeName.charAt(0) != '/', "TreeName is not of the form /<name>/<name>");
+ String baseDN = treeName.substring(1, lastSlash);
+ String indexId = treeName.substring(lastSlash + 1);
+ return new TreeName(baseDN, indexId);
}
/**
@@ -123,4 +128,4 @@
{
return s.compareTo(o.s);
}
-}
\ No newline at end of file
+}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRuleImpl.java b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRuleImpl.java
index 71aebab..4dc6f42 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRuleImpl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/replication/plugin/HistoricalCsnOrderingMatchingRuleImpl.java
@@ -41,6 +41,7 @@
import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
import org.forgerock.opendj.ldap.spi.Indexer;
import org.forgerock.opendj.ldap.spi.IndexingOptions;
+import org.opends.server.replication.common.CSN;
import static org.forgerock.opendj.ldap.Assertion.*;
import static org.opends.messages.ReplicationMessages.*;
@@ -73,7 +74,12 @@
@Override
public String keyToHumanReadableString(ByteSequence key)
{
- return key.toString();
+ ByteStringBuilder bsb = new ByteStringBuilder();
+ bsb.append(key.subSequence(2, 10));
+ bsb.append(key.subSequence(0, 2));
+ bsb.append(key.subSequence(10, 14));
+ CSN csn = CSN.valueOf(bsb.toByteString());
+ return csn.toStringUI();
}
}
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
index 9752dec..e4995b7 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool.properties
@@ -1844,47 +1844,43 @@
generate the RC script: %s
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=If you specify \
the {%s} argument you must also specify {%s}
-INFO_DESCRIPTION_DBTEST_TOOL_1327=This utility can be used to debug the JE \
- database
+INFO_DESCRIPTION_DBTEST_TOOL_1327=This utility can be used to debug the JE database
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=List the root \
containers used by all JE backends
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=List the entry \
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=List the entry \
containers for a root container
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=Dump records from \
a database container. Depending on database size, \
this subcommand can generate lots of output
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=The backend ID of the JE backend to \
- debug
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=The base DN of the entry container to debug
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=The name of the database container \
- to debug
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=Do not try to decode the JE data to \
+INFO_DESCRIPTION_BACKEND_DEBUG_BACKEND_ID_1331=The backend ID of the backend to debug
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=The base DN of the entry container to debug
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=The name of the index to debug
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=Do not try to decode backend data to \
their appropriate types
ERR_DBTEST_DECODE_FAIL_1335=An error occurred while decoding data: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=List the status of \
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=List the status of \
indexes in an entry container. \
- This subcommand can take a long time to complete, \
- as it reads all indexes for all backends
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Only show records with keys that \
+ This subcommand can take a long time to complete, as it reads all indexes for all backends
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Only show records with keys that \
should be ordered before the provided value using the comparator for the \
database container
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Only show records with keys that \
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Only show records with keys that \
should be ordered after the provided value using the comparator for the \
database container
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Only show records whose data is no \
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Only show records whose data is no \
larger than the provided value
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Only show records whose data is no \
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Only show records whose data is no \
smaller than the provided value
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=List the database \
containers for an entry container
-INFO_LABEL_DBTEST_BACKEND_ID_1342=Backend ID
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=Backend ID
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=Database Directory
-INFO_LABEL_DBTEST_BASE_DN_1344=Base DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=Base DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE Database Prefix
-INFO_LABEL_DBTEST_ENTRY_COUNT_1346=Entry Count
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=None of the Directory Server \
+INFO_LABEL_BACKEND_DEBUG_ENTRY_COUNT_1346=Entry Count
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=None of the Directory Server \
backends are configured with the requested backend ID %s
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=None of the entry \
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=None of the entry \
containers are configured with the requested base DN %s in backend %s
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=No database container \
exists with the requested name %s in entry container %s and backend %s
@@ -1892,22 +1888,22 @@
while attempting to initialize the JE backend %s: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=An unexpected error occurred \
while attempting to read and/or decode records from the database: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=Unable to decode base DN string "%s" as \
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=Unable to decode base DN string "%s" as \
a valid distinguished name: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=Database Name
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=Database Type
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE Database Name
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=Record Count
-INFO_LABEL_DBTEST_INDEX_NAME_1357=Index Name
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=Index Type
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=Index Valid
+INFO_LABEL_BACKEND_DEBUG_RECORD_COUNT_1356=Record Count
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=Index Name
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=Index Type
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=Index Valid
INFO_LABEL_DBTEST_KEY_1360=Key
INFO_LABEL_DBTEST_DATA_1361=Data
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=An error occurred while \
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=An error occurred while \
attempting to release the shared lock for backend %s: %s. This lock should \
automatically be cleared when the process exits, so no further action \
should be required
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=An error occurred while \
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=An error occurred while \
attempting to acquire a shared lock for backend %s: %s. This generally \
means that some other process has exclusive access to this backend (e.g., a \
restore or an LDIF import)
@@ -1926,7 +1922,7 @@
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=Last Sort Keys
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=An error occurred while parsing the \
min/max data size %s as a integer: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=A sub-command must be specified
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=A sub-command must be specified
INFO_CREATERC_USER_DESCRIPTION_1375=The name of the user account under which \
the server should run
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=The path to the Java installation \
@@ -2430,7 +2426,7 @@
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=The Windows \
Service was successfully configured but there was an error starting it. \
Error code starting Windows Service: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=Do not display the JE data, \
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=Do not display backend data, \
just statistics
INFO_TIMEOUT_PLACEHOLDER_1711={timeout}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=Maximum length of time (in \
@@ -2570,6 +2566,49 @@
'%s' to avoid compatibility issues
ERR_UPGRADE_DSJAVAPROPERTIES_FAILED_1853=The dsjavaproperties tool failed to run. \
Please rerun dsjavaproperties manually
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=List the root containers used by all backends
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_STORAGE_TREES_1855=List indexes for a root container storage. \
+ Depending on index size, this subcommand can generate lots of output
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_TREES_1866=List indexes for an entry container \
+ This subcommand may take a long time to complete, as it reads all data for all indexes
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_TREE_1857=Dump records from an index decoding keys and values. \
+ Depending on index size, this subcommand can generate lots of output
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_DUMP_STORAGE_TREE_1858=Dump records in hexadecimal format from an index using \
+ the storage engine. Depending on index size, this subcommand can generate lots of output
+INFO_LABEL_BACKEND_TOOL_STORAGE_TREE_NAME_1861=Index Storage Name
+ERR_BACKEND_TOOL_ERROR_READING_ENTRY_CONTAINERS_1863=An error occurred while gathering entry containers: %s
+ERR_BACKEND_TOOL_ERROR_LISTING_TREES_1864=An error occurred while listing indexes: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=An unexpected error occurred \
+ while attempting to initialize the backend %s: %s
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=An unexpected error occurred \
+ while attempting to read and/or decode records from an index: %s
+INFO_LABEL_BACKEND_TOOL_INDEX_UNDEFINED_RECORD_COUNT_1867=Over Entry Limit
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=No index exists with the requested name %s in entry container %s and backend %s
+ERR_BACKEND_TOOL_ONLY_ONE_MIN_KEY_1869=Cannot specify a minimum key both as a string and as an hexadecimal string
+ERR_BACKEND_TOOL_ONLY_ONE_MAX_KEY_1870=Cannot specify a maximum key both as a string and as an hexadecimal string
+ERR_BACKEND_TOOL_PROCESSING_ARGUMENT_1871=An error occurred while processing arguments: %s
+ERR_BACKEND_TOOL_EXECUTING_COMMAND_1872=An error occurred while trying to execute %s: %s
+INFO_LABEL_BACKEND_TOOL_TOTAL_KEYS_1873=Total Keys
+INFO_LABEL_BACKEND_TOOL_KEYS_SIZE_1874=Keys Size
+INFO_LABEL_BACKEND_TOOL_VALUES_SIZE_1875=Values Size
+INFO_LABEL_BACKEND_TOOL_TOTAL_SIZES_1876=Total Size
+INFO_DESCRIPTION_BACKEND_TOOL_USE_SI_UNITS_1877=Uses SI Units for printing sizes
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_SINGLE_LINE_1878=Write hexadecimal data on a single line instead of pretty format
+INFO_LABEL_BACKEND_TOOL_STORAGE_1879=Storage
+INFO_LABEL_BACKEND_TOOL_TOTAL_1880=%nTotal: %d%n
+ERR_BACKEND_TOOL_CANNOT_CONFIGURE_BACKEND_1881=Cannot configure backend %s: %s
+INFO_LABEL_BACKEND_TOOL_INDEX_1882=%nIndex: %s%n
+INFO_LABEL_BACKEND_TOOL_OVER_INDEX_LIMIT_KEYS_1883=Over index-entry-limit keys: %s%n
+INFO_LABEL_BACKEND_TOOL_TOTAL_RECORDS_1884=%nTotal Records: %d%n
+INFO_LABEL_BACKEND_TOOL_TOTAL_KEY_SIZE_AND_AVG_1885=Total / Average Key Size: %d bytes / %d bytes%n
+INFO_LABEL_BACKEND_TOOL_TOTAL_DATA_SIZE_AND_AVG_1886=Total / Average Data Size: %d bytes / %d bytes%n
+ERR_BACKEND_TOOL_CURSOR_AT_KEY_NUMBER_1887=At key number %d, %s:
+INFO_LABEL_BACKEND_TOOL_KEY_FORMAT_1888=Key (len %d):
+INFO_LABEL_BACKEND_TOOL_VALUE_FORMAT_1889=Value (len %d):
+ERR_BACKEND_TOOL_DECODER_NOT_AVAILABLE_1890=Data decoder for printing is not available, should use hex dump
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_IN_STORAGE_1891=No storage index exists with the requested name %s in backend %s
+INFO_LABEL_BACKEND_TOOL_BACKEND_TREE_NAME_1892=Index Backend Name
+INFO_DESCRIPTION_BACKEND_TOOL_1893=This utility can be used to debug a backend
# Upgrade tasks
INFO_UPGRADE_TASK_6869_SUMMARY_10000=Fixing de-DE collation matching rule OID
@@ -2625,7 +2664,7 @@
REF_SHORT_DESC_BASE64_15001=encode and decode base64 strings
REF_SHORT_DESC_CONTROL_PANEL_15002=start the OpenDJ graphical admin interface
REF_SHORT_DESC_CREATE_RC_SCRIPT_15003=script to manage OpenDJ as a service on UNIX
-REF_SHORT_DESC_DBTEST_15004=gather OpenDJ backend database debugging information
+REF_SHORT_DESC_DBTEST_15004=gather OpenDJ backend JE database debugging information
REF_SHORT_DESC_DSJAVAPROPERTIES_15005=apply OpenDJ Java home and JVM settings
REF_SHORT_DESC_DSREPLICATION_15006=manage OpenDJ directory data replication
REF_SHORT_DESC_ENCODE_PASSWORD_15007=encode a password with an OpenDJ storage scheme
@@ -2653,6 +2692,7 @@
REF_SHORT_DESC_VERIFY_INDEX_15029=check index for consistency or errors
REF_SHORT_DESC_WINDOWS_SERVICE_15030=register OpenDJ as a Windows Service
UPGRADE_TASK_DELETE_FILE_10035=Removing file '%s'
+REF_SHORT_DESC_BACKEND_TOOL_15031=gather OpenDJ backend debugging information
# Supplements to descriptions for generated reference documentation.
SUPPLEMENT_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_20001=\
@@ -2677,3 +2717,5 @@
have permissions to access it.
ERR_SEARCH_INVALID_DEREFERENCE_POLICY_20014=Invalid deref alias specified: %s
ERR_FILE_NOT_FULLY_READABLE_20015=Could not completely read file '%s'
+SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS_20016=\
+ <xinclude:include href="variablelist-backendtool-index-status.xml" />
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_ca_ES.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_ca_ES.properties
index c3e1eff..47dcf13 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_ca_ES.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_ca_ES.properties
@@ -311,17 +311,17 @@
INFO_CREATERC_OUTFILE_DESCRIPTION_1323=La ruta al fitxer de sortida a crear
INFO_DESCRIPTION_DBTEST_TOOL_1327=Aquesta utilitat pot utilitzar-se per a depurar la base de dades JE
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=Llistar els contenidors arrel utilitzats per totes les infraestructures de fons (Backends) JE
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Llistar els contenidors d'entrades per a un contenidor arrel
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Llistar els contenidors d'entrades per a un contenidor arrel
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=Bolcar registres des del contenidor de la base de dades
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=ID Backend per a la infraestructura de fons (Backend) JE a depurar
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=El DN base del contenidor d'entrada a depurar
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=El nom del contenidor de la base de dades a depurar
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=No intentar descodificar les dades JE i els seus tipus apropiats
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=Llistar l'estat dels \u00edndexs en un contenidor d'entrades
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Mostrar \u00fanicament els registres amb claus que han de ser ordenades abans que el valor proporcionat mitjan\u00e7ant el comparador pel contenidor de la base de dades
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Mostrar \u00fanicament els registres amb claus que han de ser ordenades despr\u00e9s que el valor proporcionat mitjan\u00e7ant el comparador pel contenidor de la base de dades
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Mostrar \u00fanicament els registres les dades dels quals no s\u00f3n m\u00e9s grans que el valor proporcionat
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Mostrar \u00fanicament els registres les dades dels quals no s\u00f3n m\u00e9s petits que el valor proporcionat
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=ID Backend per a la infraestructura de fons (Backend) JE a depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=El DN base del contenidor d'entrada a depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=El nom del contenidor de la base de dades a depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=No intentar descodificar les dades JE i els seus tipus apropiats
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=Llistar l'estat dels \u00edndexs en un contenidor d'entrades
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Mostrar \u00fanicament els registres amb claus que han de ser ordenades abans que el valor proporcionat mitjan\u00e7ant el comparador pel contenidor de la base de dades
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Mostrar \u00fanicament els registres amb claus que han de ser ordenades despr\u00e9s que el valor proporcionat mitjan\u00e7ant el comparador pel contenidor de la base de dades
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Mostrar \u00fanicament els registres les dades dels quals no s\u00f3n m\u00e9s grans que el valor proporcionat
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Mostrar \u00fanicament els registres les dades dels quals no s\u00f3n m\u00e9s petits que el valor proporcionat
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=Llistar els contenidors de base de dades per a un contenidors d'entrades
INFO_CREATERC_USER_DESCRIPTION_1375=el nom del compte d'usuari sota el qual els servidor s'ha d'executar
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=La ruta a la instal3laci\u00f3 Java que ha d'utilitzar-se per executar el servidor
@@ -490,3 +490,5 @@
INFO_LDIFDIFF_DESCRIPTION_CHECK_SCHEMA_1674=T\u00e9 en compte la sintaxis dels atributs de com estan definits en l'esquema per fer la comparaci\u00f3 de valor. Els fitxers LDIF proporcionats ha de ser conformes a l'esquema del servidor
INFO_INSTALLDS_PROVIDE_BASE_DN_PROMPT_1700=Voleu crear DNs base al servidor?
ERR_INSTALLDS_NO_BASE_DN_AND_CONFLICTING_ARG_1701=Heu especificat no crear un DN base. Si no es crea cap DN base no es pot especificar l'argument '%s'
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=Llistar els contenidors arrel utilitzats per totes les infraestructures de fons (Backends) Pluggable
+INFO_DESCRIPTION_BACKEND_TOOL_1893=Aquesta utilitat pot utilitzar-se per a depurar una infraestructura de fons
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_de.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_de.properties
index f128026..37e480a 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_de.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_de.properties
@@ -895,41 +895,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=Wenn Sie das Argument {%s} angeben, m\u00fcssen Sie auch {%s} angeben
INFO_DESCRIPTION_DBTEST_TOOL_1327=Dieses Dienstprogramm dient zur Fehlerbehebung f\u00fcr die JE-Datenbank
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=Root-Container auflisten, die von allen JE-Backends verwendet werden
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Alle Eintragscontainer f\u00fcr einen Root-Container auflisten
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Alle Eintragscontainer f\u00fcr einen Root-Container auflisten
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=Datensatzabbild von einem Datenbankcontainer erstellen
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=Backend-ID des JE-Backends, f\u00fcr das eine Fehlerbehebung ausgef\u00fchrt werden soll
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=Basis-DN des Eintragcontainers, f\u00fcr den eine Fehlerbehebung ausgef\u00fchrt werden soll
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=Name des Datenbankcontainers, f\u00fcr den eine Fehlerbehebung ausgef\u00fchrt werden soll
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=Nicht versuchen, die JE-Daten nach deren dazugeh\u00f6rigen Typen zu dekodieren
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=Backend-ID des JE-Backends, f\u00fcr das eine Fehlerbehebung ausgef\u00fchrt werden soll
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=Basis-DN des Eintragcontainers, f\u00fcr den eine Fehlerbehebung ausgef\u00fchrt werden soll
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=Name des Datenbankcontainers, f\u00fcr den eine Fehlerbehebung ausgef\u00fchrt werden soll
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=Nicht versuchen, die JE-Daten nach deren dazugeh\u00f6rigen Typen zu dekodieren
ERR_DBTEST_DECODE_FAIL_1335=Fehler bei der Datenentschl\u00fcsselung: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=Status der Indizes in einem Eintragscontainer auflisten
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Nur Datens\u00e4tze mit Schl\u00fcsseln anzeigen, die mit dem Vergleichsoperator f\u00fcr den Datenbankcontainer vor dem angegebenen Wert angeordnet werden sollen
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Nur Datens\u00e4tze mit Schl\u00fcsseln anzeigen, die mit dem Vergleichsoperator f\u00fcr den Datenbankcontainer hinter dem angegebenen Wert angeordnet werden sollen
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Nur Datens\u00e4tze anzeigen, deren Daten nicht gr\u00f6\u00dfer als der angegebene Wert sind
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Nur Datens\u00e4tze anzeigen, deren Daten nicht kleiner als der angegebene Wert sind
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=Status der Indizes in einem Eintragscontainer auflisten
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Nur Datens\u00e4tze mit Schl\u00fcsseln anzeigen, die mit dem Vergleichsoperator f\u00fcr den Datenbankcontainer vor dem angegebenen Wert angeordnet werden sollen
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Nur Datens\u00e4tze mit Schl\u00fcsseln anzeigen, die mit dem Vergleichsoperator f\u00fcr den Datenbankcontainer hinter dem angegebenen Wert angeordnet werden sollen
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Nur Datens\u00e4tze anzeigen, deren Daten nicht gr\u00f6\u00dfer als der angegebene Wert sind
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Nur Datens\u00e4tze anzeigen, deren Daten nicht kleiner als der angegebene Wert sind
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=Datenbankcontainer f\u00fcr einen Eintragscontainer auflisten
-INFO_LABEL_DBTEST_BACKEND_ID_1342=Backend-ID
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=Backend-ID
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=Datenbankverzeichnis
-INFO_LABEL_DBTEST_BASE_DN_1344=Basis-DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=Basis-DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE-Datenbank-Pr\u00e4fix
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=Anzahl der Eintr\u00e4ge
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=Keines der Directory-Server-Backends ist mit der angeforderten Backend-ID %s konfiguriert
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Keiner der Eintragscontainer ist mit dem angeforderten Basis-DN %s in Backend %s konfiguriert
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=Keines der Directory-Server-Backends ist mit der angeforderten Backend-ID %s konfiguriert
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Keiner der Eintragscontainer ist mit dem angeforderten Basis-DN %s in Backend %s konfiguriert
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=Kein Datenbankcontainer ist mit dem angeforderten Namen %s in Eintragscontainer %s und Backend %s vorhanden
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=Unerwarteter Fehler beim Versuch, das JE-Backend %s zu initialisieren: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=Unerwarteter Fehler beim Versuch, Datens\u00e4tze aus der Datenbank zu lesen und/oder zu entschl\u00fcsseln: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=Die Basis-DN-Zeichenfolge "%s" kann nicht als g\u00fcltiger Distinguished Name entschl\u00fcsselt werden: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=Die Basis-DN-Zeichenfolge "%s" kann nicht als g\u00fcltiger Distinguished Name entschl\u00fcsselt werden: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=Datenbankname
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=Datenbanktyp
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE-Datenbankname
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=Anzahl der Datens\u00e4tze
-INFO_LABEL_DBTEST_INDEX_NAME_1357=Indexname
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=Indextyp
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=Indexstatus
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=Anzahl der Datens\u00e4tze
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=Indexname
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=Indextyp
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=Indexstatus
INFO_LABEL_DBTEST_KEY_1360=Schl\u00fcssel
INFO_LABEL_DBTEST_DATA_1361=Daten
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=Fehler beim Versuch, die gemeinsame Sperre f\u00fcr Backend %s freizugeben: %s. Diese Sperre sollte automatisch aufgehoben werden, wenn der Prozess vorhanden ist, sodass keine weitere Aktion erforderlich ist
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=Fehler beim Versuch, eine gemeinsame Sperre f\u00fcr Backend %s abzurufen: %s. Dies bedeutet in der Regel, dass ein anderer Prozess \u00fcber einen exklusiven Zugriff auf dieses Backend verf\u00fcgt (z. B. eine Wiederherstellung oder ein LDIF-Import)
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=Fehler beim Versuch, die gemeinsame Sperre f\u00fcr Backend %s freizugeben: %s. Diese Sperre sollte automatisch aufgehoben werden, wenn der Prozess vorhanden ist, sodass keine weitere Aktion erforderlich ist
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=Fehler beim Versuch, eine gemeinsame Sperre f\u00fcr Backend %s abzurufen: %s. Dies bedeutet in der Regel, dass ein anderer Prozess \u00fcber einen exklusiven Zugriff auf dieses Backend verf\u00fcgt (z. B. eine Wiederherstellung oder ein LDIF-Import)
ERR_DBTEST_CANNOT_DECODE_KEY_1364=Fehler beim Entschl\u00fcsseln des min./max. Schl\u00fcsselwertes %s: %s. Werte mit dem Pr\u00e4fix "0x" werden als Rohbytes in hex. entschl\u00fcsselt. Bei der Erstellung eines Speicherauszugs der DN2ID-Datenbank muss der Wert ein g\u00fcltiger Distinguished Name sein. Bei der Erstellung eines Speicherauszugs der D2Entry-Datenbank wird der Wert als Eintrags-ID entschl\u00fcsselt. Bei der Erstellung eines Speicherauszugs aller anderen Datenbanken wird der Wert als eine Zeichenkette entschl\u00fcsselt
INFO_LABEL_DBTEST_ENTRY_1365=Eintrag
INFO_LABEL_DBTEST_ENTRY_ID_1366=Eintrags-ID
@@ -939,7 +939,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=Eintrags-ID-Liste
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=Letzte Sortierschl\u00fcssel
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=Fehler beim Analysieren der min./max. Datengr\u00f6\u00dfe %s als eine Ganzzahl: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=Es muss ein Unterbefehl angegeben werden
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=Es muss ein Unterbefehl angegeben werden
INFO_CREATERC_USER_DESCRIPTION_1375=Name des Benutzerkontos, unter dem der Server ausgef\u00fchrt werden soll
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=Pfad zur Java-Installation, die zum Ausf\u00fchren des Servers verwendet werden soll
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=Reihe von Argumenten, die an die JVM beim Ausf\u00fchren des Servers geleitet werden sollen
@@ -1271,10 +1271,15 @@
INFO_DESCRIPTION_REFRESH_PERIOD_1706=Wenn dieses Argument angegeben ist, zeigt der Statusbefehl seinen Inhalt regelm\u00e4\u00dfig an. Wird verwendet, um den Zeitraum (in Sekunden) zwischen zwei Statusanzeigen anzugeben
INFO_INSTALLDS_PRINT_EQUIVALENT_COMMAND_LINE_1708=Drucken der \u00e4quivalenten nicht interaktiven Befehlszeile
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=Der Windows-Dienst wurde erfolgreich konfiguriert, aber beim Starten des Dienstes ist ein Fehler aufgetreten. Fehlercode beim Starten des Windows-Dienstes: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=JE-Daten nicht anzeigen, nur Statistiken
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=JE-Daten nicht anzeigen, nur Statistiken
INFO_TIMEOUT_PLACEHOLDER_1711={Zeit\u00fcberschreitung}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=Maximale Dauer (in Millisekunden), die die Verbindungsherstellung in Anspruch nehmen kann
ERR_MAKELDIF_CANNOT_WRITE_ENTRY_WITHOUT_DN_1713=Ein Fehler ist beim Versuch, den Eintrag in LDIF zu schreiben, aufgetreten: Der DN konnte nicht f\u00fcr den Eintrag berechnet werden (kein Wert wurde f\u00fcr RDN-Attribut %s gefunden)
ERR_CLIENT_SIDE_TIMEOUT_1714=Ein Laufzeitfehler auf Client-Seite ist aufgetreten.%nZus\u00e4tzliche Informationen: %s
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT_1715=Nicht definiert
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=Root-Container auflisten, die von allen Backends verwendet werde
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=Unerwarteter Fehler beim Versuch, Datens\u00e4tze aus der index zu lesen und/oder zu entschl\u00fcsseln: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=Unerwarteter Fehler beim Versuch, das Backend %s zu initialisieren: %s
+INFO_DESCRIPTION_BACKEND_TOOL_1893=Dieses Dienstprogramm dient zur Fehlerbehebung f\u00fcr eine Backend
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=Kein index ist mit dem angeforderten Namen %s in Eintragscontainer %s und Backend %s vorhanden
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_es.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_es.properties
index 021451e..6babb54 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_es.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_es.properties
@@ -895,41 +895,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=Si se especifica el argumento {%s}, tambi\u00e9n debe especificarse {%s}
INFO_DESCRIPTION_DBTEST_TOOL_1327=Esta utilidad se puede utilizar para depurar la base de datos JE
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=Muestra los contenedores ra\u00edz utilizados por todos los servidores de fondo JE
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Muestra los contenedores de entrada de un contenedor ra\u00edz
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Muestra los contenedores de entrada de un contenedor ra\u00edz
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=Volcar registros desde un contenedor de base de datos
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=El Id. de servidor de fondo del servidor de fondo JE que depurar
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=El ND de base del contenedor de entradas que depurar
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=El nombre del contenedor de base de datos que depurar
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=No intentar descodificar los datos de JE seg\u00fan los tipos adecuados
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=El Id. de servidor de fondo del servidor de fondo JE que depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=El ND de base del contenedor de entradas que depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=El nombre del contenedor de base de datos que depurar
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=No intentar descodificar los datos de JE seg\u00fan los tipos adecuados
ERR_DBTEST_DECODE_FAIL_1335=Se ha producido un error al descodificar datos: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=Muestra el estado de \u00edndices en un contenedor de entradas
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Mostrar s\u00f3lo los registros con claves que se deben ordenar antes del valor especificado mediante el comparador del contenedor de base de datos
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Mostrar s\u00f3lo los registros con claves que se deben ordenar despu\u00e9s del valor especificado mediante el comparador del contenedor de base de datos
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Mostrar s\u00f3lo los registros cuyos datos no sean mayores que el valor especificado
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Mostrar s\u00f3lo los registros cuyos datos no sean menores que el valor especificado
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=Muestra el estado de \u00edndices en un contenedor de entradas
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Mostrar s\u00f3lo los registros con claves que se deben ordenar antes del valor especificado mediante el comparador del contenedor de base de datos
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Mostrar s\u00f3lo los registros con claves que se deben ordenar despu\u00e9s del valor especificado mediante el comparador del contenedor de base de datos
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Mostrar s\u00f3lo los registros cuyos datos no sean mayores que el valor especificado
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Mostrar s\u00f3lo los registros cuyos datos no sean menores que el valor especificado
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=Muestra los contenedores de base de datos para un contenedor de entradas
-INFO_LABEL_DBTEST_BACKEND_ID_1342=Id. de servidor de fondo
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=Id. de servidor de fondo
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=Directorio de base de datos
-INFO_LABEL_DBTEST_BASE_DN_1344=ND base
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=ND base
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=Prefijo de base de datos JE
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=Recuento de entradas
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=Ning\u00fan backend del Servidor de directorios est\u00e1 configurado con el Id. de backend solicitado %s
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Ninguno de los contenedores de entradas est\u00e1 configurado con el ND de base solicitado %s en el backend %s
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=Ning\u00fan backend del Servidor de directorios est\u00e1 configurado con el Id. de backend solicitado %s
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Ninguno de los contenedores de entradas est\u00e1 configurado con el ND de base solicitado %s en el backend %s
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=No existe ning\u00fan contenedor de base de datos con el nombre solicitado %s ni en el contenedor de entradas %s ni en el backend %s
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=Se ha producido un error inesperado al tratar de inicializar el backend de JE %s: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=Se ha producido un error al tratar de leer y/o descodificar registros de la base de datos: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=No se puede descodificar la cadena de ND de base "%s" como un nombre distinguido v\u00e1lido: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=No se puede descodificar la cadena de ND de base "%s" como un nombre distinguido v\u00e1lido: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=Nombre de base de datos
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=Tipo de base de datos
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=Nombre de base de datos JE
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=Recuento de registros
-INFO_LABEL_DBTEST_INDEX_NAME_1357=Nombre de \u00edndice
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=Tipo de \u00edndice
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=Estado de \u00edndice
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=Recuento de registros
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=Nombre de \u00edndice
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=Tipo de \u00edndice
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=Estado de \u00edndice
INFO_LABEL_DBTEST_KEY_1360=Clave
INFO_LABEL_DBTEST_DATA_1361=Datos
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=Se ha producido un error al tratar de desactivar el bloqueo compartido para el backend %s: %s. Este bloqueo deber\u00eda eliminarse autom\u00e1ticamente al cerrarse el proceso, por lo que no deber\u00eda requerirse la realizaci\u00f3n de ninguna operaci\u00f3n adicional
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=Se ha producido un error al tratar de adquirir un bloqueo compartido para el backend %s: %s. Generalmente, esto significa que otro proceso tiene acceso exclusivo a este backend (p. ej., una restauraci\u00f3n o una importaci\u00f3n de LDIF)
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=Se ha producido un error al tratar de desactivar el bloqueo compartido para el backend %s: %s. Este bloqueo deber\u00eda eliminarse autom\u00e1ticamente al cerrarse el proceso, por lo que no deber\u00eda requerirse la realizaci\u00f3n de ninguna operaci\u00f3n adicional
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=Se ha producido un error al tratar de adquirir un bloqueo compartido para el backend %s: %s. Generalmente, esto significa que otro proceso tiene acceso exclusivo a este backend (p. ej., una restauraci\u00f3n o una importaci\u00f3n de LDIF)
ERR_DBTEST_CANNOT_DECODE_KEY_1364=Se ha producido un error al descodificar el valor de clave m\u00edn./m\u00e1x. %s: %s. Los valores prefijados con "Ox" se descodificar\u00e1n como bytes no procesados en hexadecimal. Al volcar la base de datos DN2ID, el valor debe ser un nombre distinguido v\u00e1lido. Al volcar la base de datos ID2Entry, el valor se descodificar\u00e1 como un Id. de entrada. Al volcar las bases de datos restantes, el valor se descodificar\u00e1 como una cadena
INFO_LABEL_DBTEST_ENTRY_1365=Entrada
INFO_LABEL_DBTEST_ENTRY_ID_1366=Id. de entrada
@@ -939,7 +939,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=Lista de Id. de entrada
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=\u00daltimas claves de ordenaci\u00f3n
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=Se ha producido un error al analizar el tama\u00f1o de datos m\u00edn./m\u00e1x. %s como un n\u00famero entero: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=Debe especificar un subcomando
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=Debe especificar un subcomando
INFO_CREATERC_USER_DESCRIPTION_1375=El nombre de la cuenta de usuario bajo la que se ejecutar\u00eda el servidor
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=La ruta a la instalaci\u00f3n Java que se utilizar\u00eda para ejecutar el servidor
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=Se debe transferir un conjunto de argumentos al JVM al ejecutar el servidor
@@ -1271,7 +1271,7 @@
INFO_DESCRIPTION_REFRESH_PERIOD_1706=Si se especifica este argumento, el comando de estado mostrar\u00e1 sus contenidos peri\u00f3dicamente. Usado para especificar el periodo (en segundos) entre dos representaciones del estado
INFO_INSTALLDS_PRINT_EQUIVALENT_COMMAND_LINE_1708=Imprima la l\u00ednea de comandos no interactiva equivalente
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=El servicio de Windows se ha configurado satisfactoriamente, pero se ha producido un error al iniciarlo. C\u00f3digo de error al iniciar el servicio de Windows: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=No mostrar los datos JE, s\u00f3lo estad\u00edsticas
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=No mostrar los datos JE, s\u00f3lo estad\u00edsticas
INFO_TIMEOUT_PLACEHOLDER_1711={timeout}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=La duraci\u00f3n m\u00e1xima de tiempo (en mil\u00e9simas de segundo) que puede tardarse en establecer una conexi\u00f3n
ERR_MAKELDIF_CANNOT_WRITE_ENTRY_WITHOUT_DN_1713=Se ha producido un error al tratar de escribir una entrada en LDIF: no ha podido calcularse el DN para la entrada (no se ha encontrado ning\u00fan valor para el atributo RDN %s)
@@ -1279,3 +1279,8 @@
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT_1715=No definido
INFO_LDIFDIFF_DESCRIPTION_USE_COMPARE_RESULT_1735=Utilice los resultados de comparaci\u00f3n de LDAP como un c\u00f3digo de salida para se\\u00F1alar diferencias entre los dos archivos LDIF
INFO_LDAPCOMPARE_DESCRIPTION_USE_COMPARE_RESULT_1736=Utilice los resultados de comparaci\u00f3n de LDAP como un c\u00f3digo de salida para las comparaci\u00f3nes LDAP
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=Muestra los contenedores ra\u00edz utilizados por todos los servidores de fondo
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=Se ha producido un error al tratar de leer y/o descodificar registros del \u00edndice: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=Se ha producido un error inesperado al tratar de inicializar el backend %s: %
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=No existe ning\u00fan \u00edndice con el nombre solicitado %s ni en el contenedor de entradas %s ni en el backend %s
+INFO_DESCRIPTION_BACKEND_TOOL_1893=Esta utilidad se puede utilizar para depurar un servidore de fondo Pluggable
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_fr.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_fr.properties
index 440494c..0f170d7 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_fr.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_fr.properties
@@ -895,41 +895,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=Si vous sp\u00e9cifiez l'argument {%s}, vous devez aussi sp\u00e9cifier {%s}
INFO_DESCRIPTION_DBTEST_TOOL_1327=Cet utilitaire permet de d\u00e9boguer la base de donn\u00e9es JE
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=R\u00e9pertorier les conteneurs racine utilis\u00e9s par tous les backends JE
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=R\u00e9pertorier les conteneurs d'entr\u00e9es pour un conteneur racine
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=R\u00e9pertorier les conteneurs d'entr\u00e9es pour un conteneur racine
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=Vider les enregistrements d'un conteneur de base de donn\u00e9es
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=L'ID de backend du backend de JE \u00e0 d\u00e9boguer
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=Le DN de base du conteneur d'entr\u00e9es \u00e0 d\u00e9boguer
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=Le nom du conteneur de bases de donn\u00e9es \u00e0 d\u00e9boguer
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=N'essayez pas de d\u00e9coder les donn\u00e9es JE de leurs types appropri\u00e9s
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=L'ID de backend du backend de JE \u00e0 d\u00e9boguer
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=Le DN de base du conteneur d'entr\u00e9es \u00e0 d\u00e9boguer
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=Le nom du conteneur de bases de donn\u00e9es \u00e0 d\u00e9boguer
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=N'essayez pas de d\u00e9coder les donn\u00e9es JE de leurs types appropri\u00e9s
ERR_DBTEST_DECODE_FAIL_1335=Une erreur s'est produite lors de la tentative de d\u00e9codage des donn\u00e9es\u00a0: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=R\u00e9pertorier l'\u00e9tat des index dans un conteneur d'entr\u00e9es
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Afficher seulement les enregistrements avec des cl\u00e9s devant \u00eatre ordonn\u00e9s avant la valeur indiqu\u00e9e utilisant le comparateur pour le conteneur de bases de donn\u00e9es
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Afficher seulement les enregistrements avec des cl\u00e9s devant \u00eatre ordonn\u00e9s apr\u00e8s la valeur indiqu\u00e9e utilisant le comparateur pour le conteneur de bases de donn\u00e9es
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Afficher seulement les enregistrements dont les donn\u00e9es ne sont pas sup\u00e9rieures \u00e0 la valeur indiqu\u00e9e
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Afficher seulement les enregistrements dont les donn\u00e9es ne sont pas inf\u00e9rieures \u00e0 la valeur indiqu\u00e9e
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=R\u00e9pertorier l'\u00e9tat des index dans un conteneur d'entr\u00e9es
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Afficher seulement les enregistrements avec des cl\u00e9s devant \u00eatre ordonn\u00e9s avant la valeur indiqu\u00e9e utilisant le comparateur pour le conteneur de bases de donn\u00e9es
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Afficher seulement les enregistrements avec des cl\u00e9s devant \u00eatre ordonn\u00e9s apr\u00e8s la valeur indiqu\u00e9e utilisant le comparateur pour le conteneur de bases de donn\u00e9es
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Afficher seulement les enregistrements dont les donn\u00e9es ne sont pas sup\u00e9rieures \u00e0 la valeur indiqu\u00e9e
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Afficher seulement les enregistrements dont les donn\u00e9es ne sont pas inf\u00e9rieures \u00e0 la valeur indiqu\u00e9e
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=R\u00e9pertorier les conteneurs de bases de donn\u00e9es pour un conteneur d'entr\u00e9es
-INFO_LABEL_DBTEST_BACKEND_ID_1342=Identifiant du backend
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=Identifiant du backend
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=R\u00e9pertoire de bases de donn\u00e9es
-INFO_LABEL_DBTEST_BASE_DN_1344=DN de base
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=DN de base
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=Pr\u00e9fixe de base de donn\u00e9es JE
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=Nombre d'entr\u00e9es
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=Aucun des backends Directory Server n'est configur\u00e9 avec l'ID de backend demand\u00e9 (%s)
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Aucun des conteneurs d'entr\u00e9es n'est configur\u00e9 avec le DN de base demand\u00e9 (%s) dans le backend %s
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=Aucun des backends Directory Server n'est configur\u00e9 avec l'ID de backend demand\u00e9 (%s)
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=Aucun des conteneurs d'entr\u00e9es n'est configur\u00e9 avec le DN de base demand\u00e9 (%s) dans le backend %s
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=Aucun des conteneurs de base de donn\u00e9es ne porte le nom demand\u00e9 (%s) dans le conteneur d'entr\u00e9es %s et le backend %s
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=Une erreur inattendue s'est produite lors de la tentative d'initialisation du backend de JE %s\u00a0: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=Une erreur inattendue s'est produite lors de la tentative de lecture et/ou de d\u00e9codage d'enregistrements dans la base de donn\u00e9es\u00a0: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=Impossible de d\u00e9coder la cha\u00eene de DN de base "%s" en tant que nom distinctif valide\u00a0: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=Impossible de d\u00e9coder la cha\u00eene de DN de base "%s" en tant que nom distinctif valide\u00a0: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=Nom de base de donn\u00e9es
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=Type de base de donn\u00e9es
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=Nom de base de donn\u00e9es JE
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=Nombre d'enregistrements
-INFO_LABEL_DBTEST_INDEX_NAME_1357=Nom d'index
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=Type d'index
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=\u00c9tat d'index
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=Nombre d'enregistrements
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=Nom d'index
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=Type d'index
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=\u00c9tat d'index
INFO_LABEL_DBTEST_KEY_1360=Cl\u00e9
INFO_LABEL_DBTEST_DATA_1361=Donn\u00e9es
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=Une erreur s'est produite lors de la tentative de lib\u00e9ration du verrou partag\u00e9 pour le backend %s\u00a0: %s. Ce verrou devrait \u00eatre automatiquement supprim\u00e9 \u00e0 la fermeture du processus et aucune autre action ne devrait \u00eatre n\u00e9cessaire
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=Une erreur s'est produite lors de la tentative d'acquisition d'un verrou partag\u00e9 pour le backend %s\u00a0: %s. Cela signifie g\u00e9n\u00e9ralement qu'un autre processus (par exemple, une restauration ou une importation LDIF) dispose d'un acc\u00e8s exclusif \u00e0 ce backend
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=Une erreur s'est produite lors de la tentative de lib\u00e9ration du verrou partag\u00e9 pour le backend %s\u00a0: %s. Ce verrou devrait \u00eatre automatiquement supprim\u00e9 \u00e0 la fermeture du processus et aucune autre action ne devrait \u00eatre n\u00e9cessaire
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=Une erreur s'est produite lors de la tentative d'acquisition d'un verrou partag\u00e9 pour le backend %s\u00a0: %s. Cela signifie g\u00e9n\u00e9ralement qu'un autre processus (par exemple, une restauration ou une importation LDIF) dispose d'un acc\u00e8s exclusif \u00e0 ce backend
ERR_DBTEST_CANNOT_DECODE_KEY_1364=Une erreur s'est produite lors du d\u00e9codage de la valeur de cl\u00e9 min/max %s\u00a0: %s. Les valeurs portant le pr\u00e9fixe "0x" seront d\u00e9cod\u00e9es en tant qu'octets de donn\u00e9es brutes au format hexad\u00e9cimal. Lors du vidage de la base de donn\u00e9es DN2ID, la valeur doit \u00eatre un nom distinctif valide. Lors du vidage de la base de donn\u00e9es ID2Entry, la valeur est d\u00e9cod\u00e9e en tant qu'ID d'entr\u00e9e. Lors du vidage de toutes les autres bases de donn\u00e9es, la valeur est d\u00e9cod\u00e9e en tant que cha\u00eene
INFO_LABEL_DBTEST_ENTRY_1365=Entr\u00e9e
INFO_LABEL_DBTEST_ENTRY_ID_1366=ID d'entr\u00e9e
@@ -939,7 +939,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=Liste d'ID d'entr\u00e9es
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=Cl\u00e9s du dernier tri
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=Une erreur s'est produite lors de l'analyser de la taille de donn\u00e9es min/max %s en tant qu'entier\u00a0: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=Une sous-commande doit \u00eatre sp\u00e9cifi\u00e9e
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=Une sous-commande doit \u00eatre sp\u00e9cifi\u00e9e
INFO_CREATERC_USER_DESCRIPTION_1375=Le nom du compte utilisateur sous lequel le serveur doit tourner
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=Le chemin vers l'installation Java \u00e0 utiliser pour faire tourner le serveur
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=Un jeu d'arguments que la JVM doit accepter quand le serveur tourne
@@ -1271,11 +1271,16 @@
INFO_DESCRIPTION_REFRESH_PERIOD_1706=Lorsque vous sp\u00e9cifiez cet argument, la commande d'\u00e9tat affiche son contenu \u00e0 intervalle r\u00e9gulier. Permet de sp\u00e9cifier la p\u00e9riode (en secondes) qui s\u00e9pare deux affichages de l'\u00e9tat
INFO_INSTALLDS_PRINT_EQUIVALENT_COMMAND_LINE_1708=Imprimer la ligne de commande \u00e9quivalente non interactive
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=Le service Windows a \u00e9t\u00e9 correctement configur\u00e9 mais une erreur s'est produite lors de son d\u00e9marrage. Code d'erreur au d\u00e9marrage du service Windows\u00a0: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=Impossible d'afficher les donn\u00e9es JE, uniquement les statistiques
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=Impossible d'afficher les donn\u00e9es JE, uniquement les statistiques
INFO_TIMEOUT_PLACEHOLDER_1711={Temporisation}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=Dur\u00e9e maximale (en millisecondes) qui peut \u00eatre n\u00e9cessaire pour \u00e9tablir une connexion
ERR_MAKELDIF_CANNOT_WRITE_ENTRY_WITHOUT_DN_1713=Une erreur est survenue lors de la tentative d'\u00e9criture d'une entr\u00e9e dans LDIF : Impossible de calculer le DN de l'entr\u00e9e (aucune valeur trouv\u00e9e pour l'attribut RDN %s)
ERR_CLIENT_SIDE_TIMEOUT_1714=Une expiration du d\u00e9lai s'est produite c\u00f4t\u00e9 client.%nInformations suppl\u00e9mentaires\u00a0: %s
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT_1715=Non d\u00e9fini
INFO_LDIFDIFF_DESCRIPTION_USE_COMPARE_RESULT_1735=Utiliser le r\u00e9sultat de comparaison LDAP en tant que code de sortie pour signaler les diff\u00e9rences entre deux fichiers LDIF
-INFO_LDAPCOMPARE_DESCRIPTION_USE_COMPARE_RESULT_1736=Utiliser le r\u00e9sultat de comparaison LDAP en tant que code de sortie pour les comparaisons LDAP
\ No newline at end of file
+INFO_LDAPCOMPARE_DESCRIPTION_USE_COMPARE_RESULT_1736=Utiliser le r\u00e9sultat de comparaison LDAP en tant que code de sortie pour les comparaisons LDAP
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=R\u00e9pertorier les conteneurs racine utilis\u00e9s par tous les backends
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=Une erreur inattendue s'est produite lors de la tentative de lecture et/ou de d\u00e9codage d'enregistrements dans l' index: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=Une erreur inattendue s'est produite lors de la tentative d'initialisation du backend %s\u00a0: %s
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=Aucun des indexes ne porte le nom demand\u00e9 (%s) dans le conteneur d'entr\u00e9es %s et le backend %s
+INFO_DESCRIPTION_BACKEND_TOOL_1893=Cet utilitaire permet de d\u00e9boguer un backend
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_ja.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_ja.properties
index 7d2ceee..079b94f 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_ja.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_ja.properties
@@ -895,41 +895,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326={%s} \u5f15\u6570\u3092\u6307\u5b9a\u3059\u308b\u5834\u5408\u3001{%s} \u3082\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
INFO_DESCRIPTION_DBTEST_TOOL_1327=\u3053\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30fc\u3092\u4f7f\u3063\u3066 JE \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30c7\u30d0\u30c3\u30b0\u3067\u304d\u307e\u3059
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=\u3059\u3079\u3066\u306e JE \u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3067\u4f7f\u7528\u3055\u308c\u308b\u30eb\u30fc\u30c8\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u30eb\u30fc\u30c8\u30b3\u30f3\u30c6\u30ca\u7528\u306e\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u30eb\u30fc\u30c8\u30b3\u30f3\u30c6\u30ca\u7528\u306e\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u304b\u3089\u30ec\u30b3\u30fc\u30c9\u3092\u30c0\u30f3\u30d7\u3057\u307e\u3059
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=\u30c7\u30d0\u30c3\u30b0\u3059\u308b JE \u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u306e\u30d9\u30fc\u30b9 DN
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u540d\u524d
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=JE \u30c7\u30fc\u30bf\u3092\u305d\u306e\u9069\u5207\u306a\u578b\u3078\u5fa9\u53f7\u5316\u3059\u308b\u3053\u3068\u3092\u8a66\u307f\u307e\u305b\u3093
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=\u30c7\u30d0\u30c3\u30b0\u3059\u308b JE \u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u306e\u30d9\u30fc\u30b9 DN
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=\u30c7\u30d0\u30c3\u30b0\u3059\u308b\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u540d\u524d
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=JE \u30c7\u30fc\u30bf\u3092\u305d\u306e\u9069\u5207\u306a\u578b\u3078\u5fa9\u53f7\u5316\u3059\u308b\u3053\u3068\u3092\u8a66\u307f\u307e\u305b\u3093
ERR_DBTEST_DECODE_FAIL_1335=\u30c7\u30fc\u30bf\u306e\u5fa9\u53f7\u5316\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u5185\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u72b6\u614b\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=\u9806\u5e8f\u4ed8\u304d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u3046\u3061\u6307\u5b9a\u3055\u308c\u305f\u5024\u3088\u308a\u524d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u6bd4\u8f03\u6f14\u7b97\u5b50\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=\u9806\u5e8f\u4ed8\u304d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u3046\u3061\u6307\u5b9a\u3055\u308c\u305f\u5024\u3088\u308a\u3042\u3068\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u6bd4\u8f03\u6f14\u7b97\u5b50\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=\u6307\u5b9a\u3055\u308c\u305f\u5024\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=\u6307\u5b9a\u3055\u308c\u305f\u5024\u4ee5\u4e0a\u306e\u30c7\u30fc\u30bf\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u5185\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u72b6\u614b\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=\u9806\u5e8f\u4ed8\u304d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u3046\u3061\u6307\u5b9a\u3055\u308c\u305f\u5024\u3088\u308a\u524d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u6bd4\u8f03\u6f14\u7b97\u5b50\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=\u9806\u5e8f\u4ed8\u304d\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u3046\u3061\u6307\u5b9a\u3055\u308c\u305f\u5024\u3088\u308a\u3042\u3068\u306e\u9375\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306e\u6bd4\u8f03\u6f14\u7b97\u5b50\u304c\u4f7f\u7528\u3055\u308c\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=\u6307\u5b9a\u3055\u308c\u305f\u5024\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=\u6307\u5b9a\u3055\u308c\u305f\u5024\u4ee5\u4e0a\u306e\u30c7\u30fc\u30bf\u3092\u6301\u3064\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u8868\u793a\u3057\u307e\u3059
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u7528\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
-INFO_LABEL_DBTEST_BACKEND_ID_1342=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea
-INFO_LABEL_DBTEST_BASE_DN_1344=\u30d9\u30fc\u30b9 DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=\u30d9\u30fc\u30b9 DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=\u30a8\u30f3\u30c8\u30ea\u6570
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=\u8981\u6c42\u3055\u308c\u305f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID %s \u3067\u69cb\u6210\u3055\u308c\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30b5\u30fc\u30d0\u30fc\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %2$s \u5185\u306e\u8981\u6c42\u3055\u308c\u305f\u30d9\u30fc\u30b9 DN %1$s \u3067\u69cb\u6210\u3055\u308c\u305f\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=\u8981\u6c42\u3055\u308c\u305f\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 ID %s \u3067\u69cb\u6210\u3055\u308c\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30b5\u30fc\u30d0\u30fc\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %2$s \u5185\u306e\u8981\u6c42\u3055\u308c\u305f\u30d9\u30fc\u30b9 DN %1$s \u3067\u69cb\u6210\u3055\u308c\u305f\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca\u304c\u3042\u308a\u307e\u305b\u3093\u3002
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=\u8981\u6c42\u3055\u308c\u305f\u540d\u524d %s \u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b3\u30f3\u30c6\u30ca\u306f\u3001\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca %s \u304a\u3088\u3073\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306b\u5b58\u5728\u3057\u307e\u305b\u3093
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=JE \u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u521d\u671f\u5316\u4e2d\u306b\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308a\u307e\u305f\u306f\u5fa9\u53f7\u5316\u3001\u3042\u308b\u3044\u306f\u305d\u306e\u4e21\u65b9\u3092\u884c\u3063\u3066\u3044\u308b\u3068\u304d\u306b\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=\u30d9\u30fc\u30b9 DN \u6587\u5b57\u5217 "%s" \u3092\u6709\u52b9\u306a\u8b58\u5225\u540d\u3068\u3057\u3066\u5fa9\u53f7\u5316\u3067\u304d\u307e\u305b\u3093: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=\u30d9\u30fc\u30b9 DN \u6587\u5b57\u5217 "%s" \u3092\u6709\u52b9\u306a\u8b58\u5225\u540d\u3068\u3057\u3066\u5fa9\u53f7\u5316\u3067\u304d\u307e\u305b\u3093: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30bf\u30a4\u30d7
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u540d
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=\u30ec\u30b3\u30fc\u30c9\u6570
-INFO_LABEL_DBTEST_INDEX_NAME_1357=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u540d
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30bf\u30a4\u30d7
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u72b6\u614b
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=\u30ec\u30b3\u30fc\u30c9\u6570
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u540d
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u30bf\u30a4\u30d7
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u72b6\u614b
INFO_LABEL_DBTEST_KEY_1360=\u9375
INFO_LABEL_DBTEST_DATA_1361=\u30c7\u30fc\u30bf
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u5171\u6709\u30ed\u30c3\u30af\u306e\u89e3\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s\u3002\u3053\u306e\u30ed\u30c3\u30af\u306f\u30d7\u30ed\u30bb\u30b9\u306e\u7d42\u4e86\u6642\u306b\u81ea\u52d5\u7684\u306b\u6d88\u53bb\u3055\u308c\u308b\u305f\u3081\u3001\u3053\u308c\u4ee5\u4e0a\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u5171\u6709\u30ed\u30c3\u30af\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s\u3002\u3053\u308c\u306f\u901a\u5e38\u3001\u307b\u304b\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u3053\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3078\u306e\u6392\u4ed6\u7684\u30a2\u30af\u30bb\u30b9 (\u5fa9\u5143\u3084 LDIF \u30a4\u30f3\u30dd\u30fc\u30c8\u306a\u3069) \u3092\u884c\u3063\u3066\u3044\u308b\u305f\u3081\u3067\u3059
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u5171\u6709\u30ed\u30c3\u30af\u306e\u89e3\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s\u3002\u3053\u306e\u30ed\u30c3\u30af\u306f\u30d7\u30ed\u30bb\u30b9\u306e\u7d42\u4e86\u6642\u306b\u81ea\u52d5\u7684\u306b\u6d88\u53bb\u3055\u308c\u308b\u305f\u3081\u3001\u3053\u308c\u4ee5\u4e0a\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u5171\u6709\u30ed\u30c3\u30af\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s\u3002\u3053\u308c\u306f\u901a\u5e38\u3001\u307b\u304b\u306e\u30d7\u30ed\u30bb\u30b9\u304c\u3053\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3078\u306e\u6392\u4ed6\u7684\u30a2\u30af\u30bb\u30b9 (\u5fa9\u5143\u3084 LDIF \u30a4\u30f3\u30dd\u30fc\u30c8\u306a\u3069) \u3092\u884c\u3063\u3066\u3044\u308b\u305f\u3081\u3067\u3059
ERR_DBTEST_CANNOT_DECODE_KEY_1364=\u6700\u5c0f/\u6700\u5927\u9375\u5024 %s \u306e\u5fa9\u53f7\u5316\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s\u3002"0x" \u306e\u63a5\u982d\u8f9e\u304c\u4ed8\u3044\u305f\u5024\u306f\u300116 \u9032\u6570\u306e raw \u30d0\u30a4\u30c8\u3068\u3057\u3066\u5fa9\u53f7\u5316\u3055\u308c\u307e\u3059\u3002DN2ID \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30c0\u30f3\u30d7\u3059\u308b\u5834\u5408\u3001\u5024\u306f\u6709\u52b9\u306a\u8b58\u5225\u540d\u306b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002ID2Entry \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30c0\u30f3\u30d7\u3059\u308b\u5834\u5408\u3001\u5024\u306f\u30a8\u30f3\u30c8\u30ea ID \u3068\u3057\u3066\u5fa9\u53f7\u5316\u3055\u308c\u307e\u3059\u3002\u307b\u304b\u306e\u3059\u3079\u3066\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30c0\u30f3\u30d7\u3059\u308b\u5834\u5408\u306f\u3001\u5024\u306f\u6587\u5b57\u5217\u3068\u3057\u3066\u5fa9\u53f7\u5316\u3055\u308c\u307e\u3059
INFO_LABEL_DBTEST_ENTRY_1365=\u30a8\u30f3\u30c8\u30ea
INFO_LABEL_DBTEST_ENTRY_ID_1366=\u30a8\u30f3\u30c8\u30ea ID
@@ -939,7 +939,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=\u30a8\u30f3\u30c8\u30ea ID \u30ea\u30b9\u30c8
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=\u524d\u56de\u306e\u30bd\u30fc\u30c8\u30ad\u30fc
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=\u6700\u5c0f/\u6700\u5927\u30c7\u30fc\u30bf\u30b5\u30a4\u30ba %s \u3092\u6574\u6570\u3068\u3057\u3066\u89e3\u6790\u3057\u3066\u3044\u308b\u3068\u304d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=\u30b5\u30d6\u30b3\u30de\u30f3\u30c9\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=\u30b5\u30d6\u30b3\u30de\u30f3\u30c9\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044
INFO_CREATERC_USER_DESCRIPTION_1375=\u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u540d\u524d
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=\u30b5\u30fc\u30d0\u30fc\u306e\u5b9f\u884c\u306b\u4f7f\u7528\u3059\u308b Java \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3078\u306e\u30d1\u30b9
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=\u30b5\u30fc\u30d0\u30fc\u306e\u5b9f\u884c\u6642\u306b JVM \u306b\u6e21\u3059\u5f15\u6570\u306e\u30bb\u30c3\u30c8
@@ -1271,10 +1271,22 @@
INFO_DESCRIPTION_REFRESH_PERIOD_1706=\u3053\u306e\u5f15\u6570\u304c\u6307\u5b9a\u3055\u308c\u305f\u5834\u5408\u3001\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30de\u30f3\u30c9\u306b\u306f\u305d\u306e\u5185\u5bb9\u304c\u5b9a\u671f\u7684\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u8868\u793a\u9593\u9694 (\u79d2\u5358\u4f4d) \u3092\u6307\u5b9a\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3055\u308c\u307e\u3059
INFO_INSTALLDS_PRINT_EQUIVALENT_COMMAND_LINE_1708=\u7b49\u4fa1\u306e\u975e\u5bfe\u8a71\u578b\u30b3\u30de\u30f3\u30c9\u884c\u3092\u5370\u5237\u3057\u307e\u3059
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=Windows \u30b5\u30fc\u30d3\u30b9\u306f\u6b63\u3057\u304f\u69cb\u6210\u3055\u308c\u307e\u3057\u305f\u304c\u3001\u305d\u306e\u8d77\u52d5\u6642\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002Windows \u30b5\u30fc\u30d3\u30b9\u306e\u8d77\u52d5\u3067\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=JE \u30c7\u30fc\u30bf\u306f\u8868\u793a\u3057\u307e\u305b\u3093\u3002\u7d71\u8a08\u60c5\u5831\u306e\u307f\u3067\u3059
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=JE \u30c7\u30fc\u30bf\u306f\u8868\u793a\u3057\u307e\u305b\u3093\u3002\u7d71\u8a08\u60c5\u5831\u306e\u307f\u3067\u3059
INFO_TIMEOUT_PLACEHOLDER_1711={timeout}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=\u63a5\u7d9a\u3092\u78ba\u7acb\u3059\u308b\u305f\u3081\u306b\u304b\u3051\u3089\u308c\u308b\u6700\u5927\u6642\u9593 (\u30df\u30ea\u79d2)
ERR_MAKELDIF_CANNOT_WRITE_ENTRY_WITHOUT_DN_1713=\u30a8\u30f3\u30c8\u30ea\u3092 LDIF \u306b\u66f8\u304d\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: \u30a8\u30f3\u30c8\u30ea\u306e DN \u3092\u8a08\u7b97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f (RDN \u5c5e\u6027 %s \u306e\u5024\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093)
ERR_CLIENT_SIDE_TIMEOUT_1714=\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u5074\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002%n\u8ffd\u52a0\u60c5\u5831: %s
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT_1715=\u672a\u5b9a\u7fa9
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=\u3059\u3079\u3066\u306e\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3067\u4f7f\u7528\u3055\u308c\u308b\u30eb\u30fc\u30c8\u30b3\u30f3\u30c6\u30ca\u3092\u4e00\u89a7\u8868\u793a\u3057\u307e\u3059
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u304b\u3089\u306e\u30ec\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u53d6\u308a\u307e\u305f\u306f\u5fa9\u53f7\u5316\u3001\u3042\u308b\u3044\u306f\u305d\u306e\u4e21\u65b9\u3092\u884c\u3063\u3066\u3044\u308b\u3068\u304d\u306b\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306e\u521d\u671f\u5316\u4e2d\u306b\u4e88\u671f\u3057\u306a\u3044\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: %s
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=\u8981\u6c42\u3055\u308c\u305f\u540d\u524d %s \u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f\u3001\u30a8\u30f3\u30c8\u30ea\u30b3\u30f3\u30c6\u30ca %s \u304a\u3088\u3073\u30d0\u30c3\u30af\u30a8\u30f3\u30c9 %s \u306b\u5b58\u5728\u3057\u307e\u305b\u3093
+INFO_DESCRIPTION_BACKEND_TOOL_1893=\u3053\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u30fc\u3092\u4f7f\u3063\u3066\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3092\u30c7\u30d0\u30c3\u30b0\u3067\u304d\u307e\u3059
+INFO_LABEL_BACKEND_DEBUG_ENTRY_COUNT_1346=
+INFO_LABEL_BACKEND_TOOL_TREE_NAME_1859=
+INFO_LABEL_BACKEND_TOOL_STORAGE_TREE_NAME_1861=
+INFO_DESCRIPTION_BACKEND_TOOL_TREE_NAME_1862=
+ERR_BACKEND_TOOL_ONLY_ONE_MIN_KEY_1869=
+ERR_BACKEND_TOOL_ONLY_ONE_MAX_KEY_1870=
+ERR_BACKEND_TOOL_EXECUTING_COMMAND_1872=
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_ko.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_ko.properties
index 4808584..5cea27d 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_ko.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_ko.properties
@@ -893,41 +893,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326={%s} \uc778\uc218\ub97c \uc9c0\uc815\ud560 \uacbd\uc6b0 {%s}\ub3c4 \ud568\uaed8 \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
INFO_DESCRIPTION_DBTEST_TOOL_1327=\uc774 \uc720\ud2f8\ub9ac\ud2f0\ub97c \uc0ac\uc6a9\ud558\uc5ec JE \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub514\ubc84\uae45\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=\ubaa8\ub4e0 JE \ubc31\uc5d4\ub4dc\uc5d0 \uc0ac\uc6a9\ub418\ub294 \ub8e8\ud2b8 \ucee8\ud14c\uc774\ub108\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\ub8e8\ud2b8 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\ub8e8\ud2b8 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \ub808\ucf54\ub4dc\ub97c \ub364\ud504\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=\ub514\ubc84\uae45\ud560 JE \ubc31\uc5d4\ub4dc\uc758 \ubc31\uc5d4\ub4dc \uc544\uc774\ub514
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=\ub514\ubc84\uae45\ud560 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uc758 \uae30\ubcf8 DN
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=\ub514\ubc84\uae45\ud560 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc758 \uc774\ub984
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=JE \ub370\uc774\ud130\ub97c \uc801\uc808\ud55c \uc720\ud615\uc73c\ub85c \ud574\ub3c5\ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=\ub514\ubc84\uae45\ud560 JE \ubc31\uc5d4\ub4dc\uc758 \ubc31\uc5d4\ub4dc \uc544\uc774\ub514
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=\ub514\ubc84\uae45\ud560 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uc758 \uae30\ubcf8 DN
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=\ub514\ubc84\uae45\ud560 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc758 \uc774\ub984
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=JE \ub370\uc774\ud130\ub97c \uc801\uc808\ud55c \uc720\ud615\uc73c\ub85c \ud574\ub3c5\ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.
ERR_DBTEST_DECODE_FAIL_1335=\ub370\uc774\ud130\ub97c \ud574\ub3c5\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=\ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uc758 \uc0c9\uc778 \uc0c1\ud0dc\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ube44\uad50 \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \uc55e\uc5d0 \uc788\uc5b4\uc57c \ud560 \ud0a4\ub97c \uac00\uc9c4 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ube44\uad50 \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \ub4a4\uc5d0 \uc788\uc5b4\uc57c \ud560 \ud0a4\ub97c \uac00\uc9c4 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=\ub370\uc774\ud130\uac00 \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \ud06c\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=\ub370\uc774\ud130\uac00 \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \uc791\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=\ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uc758 \uc0c9\uc778 \uc0c1\ud0dc\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ube44\uad50 \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \uc55e\uc5d0 \uc788\uc5b4\uc57c \ud560 \ud0a4\ub97c \uac00\uc9c4 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ube44\uad50 \uc5f0\uc0b0\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \ub4a4\uc5d0 \uc788\uc5b4\uc57c \ud560 \ud0a4\ub97c \uac00\uc9c4 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=\ub370\uc774\ud130\uac00 \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \ud06c\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=\ub370\uc774\ud130\uac00 \uc81c\uacf5\ub41c \uac12\ubcf4\ub2e4 \uc791\uc9c0 \uc54a\uc740 \ub808\ucf54\ub4dc\ub9cc \ud45c\uc2dc\ud569\ub2c8\ub2e4.
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=\ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uc5d0 \ub300\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4.
-INFO_LABEL_DBTEST_BACKEND_ID_1342=\ubc31\uc5d4\ub4dc \uc544\uc774\ub514
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=\ubc31\uc5d4\ub4dc \uc544\uc774\ub514
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub514\ub809\ud1a0\ub9ac
-INFO_LABEL_DBTEST_BASE_DN_1344=\uae30\ubcf8 DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=\uae30\ubcf8 DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\ub450\uc5b4
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=\ud56d\ubaa9 \uac1c\uc218
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=\uc694\uccad\ud55c \ubc31\uc5d4\ub4dc \uc544\uc774\ub514 %s\uc744(\ub97c) \uac00\uc9c4 \ub514\ub809\ud1a0\ub9ac \uc11c\ubc84 \ubc31\uc5d4\ub4dc\uac00 \uad6c\uc131\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\uc694\uccad\ud55c \uae30\ubcf8 DN %s\uc744(\ub97c) \uac00\uc9c4 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uac00 \ubc31\uc5d4\ub4dc %s\uc5d0 \uad6c\uc131\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=\uc694\uccad\ud55c \ubc31\uc5d4\ub4dc \uc544\uc774\ub514 %s\uc744(\ub97c) \uac00\uc9c4 \ub514\ub809\ud1a0\ub9ac \uc11c\ubc84 \ubc31\uc5d4\ub4dc\uac00 \uad6c\uc131\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\uc694\uccad\ud55c \uae30\ubcf8 DN %s\uc744(\ub97c) \uac00\uc9c4 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108\uac00 \ubc31\uc5d4\ub4dc %s\uc5d0 \uad6c\uc131\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=\uc694\uccad\ud55c \uc774\ub984 %s\uc744(\ub97c) \uac00\uc9c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee8\ud14c\uc774\ub108\uac00 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108 %s \ubc0f \ubc31\uc5d4\ub4dc %s\uc5d0 \uc5c6\uc2b5\ub2c8\ub2e4.
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=JE \ubc31\uc5d4\ub4dc %s\uc744(\ub97c) \ucd08\uae30\ud654\ud558\ub294 \ub3d9\uc548 \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ub808\ucf54\ub4dc\ub97c \uc77d\uac70\ub098 \ud574\ub3c5\ud558\ub294 \ub3d9\uc548 \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=\uae30\ubcf8 DN \ubb38\uc790\uc5f4 \"%s\"\uc744(\ub97c) \uc720\ud6a8\ud55c \uace0\uc720 \uc774\ub984\uc73c\ub85c \ud574\ub3c5\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=\uae30\ubcf8 DN \ubb38\uc790\uc5f4 \"%s\"\uc744(\ub97c) \uc720\ud6a8\ud55c \uace0\uc720 \uc774\ub984\uc73c\ub85c \ud574\ub3c5\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc774\ub984
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc720\ud615
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc774\ub984
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=\ub808\ucf54\ub4dc \uac1c\uc218
-INFO_LABEL_DBTEST_INDEX_NAME_1357=\uc0c9\uc778 \uc774\ub984
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=\uc0c9\uc778 \uc720\ud615
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=\uc0c9\uc778 \uc0c1\ud0dc
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=\ub808\ucf54\ub4dc \uac1c\uc218
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=\uc0c9\uc778 \uc774\ub984
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=\uc0c9\uc778 \uc720\ud615
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=\uc0c9\uc778 \uc0c1\ud0dc
INFO_LABEL_DBTEST_KEY_1360=\ud0a4
INFO_LABEL_DBTEST_DATA_1361=\ub370\uc774\ud130
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=\ubc31\uc5d4\ub4dc %s\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \ud574\uc81c\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s. \uc774 \uc7a0\uae08\uc740 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc815\ub9ac\ub418\ubbc0\ub85c \ubcc4\ub3c4\uc758 \uc791\uc5c5\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=\ubc31\uc5d4\ub4dc %s\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uac00\uc838\uc624\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s. \uc774\uac83\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uac00 \uc774 \ubc31\uc5d4\ub4dc\uc5d0 \ub2e8\ub3c5\uc73c\ub85c \uc561\uc138\uc2a4\ud558\uace0 \uc788\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4(\uc608: \ubcf5\uc6d0 \ub610\ub294 LDIF \uac00\uc838\uc624\uae30).
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=\ubc31\uc5d4\ub4dc %s\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \ud574\uc81c\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s. \uc774 \uc7a0\uae08\uc740 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uba74 \uc790\ub3d9\uc73c\ub85c \uc815\ub9ac\ub418\ubbc0\ub85c \ubcc4\ub3c4\uc758 \uc791\uc5c5\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=\ubc31\uc5d4\ub4dc %s\uc5d0 \ub300\ud55c \uacf5\uc720 \uc7a0\uae08\uc744 \uac00\uc838\uc624\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s. \uc774\uac83\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\ub978 \ud504\ub85c\uc138\uc2a4\uac00 \uc774 \ubc31\uc5d4\ub4dc\uc5d0 \ub2e8\ub3c5\uc73c\ub85c \uc561\uc138\uc2a4\ud558\uace0 \uc788\uc74c\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4(\uc608: \ubcf5\uc6d0 \ub610\ub294 LDIF \uac00\uc838\uc624\uae30).
ERR_DBTEST_CANNOT_DECODE_KEY_1364=\ucd5c\uc18c/\ucd5c\ub300 \ud0a4 \uac12 %s\uc744(\ub97c) \ud574\ub3c5\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s. \uc811\ub450\uc5b4\uac00 "0x"\uc778 \uac12\uc740 16\uc9c4\uc218 \uc6d0\uc2dc \ubc14\uc774\ud2b8\ub85c \ud574\ub3c5\ub429\ub2c8\ub2e4. DN2ID \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub364\ud504\ud560 \uacbd\uc6b0 \uac12\uc740 \uc720\ud6a8\ud55c \uace0\uc720 \uc774\ub984\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. ID2Entry \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub364\ud504\ud560 \uacbd\uc6b0 \uac12\uc740 \ud56d\ubaa9 \uc544\uc774\ub514\ub85c \ud574\ub3c5\ub429\ub2c8\ub2e4. \ubaa8\ub4e0 \ub2e4\ub978 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub364\ud504\ud560 \uacbd\uc6b0 \uac12\uc740 \ubb38\uc790\uc5f4\ub85c \ud574\ub3c5\ub429\ub2c8\ub2e4.
INFO_LABEL_DBTEST_ENTRY_1365=\ud56d\ubaa9
INFO_LABEL_DBTEST_ENTRY_ID_1366=\ud56d\ubaa9 \uc544\uc774\ub514
@@ -937,7 +937,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=\ud56d\ubaa9 \uc544\uc774\ub514 \ubaa9\ub85d
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=\ub9c8\uc9c0\ub9c9 \uc815\ub82c \ud0a4
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=\ucd5c\uc18c/\ucd5c\ub300 \ub370\uc774\ud130 \ud06c\uae30 %s\uc744(\ub97c) \uc815\uc218\ub85c \uad6c\ubb38 \ubd84\uc11d\ud558\ub294 \ub3d9\uc548 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=\ud558\uc704 \uba85\ub839\uc744 \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=\ud558\uc704 \uba85\ub839\uc744 \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
INFO_CREATERC_USER_DESCRIPTION_1375=\uc11c\ubc84\ub97c \uc2e4\ud589\ud560 \uc0ac\uc6a9\uc790 \uacc4\uc815\uc758 \uc774\ub984
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=\uc11c\ubc84\ub97c \uc2e4\ud589\ud558\ub294 \ub370 \uc0ac\uc6a9\ub420 Java \uc124\uce58 \uacbd\ub85c
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=\uc11c\ubc84\ub97c \uc2e4\ud589\ud560 \ub54c JVM\uc5d0 \uc804\ub2ec\ub420 \uc778\uc218 \uc9d1\ud569
@@ -1179,3 +1179,8 @@
INFO_PROMPT_YES_COMPLETE_ANSWER_1663=\uc608
INFO_PROMPT_NO_COMPLETE_ANSWER_1665=\uc544\ub2c8\uc694
ERR_DSCFG_ERROR_BATCH_FILE_AND_INTERACTIVE_INCOMPATIBLE_1679={%s} \uc778\uc218\ub97c \uc9c0\uc815\ud560 \uacbd\uc6b0 {%s}\ub3c4 \ud568\uaed8 \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=\ubaa8\ub4e0\ubc31\uc5d4\ub4dc\uc5d0 \uc0ac\uc6a9\ub418\ub294 \ub8e8\ud2b8 \ucee8\ud14c\uc774\ub108\ub97c \ub098\uc5f4\ud569\ub2c8\ub2e4
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=\uc0c9\uc778 \uc5d0\uc11c \ub808\ucf54\ub4dc\ub97c \uc77d\uac70\ub098 \ud574\ub3c5\ud558\ub294 \ub3d9\uc548 \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=\ubc31\uc5d4\ub4dc %s\uc744(\ub97c) \ucd08\uae30\ud654\ud558\ub294 \ub3d9\uc548 \uc608\uae30\uce58 \uc54a\uc740 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4: %s
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=\uc694\uccad\ud55c \uc774\ub984 %s\uc744(\ub97c) \uac00\uc9c4 \uc0c9\uc778 \uac00 \ud56d\ubaa9 \ucee8\ud14c\uc774\ub108 %s \ubc0f \ubc31\uc5d4\ub4dc %s\uc5d0 \uc5c6\uc2b5\ub2c8\ub2e4.
+INFO_DESCRIPTION_BACKEND_TOOL_1893=\uc774 \uc720\ud2f8\ub9ac\ud2f0\ub97c \uc0ac\uc6a9\ud558\uc5ec\ubc31\uc5d4\ub4dc\ub97c \ub514\ubc84\uae45\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_pl.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_pl.properties
index 4907b44..3545b61 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_pl.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_pl.properties
@@ -84,7 +84,7 @@
INFO_LDIFSEARCH_DESCRIPTION_OVERWRITE_EXISTING_421=Jakikolwiek istniej\u0105cy plik zostanie nadpisany zamiast do\u0142\u0105czania do niego
INFO_STOPDS_DESCRIPTION_SASLOPTIONS_381=Opcje SASL po\u0142\u0105czenia
INFO_LDIFDIFF_DESCRIPTION_IGNORE_ATTRS_1612=Plik zawieraj\u0105cy list\u0119 atrybut\u00f3w ignorowanych przy obliczaniu r\u00f3\u017cnicy
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=ID zaplecza JE do debugowania
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=ID zaplecza JE do debugowania
INFO_DESCRIPTION_VLV_878=U\u017cyj wirtualnej kontroli widoku listy do odebrania podanej strony wynik\u00f3w
INFO_LDIFDIFF_DESCRIPTION_SOURCE_LDIF_443=Plik LDIF do u\u017cycia jako \u017ar\u00f3d\u0142o danych
INFO_DESCRIPTION_NO_PROP_FILE_1462=Nie zostanie u\u017cyty \u017caden plik z domy\u015blnymi argumentami komendy wiersza polece\u0144
@@ -139,7 +139,7 @@
INFO_STOPDS_DESCRIPTION_BINDPW_379=Has\u0142o do po\u0142\u0105czenia z serwerem
INFO_LDIFEXPORT_DESCRIPTION_APPEND_TO_LDIF_34=Do\u0142\u0105cz do istniej\u0105cego pliku LDIF zamiast nadpisywania go
INFO_SEARCH_DESCRIPTION_TIME_LIMIT_133=Maksymalny czas w sekundach przeznaczony na operacj\u0119 szukania
-INFO_LABEL_DBTEST_BASE_DN_1344=Podstawowy DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=Podstawowy DN
INFO_INSTALLDS_POPULATE_OPTION_GENERATE_SAMPLE_758=\u0141aduj wygenerowane automatycznie przykladowe dane
INFO_DESCRIPTION_TASK_FAILED_DEPENDENCY_ACTION_1472=Akcja jak\u0105 wykona to zadanie, je\u017celi jedno z zada\u0144 zale\u017cnych nie powiedzie si\u0119. Warto\u015b\u0107 musi by\u0107 jednym z %s. Je\u015bli nie podano, u\u017cyta zostanie warto\u015b\u0107 domy\u015blna %s
ERR_ERROR_PARSING_ARGS_17=Wyst\u0105pi\u0142 b\u0142\u0105d podczas przetwarzania argument\u00f3w wiersza polece\u0144: %s
@@ -167,7 +167,7 @@
INFO_LDIFIMPORT_DESCRIPTION_CLEAR_BACKEND_1251=Usu\u0144 wszystkie wpisy wszystkich bazowych DN w zapleczu przed importowaniem
INFO_INSTALLDS_PROMPT_CONFIRM_ROOT_PASSWORD_515=Prosz\u0119 ponownie wprowadzi\u0107 has\u0142o dla potwierdzenia:
INFO_DESCRIPTION_ASSERTION_FILTER_342=U\u017cyj kontroli za\u0142o\u017ce\u0144 LDAP za pomoc\u0105 podanego filtra
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=Poka\u017c tylko te rekordy, kt\u00f3rych warto\u015b\u0107 jest nie mniejsza ni\u017c podana warto\u015b\u0107
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=Poka\u017c tylko te rekordy, kt\u00f3rych warto\u015b\u0107 jest nie mniejsza ni\u017c podana warto\u015b\u0107
INFO_LDIFSEARCH_DESCRIPTION_BASEDN_415=Bazowa DN do wyszukania Wiele bazowych DN mo\u017ce zosta\u0107 wyszczeg\u00f3lnionych poprzez podanie opcji wiele razy. Je\u015bli nie podano bazowej DN, wtedy g\u0142\u00f3wna DSE zostanie u\u017cyta
INFO_LDAPMODIFY_TOOL_DESCRIPTION_691=To narz\u0119dzie mo\u017ce by\u0107 u\u017cyte do przeprowadzenia operacji modyfikacji, dodania, usuni\u0119cia LDAP i modyfikacji DN na Directory Server
INFO_INSTALLDS_DESCRIPTION_ENABLE_STARTTLS_1397=W\u0142\u0105cz StartTLS aby zapewni\u0107 bezpieczn\u0105 komunikacj\u0119 z serwerem u\u017cywaj\u0105c portu LDAP
@@ -189,14 +189,14 @@
INFO_DESCRIPTION_CONTINUE_ON_ERROR_124=Kontynuuj prztwarzanie nawet je\u015bli wyst\u0105pi\u0142y b\u0142\u0119dy
ERR_LDIFIMPORT_ERROR_DURING_IMPORT_96=Wyst\u0105pi\u0142 b\u0142\u0105d podczas pr\u00f3by przetworzenia importu LDIF: %s
INFO_INSTALLDS_DESCRIPTION_ADMINCONNECTORPORT_1619=Port na kt\u00f3rym Administrator Connector powinien nas\u0142uchiwa\u0107 w celu komunikacji
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=Nie pr\u00f3buj dekodowa\u0107 danych JE do ich odpowiednich typ\u00f3w
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=Nie pr\u00f3buj dekodowa\u0107 danych JE do ich odpowiednich typ\u00f3w
INFO_LDIFEXPORT_DESCRIPTION_EXCLUDE_FILTER_40=Filtr identyfikuj\u0105cy wpisy wy\u0142\u0105czone z eksportu do LDIF
INFO_DESCRIPTION_PSEARCH_INFO_355=U\u017cyj kontroli uporczywego szukania
INFO_PWPSTATE_DESCRIPTION_TSFILE_1108=\u015acie\u017cka sk\u0142adu zaufania certyfikatu
INFO_TASK_TOOL_TASK_SUCESSFULL_1608=%s zadanie %s zako\u0144czono pomy\u015blnie
INFO_LDIFIMPORT_DESCRIPTION_IS_COMPRESSED_80=Plik LDIF jest skompresowany
ERR_TOOL_RESULT_CODE_810=Kod Rezultatu: %d (%s)
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=Poka\u017c tylko te rekordy z kluczami, kt\u00f3re powinny by\u0107 uporz\u0105dkowane za podan\u0105 warto\u015bci\u0105 u\u017cywaj\u0105c komparatora dla kontenera bazy danych
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=Poka\u017c tylko te rekordy z kluczami, kt\u00f3re powinny by\u0107 uporz\u0105dkowane za podan\u0105 warto\u015bci\u0105 u\u017cywaj\u0105c komparatora dla kontenera bazy danych
ERR_PWPSTATE_CANNOT_CONNECT_1189=ERROR: Cannot establish a connection to the Directory Server %s. Verify that the server is running and that the provided credentials are valid. Szczeg\u00f3\u0142y: %s
INFO_STOPDS_DESCRIPTION_PORT_375=Numer portu administracyjnego serwera us\u0142ug katalogowych
INFO_INSTALLDS_DESCRIPTION_LDAPSPORT_1398=Port na kt\u00f3rym Directory Serwer powinien nas\u0142uchiwa\u0107 komunikacji LDAPS Port LDAPS b\u0119dzie skonfigurowany i SSL zostanie w\u0142\u0105czony tylko je\u017celi ten argument jest wyra\u017anie okre\u015blony
@@ -211,7 +211,7 @@
INFO_RESTOREDB_DESCRIPTION_BACKUP_DIR_293=\u015acie\u017cka do katalogu zawieraj\u0105cego plik(i) backupu
INFO_DESCRIPTION_PWPSTATE_GET_GRACE_LOGIN_USE_TIMES_1146=Wy\u015bwietl ilo\u015b\u0107 \u0142askawych logowa\u0144 (grace login) wykorzystanych przez u\u017cytkownika
INFO_LDAPSEARCH_TOOL_DESCRIPTION_693=To narz\u0119dzie mo\u017ce by\u0107 u\u017cyte do przeprowadzenia operacji szukania LDAP na Directory Server
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=Poka\u017c tylko te rekordy z kluczami, kt\u00f3re powinny by\u0107 uporz\u0105dkowane przed podan\u0105 warto\u015bci\u0105 u\u017cywaj\u0105c komparatora dla kontenera bazy danych
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=Poka\u017c tylko te rekordy z kluczami, kt\u00f3re powinny by\u0107 uporz\u0105dkowane przed podan\u0105 warto\u015bci\u0105 u\u017cywaj\u0105c komparatora dla kontenera bazy danych
INFO_INSTALLDS_DESCRIPTION_BASEDN_490=Bazowa DN informacji o u\u017cytkownikach w Directory Server. Wiele bazowych DN mo\u017ce zosta\u0107 wyszczeg\u00f3lnionych poprzez podanie opcji wiele razy.
INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_BRANCH_73=Bazowa DN ga\u0142\u0119zi, kt\u00f3ra ma by\u0107 pomini\u0119ta podczas importu z LDIF
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=Zbi\u00f3r argument\u00f3w, kt\u00f3re powinny by\u0107 przekazane JVM podczas uruchamiania serwera
@@ -272,7 +272,7 @@
INFO_LISTBACKENDS_DESCRIPTION_BASE_DN_727=Bazowy DN dla kt\u00f3rego nale\u017cy wy\u015bwietli\u0107 ID zapleczy
INFO_STOPDS_DESCRIPTION_TSPW_390=PIN sk\u0142adu zaufania certyfikatu
INFO_STOPDS_DESCRIPTION_STOP_REASON_383=Pow\u00f3d dla kt\u00f3rego serwer jest zatrzymywany lub restartowany
-INFO_LABEL_DBTEST_BACKEND_ID_1342=ID Zaplecza
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=ID Zaplecza
INFO_LDIFIMPORT_DESCRIPTION_BACKEND_ID_72=ID zaplecza do importu
INFO_DESCRIPTION_PWPSTATE_GET_SECONDS_UNTIL_PASSWORD_EXP_1129=Wy\u015bwietl okres czasu w sekundach do momentu gdy wyga\u015bnie has\u0142o u\u017cytkownika
INFO_CONFIGDS_TOOL_DESCRIPTION_684=To narz\u0119dzie mo\u017ce by\u0107 u\u017cyte do okre\u015blenia bazowej konfiguracji dla Directory Server
@@ -307,7 +307,7 @@
INFO_INSTALLDS_PROMPT_KEYSTORE_PASSWORD_1385=PIN sk\u0142adu klucza:
INFO_PWPSTATE_DESCRIPTION_BINDPWFILE_1101=\u015acie\u017cka pliku zawieraj\u0105cego has\u0142o do po\u0142\u0105czenia z serwerem
INFO_DELETE_DESCRIPTION_DELETE_SUBTREE_129=Usu\u0144 podany wpis i wszystkie wpisy poni\u017cej niego
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=Poka\u017c tylko te rekordy, kt\u00f3rych warto\u015b\u0107 jest nie wi\u0119ksza ni\u017c podana warto\u015b\u0107
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=Poka\u017c tylko te rekordy, kt\u00f3rych warto\u015b\u0107 jest nie wi\u0119ksza ni\u017c podana warto\u015b\u0107
INFO_DESCRIPTION_PWPSTATE_CLEAR_ACCOUNT_DISABLED_STATE_1117=Wyczy\u015b\u0107 informacje na temat zablokowania z konta u\u017cytkownika
INFO_ENCPW_DESCRIPTION_AUTHPW_369=U\u017cyj sk\u0142adni has\u0142a autentykacji zamiast sk\u0142adni has\u0142a u\u017cytkownika
INFO_DESCRIPTION_USE_PWP_CONTROL_411=U\u017cyj polityki kontroli \u017c\u0105dania has\u0142a
@@ -324,7 +324,7 @@
INFO_LDIFIMPORT_DESCRIPTION_EXCLUDE_FILTER_77=Filtr identyfikuj\u0105cy wpisy wy\u0142\u0105czone z importu z LDIF
INFO_DESCRIPTION_PWPSTATE_GET_PASSWORD_HISTORY_1202=Wy\u015bwietl warto\u015bci stanu historii hase\u0142 dla u\u017cytkownika
ERR_CANNOT_INITIALIZE_ARGS_16=Nieoczekiwany b\u0142\u0105d wyst\u0105pi\u0142 podczas pr\u00f3by inicjalizacji argument\u00f3w wiersza polece\u0144: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=Wypisz status indeks\u00f3w w kontenerze wpis\u00f3w
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=Wypisz status indeks\u00f3w w kontenerze wpis\u00f3w
INFO_VERIFYINDEX_TOOL_DESCRIPTION_700=To narz\u0119dzie mo\u017ce by\u0107 u\u017cyte do sprawdzenia czy dane indeks\u00f3w s\u0105 sp\u00f3jne w obr\u0119bie zaplecza opartego o Berkeley DB Java Edition
INFO_INSTALLDS_DESCRIPTION_ROOTPWFILE_497=\u015acie\u017cka pliku zawieraj\u0105cego has\u0142o dla pocz\u0105tkowego u\u017cytkownia root dla Directory Server
INFO_PWPSTATE_DESCRIPTION_PORT_1096=Port administracyjny Directory Servera
@@ -345,7 +345,7 @@
ERR_INSTALLDS_NO_ROOT_PASSWORD_513=B\u0141\u0104D: Nie podano has\u0142a dla pocz\u0105tkowego u\u017cytkownika root. Podczas przeprowadzania instalacji nieinteraktywnej, musi ono zosta\u0107 podane u\u017cywaj\u0105c argumentu %s lub %s
INFO_INSTALLDS_CONFIRM_INSTALL_1604=Ustaw serwer z powy\u017cszymi parametrami
INFO_DESCRIPTION_TASK_ERROR_NOTIFICATION_1470=Adres email odbiorcy informowanego o b\u0142\u0119dach w wyst\u0119puj\u0105cych przy uruchomieniu tego zadania. Ta opcja mo\u017ce by\u0107 wybrana wi\u0119cej ni\u017c raz
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=Nazwa kontenera bazy danych do debugowania
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=Nazwa kontenera bazy danych do debugowania
INFO_INSTALLDS_DESCRIPTION_USE_SELF_SIGNED_1399=Wygeneruj podpisany przez siebie certyfikat, kt\u00f3ry serwer powinien u\u017cy\u0107 podczas akceptowania po\u0142\u0105cze\u0144 SSL lub podczas negocjacji StartTLS
INFO_DESCRIPTION_KEYSTOREPATH_117=\u015acie\u017cka sk\u0142adu klucza certyfikatu
INFO_VERIFYINDEX_DESCRIPTION_VERIFY_CLEAN_209=Okre\u015bla, \u017ce pojedy\u0144czy indeks powinien by\u0107 zweryfikowany pod wzgl\u0119dem czysto\u015bci. Indeks jest czysty je\u015bli ka\u017cda warto\u015b\u0107 indeksu wskazuje tylko wpisy zawieraj\u0105ce t\u0105 wartos\u0107 Tylko jeden indeks w danym momencie mo\u017ce by\u0107 weryfikowany w ten spos\u00f3b
@@ -367,7 +367,7 @@
INFO_DESCRIPTION_ENCODING_115=U\u017cyj nast\u0119puj\u0105cego zestawu znak\u00f3w dla wejscia wiersza polece\u0144
INFO_DESCRIPTION_SORT_ORDER_876=Sortuj wyniki u\u017cywaj\u0105c podanej kolejno\u015bci sortowania
INFO_LDIFSEARCH_DESCRIPTION_OUTPUT_FILE_420=\u015acie\u017cka pliku, do kt\u00f3rego zostan\u0105 zapisane pasuj\u0105ce wpisy. Je\u015bli nie podano, wtedy dane zostan\u0105 wypisane na standardowym wyj\u015bciu
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Wypisz kontenery wpis\u00f3w dla g\u0142\u00f3wnych kontener\u00f3w
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=Wypisz kontenery wpis\u00f3w dla g\u0142\u00f3wnych kontener\u00f3w
INFO_STOPDS_DESCRIPTION_KSPWFILE_388=Plik PIN sk\u0142adu klucza certyfikatu
INFO_INSTALLDS_DO_NOT_START_SERVER_1601=Nie uruchamiaj Serwera po zako\u0144czeniu konfiguracji
INFO_LDIFIMPORT_DESCRIPTION_LDIF_FILE_69=\u015acie\u017cka do pliku LDIF, kt\u00f3ry ma by\u0107 zaimportowany
@@ -385,7 +385,7 @@
ERR_INSTALLDS_PASSWORDS_DONT_MATCH_530=B\u0141\u0104D: Podane warto\u015bci hase\u0142 nie zgadzaj\u0105 si\u0119
INFO_INSTALLDS_DESCRIPTION_REJECTED_FILE_1479=Zapisz odrzucone wpisy do podanego pliku
INFO_DESCRIPTION_TRUSTSTOREPATH_118=\u015acie\u017cka sk\u0142adu zaufania certyfikatu
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=Bazowa DN kontenera wpis\u00f3w do debugowania
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=Bazowa DN kontenera wpis\u00f3w do debugowania
ERR_INSTALLDS_INVALID_DN_RESPONSE_527=B\u0141\u0104D: Podana odpowied\u017a nie mog\u0142a by\u0107 zinterpretowana jako DN LDAP
INFO_PWPSTATE_DESCRIPTION_TSPWFILE_1110=Plik zawieraj\u0105cy PIN sk\u0142adu zaufania certyfikatu
INFO_LDIFIMPORT_DESCRIPTION_OVERWRITE_79=Nadpisz istniej\u0105cy plik zawieraj\u0105cy odrzucone wpisy i/lub pomi\u0144 plik zamiast do\u0142\u0105czania do niego
@@ -395,3 +395,5 @@
INFO_CONFIGURE_WINDOWS_SERVICE_DESCRIPTION_SHOWUSAGE_817=Wy\u015bwietl informacje o u\u017cyciu
INFO_VERIFYINDEX_DESCRIPTION_COUNT_ERRORS_1199=Licz ilo\u015b\u0107 b\u0142\u0119d\u00f3w jakie pojawi\u0142y si\u0119 podczas weryfikacji i zwr\u00f3\u0107 j\u0105 jako kod wyj\u015bcia (warto\u015bci > 255 b\u0119d\u0105 obci\u0119te do 255 z powodu ogranicze\u0144 kodu wyj\u015bcia)
INFO_LDAPPWMOD_TOOL_DESCRIPTION_692=To narz\u0119dzie mo\u017ce by\u0107 u\u017cyte do przeprowadzenia operacji modyfikacji has\u0142a LDAP na Directory Server
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=Wypsiz g\u0142\u00f3wne kontenery u\u017cywane przez wszystkie zaplecza
+INFO_DESCRIPTION_BACKEND_TOOL_1893=To narz\u0119dzie mo\u017ce by\u0107 wykorzystane do debugowania zaplecza
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_CN.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_CN.properties
index cbd54a3..b567f6c 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_CN.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_CN.properties
@@ -895,41 +895,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=\u5982\u679c\u6307\u5b9a {%s} \u53c2\u6570\uff0c\u8fd8\u5fc5\u987b\u6307\u5b9a {%s}
INFO_DESCRIPTION_DBTEST_TOOL_1327=\u6b64\u5b9e\u7528\u7a0b\u5e8f\u53ef\u7528\u4e8e\u8c03\u8bd5 JE \u6570\u636e\u5e93
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=\u5217\u51fa\u6240\u6709 JE \u540e\u7aef\u4f7f\u7528\u7684\u6839\u5bb9\u5668
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u5217\u51fa\u6839\u5bb9\u5668\u7684\u6761\u76ee\u5bb9\u5668
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u5217\u51fa\u6839\u5bb9\u5668\u7684\u6761\u76ee\u5bb9\u5668
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=\u8f6c\u50a8\u6570\u636e\u5e93\u5bb9\u5668\u4e2d\u7684\u8bb0\u5f55
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=\u8981\u8c03\u8bd5\u7684 JE \u540e\u7aef\u7684 ID
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=\u8981\u8c03\u8bd5\u7684\u6761\u76ee\u5bb9\u5668\u7684\u57fa DN
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=\u8981\u8c03\u8bd5\u7684\u6570\u636e\u5e93\u5bb9\u5668\u7684\u540d\u79f0
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=\u4e0d\u8981\u5c1d\u8bd5\u5c06 JE \u6570\u636e\u89e3\u7801\u4e3a\u5176\u76f8\u5e94\u7c7b\u578b
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=\u8981\u8c03\u8bd5\u7684 JE \u540e\u7aef\u7684 ID
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=\u8981\u8c03\u8bd5\u7684\u6761\u76ee\u5bb9\u5668\u7684\u57fa DN
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=\u8981\u8c03\u8bd5\u7684\u6570\u636e\u5e93\u5bb9\u5668\u7684\u540d\u79f0
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=\u4e0d\u8981\u5c1d\u8bd5\u5c06 JE \u6570\u636e\u89e3\u7801\u4e3a\u5176\u76f8\u5e94\u7c7b\u578b
ERR_DBTEST_DECODE_FAIL_1335=\u5728\u5bf9\u6570\u636e\u8fdb\u884c\u89e3\u7801\u65f6\u51fa\u73b0\u9519\u8bef: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=\u5217\u51fa\u6761\u76ee\u5bb9\u5668\u4e2d\u7684\u7d22\u5f15\u72b6\u6001
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=\u4ec5\u663e\u793a\u952e\u5e94\u6392\u5728\u63d0\u4f9b\u7684\u503c\u524d\u9762\u7684\u8bb0\u5f55\uff08\u4f7f\u7528\u6570\u636e\u5e93\u5bb9\u5668\u7684\u6bd4\u8f83\u5668\uff09
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=\u4ec5\u663e\u793a\u952e\u5e94\u6392\u5728\u63d0\u4f9b\u7684\u503c\u540e\u9762\u7684\u8bb0\u5f55\uff08\u4f7f\u7528\u6570\u636e\u5e93\u5bb9\u5668\u7684\u6bd4\u8f83\u5668\uff09
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=\u4ec5\u663e\u793a\u6570\u636e\u4e0d\u5927\u4e8e\u63d0\u4f9b\u7684\u503c\u7684\u8bb0\u5f55
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=\u4ec5\u663e\u793a\u6570\u636e\u4e0d\u5c0f\u4e8e\u63d0\u4f9b\u7684\u503c\u7684\u8bb0\u5f55
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=\u5217\u51fa\u6761\u76ee\u5bb9\u5668\u4e2d\u7684\u7d22\u5f15\u72b6\u6001
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=\u4ec5\u663e\u793a\u952e\u5e94\u6392\u5728\u63d0\u4f9b\u7684\u503c\u524d\u9762\u7684\u8bb0\u5f55\uff08\u4f7f\u7528\u6570\u636e\u5e93\u5bb9\u5668\u7684\u6bd4\u8f83\u5668\uff09
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=\u4ec5\u663e\u793a\u952e\u5e94\u6392\u5728\u63d0\u4f9b\u7684\u503c\u540e\u9762\u7684\u8bb0\u5f55\uff08\u4f7f\u7528\u6570\u636e\u5e93\u5bb9\u5668\u7684\u6bd4\u8f83\u5668\uff09
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=\u4ec5\u663e\u793a\u6570\u636e\u4e0d\u5927\u4e8e\u63d0\u4f9b\u7684\u503c\u7684\u8bb0\u5f55
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=\u4ec5\u663e\u793a\u6570\u636e\u4e0d\u5c0f\u4e8e\u63d0\u4f9b\u7684\u503c\u7684\u8bb0\u5f55
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=\u5217\u51fa\u6761\u76ee\u5bb9\u5668\u7684\u6570\u636e\u5e93\u5bb9\u5668
-INFO_LABEL_DBTEST_BACKEND_ID_1342=\u540e\u7aef ID
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=\u540e\u7aef ID
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=\u6570\u636e\u5e93\u76ee\u5f55
-INFO_LABEL_DBTEST_BASE_DN_1344=\u57fa DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=\u57fa DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE \u6570\u636e\u5e93\u524d\u7f00
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=\u6761\u76ee\u8ba1\u6570
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=\u6ca1\u6709 Directory Server \u540e\u7aef\u4f7f\u7528\u8bf7\u6c42\u7684\u540e\u7aef ID %s \u8fdb\u884c\u914d\u7f6e
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u6ca1\u6709\u4f7f\u7528\u540e\u7aef %2$s \u4e2d\u8bf7\u6c42\u7684\u57fa DN %1$s \u914d\u7f6e\u7684\u6761\u76ee\u5bb9\u5668
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=\u6ca1\u6709 Directory Server \u540e\u7aef\u4f7f\u7528\u8bf7\u6c42\u7684\u540e\u7aef ID %s \u8fdb\u884c\u914d\u7f6e
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u6ca1\u6709\u4f7f\u7528\u540e\u7aef %2$s \u4e2d\u8bf7\u6c42\u7684\u57fa DN %1$s \u914d\u7f6e\u7684\u6761\u76ee\u5bb9\u5668
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=\u4e0d\u5b58\u5728\u4f7f\u7528\u6761\u76ee\u5bb9\u5668 %2$s \u548c\u540e\u7aef %3$s \u4e2d\u8bf7\u6c42\u7684\u540d\u79f0 %1$s \u7684\u6570\u636e\u5e93\u5bb9\u5668
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=\u5728\u5c1d\u8bd5\u521d\u59cb\u5316 JE \u540e\u7aef %s \u65f6\u51fa\u73b0\u610f\u5916\u9519\u8bef: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=\u5728\u5c1d\u8bd5\u4ece\u6570\u636e\u5e93\u8bfb\u53d6\u548c/\u6216\u89e3\u7801\u8bb0\u5f55\u65f6\u51fa\u73b0\u610f\u5916\u9519\u8bef: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=\u65e0\u6cd5\u5c06\u57fa DN \u5b57\u7b26\u4e32 "%s" \u89e3\u7801\u4e3a\u6709\u6548\u7684\u6807\u8bc6\u540d: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=\u65e0\u6cd5\u5c06\u57fa DN \u5b57\u7b26\u4e32 "%s" \u89e3\u7801\u4e3a\u6709\u6548\u7684\u6807\u8bc6\u540d: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=\u6570\u636e\u5e93\u540d\u79f0
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=\u6570\u636e\u5e93\u7c7b\u578b
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE \u6570\u636e\u5e93\u540d\u79f0
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=\u8bb0\u5f55\u8ba1\u6570
-INFO_LABEL_DBTEST_INDEX_NAME_1357=\u7d22\u5f15\u540d\u79f0
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=\u7d22\u5f15\u7c7b\u578b
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=\u7d22\u5f15\u72b6\u6001
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=\u8bb0\u5f55\u8ba1\u6570
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=\u7d22\u5f15\u540d\u79f0
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=\u7d22\u5f15\u7c7b\u578b
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=\u7d22\u5f15\u72b6\u6001
INFO_LABEL_DBTEST_KEY_1360=\u952e
INFO_LABEL_DBTEST_DATA_1361=\u6570\u636e
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=\u5728\u5c1d\u8bd5\u91ca\u653e\u540e\u7aef %s \u7684\u5171\u4eab\u9501\u5b9a\u65f6\u51fa\u73b0\u9519\u8bef: %s\u3002\u6b64\u9501\u5b9a\u5e94\u5728\u8fdb\u7a0b\u9000\u51fa\u65f6\u81ea\u52a8\u6e05\u9664\uff0c\u56e0\u6b64\u5e94\u65e0\u9700\u8fdb\u4e00\u6b65\u64cd\u4f5c
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=\u5728\u5c1d\u8bd5\u83b7\u53d6\u540e\u7aef %s \u7684\u5171\u4eab\u9501\u5b9a\u65f6\u51fa\u73b0\u9519\u8bef: %s\u3002\u8fd9\u901a\u5e38\u610f\u5473\u7740\u67d0\u4e9b\u5176\u4ed6\u8fdb\u7a0b\u62e5\u6709\u6b64\u540e\u7aef\u7684\u4e92\u65a5\u8bbf\u95ee\u6743\u9650\uff08\u4f8b\u5982\uff0c\u6062\u590d\u6216 LDIF \u5bfc\u5165\uff09
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=\u5728\u5c1d\u8bd5\u91ca\u653e\u540e\u7aef %s \u7684\u5171\u4eab\u9501\u5b9a\u65f6\u51fa\u73b0\u9519\u8bef: %s\u3002\u6b64\u9501\u5b9a\u5e94\u5728\u8fdb\u7a0b\u9000\u51fa\u65f6\u81ea\u52a8\u6e05\u9664\uff0c\u56e0\u6b64\u5e94\u65e0\u9700\u8fdb\u4e00\u6b65\u64cd\u4f5c
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=\u5728\u5c1d\u8bd5\u83b7\u53d6\u540e\u7aef %s \u7684\u5171\u4eab\u9501\u5b9a\u65f6\u51fa\u73b0\u9519\u8bef: %s\u3002\u8fd9\u901a\u5e38\u610f\u5473\u7740\u67d0\u4e9b\u5176\u4ed6\u8fdb\u7a0b\u62e5\u6709\u6b64\u540e\u7aef\u7684\u4e92\u65a5\u8bbf\u95ee\u6743\u9650\uff08\u4f8b\u5982\uff0c\u6062\u590d\u6216 LDIF \u5bfc\u5165\uff09
ERR_DBTEST_CANNOT_DECODE_KEY_1364=\u5728\u89e3\u7801\u6700\u5c0f/\u6700\u5927\u5bc6\u94a5\u503c %s \u65f6\u51fa\u73b0\u9519\u8bef: %s\u3002\u5177\u6709\u524d\u7f00 "0x" \u7684\u503c\u5c06\u88ab\u89e3\u7801\u4e3a\u5341\u516d\u8fdb\u5236\u7684\u539f\u59cb\u5b57\u8282\u3002\u8f6c\u50a8 DN2ID \u6570\u636e\u5e93\u65f6\uff0c\u8be5\u503c\u5fc5\u987b\u4e3a\u6709\u6548\u7684\u6807\u8bc6\u540d\u3002\u8f6c\u50a8 ID2Entry \u6570\u636e\u5e93\u65f6\uff0c\u8be5\u503c\u5c06\u88ab\u89e3\u7801\u4e3a\u6761\u76ee ID\u3002\u8f6c\u50a8\u6240\u6709\u5176\u4ed6\u6570\u636e\u5e93\u65f6\uff0c\u8be5\u503c\u5c06\u88ab\u89e3\u7801\u4e3a\u5b57\u7b26\u4e32
INFO_LABEL_DBTEST_ENTRY_1365=\u6761\u76ee
INFO_LABEL_DBTEST_ENTRY_ID_1366=\u6761\u76ee ID
@@ -939,7 +939,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=\u6761\u76ee ID \u5217\u8868
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=\u4e0a\u6b21\u6392\u5e8f\u952e
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=\u5728\u5c06\u6700\u5c0f/\u6700\u5927\u6570\u636e\u5927\u5c0f %s \u89e3\u6790\u4e3a\u6574\u6570\u65f6\u51fa\u73b0\u9519\u8bef: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u5b50\u547d\u4ee4
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u5b50\u547d\u4ee4
INFO_CREATERC_USER_DESCRIPTION_1375=\u8fd0\u884c\u670d\u52a1\u5668\u65f6\u5e94\u4f7f\u7528\u7684\u7528\u6237\u5e10\u6237\u540d\u79f0
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=\u8fd0\u884c\u670d\u52a1\u5668\u65f6\u5e94\u4f7f\u7528\u7684 Java \u5b89\u88c5\u8def\u5f84
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=\u8fd0\u884c\u670d\u52a1\u5668\u65f6\u5e94\u4f20\u9012\u7ed9 JVM \u7684\u4e00\u7ec4\u53c2\u6570
@@ -1271,10 +1271,14 @@
INFO_DESCRIPTION_REFRESH_PERIOD_1706=\u6307\u5b9a\u6b64\u53c2\u6570\u65f6\uff0c\u72b6\u6001\u547d\u4ee4\u5c06\u5b9a\u671f\u663e\u793a\u5176\u5185\u5bb9\u3002\u7528\u4e8e\u6307\u5b9a\u4e24\u6b21\u72b6\u6001\u663e\u793a\u4e4b\u95f4\u7684\u95f4\u9694\u65f6\u95f4\uff08\u4ee5\u79d2\u4e3a\u5355\u4f4d\uff09
INFO_INSTALLDS_PRINT_EQUIVALENT_COMMAND_LINE_1708=\u6253\u5370\u7b49\u6548\u7684\u975e\u4ea4\u4e92\u547d\u4ee4\u884c
ERR_WINDOWS_SERVICE_ENABLING_ERROR_STARTING_SERVER_1709=\u5df2\u6210\u529f\u914d\u7f6e Windows \u670d\u52a1\uff0c\u4f46\u542f\u52a8\u8be5\u670d\u52a1\u65f6\u51fa\u9519\u3002\u542f\u52a8 Windows \u670d\u52a1\u65f6\u51fa\u73b0\u9519\u8bef\u4ee3\u7801: %d
-INFO_DESCRIPTION_DBTEST_STATS_ONLY_1710=\u4e0d\u663e\u793a JE \u6570\u636e\uff0c\u53ea\u663e\u793a\u7edf\u8ba1\u4fe1\u606f
+INFO_DESCRIPTION_BACKEND_DEBUG_STATS_ONLY_1710=\u4e0d\u663e\u793a JE \u6570\u636e\uff0c\u53ea\u663e\u793a\u7edf\u8ba1\u4fe1\u606f
INFO_TIMEOUT_PLACEHOLDER_1711={timeout}
INFO_DESCRIPTION_CONNECTION_TIMEOUT_1712=\u5efa\u7acb\u8fde\u63a5\u6240\u80fd\u5360\u7528\u7684\u6700\u5927\u65f6\u95f4\u957f\u5ea6\uff08\u4ee5\u6beb\u79d2\u4e3a\u5355\u4f4d\uff09
ERR_MAKELDIF_CANNOT_WRITE_ENTRY_WITHOUT_DN_1713=\u5c1d\u8bd5\u5411 LDIF \u5199\u5165\u6761\u76ee\u65f6\u51fa\u73b0\u9519\u8bef\uff1a\u65e0\u6cd5\u8ba1\u7b97\u6761\u76ee\u7684 DN\uff08\u627e\u4e0d\u5230 RDN \u5c5e\u6027 %s \u7684\u503c\uff09
ERR_CLIENT_SIDE_TIMEOUT_1714=\u51fa\u73b0\u5ba2\u6237\u7aef\u8d85\u65f6\u3002%n\u5176\u4ed6\u4fe1\u606f: %s
INFO_LABEL_DBTEST_INDEX_UNDEFINED_RECORD_COUNT_1715=\u672a\u5b9a\u4e49
-
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=\u5217\u51fa\u6240\u6709\u540e\u7aef\u4f7f\u7528\u7684\u6839\u5bb9\u5668
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=\u5728\u5c1d\u8bd5\u4ece\u7d22\u5f15\u8bfb\u53d6\u548c/\u6216\u89e3\u7801\u8bb0\u5f55\u65f6\u51fa\u73b0\u610f\u5916\u9519\u8bef: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=\u5728\u5c1d\u8bd5\u521d\u59cb\u5316\u540e\u7aef %s \u65f6\u51fa\u73b0\u610f\u5916\u9519\u8bef: %s
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=\u4e0d\u5b58\u5728\u4f7f\u7528\u6761\u76ee\u5bb9\u5668 %2$s \u548c\u540e\u7aef %3$s \u4e2d\u8bf7\u6c42\u7684\u540d\u79f0 %1$s \u7684 \u7d22\u5f15
+INFO_DESCRIPTION_BACKEND_TOOL_1893=\u6b64\u5b9e\u7528\u7a0b\u5e8f\u53ef\u7528\u4e8e\u8c03\u8bd5 Pluggable \u540e\u7aef\u7684
diff --git a/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_TW.properties b/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_TW.properties
index 7a8230d..1d57ae3 100644
--- a/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_TW.properties
+++ b/opendj-server-legacy/src/messages/org/opends/messages/tool_zh_TW.properties
@@ -893,41 +893,41 @@
ERR_DSCFG_ERROR_QUIET_AND_INTERACTIVE_INCOMPATIBLE_1326=\u82e5\u6307\u5b9a\u4e86 {%s} \u5f15\u6578\uff0c\u5247\u5fc5\u9808\u540c\u6642\u6307\u5b9a {%s}
INFO_DESCRIPTION_DBTEST_TOOL_1327=\u6b64\u516c\u7528\u7a0b\u5f0f\u53ef\u7528\u65bc\u5c0d JE \u8cc7\u6599\u5eab\u9032\u884c\u9664\u932f
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ROOT_CONTAINERS_1328=\u5217\u51fa\u6240\u6709 JE \u5f8c\u7aef\u4f7f\u7528\u7684\u6839\u5bb9\u5668
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u5217\u51fa\u6839\u5bb9\u5668\u7684\u9805\u76ee\u5bb9\u5668
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_ENTRY_CONTAINERS_1329=\u5217\u51fa\u6839\u5bb9\u5668\u7684\u9805\u76ee\u5bb9\u5668
INFO_DESCRIPTION_DBTEST_SUBCMD_DUMP_DATABASE_CONTAINER_1330=\u50be\u5370\u8cc7\u6599\u5eab\u5bb9\u5668\u4e2d\u7684\u8a18\u9304
-INFO_DESCRIPTION_DBTEST_BACKEND_ID_1331=\u8981\u9664\u932f\u4e4b JE \u5f8c\u7aef\u7684\u5f8c\u7aef ID
-INFO_DESCRIPTION_DBTEST_BASE_DN_1332=\u8981\u9664\u932f\u4e4b\u9805\u76ee\u5bb9\u5668\u7684\u57fa\u5e95 DN
-INFO_DESCRIPTION_DBTEST_DATABASE_NAME_1333=\u8981\u9664\u932f\u4e4b\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u540d\u7a31
-INFO_DESCRIPTION_DBTEST_SKIP_DECODE_1334=\u8acb\u52ff\u5617\u8a66\u5c07 JE \u8cc7\u6599\u89e3\u78bc\u70ba\u5176\u9069\u7576\u7684\u985e\u578b
+INFO_BACKEND_DEBUG_BACKEND_ID_1331=\u8981\u9664\u932f\u4e4b JE \u5f8c\u7aef\u7684\u5f8c\u7aef ID
+INFO_DESCRIPTION_BACKEND_DEBUG_BASE_DN_1332=\u8981\u9664\u932f\u4e4b\u9805\u76ee\u5bb9\u5668\u7684\u57fa\u5e95 DN
+INFO_DESCRIPTION_BACKEND_DEBUG_INDEX_NAME_1333=\u8981\u9664\u932f\u4e4b\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u540d\u7a31
+INFO_DESCRIPTION_BACKEND_DEBUG_SKIP_DECODE_1334=\u8acb\u52ff\u5617\u8a66\u5c07 JE \u8cc7\u6599\u89e3\u78bc\u70ba\u5176\u9069\u7576\u7684\u985e\u578b
ERR_DBTEST_DECODE_FAIL_1335=\u89e3\u78bc\u8cc7\u6599\u6642\u767c\u751f\u932f\u8aa4: %s
-INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_INDEX_STATUS_1336=\u5217\u51fa\u9805\u76ee\u5bb9\u5668\u4e2d\u7684\u7d22\u5f15\u72c0\u614b
-INFO_DESCRIPTION_DBTEST_MAX_KEY_VALUE_1337=\u50c5\u986f\u793a\u91d1\u9470\u61c9\u4ee5\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u6bd4\u8f03\u5b50\u6392\u5e8f\u5728\u6240\u63d0\u4f9b\u503c\u4e4b\u524d\u7684\u8a18\u9304
-INFO_DESCRIPTION_DBTEST_MIN_KEY_VALUE_1338=\u50c5\u986f\u793a\u91d1\u9470\u61c9\u4ee5\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u6bd4\u8f03\u5b50\u6392\u5e8f\u5728\u6240\u63d0\u4f9b\u503c\u4e4b\u5f8c\u7684\u8a18\u9304
-INFO_DESCRIPTION_DBTEST_MAX_DATA_SIZE_1339=\u50c5\u986f\u793a\u5176\u8cc7\u6599\u5c0f\u65bc\u6216\u7b49\u65bc\u6240\u63d0\u4f9b\u503c\u7684\u8a18\u9304
-INFO_DESCRIPTION_DBTEST_MIN_DATA_SIZE_1340=\u50c5\u986f\u793a\u5176\u8cc7\u6599\u5927\u65bc\u6216\u7b49\u65bc\u6240\u63d0\u4f9b\u503c\u7684\u8a18\u9304
+INFO_DESCRIPTION_BACKEND_DEBUG_SUBCMD_LIST_INDEX_STATUS_1336=\u5217\u51fa\u9805\u76ee\u5bb9\u5668\u4e2d\u7684\u7d22\u5f15\u72c0\u614b
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_KEY_VALUE_1337=\u50c5\u986f\u793a\u91d1\u9470\u61c9\u4ee5\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u6bd4\u8f03\u5b50\u6392\u5e8f\u5728\u6240\u63d0\u4f9b\u503c\u4e4b\u524d\u7684\u8a18\u9304
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_KEY_VALUE_1338=\u50c5\u986f\u793a\u91d1\u9470\u61c9\u4ee5\u8cc7\u6599\u5eab\u5bb9\u5668\u7684\u6bd4\u8f03\u5b50\u6392\u5e8f\u5728\u6240\u63d0\u4f9b\u503c\u4e4b\u5f8c\u7684\u8a18\u9304
+INFO_DESCRIPTION_BACKEND_DEBUG_MAX_DATA_SIZE_1339=\u50c5\u986f\u793a\u5176\u8cc7\u6599\u5c0f\u65bc\u6216\u7b49\u65bc\u6240\u63d0\u4f9b\u503c\u7684\u8a18\u9304
+INFO_DESCRIPTION_BACKEND_DEBUG_MIN_DATA_SIZE_1340=\u50c5\u986f\u793a\u5176\u8cc7\u6599\u5927\u65bc\u6216\u7b49\u65bc\u6240\u63d0\u4f9b\u503c\u7684\u8a18\u9304
INFO_DESCRIPTION_DBTEST_SUBCMD_LIST_DATABASE_CONTAINERS_1341=\u5217\u51fa\u9805\u76ee\u5bb9\u5668\u7684\u8cc7\u6599\u5eab\u5bb9\u5668
-INFO_LABEL_DBTEST_BACKEND_ID_1342=\u5f8c\u7aef ID
+INFO_LABEL_BACKEND_DEBUG_BACKEND_ID_1342=\u5f8c\u7aef ID
INFO_LABEL_DBTEST_DB_DIRECTORY_1343=\u8cc7\u6599\u5eab\u76ee\u9304
-INFO_LABEL_DBTEST_BASE_DN_1344=\u57fa\u5e95 DN
+INFO_LABEL_BACKEND_DEBUG_BASE_DN_1344=\u57fa\u5e95 DN
INFO_LABEL_DBTEST_JE_DATABASE_PREFIX_1345=JE \u8cc7\u6599\u5eab\u524d\u7db4
INFO_LABEL_DBTEST_ENTRY_COUNT_1346=\u9805\u76ee\u8a08\u6578
-ERR_DBTEST_NO_BACKENDS_FOR_ID_1347=\u6c92\u6709\u4efb\u4f55\u76ee\u9304\u4f3a\u670d\u5668\u5f8c\u7aef\u4ee5\u8acb\u6c42\u7684\u5f8c\u7aef ID %s \u9032\u884c\u914d\u7f6e
-ERR_DBTEST_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u6c92\u6709\u4efb\u4f55\u9805\u76ee\u5bb9\u5668\u4ee5\u5f8c\u7aef %2$s \u4e2d\u8acb\u6c42\u7684\u57fa\u5e95 DN %1$s \u9032\u884c\u914d\u7f6e
+ERR_BACKEND_DEBUG_NO_BACKENDS_FOR_ID_1347=\u6c92\u6709\u4efb\u4f55\u76ee\u9304\u4f3a\u670d\u5668\u5f8c\u7aef\u4ee5\u8acb\u6c42\u7684\u5f8c\u7aef ID %s \u9032\u884c\u914d\u7f6e
+ERR_BACKEND_DEBUG_NO_ENTRY_CONTAINERS_FOR_BASE_DN_1348=\u6c92\u6709\u4efb\u4f55\u9805\u76ee\u5bb9\u5668\u4ee5\u5f8c\u7aef %2$s \u4e2d\u8acb\u6c42\u7684\u57fa\u5e95 DN %1$s \u9032\u884c\u914d\u7f6e
ERR_DBTEST_NO_DATABASE_CONTAINERS_FOR_NAME_1349=\u9805\u76ee\u5bb9\u5668 %2$s \u8207\u5f8c\u7aef %3$s \u4e2d\uff0c\u90fd\u6c92\u6709\u4efb\u4f55\u8acb\u6c42\u7684\u540d\u7a31\u70ba %1$s \u7684\u8cc7\u6599\u5eab\u5bb9\u5668\u5b58\u5728
ERR_DBTEST_ERROR_INITIALIZING_BACKEND_1350=\u5617\u8a66\u521d\u59cb\u5316 JE \u5f8c\u7aef %s \u6642\uff0c\u767c\u751f\u672a\u9810\u671f\u7684\u932f\u8aa4: %s
ERR_DBTEST_ERROR_READING_DATABASE_1351=\u5617\u8a66\u8b80\u53d6\u53ca (\u6216) \u89e3\u78bc\u8cc7\u6599\u5eab\u4e2d\u7684\u8a18\u9304\u6642\u767c\u751f\u932f\u8aa4: %s
-ERR_DBTEST_DECODE_BASE_DN_1352=\u7121\u6cd5\u5c07\u57fa\u5e95 DN \u5b57\u4e32\u300c%s\u300d\u89e3\u78bc\u70ba\u6709\u6548\u7684\u8fa8\u5225\u540d\u7a31: %s
+ERR_BACKEND_DEBUG_DECODE_BASE_DN_1352=\u7121\u6cd5\u5c07\u57fa\u5e95 DN \u5b57\u4e32\u300c%s\u300d\u89e3\u78bc\u70ba\u6709\u6548\u7684\u8fa8\u5225\u540d\u7a31: %s
INFO_LABEL_DBTEST_DATABASE_NAME_1353=\u8cc7\u6599\u5eab\u540d\u7a31
INFO_LABEL_DBTEST_DATABASE_TYPE_1354=\u8cc7\u6599\u5eab\u985e\u578b
INFO_LABEL_DBTEST_JE_DATABASE_NAME_1355=JE \u8cc7\u6599\u5eab\u540d\u7a31
-INFO_LABEL_DBTEST_JE_RECORD_COUNT_1356=\u8a18\u9304\u8a08\u6578
-INFO_LABEL_DBTEST_INDEX_NAME_1357=\u7d22\u5f15\u540d\u7a31
-INFO_LABEL_DBTEST_INDEX_TYPE_1358=\u7d22\u5f15\u985e\u578b
-INFO_LABEL_DBTEST_INDEX_STATUS_1359=\u7d22\u5f15\u72c0\u614b
+INFO_LABEL_DBTEST_RECORD_COUNT_1356=\u8a18\u9304\u8a08\u6578
+INFO_LABEL_BACKEND_DEBUG_INDEX_NAME_1357=\u7d22\u5f15\u540d\u7a31
+INFO_LABEL_BACKEND_DEBUG_INDEX_TYPE_1358=\u7d22\u5f15\u985e\u578b
+INFO_LABEL_BACKEND_DEBUG_INDEX_STATUS_1359=\u7d22\u5f15\u72c0\u614b
INFO_LABEL_DBTEST_KEY_1360=\u91d1\u9470
INFO_LABEL_DBTEST_DATA_1361=\u8cc7\u6599
-WARN_DBTEST_CANNOT_UNLOCK_BACKEND_1362=\u5617\u8a66\u91cb\u653e\u5f8c\u7aef %s \u7684\u5171\u7528\u9396\u5b9a\u6642\u767c\u751f\u932f\u8aa4: %s\u3002\u6b64\u9396\u5b9a\u61c9\u6703\u5728\u7a0b\u5e8f\u7d50\u675f\u6642\u81ea\u52d5\u6e05\u9664\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u5176\u4ed6\u52d5\u4f5c
-ERR_DBTEST_CANNOT_LOCK_BACKEND_1363=\u5617\u8a66\u53d6\u5f97\u5f8c\u7aef %s \u7684\u5171\u7528\u9396\u5b9a\u6642\u767c\u751f\u932f\u8aa4: %s\u3002\u9019\u901a\u5e38\u8868\u793a\u67d0\u4e9b\u5176\u4ed6\u7a0b\u5e8f\u5177\u6709\u6b64\u5f8c\u7aef\u7684\u5c08\u7528\u5b58\u53d6 (\u4f8b\u5982\u5fa9\u539f\u6216 LDIF \u532f\u5165)
+WARN_BACKEND_DEBUG_CANNOT_UNLOCK_BACKEND_1362=\u5617\u8a66\u91cb\u653e\u5f8c\u7aef %s \u7684\u5171\u7528\u9396\u5b9a\u6642\u767c\u751f\u932f\u8aa4: %s\u3002\u6b64\u9396\u5b9a\u61c9\u6703\u5728\u7a0b\u5e8f\u7d50\u675f\u6642\u81ea\u52d5\u6e05\u9664\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u5176\u4ed6\u52d5\u4f5c
+ERR_BACKEND_DEBUG_CANNOT_LOCK_BACKEND_1363=\u5617\u8a66\u53d6\u5f97\u5f8c\u7aef %s \u7684\u5171\u7528\u9396\u5b9a\u6642\u767c\u751f\u932f\u8aa4: %s\u3002\u9019\u901a\u5e38\u8868\u793a\u67d0\u4e9b\u5176\u4ed6\u7a0b\u5e8f\u5177\u6709\u6b64\u5f8c\u7aef\u7684\u5c08\u7528\u5b58\u53d6 (\u4f8b\u5982\u5fa9\u539f\u6216 LDIF \u532f\u5165)
ERR_DBTEST_CANNOT_DECODE_KEY_1364=\u89e3\u78bc\u6700\u5927/\u6700\u5c0f\u91d1\u9470\u503c %s \u6642\u767c\u751f\u932f\u8aa4: %s\u3002\u4ee5\u300c0x\u300d\u505a\u70ba\u524d\u7db4\u7684\u503c\u5c07\u6703\u89e3\u78bc\u70ba\u5341\u516d\u9032\u5236\u7684\u539f\u59cb\u4f4d\u5143\u7d44\u3002\u50be\u5370 DN2ID \u8cc7\u6599\u5eab\u6642\uff0c\u6b64\u503c\u5fc5\u9808\u662f\u6709\u6548\u7684\u8fa8\u5225\u540d\u7a31\u3002\u50be\u5370 ID2Entry \u8cc7\u6599\u5eab\u6642\uff0c\u6b64\u503c\u5c07\u6703\u89e3\u78bc\u70ba\u9805\u76ee ID\u3002\u50be\u5370\u6240\u6709\u5176\u4ed6\u8cc7\u6599\u5eab\u6642\uff0c\u6b64\u503c\u5c07\u6703\u89e3\u78bc\u70ba\u5b57\u4e32\u3002
INFO_LABEL_DBTEST_ENTRY_1365=\u9805\u76ee
INFO_LABEL_DBTEST_ENTRY_ID_1366=\u9805\u76ee ID
@@ -937,7 +937,7 @@
INFO_LABEL_DBTEST_INDEX_ENTRY_ID_LIST_1370=\u9805\u76ee ID \u6e05\u55ae
INFO_LABEL_DBTEST_VLV_INDEX_LAST_SORT_KEYS_1371=\u6700\u5f8c\u4e00\u500b\u6392\u5e8f\u91d1\u9470
ERR_DBTEST_CANNOT_DECODE_SIZE_1372=\u5c07\u6700\u5c0f/\u6700\u5927\u8cc7\u6599\u5927\u5c0f %s \u5256\u6790\u70ba\u6574\u6578\u6642\u767c\u751f\u932f\u8aa4: %s
-ERR_DBTEST_MISSING_SUBCOMMAND_1374=\u5fc5\u9808\u6307\u5b9a\u5b50\u6307\u4ee4
+ERR_BACKEND_DEBUG_MISSING_SUBCOMMAND_1374=\u5fc5\u9808\u6307\u5b9a\u5b50\u6307\u4ee4
INFO_CREATERC_USER_DESCRIPTION_1375=\u57f7\u884c\u4f3a\u670d\u5668\u6642\u6240\u61c9\u4f7f\u7528\u7684\u4f7f\u7528\u8005\u5e33\u865f\u540d\u7a31
INFO_CREATERC_JAVA_HOME_DESCRIPTION_1376=\u57f7\u884c\u4f3a\u670d\u5668\u6642\u6240\u61c9\u4f7f\u7528\u4e4b Java \u5b89\u88dd\u7684\u8def\u5f91
INFO_CREATERC_JAVA_ARGS_DESCRIPTION_1377=\u57f7\u884c\u4f3a\u670d\u5668\u6642\u61c9\u50b3\u9001\u81f3 JVM \u7684\u4e00\u7d44\u5f15\u6578
@@ -1179,3 +1179,8 @@
INFO_PROMPT_YES_COMPLETE_ANSWER_1663=\u662f
INFO_PROMPT_NO_COMPLETE_ANSWER_1665=\u5426
ERR_DSCFG_ERROR_BATCH_FILE_AND_INTERACTIVE_INCOMPATIBLE_1679=\u82e5\u6307\u5b9a\u4e86 {%s} \u5f15\u6578\uff0c\u5247\u5fc5\u9808\u540c\u6642\u6307\u5b9a {%s}
+INFO_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_ROOT_CONTAINERS_1854=\u5217\u51fa\u6240\u6709\u5f8c\u7aef\u4f7f\u7528\u7684\u6839\u5bb9\u566
+ERR_BACKEND_TOOL_ERROR_READING_TREE_1866=\u5617\u8a66\u8b80\u53d6\u53ca (\u6216) \u7d22\u5f15\u89e3\u78bc\u4e2d\u7684\u8a18\u9304\u6642\u767c\u751f\u932f\u8aa4: %s
+ERR_BACKEND_TOOL_ERROR_INITIALIZING_BACKEND_1865=\u5617\u8a66\u521d\u59cb\u5316\u5f8c\u7aef %s \u6642\uff0c\u767c\u751f\u672a\u9810\u671f\u7684\u932f\u8aa4: %s
+ERR_BACKEND_TOOL_NO_TREE_FOR_NAME_1868=\u9805\u76ee\u5bb9\u5668 %2$s \u8207\u5f8c\u7aef %3$s \u4e2d\uff0c\u90fd\u6c92\u6709\u4efb\u4f55\u8acb\u6c42\u7684\u540d\u7a31\u70ba %1$s \u7684\u7d22\u5f15\u5b58\u5728
+INFO_DESCRIPTION_BACKEND_TOOL_1893=\u6b64\u516c\u7528\u7a0b\u5f0f\u53ef\u7528\u65bc\u5c0d Pluggable \u5f8c\u7aef\u9032\u884c\u9664\u932f
diff --git a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/OnDiskMergeImporterTest.java b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/OnDiskMergeImporterTest.java
index d2e32a0..ba482ee 100644
--- a/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/OnDiskMergeImporterTest.java
+++ b/opendj-server-legacy/src/test/java/org/opends/server/backends/pluggable/OnDiskMergeImporterTest.java
@@ -127,7 +127,7 @@
@SuppressWarnings(value = { "unchecked", "resource" })
public void testAddLongCollector()
{
- final ID2Count id2count = new ID2Count(TreeName.valueOf("dummy/dummy"));
+ final ID2Count id2count = new ID2Count(TreeName.valueOf("/dummy/dummy"));
final MeteredCursor<String, ByteString> source = cursorOf(
Pair.of("key1", id2count.toValue(10)),
Pair.of("key1", id2count.toValue(20)),
--
Gitblit v1.10.0