/*
|
* 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 2014 ForgeRock AS.
|
*/
|
package org.forgerock.opendj.server.setup.model;
|
|
import org.forgerock.i18n.LocalizableMessage;
|
import org.forgerock.opendj.config.server.ConfigException;
|
import org.forgerock.util.Reject;
|
|
/**
|
* This class provides configuration's model for the OpenDJ3 setup.
|
*/
|
public abstract class Model {
|
|
/**
|
* This enumeration is used to know what kind of server we want to set up.
|
*/
|
public enum Type {
|
/**
|
* Stand alone server.
|
*/
|
STANDALONE,
|
/**
|
* First server in topology.
|
*/
|
FIRST_IN_TOPOLOGY,
|
/**
|
* Replicate the new suffix with existing server.
|
*/
|
IN_EXISTING_TOPOLOGY
|
}
|
|
private Type type;
|
private boolean startingServerAfterSetup;
|
private boolean isService;
|
private String instancePath;
|
private String installationPath;
|
|
private String license;
|
private ListenerSettings settings;
|
private RuntimeOptions serverRuntimeSettings;
|
private RuntimeOptions importLdifRuntimeSettings;
|
private DataConfiguration dataConfiguration;
|
|
private ReplicationConfiguration replicationConfiguration = null;
|
|
/**
|
* Returns the listener settings.
|
*
|
* @return The listener settings.
|
*/
|
public ListenerSettings getListenerSettings() {
|
return settings;
|
}
|
|
/**
|
* Sets the listener settings.
|
*
|
* @param lSettings
|
* The listener settings to set.
|
*/
|
public void setListenerSettings(final ListenerSettings lSettings) {
|
settings = lSettings;
|
}
|
|
/**
|
* Returns {@code true} if this configuration has a non-empty license.
|
*
|
* @return {@code true} if this configuration has a license.
|
*/
|
public boolean hasLicense() {
|
return license != null && !license.isEmpty();
|
}
|
|
/**
|
* Returns {@code true} if this configuration is stand alone data store.
|
*
|
* @return {@code true} if this configuration is stand alone data store.
|
*/
|
boolean isStandAlone() {
|
return type == Type.STANDALONE;
|
}
|
|
/**
|
* Returns {@code true} if this configuration is a first server in a replication topology.
|
*
|
* @return {@code true} if this configuration is a first server in a replication topology.
|
*/
|
boolean isFirstInTopology() {
|
return type == Type.FIRST_IN_TOPOLOGY;
|
}
|
|
/**
|
* Returns {@code true} if this configuration is part of a replication topology.
|
*
|
* @return {@code true} if this configuration is part of a replication topology.
|
*/
|
boolean isPartOfReplicationTopology() {
|
return type == Type.IN_EXISTING_TOPOLOGY;
|
}
|
|
/**
|
* Returns {@code true} if this configuration has a certificate linked to it. That generally means SSL and/or SSL
|
* are activated.
|
*
|
* @return {@code true} if this configuration has a certificate linked to it.
|
*/
|
boolean isSecure() {
|
return getListenerSettings() != null
|
&& getListenerSettings().getCertificate() != null;
|
}
|
|
/**
|
* Sets this configuration as a stand alone data store.
|
*/
|
void setStandAloneDS() {
|
setType(Type.STANDALONE);
|
}
|
|
/**
|
* Sets the type of this server as : replication activated and this is the first server in topology.
|
*/
|
void setFirstInTopology() {
|
setType(Type.FIRST_IN_TOPOLOGY);
|
}
|
|
/**
|
* Sets the type of this server as : replication activated and this is a server in an existing topology.
|
*/
|
void setInExistingTopology() {
|
setType(Type.IN_EXISTING_TOPOLOGY);
|
}
|
|
/**
|
* Returns the type of this configuration.
|
*
|
* @return The type of this configuration.
|
*/
|
public Type getType() {
|
return type;
|
}
|
|
/**
|
* Sets the type of this configuration.
|
*
|
* @param mtype
|
* The type of this configuration (standalone, etc...)
|
*/
|
public void setType(Type mtype) {
|
type = mtype;
|
}
|
|
/**
|
* Returns {@code true} if the server must start after the installation.
|
*
|
* @return {@code true} if the server must start after the installation.
|
*/
|
public boolean isStartingServerAfterSetup() {
|
return startingServerAfterSetup;
|
}
|
|
/**
|
* Sets if the server should start after its installation.
|
*
|
* @param startServerAfterSetup
|
* {@code true} if the server must start after the installation.
|
*/
|
public void setStartingServerAfterSetup(boolean startServerAfterSetup) {
|
startingServerAfterSetup = startServerAfterSetup;
|
}
|
|
/**
|
* Returns {@code true} if the directory server should start as a service.
|
*
|
* @return {@code true} if the directory server should start as a service, {@code false} otherwise.
|
*/
|
public boolean isService() {
|
return isService;
|
}
|
|
/**
|
* Sets the directory server as a service.
|
*
|
* @param isAService
|
* {@code true} if the directory server should start as a service, {@code false} otherwise.
|
*/
|
public void setService(boolean isAService) {
|
isService = isAService;
|
}
|
|
/**
|
* Returns the instance path.
|
*
|
* @return The instance path where the binaries are installed.
|
*/
|
public String getInstancePath() {
|
return instancePath;
|
}
|
|
/**
|
* Sets the current instance path location.
|
*
|
* @param iPath
|
* The instance path.
|
*/
|
public void setInstancePath(String iPath) {
|
instancePath = iPath;
|
}
|
|
/**
|
* Returns the license.
|
*
|
* @return The license.
|
*/
|
public String getLicense() {
|
return license;
|
}
|
|
/**
|
* Sets the license linked to this installation.
|
*
|
* @param theLicense
|
* The license to set.
|
*/
|
public void setLicense(String theLicense) {
|
license = theLicense;
|
}
|
|
/**
|
* Returns the runtime options that apply to this installation.
|
*
|
* @return The runtime options that apply to this installation.
|
*/
|
public RuntimeOptions getServerRuntimeSettings() {
|
return serverRuntimeSettings;
|
}
|
|
/**
|
* Sets the runtime options that apply to this installation.
|
*
|
* @param settings
|
* The runtime options that apply to this installation.
|
*/
|
public void setServerRuntimeOptions(RuntimeOptions settings) {
|
serverRuntimeSettings = settings;
|
}
|
|
/**
|
* Returns the runtime options that apply to the current import LDIF.
|
*
|
* @return The runtime options that apply to the current import LDIF.
|
*/
|
public RuntimeOptions getImportLdifRuntimeOptions() {
|
return importLdifRuntimeSettings;
|
}
|
|
/**
|
* Sets the runtime options that apply to the current import LDIF.
|
*
|
* @param settings
|
* The runtime options that apply to the current import LDIF.
|
*/
|
public void setImportLdifRuntimeOptions(RuntimeOptions settings) {
|
importLdifRuntimeSettings = settings;
|
}
|
|
/**
|
* Returns the data configuration of this model.
|
*
|
* @return The data configuration of this model.
|
*/
|
public DataConfiguration getDataConfiguration() {
|
return dataConfiguration;
|
}
|
|
/**
|
* Sets the data configuration of this model.
|
*
|
* @param dConfiguration
|
* The data configuration to set for this model.
|
*/
|
public void setDataConfiguration(DataConfiguration dConfiguration) {
|
dataConfiguration = dConfiguration;
|
}
|
|
/**
|
* Returns the replication configuration of this model.
|
*
|
* @return The replication configuration of this model.
|
*/
|
public ReplicationConfiguration getReplicationConfiguration() {
|
return replicationConfiguration;
|
}
|
|
/**
|
* Sets the replication configuration of this model.
|
*
|
* @param replicationConfiguration
|
* The replication configuration to set for this model.
|
*/
|
public void setReplicationConfiguration(ReplicationConfiguration replicationConfiguration) {
|
this.replicationConfiguration = replicationConfiguration;
|
}
|
|
/**
|
* Returns the installation path of this model.
|
*
|
* @return The installation path of this model.
|
*/
|
public String getInstallationPath() {
|
return installationPath;
|
}
|
|
/**
|
* Sets the installation path of this model.
|
*
|
* @param installationPath
|
* The installation path of this model.
|
*/
|
public void setInstallationPath(String installationPath) {
|
this.installationPath = installationPath;
|
}
|
|
/**
|
* Creates a basic data store model configuration for setup.
|
*/
|
public static class DataStoreModel extends Model {
|
/**
|
* The default data store model.
|
*/
|
public DataStoreModel() {
|
setStandAloneDS();
|
setDataConfiguration(new DataConfiguration());
|
setListenerSettings(new ListenerSettings());
|
setServerRuntimeOptions(RuntimeOptions.getDefault());
|
setImportLdifRuntimeOptions(RuntimeOptions.getDefault());
|
setStartingServerAfterSetup(true);
|
}
|
}
|
|
/**
|
* Checks the validity of the current setup configuration.
|
*
|
* @throws ConfigException
|
* If this configuration is invalid.
|
*/
|
void validate() throws ConfigException {
|
if (isFirstInTopology() || isPartOfReplicationTopology()) {
|
if (getReplicationConfiguration() == null) {
|
throw new ConfigException(LocalizableMessage.raw("No replication configuration found"));
|
}
|
if (isPartOfReplicationTopology()) {
|
Reject.ifNull(getReplicationConfiguration().getAdministrator(),
|
"Administrator name should not be null");
|
Reject.ifNull(getReplicationConfiguration().getPassword(), "Admin password should not be null");
|
Reject.ifNull(getReplicationConfiguration().getGlobalAdministrator(),
|
"Global administrator should not be null");
|
Reject.ifNull(getReplicationConfiguration().getGlobalAdministratorPassword(),
|
"Global administrator should not be null");
|
if (getReplicationConfiguration().getSuffixes() == null
|
|| getReplicationConfiguration().getSuffixes().size() == 0) {
|
throw new ConfigException(
|
LocalizableMessage.raw("At least one base DN should be selected "
|
+ "to replicate content with"));
|
}
|
}
|
}
|
final ListenerSettings settings = getListenerSettings();
|
final DataConfiguration dataConf = getDataConfiguration();
|
if (settings == null) {
|
throw new ConfigException(LocalizableMessage.raw("Invalid settings"));
|
}
|
if (dataConf == null) {
|
throw new ConfigException(LocalizableMessage.raw("Invalid data configuration"));
|
}
|
if (dataConf.isImportLDIF() && dataConf.getLdifImportDataPath() == null) {
|
throw new ConfigException(LocalizableMessage.raw("Invalid import ldif file."));
|
}
|
if (settings.getPasswordFile() == null && settings.getPassword() == null) {
|
throw new ConfigException(LocalizableMessage.raw("A password must be set for the root DN."));
|
}
|
}
|
|
}
|