/*
|
* 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 2007-2010 Sun Microsystems, Inc.
|
* Portions Copyright 2014 ForgeRock AS
|
*/
|
package org.forgerock.opendj.config.dsconfig;
|
|
import static com.forgerock.opendj.dsconfig.DsconfigMessages.*;
|
import static com.forgerock.opendj.cli.CliMessages.*;
|
import static org.forgerock.util.Utils.closeSilently;
|
|
import javax.net.ssl.SSLException;
|
|
import org.forgerock.opendj.config.LDAPProfile;
|
import org.forgerock.opendj.config.client.ManagementContext;
|
import org.forgerock.opendj.config.client.ldap.LDAPManagementContext;
|
import org.forgerock.opendj.config.server.ConfigException;
|
import org.forgerock.opendj.ldap.Connection;
|
import org.forgerock.opendj.ldap.ConnectionFactory;
|
import org.forgerock.opendj.ldap.ErrorResultException;
|
|
import com.forgerock.opendj.cli.ArgumentException;
|
import com.forgerock.opendj.cli.ClientException;
|
import com.forgerock.opendj.cli.CommandBuilder;
|
import com.forgerock.opendj.cli.ConnectionFactoryProvider;
|
import com.forgerock.opendj.cli.ConsoleApplication;
|
import com.forgerock.opendj.cli.ReturnCode;
|
|
/**
|
* An LDAP management context factory for the DSConfig tool.
|
*/
|
public final class LDAPManagementContextFactory
|
{
|
|
/** The management context. */
|
private ManagementContext context;
|
|
/** The connection parameters command builder. */
|
private CommandBuilder contextCommandBuilder;
|
|
/** The connection factory provider. */
|
private final ConnectionFactoryProvider provider;
|
|
/** The connection factory. */
|
private final ConnectionFactory factory;
|
|
/**
|
* Creates a new LDAP management context factory based on an authenticated
|
* connection factory.
|
*
|
* @param cfp
|
* The connection factory provider which should be used in this
|
* context.
|
* @throws ArgumentException
|
* If an exception occurs when creating the authenticated connection
|
* factory linked to this context.
|
*/
|
public LDAPManagementContextFactory(ConnectionFactoryProvider cfp) throws ArgumentException {
|
this.provider = cfp;
|
factory = cfp.getAuthenticatedConnectionFactory();
|
}
|
|
/**
|
* Closes this management context.
|
*/
|
public void close()
|
{
|
closeSilently(context);
|
}
|
|
/**
|
* Returns the command builder that provides the equivalent arguments in
|
* interactive mode to get the management context.
|
*
|
* @return the command builder that provides the equivalent arguments in
|
* interactive mode to get the management context.
|
*/
|
public CommandBuilder getContextCommandBuilder()
|
{
|
return contextCommandBuilder;
|
}
|
|
/**
|
* Gets the management context which sub-commands should use in
|
* order to manage the directory server.
|
*
|
* @param app
|
* The console application instance.
|
* @return Returns the management context which sub-commands should
|
* use in order to manage the directory server.
|
* @throws ArgumentException
|
* If a management context related argument could not be
|
* parsed successfully.
|
* @throws ClientException
|
* If the management context could not be created.
|
*/
|
public ManagementContext getManagementContext(ConsoleApplication app)
|
throws ArgumentException, ClientException
|
{
|
// Lazily create the LDAP management context.
|
if (context == null)
|
{
|
Connection connection;
|
final String hostName = provider.getHostname();
|
final int port = provider.getPort();
|
try
|
{
|
connection = factory.getConnection();
|
BuildVersion.checkVersionMismatch(connection);
|
}
|
catch (ErrorResultException e)
|
{
|
if (e.getCause() instanceof SSLException)
|
{
|
throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
|
ERR_FAILED_TO_CONNECT_NOT_TRUSTED.get(hostName, String
|
.valueOf(port)));
|
}
|
else
|
{
|
throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
|
ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, String
|
.valueOf(port)));
|
}
|
}
|
catch (ConfigException e)
|
{
|
throw new ClientException(ReturnCode.ERROR_USER_DATA,e.getMessageObject());
|
}
|
catch (Exception ex)
|
{
|
throw new ClientException(ReturnCode.CLIENT_SIDE_CONNECT_ERROR,
|
ERR_DSCFG_ERROR_LDAP_FAILED_TO_CONNECT.get(hostName, port));
|
}
|
finally
|
{
|
closeSilently(factory);
|
}
|
|
context =
|
LDAPManagementContext.newManagementContext(connection, LDAPProfile
|
.getInstance());
|
}
|
return context;
|
}
|
}
|