/* * 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; /** * 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.")); } } }