/*
|
* 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
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
|
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
|
* 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
|
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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 2006-2007 Sun Microsystems, Inc.
|
*/
|
package org.opends.server.tools;
|
|
import org.opends.server.api.Backend;
|
import org.opends.server.config.ConfigEntry;
|
import org.opends.server.config.ConfigException;
|
import org.opends.server.config.StringConfigAttribute;
|
import org.opends.server.config.DNConfigAttribute;
|
import org.opends.server.types.DN;
|
import org.opends.server.types.DirectoryException;
|
import org.opends.server.types.ErrorLogCategory;
|
import org.opends.server.types.ErrorLogSeverity;
|
import org.opends.server.core.DirectoryServer;
|
|
import static org.opends.server.config.ConfigConstants.DN_BACKEND_BASE;
|
import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_ID;
|
import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_CLASS;
|
import static org.opends.server.config.ConfigConstants.ATTR_BACKEND_BASE_DN;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_DECODE_BACKEND_BASE_DN;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_RETRIEVE_BACKEND_BASE_ENTRY;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_DETERMINE_BACKEND_ID;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_DETERMINE_BACKEND_CLASS;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_LOAD_BACKEND_CLASS;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_INSTANTIATE_BACKEND_CLASS;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_NO_BASES_FOR_BACKEND;
|
import static org.opends.server.messages.ToolMessages.
|
MSGID_CANNOT_DETERMINE_BASES_FOR_BACKEND;
|
import static org.opends.server.messages.MessageHandler.getMessage;
|
import static org.opends.server.messages.ConfigMessages.
|
MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BACKEND_ID;
|
import static org.opends.server.messages.ConfigMessages.
|
MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_CLASS;
|
import static org.opends.server.messages.ConfigMessages.
|
MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BASE_DNS;
|
import static org.opends.server.loggers.Error.logError;
|
import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* This class provides utility functions for all JE related client tools.
|
*/
|
public class BackendToolUtils
|
{
|
/**
|
* Retrieves information about the backends defined in the Directory Server
|
* configuration.
|
*
|
* @param backendList A list into which instantiated (but not initialized)
|
* backend instances will be placed.
|
* @param entryList A list into which the config entries associated with
|
* the backends will be placed.
|
* @param dnList A list into which the set of base DNs for each backend
|
* will be placed.
|
*
|
* @return 0 if everything went fine. 1 if an error occurred.
|
*
|
*/
|
public static int getBackends(ArrayList<Backend> backendList,
|
ArrayList<ConfigEntry> entryList,
|
ArrayList<List<DN>> dnList)
|
{
|
// Get the base entry for all backend configuration.
|
DN backendBaseDN = null;
|
try
|
{
|
backendBaseDN = DN.decode(DN_BACKEND_BASE);
|
}
|
catch (DirectoryException de)
|
{
|
int msgID = MSGID_CANNOT_DECODE_BACKEND_BASE_DN;
|
String message = getMessage(msgID, DN_BACKEND_BASE, de.getErrorMessage());
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message,
|
msgID);
|
return 1;
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_DECODE_BACKEND_BASE_DN;
|
String message = getMessage(msgID, DN_BACKEND_BASE,
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message,
|
msgID);
|
return 1;
|
}
|
|
ConfigEntry baseEntry = null;
|
try
|
{
|
baseEntry = DirectoryServer.getConfigEntry(backendBaseDN);
|
}
|
catch (ConfigException ce)
|
{
|
int msgID = MSGID_CANNOT_RETRIEVE_BACKEND_BASE_ENTRY;
|
String message = getMessage(msgID, DN_BACKEND_BASE, ce.getMessage());
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message,
|
msgID);
|
return 1;
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_RETRIEVE_BACKEND_BASE_ENTRY;
|
String message = getMessage(msgID, DN_BACKEND_BASE,
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR, message,
|
msgID);
|
return 1;
|
}
|
|
|
// Iterate through the immediate children, attempting to parse them as
|
// backends.
|
for (ConfigEntry configEntry : baseEntry.getChildren().values())
|
{
|
// Get the backend ID attribute from the entry. If there isn't one, then
|
// skip the entry.
|
String backendID = null;
|
try
|
{
|
int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BACKEND_ID;
|
StringConfigAttribute idStub =
|
new StringConfigAttribute(ATTR_BACKEND_ID, getMessage(msgID),
|
true, false, true);
|
StringConfigAttribute idAttr =
|
(StringConfigAttribute) configEntry.getConfigAttribute(idStub);
|
if (idAttr == null)
|
{
|
continue;
|
}
|
else
|
{
|
backendID = idAttr.activeValue();
|
}
|
}
|
catch (ConfigException ce)
|
{
|
int msgID = MSGID_CANNOT_DETERMINE_BACKEND_ID;
|
String message = getMessage(msgID, String.valueOf(configEntry.getDN()),
|
ce.getMessage());
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_DETERMINE_BACKEND_ID;
|
String message = getMessage(msgID, String.valueOf(configEntry.getDN()),
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
|
|
// Get the backend class name attribute from the entry. If there isn't
|
// one, then just skip the entry.
|
String backendClassName = null;
|
try
|
{
|
int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_CLASS;
|
StringConfigAttribute classStub =
|
new StringConfigAttribute(ATTR_BACKEND_CLASS, getMessage(msgID),
|
true, false, false);
|
StringConfigAttribute classAttr =
|
(StringConfigAttribute) configEntry.getConfigAttribute(classStub);
|
if (classAttr == null)
|
{
|
continue;
|
}
|
else
|
{
|
backendClassName = classAttr.activeValue();
|
}
|
}
|
catch (ConfigException ce)
|
{
|
int msgID = MSGID_CANNOT_DETERMINE_BACKEND_CLASS;
|
String message = getMessage(msgID, String.valueOf(configEntry.getDN()),
|
ce.getMessage());
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_DETERMINE_BACKEND_CLASS;
|
String message = getMessage(msgID, String.valueOf(configEntry.getDN()),
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
|
Class backendClass = null;
|
try
|
{
|
backendClass = Class.forName(backendClassName);
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_LOAD_BACKEND_CLASS;
|
String message = getMessage(msgID, backendClassName,
|
String.valueOf(configEntry.getDN()),
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
|
Backend backend = null;
|
try
|
{
|
backend = (Backend) backendClass.newInstance();
|
backend.setBackendID(backendID);
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_INSTANTIATE_BACKEND_CLASS;
|
String message = getMessage(msgID, backendClassName,
|
String.valueOf(configEntry.getDN()),
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
|
|
// Get the base DN attribute from the entry. If there isn't one, then
|
// just skip this entry.
|
List<DN> baseDNs = null;
|
try
|
{
|
int msgID = MSGID_CONFIG_BACKEND_ATTR_DESCRIPTION_BASE_DNS;
|
DNConfigAttribute baseDNStub =
|
new DNConfigAttribute(ATTR_BACKEND_BASE_DN, getMessage(msgID),
|
true, true, true);
|
DNConfigAttribute baseDNAttr =
|
(DNConfigAttribute) configEntry.getConfigAttribute(baseDNStub);
|
if (baseDNAttr == null)
|
{
|
msgID = MSGID_NO_BASES_FOR_BACKEND;
|
String message = getMessage(msgID,
|
String.valueOf(configEntry.getDN()));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
}
|
else
|
{
|
baseDNs = baseDNAttr.activeValues();
|
}
|
}
|
catch (Exception e)
|
{
|
int msgID = MSGID_CANNOT_DETERMINE_BASES_FOR_BACKEND;
|
String message = getMessage(msgID, String.valueOf(configEntry.getDN()),
|
stackTraceToSingleLineString(e));
|
logError(ErrorLogCategory.BACKEND, ErrorLogSeverity.SEVERE_ERROR,
|
message, msgID);
|
return 1;
|
}
|
|
|
backendList.add(backend);
|
entryList.add(configEntry);
|
dnList.add(baseDNs);
|
}
|
return 0;
|
}
|
}
|