/*
* 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.LdapException;
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 (LdapException 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;
}
}