/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License. You may obtain a
 * copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package org.apache.geode.distributed.internal;

import static org.apache.geode.distributed.ConfigurationProperties.ACK_SEVERE_ALERT_THRESHOLD;
import static org.apache.geode.distributed.ConfigurationProperties.ACK_WAIT_THRESHOLD;
import static org.apache.geode.distributed.ConfigurationProperties.ARCHIVE_DISK_SPACE_LIMIT;
import static org.apache.geode.distributed.ConfigurationProperties.ARCHIVE_FILE_SIZE_LIMIT;
import static org.apache.geode.distributed.ConfigurationProperties.ASYNC_DISTRIBUTION_TIMEOUT;
import static org.apache.geode.distributed.ConfigurationProperties.ASYNC_MAX_QUEUE_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.ASYNC_QUEUE_TIMEOUT;
import static org.apache.geode.distributed.ConfigurationProperties.BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.CACHE_XML_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_CONFIGURATION_DIR;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.CONFLATE_EVENTS;
import static org.apache.geode.distributed.ConfigurationProperties.CONSERVE_SOCKETS;
import static org.apache.geode.distributed.ConfigurationProperties.DELTA_PROPAGATION;
import static org.apache.geode.distributed.ConfigurationProperties.DEPLOY_WORKING_DIR;
import static org.apache.geode.distributed.ConfigurationProperties.DISABLE_AUTO_RECONNECT;
import static org.apache.geode.distributed.ConfigurationProperties.DISABLE_JMX;
import static org.apache.geode.distributed.ConfigurationProperties.DISABLE_TCP;
import static org.apache.geode.distributed.ConfigurationProperties.DISTRIBUTED_SYSTEM_ID;
import static org.apache.geode.distributed.ConfigurationProperties.DISTRIBUTED_TRANSACTIONS;
import static org.apache.geode.distributed.ConfigurationProperties.DURABLE_CLIENT_ID;
import static org.apache.geode.distributed.ConfigurationProperties.DURABLE_CLIENT_TIMEOUT;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_MANAGEMENT_REST_SERVICE;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_NETWORK_PARTITION_DETECTION;
import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_TIME_STATISTICS;
import static org.apache.geode.distributed.ConfigurationProperties.ENFORCE_UNIQUE_HOST;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.GATEWAY_SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_ACCESS_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_HOSTNAME_FOR_CLIENTS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_HTTP_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PASSWORD_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_START;
import static org.apache.geode.distributed.ConfigurationProperties.JMX_MANAGER_UPDATE_RATE;
import static org.apache.geode.distributed.ConfigurationProperties.LOAD_CLUSTER_CONFIGURATION_FROM_DIR;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.LOCATOR_WAIT_TIME;
import static org.apache.geode.distributed.ConfigurationProperties.LOCK_MEMORY;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_DISK_SPACE_LIMIT;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_FILE_SIZE_LIMIT;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
import static org.apache.geode.distributed.ConfigurationProperties.MAX_NUM_RECONNECT_TRIES;
import static org.apache.geode.distributed.ConfigurationProperties.MAX_WAIT_TIME_RECONNECT;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_FLOW_CONTROL;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_RECV_BUFFER_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_SEND_BUFFER_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_TTL;
import static org.apache.geode.distributed.ConfigurationProperties.MEMBERSHIP_PORT_RANGE;
import static org.apache.geode.distributed.ConfigurationProperties.MEMBER_TIMEOUT;
import static org.apache.geode.distributed.ConfigurationProperties.MEMCACHED_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.MEMCACHED_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.MEMCACHED_PROTOCOL;
import static org.apache.geode.distributed.ConfigurationProperties.NAME;
import static org.apache.geode.distributed.ConfigurationProperties.OFF_HEAP_MEMORY_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.REDIS_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.REDIS_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.REDIS_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.REDUNDANCY_ZONE;
import static org.apache.geode.distributed.ConfigurationProperties.REMOTE_LOCATORS;
import static org.apache.geode.distributed.ConfigurationProperties.REMOVE_UNRESPONSIVE_CLIENT;
import static org.apache.geode.distributed.ConfigurationProperties.ROLES;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_ACCESSOR;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_ACCESSOR_PP;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_AUTHENTICATOR;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_AUTH_INIT;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_DHALGO;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_LOG_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_LOG_LEVEL;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_MANAGER;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_PEER_AUTHENTICATOR;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_PEER_AUTH_INIT;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_PEER_VERIFY_MEMBER_TIMEOUT;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_POST_PROCESSOR;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_PREFIX;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_SHIRO_INIT;
import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_UDP_DHALGO;
import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_BIND_ADDRESS;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.SERVER_SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.SOCKET_BUFFER_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.SOCKET_LEASE_TIME;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_CIPHERS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_CLUSTER_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_DEFAULT_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_ENABLED_COMPONENTS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_ENDPOINT_IDENTIFICATION_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_GATEWAY_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_JMX_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_KEYSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_KEYSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_KEYSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_LOCATOR_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_PROTOCOLS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_SERVER_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE_PASSWORD;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE_TYPE;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_USE_DEFAULT_CONTEXT;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_WEB_ALIAS;
import static org.apache.geode.distributed.ConfigurationProperties.SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION;
import static org.apache.geode.distributed.ConfigurationProperties.START_DEV_REST_API;
import static org.apache.geode.distributed.ConfigurationProperties.START_LOCATOR;
import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_ARCHIVE_FILE;
import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_SAMPLE_RATE;
import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_SAMPLING_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.TCP_PORT;
import static org.apache.geode.distributed.ConfigurationProperties.THREAD_MONITOR_ENABLED;
import static org.apache.geode.distributed.ConfigurationProperties.THREAD_MONITOR_INTERVAL;
import static org.apache.geode.distributed.ConfigurationProperties.THREAD_MONITOR_TIME_LIMIT;
import static org.apache.geode.distributed.ConfigurationProperties.UDP_FRAGMENT_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.UDP_RECV_BUFFER_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.UDP_SEND_BUFFER_SIZE;
import static org.apache.geode.distributed.ConfigurationProperties.USER_COMMAND_PACKAGES;
import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION;
import static org.apache.geode.distributed.ConfigurationProperties.VALIDATE_SERIALIZABLE_OBJECTS;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.geode.GemFireIOException;
import org.apache.geode.LogWriter;
import org.apache.geode.UnmodifiableException;
import org.apache.geode.annotations.Immutable;
import org.apache.geode.annotations.internal.MakeImmutable;
import org.apache.geode.distributed.ConfigurationProperties;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.internal.Config;
import org.apache.geode.internal.ConfigSource;
import org.apache.geode.internal.logging.LogWriterImpl;
import org.apache.geode.internal.security.SecurableCommunicationChannel;
import org.apache.geode.internal.statistics.StatisticsConfig;
import org.apache.geode.internal.tcp.Connection;
import org.apache.geode.logging.internal.spi.LogConfig;
import org.apache.geode.logging.internal.spi.LogWriterLevel;

/**
 * Provides accessor (and in some cases mutator) methods for the various GemFire distribution
 * configuration properties. The interface also provides constants for the names of properties and
 * their default values.
 * <p>
 * Descriptions of these properties can be found {@link ConfigurationProperties}.
 *
 * @see Config
 * @since GemFire 2.1
 */
public interface DistributionConfig extends Config, LogConfig, StatisticsConfig {

  /**
   * The static String definition of the prefix used to defined ssl-* properties
   */
  String SSL_PREFIX = "ssl-";

  /**
   * The prefix used for Gemfire properties set through java system properties
   */
  String GEMFIRE_PREFIX = "gemfire.";

  /**
   * Returns the value of the {@link ConfigurationProperties#NAME} property Gets the member's name.
   * A name is optional and by default empty. If set it must be unique in the ds. When set its used
   * by tools to help identify the member.
   * <p>
   * The default value is: {@link #DEFAULT_NAME}.
   *
   * @return the system's name.
   */
  @Override
  @ConfigAttributeGetter(name = NAME)
  String getName();

  /**
   * Sets the member's name.
   * <p>
   * The name can not be changed while the system is running.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = NAME)
  void setName(String value);

  /**
   * The "name" property, representing the system's name
   */
  @ConfigAttribute(type = String.class)
  String NAME_NAME = NAME;

  /**
   * The default system name.
   * <p>
   * Actual value of this constant is <code>""</code>.
   */
  String DEFAULT_NAME = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#MCAST_PORT}</a> property
   */
  @ConfigAttributeGetter(name = MCAST_PORT_NAME)
  int getMcastPort();

  /**
   * Sets the value of the {@link ConfigurationProperties#MCAST_PORT} property
   */
  @ConfigAttributeSetter(name = MCAST_PORT_NAME)
  void setMcastPort(int value);

  /**
   * The default value of the {@link ConfigurationProperties#MCAST_PORT} property
   */
  int DEFAULT_MCAST_PORT = 0;

  /**
   * The minimum {@link ConfigurationProperties#MCAST_PORT}.
   * <p>
   * Actual value of this constant is <code>0</code>.
   */
  int MIN_MCAST_PORT = 0;

  /**
   * The maximum {@link ConfigurationProperties#MCAST_PORT}.
   * <p>
   * Actual value of this constant is <code>65535</code>.
   */
  int MAX_MCAST_PORT = 65535;

  /**
   * The name of the {@link ConfigurationProperties#MCAST_PORT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_MCAST_PORT, max = MAX_MCAST_PORT)
  String MCAST_PORT_NAME = MCAST_PORT;

  /**
   * Returns the value of the {@link ConfigurationProperties#TCP_PORT} property
   */
  @ConfigAttributeGetter(name = TCP_PORT)
  int getTcpPort();

  /**
   * Sets the value of the {@link ConfigurationProperties#TCP_PORT} property
   */
  @ConfigAttributeSetter(name = TCP_PORT)
  void setTcpPort(int value);

  /**
   * The default value of the {@link ConfigurationProperties#TCP_PORT} property
   */
  int DEFAULT_TCP_PORT = 0;

  /**
   * The minimum {@link ConfigurationProperties#TCP_PORT}.
   * <p>
   * Actual value of this constant is <code>0</code>.
   */
  int MIN_TCP_PORT = 0;

  /**
   * The maximum {@link ConfigurationProperties#TCP_PORT}.
   * <p>
   * Actual value of this constant is <code>65535</code>.
   */
  int MAX_TCP_PORT = 65535;

  /**
   * The name of the {@link ConfigurationProperties#TCP_PORT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_TCP_PORT, max = MAX_TCP_PORT)
  String TCP_PORT_NAME = TCP_PORT;

  /**
   * Returns the value of the {@link ConfigurationProperties#MCAST_ADDRESS} property
   */
  @ConfigAttributeGetter(name = MCAST_ADDRESS)
  InetAddress getMcastAddress();

  /**
   * Sets the value of the {@link ConfigurationProperties#MCAST_ADDRESS} property
   */
  @ConfigAttributeSetter(name = MCAST_ADDRESS)
  void setMcastAddress(InetAddress value);

  /**
   * The name of the {@link ConfigurationProperties#MCAST_ADDRESS} property
   */
  @ConfigAttribute(type = InetAddress.class)
  String MCAST_ADDRESS_NAME = MCAST_ADDRESS;

  /**
   * The default value of the {@link ConfigurationProperties#MCAST_ADDRESS} property. Current value
   * is <code>239.192.81.1</code>
   */
  InetAddress DEFAULT_MCAST_ADDRESS = AbstractDistributionConfig._getDefaultMcastAddress();

  /**
   * Returns the value of the {@link ConfigurationProperties#MCAST_TTL} property
   */
  @ConfigAttributeGetter(name = MCAST_TTL)
  int getMcastTtl();

  /**
   * Sets the value of the {@link ConfigurationProperties#MCAST_TTL} property
   */
  @ConfigAttributeSetter(name = MCAST_TTL)
  void setMcastTtl(int value);

  /**
   * The default value of the {@link ConfigurationProperties#MCAST_TTL} property
   */
  int DEFAULT_MCAST_TTL = 32;

  /**
   * The minimum {@link ConfigurationProperties#MCAST_TTL}.
   * <p>
   * Actual value of this constant is <code>0</code>.
   */
  int MIN_MCAST_TTL = 0;

  /**
   * The maximum {@link ConfigurationProperties#MCAST_TTL}.
   * <p>
   * Actual value of this constant is <code>255</code>.
   */
  int MAX_MCAST_TTL = 255;

  /**
   * The name of the {@link ConfigurationProperties#MCAST_TTL} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_MCAST_TTL, max = MAX_MCAST_TTL)
  String MCAST_TTL_NAME = MCAST_TTL;

  /**
   * Returns the value of the {@link ConfigurationProperties#BIND_ADDRESS} property
   */
  @ConfigAttributeGetter(name = BIND_ADDRESS)
  String getBindAddress();

  /**
   * Sets the value of the {@link ConfigurationProperties#BIND_ADDRESS} property
   */
  @ConfigAttributeSetter(name = BIND_ADDRESS)
  void setBindAddress(String value);

  /**
   * The name of the {@link ConfigurationProperties#BIND_ADDRESS} property
   */
  @ConfigAttribute(type = String.class)
  String BIND_ADDRESS_NAME = BIND_ADDRESS;

  /**
   * The default value of the {@link ConfigurationProperties#BIND_ADDRESS} property. Current value
   * is an empty string <code>""</code>
   */
  String DEFAULT_BIND_ADDRESS = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_BIND_ADDRESS} property
   */
  @ConfigAttributeGetter(name = SERVER_BIND_ADDRESS)
  String getServerBindAddress();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_BIND_ADDRESS} property
   */
  @ConfigAttributeSetter(name = SERVER_BIND_ADDRESS)
  void setServerBindAddress(String value);

  /**
   * The name of the {@link ConfigurationProperties#SERVER_BIND_ADDRESS} property
   */
  @ConfigAttribute(type = String.class)
  String SERVER_BIND_ADDRESS_NAME = SERVER_BIND_ADDRESS;

  /**
   * The default value of the {@link ConfigurationProperties#SERVER_BIND_ADDRESS} property. Current
   * value is an empty string <code>""</code>
   */
  String DEFAULT_SERVER_BIND_ADDRESS = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#LOCATORS} property
   */
  @ConfigAttributeGetter(name = LOCATORS)
  String getLocators();

  /**
   * Sets the system's locator list. A locator list is optional and by default empty. Its used to by
   * the system to locator other system nodes and to publish itself so it can be located by others.
   *
   * @param value must be of the form <code>hostName[portNum]</code>. Multiple elements are allowed
   *        and must be separated by a comma.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = LOCATORS)
  void setLocators(String value);

  /**
   * The name of the {@link ConfigurationProperties#LOCATORS} property
   */
  @ConfigAttribute(type = String.class)
  String LOCATORS_NAME = LOCATORS;

  /**
   * The default value of the {@link ConfigurationProperties#LOCATORS} property
   */
  String DEFAULT_LOCATORS = "";

  /**
   * Locator wait time - how long to wait for a locator to start before giving up & throwing a
   * GemFireConfigException
   */
  @ConfigAttribute(type = Integer.class)
  String LOCATOR_WAIT_TIME_NAME = LOCATOR_WAIT_TIME;

  int DEFAULT_LOCATOR_WAIT_TIME = 0;

  @ConfigAttributeGetter(name = LOCATOR_WAIT_TIME)
  int getLocatorWaitTime();

  @ConfigAttributeSetter(name = LOCATOR_WAIT_TIME)
  void setLocatorWaitTime(int seconds);

  /**
   * returns the value of the {@link ConfigurationProperties#START_LOCATOR} property
   */
  @ConfigAttributeGetter(name = START_LOCATOR)
  String getStartLocator();

  /**
   * Sets the {@link ConfigurationProperties#START_LOCATOR} property. This is a string in the form
   * bindAddress[port] and, if set, tells the distributed system to start a locator prior to
   * connecting
   *
   * @param value must be of the form <code>hostName[portNum]</code>
   */
  @ConfigAttributeSetter(name = START_LOCATOR)
  void setStartLocator(String value);

  /**
   * The name of the {@link ConfigurationProperties#START_LOCATOR} property
   */
  @ConfigAttribute(type = String.class)
  String START_LOCATOR_NAME = START_LOCATOR;
  /**
   * The default value of the {@link ConfigurationProperties#START_LOCATOR} property
   */
  String DEFAULT_START_LOCATOR = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#DEPLOY_WORKING_DIR} property
   */
  @ConfigAttributeGetter(name = DEPLOY_WORKING_DIR)
  File getDeployWorkingDir();

  /**
   * Sets the system's deploy working directory.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = DEPLOY_WORKING_DIR)
  void setDeployWorkingDir(File value);

  /**
   * The name of the {@link ConfigurationProperties#DEPLOY_WORKING_DIR} property.
   */
  @ConfigAttribute(type = File.class)
  String DEPLOY_WORKING_DIR_NAME = DEPLOY_WORKING_DIR;

  /**
   * Default will be the current working directory as determined by
   * <code>System.getProperty("user.dir")</code>.
   */
  File DEFAULT_DEPLOY_WORKING_DIR = new File(System.getProperty("user.dir"));

  /**
   * Returns the value of the {@link ConfigurationProperties#USER_COMMAND_PACKAGES} property
   */
  @ConfigAttributeGetter(name = USER_COMMAND_PACKAGES)
  String getUserCommandPackages();

  /**
   * Sets the system's user command path.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = USER_COMMAND_PACKAGES)
  void setUserCommandPackages(String value);

  /**
   * The name of the {@link ConfigurationProperties#USER_COMMAND_PACKAGES} property.
   */
  @ConfigAttribute(type = String.class)
  String USER_COMMAND_PACKAGES_NAME = USER_COMMAND_PACKAGES;

  /**
   * The default value of the {@link ConfigurationProperties#USER_COMMAND_PACKAGES} property
   */
  String DEFAULT_USER_COMMAND_PACKAGES = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#LOG_FILE} property
   *
   * @return <code>null</code> if logging information goes to standard out
   */
  @Override
  @ConfigAttributeGetter(name = LOG_FILE)
  File getLogFile();

  /**
   * Sets the system's log file.
   * <p>
   * Non-absolute log files are relative to the system directory.
   * <p>
   * The system log file can not be changed while the system is running.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = LOG_FILE)
  void setLogFile(File value);

  /**
   * The name of the {@link ConfigurationProperties#LOG_FILE} property
   */
  @ConfigAttribute(type = File.class)
  String LOG_FILE_NAME = LOG_FILE;

  /**
   * The default {@link ConfigurationProperties#LOG_FILE}.
   * <p>
   * Actual value of this constant is <code>""</code> which directs log message to standard output.
   */
  File DEFAULT_LOG_FILE = new File("");

  /**
   * Returns the value of the {@link ConfigurationProperties#LOG_LEVEL} property
   *
   * @see LogWriterImpl
   */
  @Override
  @ConfigAttributeGetter(name = LOG_LEVEL)
  int getLogLevel();

  /**
   * Sets the value of the {@link ConfigurationProperties#LOG_LEVEL} property
   *
   * @see LogWriterImpl
   */
  @ConfigAttributeSetter(name = LOG_LEVEL)
  void setLogLevel(int value);

  /**
   * The default {@link ConfigurationProperties#LOG_LEVEL}.
   * <p>
   * Actual value of this constant is {@link LogWriterLevel#CONFIG#intLevel()}.
   */
  int DEFAULT_LOG_LEVEL = LogWriterLevel.CONFIG.intLevel();
  /**
   * The minimum {@link ConfigurationProperties#LOG_LEVEL}.
   * <p>
   * Actual value of this constant is {@link LogWriterLevel#ALL#intLevel()}.
   */
  int MIN_LOG_LEVEL = LogWriterLevel.ALL.intLevel();
  /**
   * The maximum {@link ConfigurationProperties#LOG_LEVEL}.
   * <p>
   * Actual value of this constant is {@link LogWriterLevel#NONE#intLevel()}.
   */
  int MAX_LOG_LEVEL = LogWriterLevel.NONE.intLevel();

  /**
   * The name of the {@link ConfigurationProperties#LOG_LEVEL} property
   */
  // type is String because the config file contains "config", "debug", "fine" etc, not a code, but
  // the setter/getter accepts int
  @ConfigAttribute(type = String.class)
  String LOG_LEVEL_NAME = LOG_LEVEL;

  /**
   * Returns the value of the {@link ConfigurationProperties#STATISTIC_SAMPLING_ENABLED} property
   */
  @Override
  @ConfigAttributeGetter(name = STATISTIC_SAMPLING_ENABLED)
  boolean getStatisticSamplingEnabled();

  /**
   * Sets {@link ConfigurationProperties#STATISTIC_SAMPLING_ENABLED}
   */
  @ConfigAttributeSetter(name = STATISTIC_SAMPLING_ENABLED)
  void setStatisticSamplingEnabled(boolean newValue);

  /**
   * The name of the {@link ConfigurationProperties#STATISTIC_SAMPLING_ENABLED} property
   */
  @ConfigAttribute(type = Boolean.class)
  String STATISTIC_SAMPLING_ENABLED_NAME = STATISTIC_SAMPLING_ENABLED;

  /**
   * The default value of the {@link ConfigurationProperties#STATISTIC_SAMPLING_ENABLED} property
   */
  boolean DEFAULT_STATISTIC_SAMPLING_ENABLED = true;

  /**
   * Returns the value of the {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE} property
   */
  @Override
  @ConfigAttributeGetter(name = STATISTIC_SAMPLE_RATE)
  int getStatisticSampleRate();

  /**
   * Sets the value of the {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE} property
   */
  @ConfigAttributeSetter(name = STATISTIC_SAMPLE_RATE)
  void setStatisticSampleRate(int value);

  /**
   * The default {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE}.
   * <p>
   * Actual value of this constant is <code>1000</code> milliseconds.
   */
  int DEFAULT_STATISTIC_SAMPLE_RATE = 1000;
  /**
   * The minimum {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE}.
   * <p>
   * Actual value of this constant is <code>100</code> milliseconds.
   */
  int MIN_STATISTIC_SAMPLE_RATE = 100;
  /**
   * The maximum {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE}.
   * <p>
   * Actual value of this constant is <code>60000</code> milliseconds.
   */
  int MAX_STATISTIC_SAMPLE_RATE = 60000;

  /**
   * The name of the {@link ConfigurationProperties#STATISTIC_SAMPLE_RATE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_STATISTIC_SAMPLE_RATE,
      max = MAX_STATISTIC_SAMPLE_RATE)
  String STATISTIC_SAMPLE_RATE_NAME = STATISTIC_SAMPLE_RATE;

  /**
   * Returns the value of the {@link ConfigurationProperties#STATISTIC_ARCHIVE_FILE} property.
   *
   * @return <code>null</code> if no file was specified
   */
  @Override
  @ConfigAttributeGetter(name = STATISTIC_ARCHIVE_FILE)
  File getStatisticArchiveFile();

  /**
   * Sets the value of the {@link ConfigurationProperties#STATISTIC_ARCHIVE_FILE} property.
   */
  @ConfigAttributeSetter(name = STATISTIC_ARCHIVE_FILE)
  void setStatisticArchiveFile(File value);

  /**
   * The name of the {@link ConfigurationProperties#STATISTIC_ARCHIVE_FILE} property
   */
  @ConfigAttribute(type = File.class)
  String STATISTIC_ARCHIVE_FILE_NAME = STATISTIC_ARCHIVE_FILE;

  /**
   * The default {@link ConfigurationProperties#STATISTIC_ARCHIVE_FILE}.
   * <p>
   * Actual value of this constant is <code>""</code> which causes no archive file to be created.
   */
  File DEFAULT_STATISTIC_ARCHIVE_FILE = new File(""); // fix for bug 29786

  /**
   * Returns the value of the {@link ConfigurationProperties#CACHE_XML_FILE} property
   */
  @ConfigAttributeGetter(name = CACHE_XML_FILE)
  File getCacheXmlFile();

  /**
   * Sets the value of the {@link ConfigurationProperties#CACHE_XML_FILE} property
   */
  @ConfigAttributeSetter(name = CACHE_XML_FILE)
  void setCacheXmlFile(File value);

  /**
   * The name of the {@link ConfigurationProperties#CACHE_XML_FILE} property
   */
  @ConfigAttribute(type = File.class)
  String CACHE_XML_FILE_NAME = CACHE_XML_FILE;

  /**
   * The default value of the {@link ConfigurationProperties#CACHE_XML_FILE} property
   */
  File DEFAULT_CACHE_XML_FILE = new File("cache.xml");

  /**
   * Returns the value of the {@link ConfigurationProperties#ACK_WAIT_THRESHOLD} property
   */
  @ConfigAttributeGetter(name = ACK_WAIT_THRESHOLD)
  int getAckWaitThreshold();

  /**
   * Sets the value of the {@link ConfigurationProperties#ACK_WAIT_THRESHOLD} property Setting this
   * value too low will cause spurious alerts.
   */
  @ConfigAttributeSetter(name = ACK_WAIT_THRESHOLD)
  void setAckWaitThreshold(int newThreshold);

  /**
   * The default {@link ConfigurationProperties#ACK_WAIT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>15</code> seconds.
   */
  int DEFAULT_ACK_WAIT_THRESHOLD = 15;
  /**
   * The minimum {@link ConfigurationProperties#ACK_WAIT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>1</code> second.
   */
  int MIN_ACK_WAIT_THRESHOLD = 1;
  /**
   * The maximum {@link ConfigurationProperties#ACK_WAIT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>MAX_INT</code> seconds.
   */
  int MAX_ACK_WAIT_THRESHOLD = Integer.MAX_VALUE;
  /**
   * The name of the {@link ConfigurationProperties#ACK_WAIT_THRESHOLD} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ACK_WAIT_THRESHOLD)
  String ACK_WAIT_THRESHOLD_NAME = ACK_WAIT_THRESHOLD;

  /**
   * Returns the value of the {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD} property
   */
  @ConfigAttributeGetter(name = ACK_SEVERE_ALERT_THRESHOLD)
  int getAckSevereAlertThreshold();

  /**
   * Sets the value of the {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD} property
   * Setting this value too low will cause spurious forced disconnects.
   */
  @ConfigAttributeSetter(name = ACK_SEVERE_ALERT_THRESHOLD)
  void setAckSevereAlertThreshold(int newThreshold);

  /**
   * The default {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>0</code> seconds, which turns off shunning.
   */
  int DEFAULT_ACK_SEVERE_ALERT_THRESHOLD = 0;
  /**
   * The minimum {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>0</code> second, which turns off shunning.
   */
  int MIN_ACK_SEVERE_ALERT_THRESHOLD = 0;
  /**
   * The maximum {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD}.
   * <p>
   * Actual value of this constant is <code>MAX_INT</code> seconds.
   */
  int MAX_ACK_SEVERE_ALERT_THRESHOLD = Integer.MAX_VALUE;
  /**
   * The name of the {@link ConfigurationProperties#ACK_SEVERE_ALERT_THRESHOLD} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ACK_SEVERE_ALERT_THRESHOLD)
  String ACK_SEVERE_ALERT_THRESHOLD_NAME = ACK_SEVERE_ALERT_THRESHOLD;

  /**
   * Returns the value of the {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT} property
   */
  @Override
  @ConfigAttributeGetter(name = ARCHIVE_FILE_SIZE_LIMIT)
  int getArchiveFileSizeLimit();

  /**
   * Sets the value of the {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT} property
   */
  @ConfigAttributeSetter(name = ARCHIVE_FILE_SIZE_LIMIT)
  void setArchiveFileSizeLimit(int value);

  /**
   * The default {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int DEFAULT_ARCHIVE_FILE_SIZE_LIMIT = 0;
  /**
   * The minimum {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int MIN_ARCHIVE_FILE_SIZE_LIMIT = 0;
  /**
   * The maximum {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>1000000</code> megabytes.
   */
  int MAX_ARCHIVE_FILE_SIZE_LIMIT = 1000000;

  /**
   * The name of the {@link ConfigurationProperties#ARCHIVE_FILE_SIZE_LIMIT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ARCHIVE_FILE_SIZE_LIMIT,
      max = MAX_ARCHIVE_FILE_SIZE_LIMIT)
  String ARCHIVE_FILE_SIZE_LIMIT_NAME = ARCHIVE_FILE_SIZE_LIMIT;

  /**
   * Returns the value of the {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT} property
   */
  @Override
  @ConfigAttributeGetter(name = ARCHIVE_DISK_SPACE_LIMIT)
  int getArchiveDiskSpaceLimit();

  /**
   * Sets the value of the {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT} property
   */
  @ConfigAttributeSetter(name = ARCHIVE_DISK_SPACE_LIMIT)
  void setArchiveDiskSpaceLimit(int value);

  /**
   * The default {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int DEFAULT_ARCHIVE_DISK_SPACE_LIMIT = 0;
  /**
   * The minimum {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int MIN_ARCHIVE_DISK_SPACE_LIMIT = 0;
  /**
   * The maximum {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>1000000</code> megabytes.
   */
  int MAX_ARCHIVE_DISK_SPACE_LIMIT = 1000000;

  /**
   * The name of the {@link ConfigurationProperties#ARCHIVE_DISK_SPACE_LIMIT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ARCHIVE_DISK_SPACE_LIMIT,
      max = MAX_ARCHIVE_DISK_SPACE_LIMIT)
  String ARCHIVE_DISK_SPACE_LIMIT_NAME = ARCHIVE_DISK_SPACE_LIMIT;

  /**
   * Returns the value of the {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT} property
   */
  @Override
  @ConfigAttributeGetter(name = LOG_FILE_SIZE_LIMIT)
  int getLogFileSizeLimit();

  /**
   * Sets the value of the {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT} property
   */
  @ConfigAttributeSetter(name = LOG_FILE_SIZE_LIMIT)
  void setLogFileSizeLimit(int value);

  /**
   * The default {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int DEFAULT_LOG_FILE_SIZE_LIMIT = 0;
  /**
   * The minimum {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int MIN_LOG_FILE_SIZE_LIMIT = 0;
  /**
   * The maximum {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>1000000</code> megabytes.
   */
  int MAX_LOG_FILE_SIZE_LIMIT = 1000000;

  /**
   * The name of the {@link ConfigurationProperties#LOG_FILE_SIZE_LIMIT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_LOG_FILE_SIZE_LIMIT,
      max = MAX_LOG_FILE_SIZE_LIMIT)
  String LOG_FILE_SIZE_LIMIT_NAME = LOG_FILE_SIZE_LIMIT;

  /**
   * Returns the value of the {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT} property
   */
  @Override
  @ConfigAttributeGetter(name = LOG_DISK_SPACE_LIMIT)
  int getLogDiskSpaceLimit();

  /**
   * Sets the value of the {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT} property
   */
  @ConfigAttributeSetter(name = LOG_DISK_SPACE_LIMIT)
  void setLogDiskSpaceLimit(int value);

  /**
   * The default {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int DEFAULT_LOG_DISK_SPACE_LIMIT = 0;
  /**
   * The minimum {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>0</code> megabytes.
   */
  int MIN_LOG_DISK_SPACE_LIMIT = 0;
  /**
   * The maximum {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT}.
   * <p>
   * Actual value of this constant is <code>1000000</code> megabytes.
   */
  int MAX_LOG_DISK_SPACE_LIMIT = 1000000;

  /**
   * The name of the {@link ConfigurationProperties#LOG_DISK_SPACE_LIMIT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_LOG_DISK_SPACE_LIMIT,
      max = MAX_LOG_DISK_SPACE_LIMIT)
  String LOG_DISK_SPACE_LIMIT_NAME = LOG_DISK_SPACE_LIMIT;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_ENABLED} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_ENABLED)
  boolean getClusterSSLEnabled();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_ENABLED} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_ENABLED)
  void setClusterSSLEnabled(boolean enabled);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_ENABLED} state.
   * <p>
   * Actual value of this constant is <code>false</code>.
   */
  @Deprecated
  boolean DEFAULT_SSL_ENABLED = false;

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_ENABLED} property
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String CLUSTER_SSL_ENABLED_NAME = CLUSTER_SSL_ENABLED;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_PROTOCOLS)
  String getClusterSSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_PROTOCOLS)
  void setClusterSSLProtocols(String protocols);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   */
  String DEFAULT_SSL_PROTOCOLS = "any";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_PROTOCOLS_NAME = CLUSTER_SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_CIPHERS)
  String getClusterSSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_CIPHERS)
  void setClusterSSLCiphers(String ciphers);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   */
  String DEFAULT_SSL_CIPHERS = "any";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_CIPHERS_NAME = CLUSTER_SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_REQUIRE_AUTHENTICATION)
  boolean getClusterSSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_REQUIRE_AUTHENTICATION)
  void setClusterSSLRequireAuthentication(boolean enabled);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION} value.
   * <p>
   * Actual value of this constant is <code>true</code>.
   */
  boolean DEFAULT_SSL_REQUIRE_AUTHENTICATION = true;

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION} property
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String CLUSTER_SSL_REQUIRE_AUTHENTICATION_NAME = CLUSTER_SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_KEYSTORE)
  String getClusterSSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_KEYSTORE)
  void setClusterSSLKeyStore(String keyStore);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE} value.
   * <p>
   * Actual value of this constant is "".
   */
  String DEFAULT_SSL_KEYSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_KEYSTORE_NAME = CLUSTER_SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_KEYSTORE_TYPE)
  String getClusterSSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_KEYSTORE_TYPE)
  void setClusterSSLKeyStoreType(String keyStoreType);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE} value.
   * <p>
   * Actual value of this constant is "".
   */
  String DEFAULT_CLUSTER_SSL_KEYSTORE_TYPE = "";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_KEYSTORE_TYPE_NAME = CLUSTER_SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD}
   * property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_KEYSTORE_PASSWORD)
  String getClusterSSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_KEYSTORE_PASSWORD)
  void setClusterSSLKeyStorePassword(String keyStorePassword);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   */
  String DEFAULT_SSL_KEYSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_KEYSTORE_PASSWORD_NAME = CLUSTER_SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE} property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_TRUSTSTORE)
  String getClusterSSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_TRUSTSTORE)
  void setClusterSSLTrustStore(String trustStore);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE} value.
   * <p>
   * Actual value of this constant is "".
   */
  String DEFAULT_SSL_TRUSTSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_TRUSTSTORE_NAME = CLUSTER_SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD}
   * property.
   */
  @Deprecated
  @ConfigAttributeGetter(name = CLUSTER_SSL_TRUSTSTORE_PASSWORD)
  String getClusterSSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD} property.
   */
  @Deprecated
  @ConfigAttributeSetter(name = CLUSTER_SSL_TRUSTSTORE_PASSWORD)
  void setClusterSSLTrustStorePassword(String trusStorePassword);

  /**
   * The default {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   */
  String DEFAULT_SSL_TRUSTSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD} property
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_TRUSTSTORE_PASSWORD_NAME = CLUSTER_SSL_TRUSTSTORE_PASSWORD;

  /**
   * The name of an internal property that specifies a {@link org.apache.geode.LogWriter}
   * instance to log to. Set this property with put(), not with setProperty()
   *
   * @since GemFire 4.0
   */
  String LOG_WRITER_NAME = "log-writer";

  /**
   * The name of an internal property that specifies a a DistributionConfigImpl that the locator is
   * passing in to a ds connect. Set this property with put(), not with setProperty()
   *
   * @since GemFire 7.0
   */
  String DS_CONFIG_NAME = "ds-config";

  /**
   * The name of an internal property that specifies whether the distributed system is reconnecting
   * after a forced- disconnect.
   *
   * @since GemFire 8.1
   */
  String DS_RECONNECTING_NAME = "ds-reconnecting";

  /**
   * The name of an internal property that specifies the quorum checker for the system that was
   * forcibly disconnected. This should be used if the DS_RECONNECTING_NAME property is used.
   */
  String DS_QUORUM_CHECKER_NAME = "ds-quorum-checker";

  /**
   * The name of an internal property that specifies a {@link LogWriter} instance
   * to log security messages to. Set this property with put(), not with setProperty()
   *
   * @since GemFire 5.5
   */
  String SECURITY_LOG_WRITER_NAME = "security-log-writer";

  /**
   * The name of an internal property that specifies a FileOutputStream associated with the internal
   * property LOG_WRITER_NAME. If this property is set, the FileOutputStream will be closed when the
   * distributed system disconnects. Set this property with put(), not with setProperty()
   *
   * @since GemFire 5.0
   */
  String LOG_OUTPUTSTREAM_NAME = "log-output-stream";

  /**
   * The name of an internal property that specifies a FileOutputStream associated with the internal
   * property SECURITY_LOG_WRITER_NAME. If this property is set, the FileOutputStream will be closed
   * when the distributed system disconnects. Set this property with put(), not with setProperty()
   *
   * @since GemFire 5.5
   */
  String SECURITY_LOG_OUTPUTSTREAM_NAME = "security-log-output-stream";

  /**
   * Returns the value of the {@link ConfigurationProperties#SOCKET_LEASE_TIME} property
   */
  @ConfigAttributeGetter(name = SOCKET_LEASE_TIME)
  int getSocketLeaseTime();

  /**
   * Sets the value of the {@link ConfigurationProperties#SOCKET_LEASE_TIME} property
   */
  @ConfigAttributeSetter(name = SOCKET_LEASE_TIME)
  void setSocketLeaseTime(int value);

  /**
   * The default value of the {@link ConfigurationProperties#SOCKET_LEASE_TIME} property
   */
  int DEFAULT_SOCKET_LEASE_TIME = 60000;
  /**
   * The minimum {@link ConfigurationProperties#SOCKET_LEASE_TIME}.
   * <p>
   * Actual value of this constant is <code>0</code>.
   */
  int MIN_SOCKET_LEASE_TIME = 0;
  /**
   * The maximum {@link ConfigurationProperties#SOCKET_LEASE_TIME}.
   * <p>
   * Actual value of this constant is <code>600000</code>.
   */
  int MAX_SOCKET_LEASE_TIME = 600000;

  /**
   * The name of the {@link ConfigurationProperties#SOCKET_LEASE_TIME} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_SOCKET_LEASE_TIME, max = MAX_SOCKET_LEASE_TIME)
  String SOCKET_LEASE_TIME_NAME = SOCKET_LEASE_TIME;

  /**
   * Returns the value of the {@link ConfigurationProperties#SOCKET_BUFFER_SIZE} property
   */
  @ConfigAttributeGetter(name = SOCKET_BUFFER_SIZE)
  int getSocketBufferSize();

  /**
   * Sets the value of the {@link ConfigurationProperties#SOCKET_BUFFER_SIZE} property
   */
  @ConfigAttributeSetter(name = SOCKET_BUFFER_SIZE)
  void setSocketBufferSize(int value);

  /**
   * The default value of the {@link ConfigurationProperties#SOCKET_BUFFER_SIZE} property
   */
  int DEFAULT_SOCKET_BUFFER_SIZE = 32768;
  /**
   * The minimum {@link ConfigurationProperties#SOCKET_BUFFER_SIZE}.
   * <p>
   * Actual value of this constant is <code>1024</code>.
   */
  int MIN_SOCKET_BUFFER_SIZE = 1024;
  /**
   * The maximum {@link ConfigurationProperties#SOCKET_BUFFER_SIZE}.
   * <p>
   * Actual value of this constant is <code>20000000</code>.
   */
  int MAX_SOCKET_BUFFER_SIZE = Connection.MAX_MSG_SIZE;

  boolean VALIDATE = Boolean.getBoolean(DistributionConfig.GEMFIRE_PREFIX + "validateMessageSize");
  int VALIDATE_CEILING = Integer
      .getInteger(DistributionConfig.GEMFIRE_PREFIX + "validateMessageSizeCeiling", 8 * 1024 * 1024)
      .intValue();

  /**
   * The name of the {@link ConfigurationProperties#SOCKET_BUFFER_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_SOCKET_BUFFER_SIZE, max = MAX_SOCKET_BUFFER_SIZE)
  String SOCKET_BUFFER_SIZE_NAME = SOCKET_BUFFER_SIZE;

  /**
   * Get the value of the {@link ConfigurationProperties#MCAST_SEND_BUFFER_SIZE} property
   */
  @ConfigAttributeGetter(name = MCAST_SEND_BUFFER_SIZE)
  int getMcastSendBufferSize();

  /**
   * Set the value of the {@link ConfigurationProperties#MCAST_SEND_BUFFER_SIZE} property
   */
  @ConfigAttributeSetter(name = MCAST_SEND_BUFFER_SIZE)
  void setMcastSendBufferSize(int value);

  /**
   * The default value for {@link ConfigurationProperties#MCAST_SEND_BUFFER_SIZE} property
   */
  int DEFAULT_MCAST_SEND_BUFFER_SIZE = 65535;

  /**
   * The minimum size of the {@link ConfigurationProperties#MCAST_SEND_BUFFER_SIZE}, in bytes.
   * <p>
   * Actual value of this constant is <code>2048</code>.
   */
  int MIN_MCAST_SEND_BUFFER_SIZE = 2048;

  /**
   * The name of the {@link ConfigurationProperties#MCAST_SEND_BUFFER_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_MCAST_SEND_BUFFER_SIZE)
  String MCAST_SEND_BUFFER_SIZE_NAME = MCAST_SEND_BUFFER_SIZE;

  /**
   * Get the value of the {@link ConfigurationProperties#MCAST_RECV_BUFFER_SIZE} property
   */
  @ConfigAttributeGetter(name = MCAST_RECV_BUFFER_SIZE)
  int getMcastRecvBufferSize();

  /**
   * Set the value of the {@link ConfigurationProperties#MCAST_RECV_BUFFER_SIZE} property
   */
  @ConfigAttributeSetter(name = MCAST_RECV_BUFFER_SIZE)
  void setMcastRecvBufferSize(int value);

  /**
   * The default value of the {@link ConfigurationProperties#MCAST_RECV_BUFFER_SIZE} property
   */
  int DEFAULT_MCAST_RECV_BUFFER_SIZE = 1048576;

  /**
   * The minimum size of the {@link ConfigurationProperties#MCAST_RECV_BUFFER_SIZE}, in bytes.
   * <p>
   * Actual value of this constant is <code>2048</code>.
   */
  int MIN_MCAST_RECV_BUFFER_SIZE = 2048;

  /**
   * The name of the {@link ConfigurationProperties#MCAST_RECV_BUFFER_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_MCAST_RECV_BUFFER_SIZE)
  String MCAST_RECV_BUFFER_SIZE_NAME = MCAST_RECV_BUFFER_SIZE;

  /**
   * Get the value of the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} property.
   */
  @ConfigAttributeGetter(name = MCAST_FLOW_CONTROL)
  FlowControlParams getMcastFlowControl();

  /**
   * Set the value of the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} property
   */
  @ConfigAttributeSetter(name = MCAST_FLOW_CONTROL)
  void setMcastFlowControl(FlowControlParams values);

  /**
   * The name of the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} property
   */
  @ConfigAttribute(type = FlowControlParams.class)
  String MCAST_FLOW_CONTROL_NAME = MCAST_FLOW_CONTROL;

  /**
   * The default value of the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} property
   */
  @Immutable
  FlowControlParams DEFAULT_MCAST_FLOW_CONTROL = new FlowControlParams(1048576, (float) 0.25, 5000);

  /**
   * The minimum byteAllowance for the{@link ConfigurationProperties#MCAST_FLOW_CONTROL} setting of
   * <code>100000</code>.
   */
  int MIN_FC_BYTE_ALLOWANCE = 10000;

  /**
   * The minimum rechargeThreshold for the {@link ConfigurationProperties#MCAST_FLOW_CONTROL}
   * setting of <code>0.1</code>
   */
  float MIN_FC_RECHARGE_THRESHOLD = (float) 0.1;

  /**
   * The maximum rechargeThreshold for the {@link ConfigurationProperties#MCAST_FLOW_CONTROL}
   * setting of <code>0.5</code>
   */
  float MAX_FC_RECHARGE_THRESHOLD = (float) 0.5;

  /**
   * The minimum rechargeBlockMs for the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} setting
   * of <code>500</code>
   */
  int MIN_FC_RECHARGE_BLOCK_MS = 500;

  /**
   * The maximum rechargeBlockMs for the {@link ConfigurationProperties#MCAST_FLOW_CONTROL} setting
   * of <code>60000</code>
   */
  int MAX_FC_RECHARGE_BLOCK_MS = 60000;

  /**
   * Get the value of the {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} property.
   */
  @ConfigAttributeGetter(name = UDP_FRAGMENT_SIZE)
  int getUdpFragmentSize();

  /**
   * Set the value of the {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} property
   */
  @ConfigAttributeSetter(name = UDP_FRAGMENT_SIZE)
  void setUdpFragmentSize(int value);

  /**
   * The default value of the {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} property
   */
  int DEFAULT_UDP_FRAGMENT_SIZE = 60000;

  /**
   * The minimum allowed {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} setting of 1000
   */
  int MIN_UDP_FRAGMENT_SIZE = 1000;

  /**
   * The maximum allowed {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} setting of 60000
   */
  int MAX_UDP_FRAGMENT_SIZE = 60000;

  /**
   * The name of the {@link ConfigurationProperties#UDP_FRAGMENT_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_UDP_FRAGMENT_SIZE, max = MAX_UDP_FRAGMENT_SIZE)
  String UDP_FRAGMENT_SIZE_NAME = UDP_FRAGMENT_SIZE;

  /**
   * Get the value of the {@link ConfigurationProperties#UDP_SEND_BUFFER_SIZE} property
   */
  @ConfigAttributeGetter(name = UDP_SEND_BUFFER_SIZE)
  int getUdpSendBufferSize();

  /**
   * Set the value of the {@link ConfigurationProperties#UDP_SEND_BUFFER_SIZE} property
   */
  @ConfigAttributeSetter(name = UDP_SEND_BUFFER_SIZE)
  void setUdpSendBufferSize(int value);

  /**
   * The default value of the {@link ConfigurationProperties#UDP_SEND_BUFFER_SIZE} property
   */
  int DEFAULT_UDP_SEND_BUFFER_SIZE = 65535;

  /**
   * The minimum size of the {@link ConfigurationProperties#UDP_SEND_BUFFER_SIZE}, in bytes.
   * <p>
   * Actual value of this constant is <code>2048</code>.
   */
  int MIN_UDP_SEND_BUFFER_SIZE = 2048;

  /**
   * The name of the {@link ConfigurationProperties#UDP_SEND_BUFFER_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_UDP_SEND_BUFFER_SIZE)
  String UDP_SEND_BUFFER_SIZE_NAME = UDP_SEND_BUFFER_SIZE;

  /**
   * Get the value of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE} property
   */
  @ConfigAttributeGetter(name = UDP_RECV_BUFFER_SIZE)
  int getUdpRecvBufferSize();

  /**
   * Set the value of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE} property
   */
  @ConfigAttributeSetter(name = UDP_RECV_BUFFER_SIZE)
  void setUdpRecvBufferSize(int value);

  /**
   * The default value of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE} property
   */
  int DEFAULT_UDP_RECV_BUFFER_SIZE = 1048576;

  /**
   * The default size of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE} if tcp/ip sockets
   * are enabled and multicast is disabled
   */
  int DEFAULT_UDP_RECV_BUFFER_SIZE_REDUCED = 65535;

  /**
   * The minimum size of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE}, in bytes.
   * <p>
   * Actual value of this constant is <code>2048</code>.
   */
  int MIN_UDP_RECV_BUFFER_SIZE = 2048;

  /**
   * The name of the {@link ConfigurationProperties#UDP_RECV_BUFFER_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_UDP_RECV_BUFFER_SIZE)
  String UDP_RECV_BUFFER_SIZE_NAME = UDP_RECV_BUFFER_SIZE;

  /**
   * Returns the value of the {@link ConfigurationProperties#DISABLE_TCP} property
   */
  @ConfigAttributeGetter(name = DISABLE_TCP)
  boolean getDisableTcp();

  /**
   * Sets the value of the {@link ConfigurationProperties#DISABLE_TCP} property.
   */
  @ConfigAttributeSetter(name = DISABLE_TCP)
  void setDisableTcp(boolean newValue);

  /**
   * The name of the {@link ConfigurationProperties#DISABLE_TCP} property
   */
  @ConfigAttribute(type = Boolean.class)
  String DISABLE_TCP_NAME = DISABLE_TCP;

  /**
   * The default value of the {@link ConfigurationProperties#DISABLE_TCP} property
   */
  boolean DEFAULT_DISABLE_TCP = false;

  /**
   * Returns the value of the {@link ConfigurationProperties#DISABLE_JMX} property
   */
  @ConfigAttributeGetter(name = DISABLE_JMX)
  boolean getDisableJmx();

  /**
   * Sets the value of the {@link ConfigurationProperties#DISABLE_JMX} property.
   */
  @ConfigAttributeSetter(name = DISABLE_JMX)
  void setDisableJmx(boolean newValue);

  /**
   * The name of the {@link ConfigurationProperties#DISABLE_JMX} property
   */
  @ConfigAttribute(type = Boolean.class)
  String DISABLE_JMX_NAME = DISABLE_JMX;

  /**
   * The default value of the {@link ConfigurationProperties#DISABLE_JMX} property
   */
  boolean DEFAULT_DISABLE_JMX = false;

  /**
   * Turns on timing statistics for the distributed system
   */
  @ConfigAttributeSetter(name = ENABLE_TIME_STATISTICS)
  void setEnableTimeStatistics(boolean newValue);

  /**
   * Returns the value of {@link ConfigurationProperties#ENABLE_TIME_STATISTICS} property
   */
  @ConfigAttributeGetter(name = ENABLE_TIME_STATISTICS)
  boolean getEnableTimeStatistics();

  /**
   * the name of the {@link ConfigurationProperties#ENABLE_TIME_STATISTICS} property
   */
  @ConfigAttribute(type = Boolean.class)
  String ENABLE_TIME_STATISTICS_NAME = ENABLE_TIME_STATISTICS;

  /**
   * The default value of the {@link ConfigurationProperties#ENABLE_TIME_STATISTICS} property
   */
  boolean DEFAULT_ENABLE_TIME_STATISTICS = false;

  /**
   * Returns the value of the {@link ConfigurationProperties#THREAD_MONITOR_ENABLED} property
   */
  @ConfigAttributeGetter(name = THREAD_MONITOR_ENABLED)
  boolean getThreadMonitorEnabled();

  /**
   * Sets {@link ConfigurationProperties#THREAD_MONITOR_ENABLED}
   */
  @ConfigAttributeSetter(name = THREAD_MONITOR_ENABLED)
  void setThreadMonitorEnabled(boolean newValue);

  /**
   * The name of the {@link ConfigurationProperties#THREAD_MONITOR_ENABLED} property
   */
  @ConfigAttribute(type = Boolean.class)
  String THREAD_MONITOR_ENABLED_NAME = THREAD_MONITOR_ENABLED;

  /**
   * The default value of the {@link ConfigurationProperties#THREAD_MONITOR_ENABLED} property
   */
  boolean DEFAULT_THREAD_MONITOR_ENABLED = true;

  /**
   * Sets the value for {@link ConfigurationProperties#USE_CLUSTER_CONFIGURATION}
   */
  @ConfigAttributeSetter(name = USE_CLUSTER_CONFIGURATION)
  void setUseSharedConfiguration(boolean newValue);

  /**
   * Returns the value of {@link ConfigurationProperties#USE_CLUSTER_CONFIGURATION} property
   */
  @ConfigAttributeGetter(name = USE_CLUSTER_CONFIGURATION)
  boolean getUseSharedConfiguration();

  /**
   * the name of the {@link ConfigurationProperties#USE_CLUSTER_CONFIGURATION} property
   */
  @ConfigAttribute(type = Boolean.class)
  String USE_CLUSTER_CONFIGURATION_NAME = USE_CLUSTER_CONFIGURATION;

  /**
   * The default value of the {@link ConfigurationProperties#USE_CLUSTER_CONFIGURATION} property
   */
  boolean DEFAULT_USE_CLUSTER_CONFIGURATION = true;

  /**
   * Sets the value for {@link ConfigurationProperties#ENABLE_CLUSTER_CONFIGURATION}
   */
  @ConfigAttributeSetter(name = ENABLE_CLUSTER_CONFIGURATION)
  void setEnableClusterConfiguration(boolean newValue);

  /**
   * Returns the value of {@link ConfigurationProperties#ENABLE_CLUSTER_CONFIGURATION} property
   */
  @ConfigAttributeGetter(name = ENABLE_CLUSTER_CONFIGURATION)
  boolean getEnableClusterConfiguration();

  /**
   * the name of the {@link ConfigurationProperties#ENABLE_CLUSTER_CONFIGURATION} property
   */
  @ConfigAttribute(type = Boolean.class)
  String ENABLE_CLUSTER_CONFIGURATION_NAME = ENABLE_CLUSTER_CONFIGURATION;

  /**
   * The default value of the {@link ConfigurationProperties#ENABLE_CLUSTER_CONFIGURATION} property
   */
  boolean DEFAULT_ENABLE_CLUSTER_CONFIGURATION = true;

  /**
   * Sets the value for {@link ConfigurationProperties#ENABLE_MANAGEMENT_REST_SERVICE}
   */
  @ConfigAttributeSetter(name = ENABLE_MANAGEMENT_REST_SERVICE)
  void setEnableManagementRestService(boolean newValue);

  /**
   * Returns the value of {@link ConfigurationProperties#ENABLE_MANAGEMENT_REST_SERVICE} property
   */
  @ConfigAttributeGetter(name = ENABLE_MANAGEMENT_REST_SERVICE)
  boolean getEnableManagementRestService();

  /**
   * the name of the {@link ConfigurationProperties#ENABLE_MANAGEMENT_REST_SERVICE} property
   */
  @ConfigAttribute(type = Boolean.class)
  String ENABLE_MANAGEMENT_REST_SERVICE_NAME = ENABLE_MANAGEMENT_REST_SERVICE;

  /**
   * The default value of the {@link ConfigurationProperties#ENABLE_MANAGEMENT_REST_SERVICE}
   * property
   */
  boolean DEFAULT_ENABLE_MANAGEMENT_REST_SERVICE = true;

  @ConfigAttribute(type = Boolean.class)
  String LOAD_CLUSTER_CONFIG_FROM_DIR_NAME = LOAD_CLUSTER_CONFIGURATION_FROM_DIR;
  boolean DEFAULT_LOAD_CLUSTER_CONFIG_FROM_DIR = false;

  /**
   * Returns the value of {@link ConfigurationProperties#LOAD_CLUSTER_CONFIGURATION_FROM_DIR}
   * property
   */
  @ConfigAttributeGetter(name = LOAD_CLUSTER_CONFIGURATION_FROM_DIR)
  boolean getLoadClusterConfigFromDir();

  /**
   * Sets the value of {@link ConfigurationProperties#LOAD_CLUSTER_CONFIGURATION_FROM_DIR} property
   */
  @ConfigAttributeSetter(name = LOAD_CLUSTER_CONFIGURATION_FROM_DIR)
  void setLoadClusterConfigFromDir(boolean newValue);

  @ConfigAttribute(type = String.class)
  String CLUSTER_CONFIGURATION_DIR_NAME = CLUSTER_CONFIGURATION_DIR;
  String DEFAULT_CLUSTER_CONFIGURATION_DIR = System.getProperty("user.dir");

  @ConfigAttributeGetter(name = CLUSTER_CONFIGURATION_DIR)
  String getClusterConfigDir();

  @ConfigAttributeSetter(name = CLUSTER_CONFIGURATION_DIR)
  void setClusterConfigDir(String clusterConfigDir);

  /**
   * Turns on network partition detection
   */
  @ConfigAttributeSetter(name = ENABLE_NETWORK_PARTITION_DETECTION)
  void setEnableNetworkPartitionDetection(boolean newValue);

  /**
   * Returns the value of the {@link ConfigurationProperties#ENABLE_NETWORK_PARTITION_DETECTION}
   * property
   */
  @ConfigAttributeGetter(name = ENABLE_NETWORK_PARTITION_DETECTION)
  boolean getEnableNetworkPartitionDetection();

  /**
   * the name of the {@link ConfigurationProperties#ENABLE_NETWORK_PARTITION_DETECTION} property
   */
  @ConfigAttribute(type = Boolean.class)
  String ENABLE_NETWORK_PARTITION_DETECTION_NAME = ENABLE_NETWORK_PARTITION_DETECTION;
  boolean DEFAULT_ENABLE_NETWORK_PARTITION_DETECTION = true;

  /**
   * Get the value of the {@link ConfigurationProperties#MEMBER_TIMEOUT} property
   */
  @ConfigAttributeGetter(name = MEMBER_TIMEOUT)
  int getMemberTimeout();

  /**
   * Set the value of the {@link ConfigurationProperties#MEMBER_TIMEOUT} property
   */
  @ConfigAttributeSetter(name = MEMBER_TIMEOUT)
  void setMemberTimeout(int value);

  /**
   * The default value of the {@link ConfigurationProperties#MEMBER_TIMEOUT} property
   */
  int DEFAULT_MEMBER_TIMEOUT = 5000;

  /**
   * The minimum {@link ConfigurationProperties#MEMBER_TIMEOUT} setting of 1000 milliseconds
   */
  int MIN_MEMBER_TIMEOUT = 10;

  /**
   * The maximum {@link ConfigurationProperties#MEMBER_TIMEOUT} setting of 600000 millieseconds
   */
  int MAX_MEMBER_TIMEOUT = 600000;
  /**
   * The name of the {@link ConfigurationProperties#MEMBER_TIMEOUT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_MEMBER_TIMEOUT, max = MAX_MEMBER_TIMEOUT)
  String MEMBER_TIMEOUT_NAME = MEMBER_TIMEOUT;

  @ConfigAttribute(type = int[].class)
  String MEMBERSHIP_PORT_RANGE_NAME = MEMBERSHIP_PORT_RANGE;

  /**
   * set this boolean to restrict membership/communications to use ports in the ephemeral range
   */
  String RESTRICT_MEMBERSHIP_PORT_RANGE = GEMFIRE_PREFIX + "use-ephemeral-ports";

  @MakeImmutable
  int[] DEFAULT_MEMBERSHIP_PORT_RANGE = new int[] {41000, 61000};

  @ConfigAttributeGetter(name = MEMBERSHIP_PORT_RANGE)
  int[] getMembershipPortRange();

  @ConfigAttributeSetter(name = MEMBERSHIP_PORT_RANGE)
  void setMembershipPortRange(int[] range);

  /**
   * Returns the value of the {@link ConfigurationProperties#CONSERVE_SOCKETS} property
   */
  @ConfigAttributeGetter(name = CONSERVE_SOCKETS)
  boolean getConserveSockets();

  /**
   * Sets the value of the {@link ConfigurationProperties#CONSERVE_SOCKETS} property.
   */
  @ConfigAttributeSetter(name = CONSERVE_SOCKETS)
  void setConserveSockets(boolean newValue);

  /**
   * The name of the {@link ConfigurationProperties#CONSERVE_SOCKETS} property
   */
  @ConfigAttribute(type = Boolean.class)
  String CONSERVE_SOCKETS_NAME = CONSERVE_SOCKETS;

  /**
   * The default value of the {@link ConfigurationProperties#CONSERVE_SOCKETS} property
   */
  boolean DEFAULT_CONSERVE_SOCKETS = true;

  /**
   * Returns the value of the {@link ConfigurationProperties#ROLES} property
   */
  @ConfigAttributeGetter(name = ROLES)
  String getRoles();

  /**
   * Sets the value of the {@link ConfigurationProperties#ROLES} property.
   */
  @ConfigAttributeSetter(name = ROLES)
  void setRoles(String roles);

  /**
   * The name of the {@link ConfigurationProperties#ROLES} property
   */
  @ConfigAttribute(type = String.class)
  String ROLES_NAME = ROLES;

  /**
   * The default value of the {@link ConfigurationProperties#ROLES} property
   */
  String DEFAULT_ROLES = "";

  /**
   * The name of the {@link ConfigurationProperties#MAX_WAIT_TIME_RECONNECT} property
   */
  @ConfigAttribute(type = Integer.class)
  String MAX_WAIT_TIME_FOR_RECONNECT_NAME = MAX_WAIT_TIME_RECONNECT;

  /**
   * Default value for {@link ConfigurationProperties#MAX_WAIT_TIME_RECONNECT}, 60,000 milliseconds.
   */
  int DEFAULT_MAX_WAIT_TIME_FOR_RECONNECT = 60000;

  /**
   * Sets the {@link ConfigurationProperties#MAX_WAIT_TIME_RECONNECT}, in milliseconds, for
   * reconnect.
   */
  @ConfigAttributeSetter(name = MAX_WAIT_TIME_RECONNECT)
  void setMaxWaitTimeForReconnect(int timeOut);

  /**
   * Returns the {@link ConfigurationProperties#MAX_WAIT_TIME_RECONNECT}, in milliseconds, for
   * reconnect.
   */
  @ConfigAttributeGetter(name = MAX_WAIT_TIME_RECONNECT)
  int getMaxWaitTimeForReconnect();

  /**
   * The name of the {@link ConfigurationProperties#MAX_NUM_RECONNECT_TRIES} property.
   */
  @ConfigAttribute(type = Integer.class)
  String MAX_NUM_RECONNECT_TRIES_NAME = MAX_NUM_RECONNECT_TRIES;

  /**
   * Default value for {@link ConfigurationProperties#MAX_NUM_RECONNECT_TRIES}.
   */
  int DEFAULT_MAX_NUM_RECONNECT_TRIES = 3;

  /**
   * Sets the {@link ConfigurationProperties#MAX_NUM_RECONNECT_TRIES}.
   */
  @ConfigAttributeSetter(name = MAX_NUM_RECONNECT_TRIES)
  void setMaxNumReconnectTries(int tries);

  /**
   * Returns the value for {@link ConfigurationProperties#MAX_NUM_RECONNECT_TRIES}.
   */
  @ConfigAttributeGetter(name = MAX_NUM_RECONNECT_TRIES)
  int getMaxNumReconnectTries();

  // ------------------- Asynchronous Messaging Properties -------------------

  /**
   * Returns the value of the {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} property.
   */
  @ConfigAttributeGetter(name = ASYNC_DISTRIBUTION_TIMEOUT)
  int getAsyncDistributionTimeout();

  /**
   * Sets the value of the {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} property.
   */
  @ConfigAttributeSetter(name = ASYNC_DISTRIBUTION_TIMEOUT)
  void setAsyncDistributionTimeout(int newValue);

  /**
   * The default value of {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} is
   * <code>0</code>.
   */
  int DEFAULT_ASYNC_DISTRIBUTION_TIMEOUT = 0;
  /**
   * The minimum value of {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} is
   * <code>0</code>.
   */
  int MIN_ASYNC_DISTRIBUTION_TIMEOUT = 0;
  /**
   * The maximum value of {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} is
   * <code>60000</code>.
   */
  int MAX_ASYNC_DISTRIBUTION_TIMEOUT = 60000;

  /**
   * The name of the {@link ConfigurationProperties#ASYNC_DISTRIBUTION_TIMEOUT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ASYNC_DISTRIBUTION_TIMEOUT,
      max = MAX_ASYNC_DISTRIBUTION_TIMEOUT)
  String ASYNC_DISTRIBUTION_TIMEOUT_NAME = ASYNC_DISTRIBUTION_TIMEOUT;

  /**
   * Returns the value of the {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} property.
   */
  @ConfigAttributeGetter(name = ASYNC_QUEUE_TIMEOUT)
  int getAsyncQueueTimeout();

  /**
   * Sets the value of the {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} property.
   */
  @ConfigAttributeSetter(name = ASYNC_QUEUE_TIMEOUT)
  void setAsyncQueueTimeout(int newValue);

  /**
   * The default value of {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} is <code>60000</code>.
   */
  int DEFAULT_ASYNC_QUEUE_TIMEOUT = 60000;
  /**
   * The minimum value of {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} is <code>0</code>.
   */
  int MIN_ASYNC_QUEUE_TIMEOUT = 0;
  /**
   * The maximum value of {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} is
   * <code>86400000</code>.
   */
  int MAX_ASYNC_QUEUE_TIMEOUT = 86400000;
  /**
   * The name of the {@link ConfigurationProperties#ASYNC_QUEUE_TIMEOUT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ASYNC_QUEUE_TIMEOUT,
      max = MAX_ASYNC_QUEUE_TIMEOUT)
  String ASYNC_QUEUE_TIMEOUT_NAME = ASYNC_QUEUE_TIMEOUT;

  /**
   * Returns the value of the {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} property.
   */
  @ConfigAttributeGetter(name = THREAD_MONITOR_INTERVAL)
  int getThreadMonitorInterval();

  /**
   * Sets the value of the {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} property.
   */
  @ConfigAttributeSetter(name = THREAD_MONITOR_INTERVAL)
  void setThreadMonitorInterval(int newValue);

  /**
   * The default value of {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} is
   * <code>60000</code>.
   */
  int DEFAULT_THREAD_MONITOR_INTERVAL = 60000;
  /**
   * The minimum value of {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} is <code>0</code>.
   */
  int MIN_THREAD_MONITOR_INTERVAL = 0;
  /**
   * The maximum value of {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} is
   * <code>86400000</code>.
   */
  int MAX_THREAD_MONITOR_INTERVAL = 86400000;
  /**
   * The name of the {@link ConfigurationProperties#THREAD_MONITOR_INTERVAL} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_THREAD_MONITOR_INTERVAL,
      max = MAX_THREAD_MONITOR_INTERVAL)
  String THREAD_MONITOR_INTERVAL_NAME = THREAD_MONITOR_INTERVAL;

  /**
   * Returns the value of the {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} property.
   */
  @ConfigAttributeGetter(name = THREAD_MONITOR_TIME_LIMIT)
  int getThreadMonitorTimeLimit();

  /**
   * Sets the value of the {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} property.
   */
  @ConfigAttributeSetter(name = THREAD_MONITOR_TIME_LIMIT)
  void setThreadMonitorTimeLimit(int newValue);

  /**
   * The default value of {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} is
   * <code>60000</code>.
   */
  int DEFAULT_THREAD_MONITOR_TIME_LIMIT = 30000;
  /**
   * The minimum value of {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} is
   * <code>0</code>.
   */
  int MIN_THREAD_MONITOR_TIME_LIMIT = 0;
  /**
   * The maximum value of {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} is
   * <code>86400000</code>.
   */
  int MAX_THREAD_MONITOR_TIME_LIMIT = 86400000;
  /**
   * The name of the {@link ConfigurationProperties#THREAD_MONITOR_TIME_LIMIT} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_THREAD_MONITOR_TIME_LIMIT,
      max = MAX_THREAD_MONITOR_TIME_LIMIT)
  String THREAD_MONITOR_TIME_LIMIT_NAME = THREAD_MONITOR_TIME_LIMIT;

  /**
   * Returns the value of the {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} property.
   */
  @ConfigAttributeGetter(name = ASYNC_MAX_QUEUE_SIZE)
  int getAsyncMaxQueueSize();

  /**
   * Sets the value of the {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} property.
   */
  @ConfigAttributeSetter(name = ASYNC_MAX_QUEUE_SIZE)
  void setAsyncMaxQueueSize(int newValue);

  /**
   * The default value of {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} is <code>8</code>.
   */
  int DEFAULT_ASYNC_MAX_QUEUE_SIZE = 8;
  /**
   * The minimum value of {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} is <code>0</code>.
   */
  int MIN_ASYNC_MAX_QUEUE_SIZE = 0;
  /**
   * The maximum value of {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} is <code>1024</code>.
   */
  int MAX_ASYNC_MAX_QUEUE_SIZE = 1024;

  /**
   * The name of the {@link ConfigurationProperties#ASYNC_MAX_QUEUE_SIZE} property
   */
  @ConfigAttribute(type = Integer.class, min = MIN_ASYNC_MAX_QUEUE_SIZE,
      max = MAX_ASYNC_MAX_QUEUE_SIZE)
  String ASYNC_MAX_QUEUE_SIZE_NAME = ASYNC_MAX_QUEUE_SIZE;
  /**
   * @since GemFire 5.7
   */
  @ConfigAttribute(type = String.class)
  String CLIENT_CONFLATION_PROP_NAME = CONFLATE_EVENTS;
  /**
   * @since GemFire 5.7
   */
  String CLIENT_CONFLATION_PROP_VALUE_DEFAULT = "server";
  /**
   * @since GemFire 5.7
   */
  String CLIENT_CONFLATION_PROP_VALUE_ON = "true";
  /**
   * @since GemFire 5.7
   */
  String CLIENT_CONFLATION_PROP_VALUE_OFF = "false";

  /**
   * @since Geode 1.0
   */
  @ConfigAttribute(type = Boolean.class)
  String DISTRIBUTED_TRANSACTIONS_NAME = DISTRIBUTED_TRANSACTIONS;
  boolean DEFAULT_DISTRIBUTED_TRANSACTIONS = false;

  @ConfigAttributeGetter(name = DISTRIBUTED_TRANSACTIONS)
  boolean getDistributedTransactions();

  @ConfigAttributeSetter(name = DISTRIBUTED_TRANSACTIONS)
  void setDistributedTransactions(boolean value);

  /**
   * Returns the value of the {@link ConfigurationProperties#CONFLATE_EVENTS} property.
   *
   * @since GemFire 5.7
   */
  @ConfigAttributeGetter(name = CONFLATE_EVENTS)
  String getClientConflation();

  /**
   * Sets the value of the {@link ConfigurationProperties#CONFLATE_EVENTS} property.
   *
   * @since GemFire 5.7
   */
  @ConfigAttributeSetter(name = CONFLATE_EVENTS)
  void setClientConflation(String clientConflation);
  // -------------------------------------------------------------------------

  /**
   * Returns the value of the {@link ConfigurationProperties#DURABLE_CLIENT_ID} property.
   */
  @ConfigAttributeGetter(name = DURABLE_CLIENT_ID)
  String getDurableClientId();

  /**
   * Sets the value of the {@link ConfigurationProperties#DURABLE_CLIENT_ID} property.
   */
  @ConfigAttributeSetter(name = DURABLE_CLIENT_ID)
  void setDurableClientId(String durableClientId);

  /**
   * The name of the {@link ConfigurationProperties#DURABLE_CLIENT_ID} property
   */
  @ConfigAttribute(type = String.class)
  String DURABLE_CLIENT_ID_NAME = DURABLE_CLIENT_ID;

  /**
   * The default {@link ConfigurationProperties#DURABLE_CLIENT_ID}.
   * <p>
   * Actual value of this constant is <code>""</code>.
   */
  String DEFAULT_DURABLE_CLIENT_ID = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#DURABLE_CLIENT_TIMEOUT} property.
   */
  @ConfigAttributeGetter(name = DURABLE_CLIENT_TIMEOUT)
  int getDurableClientTimeout();

  /**
   * Sets the value of the {@link ConfigurationProperties#DURABLE_CLIENT_TIMEOUT} property.
   */
  @ConfigAttributeSetter(name = DURABLE_CLIENT_TIMEOUT)
  void setDurableClientTimeout(int durableClientTimeout);

  /**
   * The name of the {@link ConfigurationProperties#DURABLE_CLIENT_TIMEOUT} property
   */
  @ConfigAttribute(type = Integer.class)
  String DURABLE_CLIENT_TIMEOUT_NAME = DURABLE_CLIENT_TIMEOUT;

  /**
   * The default {@link ConfigurationProperties#DURABLE_CLIENT_TIMEOUT} in seconds.
   * <p>
   * Actual value of this constant is <code>"300"</code>.
   */
  int DEFAULT_DURABLE_CLIENT_TIMEOUT = 300;

  /**
   * Returns user module name for client authentication initializer in
   * {@link ConfigurationProperties#SECURITY_CLIENT_AUTH_INIT}
   */
  @ConfigAttributeGetter(name = SECURITY_CLIENT_AUTH_INIT)
  String getSecurityClientAuthInit();

  /**
   * Sets the user module name in {@link ConfigurationProperties#SECURITY_CLIENT_AUTH_INIT}
   * property.
   */
  @ConfigAttributeSetter(name = SECURITY_CLIENT_AUTH_INIT)
  void setSecurityClientAuthInit(String attValue);

  /**
   * The name of user defined method name for
   * {@link ConfigurationProperties#SECURITY_CLIENT_AUTH_INIT} property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_CLIENT_AUTH_INIT_NAME = SECURITY_CLIENT_AUTH_INIT;

  /**
   * The default {@link ConfigurationProperties#SECURITY_CLIENT_AUTH_INIT} method name.
   * <p>
   * Actual value of this is in format <code>"jar file:module name"</code>.
   */
  String DEFAULT_SECURITY_CLIENT_AUTH_INIT = "";

  /**
   * Returns user module name authenticating client credentials in
   * {@link ConfigurationProperties#SECURITY_CLIENT_AUTHENTICATOR}
   */
  @ConfigAttributeGetter(name = SECURITY_CLIENT_AUTHENTICATOR)
  String getSecurityClientAuthenticator();

  /**
   * Sets the user defined method name in
   * {@link ConfigurationProperties#SECURITY_CLIENT_AUTHENTICATOR} property.
   */
  @ConfigAttributeSetter(name = SECURITY_CLIENT_AUTHENTICATOR)
  void setSecurityClientAuthenticator(String attValue);

  /**
   * The name of factory method for {@link ConfigurationProperties#SECURITY_CLIENT_AUTHENTICATOR}
   * property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_CLIENT_AUTHENTICATOR_NAME = SECURITY_CLIENT_AUTHENTICATOR;

  /**
   * The default {@link ConfigurationProperties#SECURITY_CLIENT_AUTHENTICATOR} method name.
   * <p>
   * Actual value of this is fully qualified <code>"method name"</code>.
   */
  String DEFAULT_SECURITY_CLIENT_AUTHENTICATOR = "";

  /**
   * Returns user defined class name authenticating client credentials in
   * {@link ConfigurationProperties#SECURITY_MANAGER}
   */
  @ConfigAttributeGetter(name = SECURITY_MANAGER)
  String getSecurityManager();

  /**
   * Sets the user defined class name in {@link ConfigurationProperties#SECURITY_MANAGER} property.
   */
  @ConfigAttributeSetter(name = SECURITY_MANAGER)
  void setSecurityManager(String attValue);

  /**
   * The name of class for {@link ConfigurationProperties#SECURITY_MANAGER} property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_MANAGER_NAME = SECURITY_MANAGER;

  /**
   * The default {@link ConfigurationProperties#SECURITY_MANAGER} class name.
   * <p>
   * Actual value of this is fully qualified <code>"class name"</code>.
   */
  String DEFAULT_SECURITY_MANAGER = "";

  /**
   * Returns user defined post processor name in
   * {@link ConfigurationProperties#SECURITY_POST_PROCESSOR}
   */
  @ConfigAttributeGetter(name = SECURITY_POST_PROCESSOR)
  String getPostProcessor();

  /**
   * Sets the user defined class name in {@link ConfigurationProperties#SECURITY_POST_PROCESSOR}
   * property.
   */
  @ConfigAttributeSetter(name = SECURITY_POST_PROCESSOR)
  void setPostProcessor(String attValue);

  /**
   * The name of class for {@link ConfigurationProperties#SECURITY_POST_PROCESSOR} property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_POST_PROCESSOR_NAME = SECURITY_POST_PROCESSOR;

  /**
   * The default {@link ConfigurationProperties#SECURITY_POST_PROCESSOR} class name.
   * <p>
   * Actual value of this is fully qualified <code>"class name"</code>.
   */
  String DEFAULT_SECURITY_POST_PROCESSOR = "";

  /**
   * Returns name of algorithm to use for Diffie-Hellman key exchange
   * {@link ConfigurationProperties#SECURITY_CLIENT_DHALGO}
   */
  @ConfigAttributeGetter(name = SECURITY_CLIENT_DHALGO)
  String getSecurityClientDHAlgo();

  /**
   * Set the name of algorithm to use for Diffie-Hellman key exchange
   * {@link ConfigurationProperties#SECURITY_CLIENT_DHALGO} property.
   */
  @ConfigAttributeSetter(name = SECURITY_CLIENT_DHALGO)
  void setSecurityClientDHAlgo(String attValue);

  /**
   * Returns name of algorithm to use for Diffie-Hellman key exchange
   * <a href="../DistributedSystem.html#security-udp-dhalgo">"security-udp-dhalgo"</a>
   */
  @ConfigAttributeGetter(name = SECURITY_UDP_DHALGO)
  String getSecurityUDPDHAlgo();

  /**
   * Set the name of algorithm to use for Diffie-Hellman key exchange
   * <a href="../DistributedSystem.html#security-udp-dhalgo">"security-udp-dhalgo"</a> property.
   */
  @ConfigAttributeSetter(name = SECURITY_UDP_DHALGO)
  void setSecurityUDPDHAlgo(String attValue);

  /**
   * The name of the Diffie-Hellman symmetric algorithm
   * {@link ConfigurationProperties#SECURITY_CLIENT_DHALGO} property.
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_CLIENT_DHALGO_NAME = SECURITY_CLIENT_DHALGO;

  /**
   * The name of the Diffie-Hellman symmetric algorithm "security-udp-dhalgo" property.
   *
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_UDP_DHALGO_NAME = SECURITY_UDP_DHALGO;

  /**
   * The default Diffie-Hellman symmetric algorithm name.
   * <p>
   * Actual value of this is one of the available symmetric algorithm names in JDK like "AES:128" or
   * "Blowfish".
   */
  String DEFAULT_SECURITY_CLIENT_DHALGO = "";

  /**
   * The default Diffie-Hellman symmetric algorithm name.
   * <p>
   * Actual value of this is one of the available symmetric algorithm names in JDK like "AES:128" or
   * "Blowfish".
   */
  String DEFAULT_SECURITY_UDP_DHALGO = "";

  /**
   * Returns user defined method name for peer authentication initializer in
   * {@link ConfigurationProperties#SECURITY_PEER_AUTH_INIT}
   */
  @ConfigAttributeGetter(name = SECURITY_PEER_AUTH_INIT)
  String getSecurityPeerAuthInit();

  /**
   * Sets the user module name in {@link ConfigurationProperties#SECURITY_PEER_AUTH_INIT} property.
   */
  @ConfigAttributeSetter(name = SECURITY_PEER_AUTH_INIT)
  void setSecurityPeerAuthInit(String attValue);

  /**
   * The name of user module for {@link ConfigurationProperties#SECURITY_PEER_AUTH_INIT} property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_PEER_AUTH_INIT_NAME = SECURITY_PEER_AUTH_INIT;

  /**
   * The default {@link ConfigurationProperties#SECURITY_PEER_AUTH_INIT} method name.
   * <p>
   * Actual value of this is fully qualified <code>"method name"</code>.
   */
  String DEFAULT_SECURITY_PEER_AUTH_INIT = "";

  /**
   * Returns user defined method name authenticating peer's credentials in
   * {@link ConfigurationProperties#SECURITY_PEER_AUTHENTICATOR}
   */
  @ConfigAttributeGetter(name = SECURITY_PEER_AUTHENTICATOR)
  String getSecurityPeerAuthenticator();

  /**
   * Sets the user module name in {@link ConfigurationProperties#SECURITY_PEER_AUTHENTICATOR}
   * property.
   */
  @ConfigAttributeSetter(name = SECURITY_PEER_AUTHENTICATOR)
  void setSecurityPeerAuthenticator(String attValue);

  /**
   * The name of user defined method for {@link ConfigurationProperties#SECURITY_PEER_AUTHENTICATOR}
   * property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_PEER_AUTHENTICATOR_NAME = SECURITY_PEER_AUTHENTICATOR;

  /**
   * The default {@link ConfigurationProperties#SECURITY_PEER_AUTHENTICATOR} method.
   * <p>
   * Actual value of this is fully qualified <code>"method name"</code>.
   */
  String DEFAULT_SECURITY_PEER_AUTHENTICATOR = "";

  /**
   * Returns user module name authorizing client credentials in
   * {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR}
   */
  @ConfigAttributeGetter(name = SECURITY_CLIENT_ACCESSOR)
  String getSecurityClientAccessor();

  /**
   * Sets the user defined method name in {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR}
   * property.
   */
  @ConfigAttributeSetter(name = SECURITY_CLIENT_ACCESSOR)
  void setSecurityClientAccessor(String attValue);

  /**
   * The name of the factory method for {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR}
   * property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_CLIENT_ACCESSOR_NAME = SECURITY_CLIENT_ACCESSOR;

  /**
   * The default {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR} method name.
   * <p>
   * Actual value of this is fully qualified <code>"method name"</code>.
   */
  String DEFAULT_SECURITY_CLIENT_ACCESSOR = "";

  /**
   * Returns user module name authorizing client credentials in
   * {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR_PP}
   */
  @ConfigAttributeGetter(name = SECURITY_CLIENT_ACCESSOR_PP)
  String getSecurityClientAccessorPP();

  /**
   * Sets the user defined method name in
   * {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR_PP} property.
   */
  @ConfigAttributeSetter(name = SECURITY_CLIENT_ACCESSOR_PP)
  void setSecurityClientAccessorPP(String attValue);

  /**
   * The name of the factory method for {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR_PP}
   * property
   */
  @ConfigAttribute(type = String.class)
  String SECURITY_CLIENT_ACCESSOR_PP_NAME = SECURITY_CLIENT_ACCESSOR_PP;

  /**
   * The default client post-operation {@link ConfigurationProperties#SECURITY_CLIENT_ACCESSOR_PP}
   * method name.
   * <p>
   * Actual value of this is fully qualified <code>"method name"</code>.
   */
  String DEFAULT_SECURITY_CLIENT_ACCESSOR_PP = "";

  /**
   * Get the current log-level for {@link ConfigurationProperties#SECURITY_LOG_LEVEL}.
   *
   * @return the current security log-level
   */
  @Override
  @ConfigAttributeGetter(name = SECURITY_LOG_LEVEL)
  int getSecurityLogLevel();

  /**
   * Set the log-level for {@link ConfigurationProperties#SECURITY_LOG_LEVEL}.
   *
   * @param level the new security log-level
   */
  @ConfigAttributeSetter(name = SECURITY_LOG_LEVEL)
  void setSecurityLogLevel(int level);

  /**
   * The name of {@link ConfigurationProperties#SECURITY_LOG_LEVEL} property that sets the log-level
   * for security logger obtained using {@link DistributedSystem#getSecurityLogWriter()}
   */
  // type is String because the config file "config", "debug", "fine" etc, but the setter getter
  // accepts int
  @ConfigAttribute(type = String.class)
  String SECURITY_LOG_LEVEL_NAME = SECURITY_LOG_LEVEL;

  /**
   * Returns the value of the {@link ConfigurationProperties#SECURITY_LOG_FILE} property
   *
   * @return <code>null</code> if logging information goes to standard out
   */
  @Override
  @ConfigAttributeGetter(name = SECURITY_LOG_FILE)
  File getSecurityLogFile();

  /**
   * Sets the system's {@link ConfigurationProperties#SECURITY_LOG_FILE} containing security related
   * messages.
   * <p>
   * Non-absolute log files are relative to the system directory.
   * <p>
   * The security log file can not be changed while the system is running.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   */
  @ConfigAttributeSetter(name = SECURITY_LOG_FILE)
  void setSecurityLogFile(File value);

  /**
   * The name of the {@link ConfigurationProperties#SECURITY_LOG_FILE} property. This property is
   * the path of the file where security related messages are logged.
   */
  @ConfigAttribute(type = File.class)
  String SECURITY_LOG_FILE_NAME = SECURITY_LOG_FILE;

  /**
   * The default {@link ConfigurationProperties#SECURITY_LOG_FILE}.
   * <p>
   * *
   * <p>
   * Actual value of this constant is <code>""</code> which directs security log messages to the
   * same place as the system log file.
   */
  File DEFAULT_SECURITY_LOG_FILE = new File("");

  /**
   * Get timeout for peer membership check when security is enabled.
   *
   * @return Timeout in milliseconds.
   */
  @ConfigAttributeGetter(name = SECURITY_PEER_VERIFY_MEMBER_TIMEOUT)
  int getSecurityPeerMembershipTimeout();

  /**
   * Set timeout for peer membership check when security is enabled. The timeout must be less than
   * peer handshake timeout.
   *
   */
  @ConfigAttributeSetter(name = SECURITY_PEER_VERIFY_MEMBER_TIMEOUT)
  void setSecurityPeerMembershipTimeout(int attValue);

  /**
   * The default peer membership check timeout is 1 second.
   */
  int DEFAULT_SECURITY_PEER_VERIFYMEMBER_TIMEOUT = 1000;

  /**
   * Max membership timeout must be less than max peer handshake timeout. Currently this is set to
   * default handshake timeout of 60 seconds.
   */
  int MAX_SECURITY_PEER_VERIFYMEMBER_TIMEOUT = 60000;

  /**
   * The name of the peer membership check timeout property
   */
  @ConfigAttribute(type = Integer.class, min = 0, max = MAX_SECURITY_PEER_VERIFYMEMBER_TIMEOUT)
  String SECURITY_PEER_VERIFYMEMBER_TIMEOUT_NAME = SECURITY_PEER_VERIFY_MEMBER_TIMEOUT;

  /**
   * Returns all properties starting with {@link ConfigurationProperties#SECURITY_PREFIX}
   */
  Properties getSecurityProps();

  /**
   * Returns the value of security property {@link ConfigurationProperties#SECURITY_PREFIX} for an
   * exact attribute name match.
   */
  String getSecurity(String attName);

  /**
   * Sets the value of the {@link ConfigurationProperties#SECURITY_PREFIX} property.
   */
  void setSecurity(String attName, String attValue);

  String SECURITY_PREFIX_NAME = SECURITY_PREFIX;

  /**
   * Sets the value for
   * {@link ConfigurationProperties#SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS}
   */
  @ConfigAttributeSetter(name = SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS)
  void setSecurityAuthTokenEnabledComponents(String[] newValue);

  /**
   * Returns the value of
   * {@link ConfigurationProperties#SSECURITY_AUTH_TOKEN_ENABLED_COMPONENTS} property
   */
  @ConfigAttributeGetter(name = SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS)
  String[] getSecurityAuthTokenEnabledComponents();

  /**
   * the name of the {@link ConfigurationProperties#SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS}
   * property
   */
  @ConfigAttribute(type = String[].class)
  String SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS_NAME =
      SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS;

  /**
   * The static String definition of the cluster ssl prefix <i>"cluster-ssl"</i> used in conjunction
   * with other <i>cluster-ssl-*</i> properties property <a name="cluster-ssl"/a>
   * </p>
   * <U>Description</U>: The cluster-ssl property prefix
   */
  @Deprecated
  String CLUSTER_SSL_PREFIX = "cluster-ssl";

  /**
   * For the "custom-" prefixed properties
   */
  String USERDEFINED_PREFIX_NAME = "custom-";

  /**
   * For ssl keystore and trust store properties
   */
  String SSL_SYSTEM_PROPS_NAME = "javax.net.ssl";

  String KEY_STORE_TYPE_NAME = ".keyStoreType";
  String KEY_STORE_NAME = ".keyStore";
  String KEY_STORE_PASSWORD_NAME = ".keyStorePassword";
  String TRUST_STORE_NAME = ".trustStore";
  String TRUST_STORE_PASSWORD_NAME = ".trustStorePassword";

  /**
   * Suffix for ssl keystore and trust store properties for JMX
   */
  String JMX_SSL_PROPS_SUFFIX = "-jmx";

  /**
   * For security properties starting with sysprop in gfsecurity.properties file
   */
  String SYS_PROP_NAME = "sysprop-";
  /**
   * The property decides whether to remove unresponsive client from the server.
   */
  @ConfigAttribute(type = Boolean.class)
  String REMOVE_UNRESPONSIVE_CLIENT_PROP_NAME = REMOVE_UNRESPONSIVE_CLIENT;

  /**
   * The default value of remove unresponsive client is false.
   */
  boolean DEFAULT_REMOVE_UNRESPONSIVE_CLIENT = false;

  /**
   * Returns the value of the {@link ConfigurationProperties#REMOVE_UNRESPONSIVE_CLIENT} property.
   *
   * @since GemFire 6.0
   */
  @ConfigAttributeGetter(name = REMOVE_UNRESPONSIVE_CLIENT)
  boolean getRemoveUnresponsiveClient();

  /**
   * Sets the value of the {@link ConfigurationProperties#REMOVE_UNRESPONSIVE_CLIENT} property.
   *
   * @since GemFire 6.0
   */
  @ConfigAttributeSetter(name = REMOVE_UNRESPONSIVE_CLIENT)
  void setRemoveUnresponsiveClient(boolean value);

  /**
   * @since GemFire 6.3
   */
  @ConfigAttribute(type = Boolean.class)
  String DELTA_PROPAGATION_PROP_NAME = DELTA_PROPAGATION;

  boolean DEFAULT_DELTA_PROPAGATION = true;

  /**
   * Returns the value of the {@link ConfigurationProperties#DELTA_PROPAGATION} property.
   *
   * @since GemFire 6.3
   */
  @ConfigAttributeGetter(name = DELTA_PROPAGATION)
  boolean getDeltaPropagation();

  /**
   * Sets the value of the {@link ConfigurationProperties#DELTA_PROPAGATION} property.
   *
   * @since GemFire 6.3
   */
  @ConfigAttributeSetter(name = DELTA_PROPAGATION)
  void setDeltaPropagation(boolean value);

  int MIN_DISTRIBUTED_SYSTEM_ID = -1;
  int MAX_DISTRIBUTED_SYSTEM_ID = 255;
  /**
   * @since GemFire 6.6
   */
  @ConfigAttribute(type = Integer.class)
  String DISTRIBUTED_SYSTEM_ID_NAME = DISTRIBUTED_SYSTEM_ID;
  int DEFAULT_DISTRIBUTED_SYSTEM_ID = -1;

  /**
   * @since GemFire 6.6
   */
  @ConfigAttributeSetter(name = DISTRIBUTED_SYSTEM_ID)
  void setDistributedSystemId(int distributedSystemId);

  /**
   * @since GemFire 6.6
   */
  @ConfigAttributeGetter(name = DISTRIBUTED_SYSTEM_ID)
  int getDistributedSystemId();

  /**
   * @since GemFire 6.6
   */
  @ConfigAttribute(type = String.class)
  String REDUNDANCY_ZONE_NAME = REDUNDANCY_ZONE;
  String DEFAULT_REDUNDANCY_ZONE = "";

  /**
   * @since GemFire 6.6
   */
  @ConfigAttributeSetter(name = REDUNDANCY_ZONE)
  void setRedundancyZone(String redundancyZone);

  /**
   * @since GemFire 6.6
   */
  @ConfigAttributeGetter(name = REDUNDANCY_ZONE)
  String getRedundancyZone();

  /**
   * @since GemFire 6.6.2
   */
  void setSSLProperty(String attName, String attValue);

  /**
   * @since GemFire 6.6.2
   */
  Properties getSSLProperties();

  Properties getClusterSSLProperties();

  /**
   * @since GemFire 8.0
   * @deprecated Geode 1.0 use {@link #getClusterSSLProperties()}
   */
  Properties getJmxSSLProperties();

  /**
   * @since GemFire 6.6
   */
  @ConfigAttribute(type = Boolean.class)
  String ENFORCE_UNIQUE_HOST_NAME = ENFORCE_UNIQUE_HOST;
  /**
   * Using the system property to set the default here to retain backwards compatibility with
   * customers that are already using this system property.
   */
  boolean DEFAULT_ENFORCE_UNIQUE_HOST =
      Boolean.getBoolean(DistributionConfig.GEMFIRE_PREFIX + "EnforceUniqueHostStorageAllocation");

  @ConfigAttributeSetter(name = ENFORCE_UNIQUE_HOST)
  void setEnforceUniqueHost(boolean enforceUniqueHost);

  @ConfigAttributeGetter(name = ENFORCE_UNIQUE_HOST)
  boolean getEnforceUniqueHost();

  Properties getUserDefinedProps();

  /**
   * Returns the value of the {@link ConfigurationProperties#GROUPS} property
   * <p>
   * The default value is: {@link #DEFAULT_GROUPS}.
   *
   * @return the value of the property
   *
   * @since GemFire 7.0
   */
  @ConfigAttributeGetter(name = GROUPS)
  String getGroups();

  /**
   * Sets the {@link ConfigurationProperties#GROUPS} property.
   * <p>
   * The groups can not be changed while the system is running.
   *
   * @throws IllegalArgumentException if the specified value is not acceptable.
   * @throws UnmodifiableException if this attribute can not be modified.
   * @throws GemFireIOException if the set failure is caused by an error when
   *         writing to the system's configuration file.
   * @since GemFire 7.0
   */
  @ConfigAttributeSetter(name = GROUPS)
  void setGroups(String value);

  /**
   * The name of the {@link ConfigurationProperties#GROUPS} property
   *
   * @since GemFire 7.0
   */
  @ConfigAttribute(type = String.class)
  String GROUPS_NAME = GROUPS;
  /**
   * The default {@link ConfigurationProperties#GROUPS}.
   * <p>
   * Actual value of this constant is <code>""</code>.
   *
   * @since GemFire 7.0
   */
  String DEFAULT_GROUPS = "";

  /**
   * Any cleanup required before closing the distributed system
   */
  void close();

  @ConfigAttributeSetter(name = REMOTE_LOCATORS)
  void setRemoteLocators(String locators);

  @ConfigAttributeGetter(name = REMOTE_LOCATORS)
  String getRemoteLocators();

  /**
   * The name of the {@link ConfigurationProperties#REMOTE_LOCATORS} property
   */
  @ConfigAttribute(type = String.class)
  String REMOTE_LOCATORS_NAME = REMOTE_LOCATORS;
  /**
   * The default value of the {@link ConfigurationProperties#REMOTE_LOCATORS} property
   */
  String DEFAULT_REMOTE_LOCATORS = "";

  @ConfigAttributeGetter(name = JMX_MANAGER)
  boolean getJmxManager();

  @ConfigAttributeSetter(name = JMX_MANAGER)
  void setJmxManager(boolean value);

  @ConfigAttribute(type = Boolean.class)
  String JMX_MANAGER_NAME = JMX_MANAGER;
  boolean DEFAULT_JMX_MANAGER = false;

  @ConfigAttributeGetter(name = JMX_MANAGER_START)
  boolean getJmxManagerStart();

  @ConfigAttributeSetter(name = JMX_MANAGER_START)
  void setJmxManagerStart(boolean value);

  @ConfigAttribute(type = Boolean.class)
  String JMX_MANAGER_START_NAME = JMX_MANAGER_START;
  boolean DEFAULT_JMX_MANAGER_START = false;

  @ConfigAttributeGetter(name = JMX_MANAGER_PORT)
  int getJmxManagerPort();

  @ConfigAttributeSetter(name = JMX_MANAGER_PORT)
  void setJmxManagerPort(int value);

  @ConfigAttribute(type = Integer.class, min = 0, max = 65535)
  String JMX_MANAGER_PORT_NAME = JMX_MANAGER_PORT;

  int DEFAULT_JMX_MANAGER_PORT = 1099;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLEnabled()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_ENABLED)
  boolean getJmxManagerSSLEnabled();

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_ENABLED} state.
   * <p>
   * Actual value of this constant is <code>false</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_ENABLED}
   */
  @Deprecated
  boolean DEFAULT_JMX_MANAGER_SSL_ENABLED = false;

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_ENABLED} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_ENABLED}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String JMX_MANAGER_SSL_ENABLED_NAME = JMX_MANAGER_SSL_ENABLED;

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLEnabled(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_ENABLED)
  void setJmxManagerSSLEnabled(boolean enabled);

  /**
   * Returns the value of the {@link ConfigurationProperties#OFF_HEAP_MEMORY_SIZE} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = OFF_HEAP_MEMORY_SIZE)
  String getOffHeapMemorySize();

  /**
   * Sets the value of the {@link ConfigurationProperties#OFF_HEAP_MEMORY_SIZE} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = OFF_HEAP_MEMORY_SIZE)
  void setOffHeapMemorySize(String value);

  /**
   * The name of the {@link ConfigurationProperties#OFF_HEAP_MEMORY_SIZE} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String OFF_HEAP_MEMORY_SIZE_NAME = OFF_HEAP_MEMORY_SIZE;
  /**
   * The default {@link ConfigurationProperties#OFF_HEAP_MEMORY_SIZE} value of <code>""</code>.
   *
   * @since Geode 1.0
   */
  String DEFAULT_OFF_HEAP_MEMORY_SIZE = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLProtocols()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_PROTOCOLS)
  String getJmxManagerSSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLProtocols(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_PROTOCOLS)
  void setJmxManagerSSLProtocols(String protocols);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_PROTOCOLS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_PROTOCOLS}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_PROTOCOLS = "any";
  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_PROTOCOLS} property The name of
   * the {@link ConfigurationProperties#JMX_MANAGER_SSL_PROTOCOLS}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_PROTOCOLS_NAME = JMX_MANAGER_SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLCiphers()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_CIPHERS)
  String getJmxManagerSSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLCiphers(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_CIPHERS)
  void setJmxManagerSSLCiphers(String ciphers);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_CIPHERS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_CIPHERS}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_CIPHERS = "any";
  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_CIPHERS} property The name of
   * the {@link ConfigurationProperties#JMX_MANAGER_SSL_CIPHERS}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_CIPHERS_NAME = JMX_MANAGER_SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLRequireAuthentication()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION)
  boolean getJmxManagerSSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLRequireAuthentication(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION)
  void setJmxManagerSSLRequireAuthentication(boolean enabled);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION} value.
   * <p>
   * Actual value of this constant is <code>true</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  boolean DEFAULT_JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION = true;
  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION} property
   * The name of the
   * {@link ConfigurationProperties#JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION_NAME = JMX_MANAGER_SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_KEYSTORE)
  String getJmxManagerSSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_KEYSTORE)
  void setJmxManagerSSLKeyStore(String keyStore);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_KEYSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE} property The name of
   * the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_KEYSTORE_NAME = JMX_MANAGER_SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_TYPE}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStoreType()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_KEYSTORE_TYPE)
  String getJmxManagerSSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStoreType(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_KEYSTORE_TYPE)
  void setJmxManagerSSLKeyStoreType(String keyStoreType);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_TYPE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_KEYSTORE_TYPE = "";

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_TYPE} property The name
   * of the
   * {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_TYPE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_KEYSTORE_TYPE_NAME = JMX_MANAGER_SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_KEYSTORE_PASSWORD)
  String getJmxManagerSSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_KEYSTORE_PASSWORD)
  void setJmxManagerSSLKeyStorePassword(String keyStorePassword);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_KEYSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_PASSWORD} property The
   * name of the
   * {@link ConfigurationProperties#JMX_MANAGER_SSL_KEYSTORE_PASSWORD}
   * propery
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_KEYSTORE_PASSWORD_NAME = JMX_MANAGER_SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_TRUSTSTORE)
  String getJmxManagerSSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_TRUSTSTORE)
  void setJmxManagerSSLTrustStore(String trustStore);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_TRUSTSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE} property The name of
   * the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE}
   */
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_TRUSTSTORE_NAME = JMX_MANAGER_SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD)
  String getJmxManagerSSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD)
  void setJmxManagerSSLTrustStorePassword(String trusStorePassword);

  /**
   * The default {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD} property
   * The name of the
   * {@link ConfigurationProperties#JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD_NAME = JMX_MANAGER_SSL_TRUSTSTORE_PASSWORD;

  @ConfigAttributeGetter(name = JMX_MANAGER_BIND_ADDRESS)
  String getJmxManagerBindAddress();

  @ConfigAttributeSetter(name = JMX_MANAGER_BIND_ADDRESS)
  void setJmxManagerBindAddress(String value);

  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_BIND_ADDRESS_NAME = JMX_MANAGER_BIND_ADDRESS;
  String DEFAULT_JMX_MANAGER_BIND_ADDRESS = "";

  @ConfigAttributeGetter(name = JMX_MANAGER_HOSTNAME_FOR_CLIENTS)
  String getJmxManagerHostnameForClients();

  @ConfigAttributeSetter(name = JMX_MANAGER_HOSTNAME_FOR_CLIENTS)
  void setJmxManagerHostnameForClients(String value);

  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_HOSTNAME_FOR_CLIENTS_NAME = JMX_MANAGER_HOSTNAME_FOR_CLIENTS;
  String DEFAULT_JMX_MANAGER_HOSTNAME_FOR_CLIENTS = "";

  @ConfigAttributeGetter(name = JMX_MANAGER_PASSWORD_FILE)
  String getJmxManagerPasswordFile();

  @ConfigAttributeSetter(name = JMX_MANAGER_PASSWORD_FILE)
  void setJmxManagerPasswordFile(String value);

  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_PASSWORD_FILE_NAME = JMX_MANAGER_PASSWORD_FILE;
  String DEFAULT_JMX_MANAGER_PASSWORD_FILE = "";

  @ConfigAttributeGetter(name = JMX_MANAGER_ACCESS_FILE)
  String getJmxManagerAccessFile();

  @ConfigAttributeSetter(name = JMX_MANAGER_ACCESS_FILE)
  void setJmxManagerAccessFile(String value);

  @ConfigAttribute(type = String.class)
  String JMX_MANAGER_ACCESS_FILE_NAME = JMX_MANAGER_ACCESS_FILE;
  String DEFAULT_JMX_MANAGER_ACCESS_FILE = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} property
   *
   * @deprecated as of 8.0 use {@link #getHttpServicePort()} instead.
   */
  @ConfigAttributeGetter(name = JMX_MANAGER_HTTP_PORT)
  int getJmxManagerHttpPort();

  /**
   * Set the {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} for jmx-manager.
   * <p>
   * Set the {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} for
   * jmx-manager.
   *
   * @param value the port number for jmx-manager HTTP service
   *
   * @deprecated as of 8.0 use {@link #setHttpServicePort(int)} instead.
   */
  @ConfigAttributeSetter(name = JMX_MANAGER_HTTP_PORT)
  void setJmxManagerHttpPort(int value);

  /**
   * The name of the {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} property.
   * <p>
   * The name of the
   * {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} property.
   *
   * @deprecated as of 8.0 use {{@link #HTTP_SERVICE_PORT_NAME} instead.
   */
  @ConfigAttribute(type = Integer.class, min = 0, max = 65535)
  String JMX_MANAGER_HTTP_PORT_NAME = JMX_MANAGER_HTTP_PORT;

  /**
   * The default value of the {@link ConfigurationProperties#JMX_MANAGER_HTTP_PORT} property.
   * Current value is a <code>7070</code>
   *
   * @deprecated as of 8.0 use {@link #DEFAULT_HTTP_SERVICE_PORT} instead.
   */
  int DEFAULT_JMX_MANAGER_HTTP_PORT = 7070;

  @ConfigAttributeGetter(name = JMX_MANAGER_UPDATE_RATE)
  int getJmxManagerUpdateRate();

  @ConfigAttributeSetter(name = JMX_MANAGER_UPDATE_RATE)
  void setJmxManagerUpdateRate(int value);

  int DEFAULT_JMX_MANAGER_UPDATE_RATE = 2000;
  int MIN_JMX_MANAGER_UPDATE_RATE = 1000;
  int MAX_JMX_MANAGER_UPDATE_RATE = 60000 * 5;
  @ConfigAttribute(type = Integer.class, min = MIN_JMX_MANAGER_UPDATE_RATE,
      max = MAX_JMX_MANAGER_UPDATE_RATE)
  String JMX_MANAGER_UPDATE_RATE_NAME = JMX_MANAGER_UPDATE_RATE;

  /**
   * Returns the value of the {@link ConfigurationProperties#MEMCACHED_PORT} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#MEMCACHED_PORT} property
   *
   * @return the port on which GemFireMemcachedServer should be started
   *
   * @since GemFire 7.0
   */
  @ConfigAttributeGetter(name = MEMCACHED_PORT)
  int getMemcachedPort();

  @ConfigAttributeSetter(name = MEMCACHED_PORT)
  void setMemcachedPort(int value);

  @ConfigAttribute(type = Integer.class, min = 0, max = 65535)
  String MEMCACHED_PORT_NAME = MEMCACHED_PORT;
  int DEFAULT_MEMCACHED_PORT = 0;

  /**
   * Returns the value of the {@link ConfigurationProperties#MEMCACHED_PROTOCOL} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#MEMCACHED_PROTOCOL} property
   *
   * @return the protocol for GemFireMemcachedServer
   *
   * @since GemFire 7.0
   */
  @ConfigAttributeGetter(name = MEMCACHED_PROTOCOL)
  String getMemcachedProtocol();

  @ConfigAttributeSetter(name = MEMCACHED_PROTOCOL)
  void setMemcachedProtocol(String protocol);

  @ConfigAttribute(type = String.class)
  String MEMCACHED_PROTOCOL_NAME = MEMCACHED_PROTOCOL;
  String DEFAULT_MEMCACHED_PROTOCOL = "ASCII";

  /**
   * Returns the value of the {@link ConfigurationProperties#MEMCACHED_BIND_ADDRESS} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#MEMCACHED_BIND_ADDRESS} property
   *
   * @return the bind address for GemFireMemcachedServer
   *
   * @since GemFire 7.0
   */
  @ConfigAttributeGetter(name = MEMCACHED_BIND_ADDRESS)
  String getMemcachedBindAddress();

  @ConfigAttributeSetter(name = MEMCACHED_BIND_ADDRESS)
  void setMemcachedBindAddress(String bindAddress);

  @ConfigAttribute(type = String.class)
  String MEMCACHED_BIND_ADDRESS_NAME = MEMCACHED_BIND_ADDRESS;
  String DEFAULT_MEMCACHED_BIND_ADDRESS = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#REDIS_PORT} property
   *
   * @return the port on which GeodeRedisServer should be started
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeGetter(name = REDIS_PORT)
  int getRedisPort();

  @ConfigAttributeSetter(name = REDIS_PORT)
  void setRedisPort(int value);

  @ConfigAttribute(type = Integer.class, min = 0, max = 65535)
  String REDIS_PORT_NAME = REDIS_PORT;
  int DEFAULT_REDIS_PORT = 0;

  /**
   * Returns the value of the {@link ConfigurationProperties#REDIS_BIND_ADDRESS} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#REDIS_BIND_ADDRESS} property
   *
   * @return the bind address for GemFireRedisServer
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeGetter(name = REDIS_BIND_ADDRESS)
  String getRedisBindAddress();

  @ConfigAttributeSetter(name = REDIS_BIND_ADDRESS)
  void setRedisBindAddress(String bindAddress);

  @ConfigAttribute(type = String.class)
  String REDIS_BIND_ADDRESS_NAME = REDIS_BIND_ADDRESS;
  String DEFAULT_REDIS_BIND_ADDRESS = "";

  /**
   * Returns the value of the {@link ConfigurationProperties#REDIS_PASSWORD} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#REDIS_PASSWORD} property
   *
   * @return the authentication password for GemFireRedisServer
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeGetter(name = REDIS_PASSWORD)
  String getRedisPassword();

  @ConfigAttributeSetter(name = REDIS_PASSWORD)
  void setRedisPassword(String password);

  @ConfigAttribute(type = String.class)
  String REDIS_PASSWORD_NAME = REDIS_PASSWORD;
  String DEFAULT_REDIS_PASSWORD = "";

  // Added for the HTTP service

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_PORT} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#HTTP_SERVICE_PORT} property
   *
   * @return the HTTP service port
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeGetter(name = HTTP_SERVICE_PORT)
  int getHttpServicePort();

  /**
   * Set the {@link ConfigurationProperties#HTTP_SERVICE_PORT} for HTTP service.
   * <p>
   * Set the {@link ConfigurationProperties#HTTP_SERVICE_PORT} for HTTP
   * service.
   *
   * @param value the port number for HTTP service
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeSetter(name = HTTP_SERVICE_PORT)
  void setHttpServicePort(int value);

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_PORT} property
   * <p>
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_PORT}
   * property
   *
   * @since GemFire 8.0
   */
  @ConfigAttribute(type = Integer.class, min = 0, max = 65535)
  String HTTP_SERVICE_PORT_NAME = HTTP_SERVICE_PORT;

  /**
   * The default value of the {@link ConfigurationProperties#HTTP_SERVICE_PORT} property. Current
   * value is a <code>7070</code>
   *
   * @since GemFire 8.0
   */
  int DEFAULT_HTTP_SERVICE_PORT = 7070;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS} property
   *
   * @return the bind-address for HTTP service
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeGetter(name = HTTP_SERVICE_BIND_ADDRESS)
  String getHttpServiceBindAddress();

  /**
   * Set the {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS} for HTTP service.
   * <p>
   * Set the {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS}
   * for HTTP service.
   *
   * @param value the bind-address for HTTP service
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeSetter(name = HTTP_SERVICE_BIND_ADDRESS)
  void setHttpServiceBindAddress(String value);

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS} property
   *
   * @since GemFire 8.0
   */
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_BIND_ADDRESS_NAME = HTTP_SERVICE_BIND_ADDRESS;

  /**
   * The default value of the {@link ConfigurationProperties#HTTP_SERVICE_BIND_ADDRESS} property.
   * Current value is an empty string <code>""</code>
   *
   * @since GemFire 8.0
   */
  String DEFAULT_HTTP_SERVICE_BIND_ADDRESS = "";

  // Added for HTTP Service SSL

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLEnabled()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_ENABLED)
  boolean getHttpServiceSSLEnabled();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLEnabled(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_ENABLED)
  void setHttpServiceSSLEnabled(boolean httpServiceSSLEnabled);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_ENABLED} state.
   * <p>
   * Actual value of this constant is <code>false</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_ENABLED}
   */
  @Deprecated
  boolean DEFAULT_HTTP_SERVICE_SSL_ENABLED = false;

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_ENABLED} property The name of
   * the {@link ConfigurationProperties#HTTP_SERVICE_SSL_ENABLED}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_ENABLED}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String HTTP_SERVICE_SSL_ENABLED_NAME = HTTP_SERVICE_SSL_ENABLED;

  /**
   * Returns the value of the
   * {@link ConfigurationProperties#HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLRequireAuthentication()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION)
  boolean getHttpServiceSSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLRequireAuthentication(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION)
  void setHttpServiceSSLRequireAuthentication(boolean httpServiceSSLRequireAuthentication);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION} value.
   * <p>
   * Actual value of this constant is <code>true</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  boolean DEFAULT_HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION = false;

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION}
   * property The name of the
   * {@link ConfigurationProperties#HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION_NAME = HTTP_SERVICE_SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLProtocols()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_PROTOCOLS)
  String getHttpServiceSSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLProtocols(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_PROTOCOLS)
  void setHttpServiceSSLProtocols(String protocols);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_PROTOCOLS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_PROTOCOLS}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_PROTOCOLS = "any";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_PROTOCOLS} property The name of
   * the {@link ConfigurationProperties#HTTP_SERVICE_SSL_PROTOCOLS}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_PROTOCOLS_NAME = HTTP_SERVICE_SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLCiphers()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_CIPHERS)
  String getHttpServiceSSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLCiphers(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_CIPHERS)
  void setHttpServiceSSLCiphers(String ciphers);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_CIPHERS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_CIPHERS}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_CIPHERS = "any";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_CIPHERS} property The name of
   * the {@link ConfigurationProperties#HTTP_SERVICE_SSL_CIPHERS}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_CIPHERS_NAME = HTTP_SERVICE_SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_KEYSTORE)
  String getHttpServiceSSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_KEYSTORE)
  void setHttpServiceSSLKeyStore(String keyStore);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_KEYSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE} property The name of
   * the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_KEYSTORE_NAME = HTTP_SERVICE_SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_KEYSTORE_PASSWORD)
  String getHttpServiceSSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_KEYSTORE_PASSWORD)
  void setHttpServiceSSLKeyStorePassword(String keyStorePassword);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_KEYSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_PASSWORD} property The
   * name of the
   * {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_KEYSTORE_PASSWORD_NAME = HTTP_SERVICE_SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_TYPE}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStoreType()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_KEYSTORE_TYPE)
  String getHttpServiceSSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStoreType(String)}
   */
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_KEYSTORE_TYPE)
  void setHttpServiceSSLKeyStoreType(String keyStoreType);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_TYPE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_KEYSTORE_TYPE = "";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_TYPE} property The
   * name of the
   * {@link ConfigurationProperties#HTTP_SERVICE_SSL_KEYSTORE_TYPE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_KEYSTORE_TYPE_NAME = HTTP_SERVICE_SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_TRUSTSTORE)
  String getHttpServiceSSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_TRUSTSTORE)
  void setHttpServiceSSLTrustStore(String trustStore);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_TRUSTSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE} property The name
   * of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_TRUSTSTORE_NAME = HTTP_SERVICE_SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD)
  String getHttpServiceSSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD)
  void setHttpServiceSSLTrustStorePassword(String trustStorePassword);

  /**
   * The default {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD} property
   * The name of the
   * {@link ConfigurationProperties#HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD_NAME = HTTP_SERVICE_SSL_TRUSTSTORE_PASSWORD;

  /**
   * @deprecated Geode 1.0 use {@link #getClusterSSLProperties()}
   */
  @Deprecated
  Properties getHttpServiceSSLProperties();

  // Added for API REST

  /**
   * Returns the value of the {@link ConfigurationProperties#START_DEV_REST_API} property
   * <p>
   * Returns the value of the
   * {@link ConfigurationProperties#START_DEV_REST_API} property
   *
   * @return the value of the property
   *
   * @since GemFire 8.0
   */

  @ConfigAttributeGetter(name = START_DEV_REST_API)
  boolean getStartDevRestApi();

  /**
   * Set the {@link ConfigurationProperties#START_DEV_REST_API} for HTTP service.
   * <p>
   * Set the {@link ConfigurationProperties#START_DEV_REST_API} for
   * HTTP service.
   *
   * @param value for the property
   *
   * @since GemFire 8.0
   */
  @ConfigAttributeSetter(name = START_DEV_REST_API)
  void setStartDevRestApi(boolean value);

  /**
   * The name of the {@link ConfigurationProperties#START_DEV_REST_API} property
   * <p>
   * The name of the {@link ConfigurationProperties#START_DEV_REST_API}
   * property
   *
   * @since GemFire 8.0
   */
  @ConfigAttribute(type = Boolean.class)
  String START_DEV_REST_API_NAME = START_DEV_REST_API;

  /**
   * The default value of the {@link ConfigurationProperties#START_DEV_REST_API} property. Current
   * value is <code>"false"</code>
   *
   * @since GemFire 8.0
   */
  boolean DEFAULT_START_DEV_REST_API = false;

  /**
   * The name of the {@link ConfigurationProperties#DISABLE_AUTO_RECONNECT} property
   *
   * @since GemFire 8.0
   */
  @ConfigAttribute(type = Boolean.class)
  String DISABLE_AUTO_RECONNECT_NAME = DISABLE_AUTO_RECONNECT;

  /**
   * The default value of the {@link ConfigurationProperties#DISABLE_AUTO_RECONNECT} property
   */
  boolean DEFAULT_DISABLE_AUTO_RECONNECT = false;

  /**
   * Gets the value of {@link ConfigurationProperties#DISABLE_AUTO_RECONNECT}
   */
  @ConfigAttributeGetter(name = DISABLE_AUTO_RECONNECT)
  boolean getDisableAutoReconnect();

  /**
   * Sets the value of {@link ConfigurationProperties#DISABLE_AUTO_RECONNECT}
   *
   * @param value the new setting
   */
  @ConfigAttributeSetter(name = DISABLE_AUTO_RECONNECT)
  void setDisableAutoReconnect(boolean value);

  /**
   * @deprecated Geode 1.0 use {@link #getClusterSSLProperties()}
   */
  @Deprecated
  Properties getServerSSLProperties();

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLEnabled()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_ENABLED)
  boolean getServerSSLEnabled();

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_ENABLED} state.
   * <p>
   * Actual value of this constant is <code>false</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_ENABLED}
   */
  @Deprecated
  boolean DEFAULT_SERVER_SSL_ENABLED = false;
  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_ENABLED} property The name of the
   * {@link ConfigurationProperties#SERVER_SSL_ENABLED} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#SERVER_SSL_ENABLED}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String SERVER_SSL_ENABLED_NAME = SERVER_SSL_ENABLED;

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLEnabled(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_ENABLED)
  void setServerSSLEnabled(boolean enabled);

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLProtocols()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_PROTOCOLS)
  String getServerSSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_PROTOCOLS} property.
   */
  @ConfigAttributeSetter(name = SERVER_SSL_PROTOCOLS)
  void setServerSSLProtocols(String protocols);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_PROTOCOLS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_PROTOCOLS}
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_PROTOCOLS = "any";
  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_PROTOCOLS} property The name of the
   * {@link ConfigurationProperties#SERVER_SSL_PROTOCOLS} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_PROTOCOLS_NAME = SERVER_SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLCiphers()} 
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_CIPHERS)
  String getServerSSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLCiphers(String)} 
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_CIPHERS)
  void setServerSSLCiphers(String ciphers);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_CIPHERS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_CIPHERS} 
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_CIPHERS = "any";
  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_CIPHERS} property The name of the
   * {@link ConfigurationProperties#SERVER_SSL_CIPHERS} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} 
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_CIPHERS_NAME = SERVER_SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLRequireAuthentication()} 
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_REQUIRE_AUTHENTICATION)
  boolean getServerSSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLRequireAuthentication(boolean)} 
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_REQUIRE_AUTHENTICATION)
  void setServerSSLRequireAuthentication(boolean enabled);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_REQUIRE_AUTHENTICATION} value.
   * <p>
   * Actual value of this constant is <code>true</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  boolean DEFAULT_SERVER_SSL_REQUIRE_AUTHENTICATION = true;
  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_REQUIRE_AUTHENTICATION} property The
   * name of the
   * {@link ConfigurationProperties#SERVER_SSL_REQUIRE_AUTHENTICATION}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String SERVER_SSL_REQUIRE_AUTHENTICATION_NAME = SERVER_SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_KEYSTORE)
  String getServerSSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_KEYSTORE)
  void setServerSSLKeyStore(String keyStore);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_KEYSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE}
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_KEYSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE} property The name of the
   * {@link ConfigurationProperties#SERVER_SSL_KEYSTORE} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_KEYSTORE_NAME = SERVER_SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStoreType()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_KEYSTORE_TYPE)
  String getServerSSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStoreType(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_KEYSTORE_TYPE)
  void setServerSSLKeyStoreType(String keyStoreType);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_TYPE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_KEYSTORE_TYPE = "";

  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_TYPE} property The name of
   * the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_TYPE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_KEYSTORE_TYPE_NAME = SERVER_SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_PASSWORD} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_KEYSTORE_PASSWORD)
  String getServerSSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_PASSWORD} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_KEYSTORE_PASSWORD)
  void setServerSSLKeyStorePassword(String keyStorePassword);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_KEYSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_PASSWORD} property The name
   * of the
   * {@link ConfigurationProperties#SERVER_SSL_KEYSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_KEYSTORE_PASSWORD_NAME = SERVER_SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_TRUSTSTORE)
  String getServerSSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setServerSSLTrustStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_TRUSTSTORE)
  void setServerSSLTrustStore(String trustStore);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE}
   */
  String DEFAULT_SERVER_SSL_TRUSTSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE} property The name of the
   * {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_TRUSTSTORE_NAME = SERVER_SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = SERVER_SSL_TRUSTSTORE_PASSWORD)
  String getServerSSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE_PASSWORD} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = SERVER_SSL_TRUSTSTORE_PASSWORD)
  void setServerSSLTrustStorePassword(String trusStorePassword);

  /**
   * The default {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_SERVER_SSL_TRUSTSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE_PASSWORD} property The
   * name of the
   * {@link ConfigurationProperties#SERVER_SSL_TRUSTSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_TRUSTSTORE_PASSWORD_NAME = SERVER_SSL_TRUSTSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLEnabled()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_ENABLED)
  boolean getGatewaySSLEnabled();

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_ENABLED} state.
   * <p>
   * Actual value of this constant is <code>false</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_ENABLED}
   */
  @Deprecated
  boolean DEFAULT_GATEWAY_SSL_ENABLED = false;
  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_ENABLED} property The name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_ENABLED} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_ENABLED}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String GATEWAY_SSL_ENABLED_NAME = GATEWAY_SSL_ENABLED;

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_ENABLED} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLEnabled()}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_ENABLED)
  void setGatewaySSLEnabled(boolean enabled);

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLProtocols()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_PROTOCOLS)
  String getGatewaySSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_PROTOCOLS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_PROTOCOLS)
  void setGatewaySSLProtocols(String protocols);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_PROTOCOLS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_PROTOCOLS}
   */
  String DEFAULT_GATEWAY_SSL_PROTOCOLS = "any";
  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_PROTOCOLS} property The name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_PROTOCOLS} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_PROTOCOLS}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_PROTOCOLS_NAME = GATEWAY_SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLCiphers()} 
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_CIPHERS)
  String getGatewaySSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_CIPHERS} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLCiphers(String)} 
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_CIPHERS)
  void setGatewaySSLCiphers(String ciphers);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_CIPHERS} value.
   * <p>
   * Actual value of this constant is <code>any</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_CIPHERS} 
   */
  String DEFAULT_GATEWAY_SSL_CIPHERS = "any";
  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_CIPHERS} property The name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_CIPHERS} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_CIPHERS} 
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_CIPHERS_NAME = GATEWAY_SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLRequireAuthentication()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_REQUIRE_AUTHENTICATION)
  boolean getGatewaySSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_REQUIRE_AUTHENTICATION}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #setGatewaySSLRequireAuthentication(boolean)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_REQUIRE_AUTHENTICATION)
  void setGatewaySSLRequireAuthentication(boolean enabled);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_REQUIRE_AUTHENTICATION} value.
   * <p>
   * Actual value of this constant is <code>true</code>.
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  boolean DEFAULT_GATEWAY_SSL_REQUIRE_AUTHENTICATION = true;
  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_REQUIRE_AUTHENTICATION} property The
   * name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_REQUIRE_AUTHENTICATION}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_REQUIRE_AUTHENTICATION}
   */
  @Deprecated
  @ConfigAttribute(type = Boolean.class)
  String GATEWAY_SSL_REQUIRE_AUTHENTICATION_NAME = GATEWAY_SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_KEYSTORE)
  String getGatewaySSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_KEYSTORE)
  void setGatewaySSLKeyStore(String keyStore);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE}
   */
  @Deprecated
  String DEFAULT_GATEWAY_SSL_KEYSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE} property The name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_KEYSTORE_NAME = GATEWAY_SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStoreType()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_KEYSTORE_TYPE)
  String getGatewaySSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_TYPE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStoreType(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_KEYSTORE_TYPE)
  void setGatewaySSLKeyStoreType(String keyStoreType);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_TYPE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  String DEFAULT_GATEWAY_SSL_KEYSTORE_TYPE = "";

  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_TYPE} property The name of
   * the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_TYPE}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_TYPE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_KEYSTORE_TYPE_NAME = GATEWAY_SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLKeyStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_KEYSTORE_PASSWORD)
  String getGatewaySSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_PASSWORD} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_KEYSTORE_PASSWORD)
  void setGatewaySSLKeyStorePassword(String keyStorePassword);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_GATEWAY_SSL_KEYSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_PASSWORD} property The name
   * of the
   * {@link ConfigurationProperties#GATEWAY_SSL_KEYSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_KEYSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_KEYSTORE_PASSWORD_NAME = GATEWAY_SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStore()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_TRUSTSTORE)
  String getGatewaySSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLTrustStore(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_TRUSTSTORE)
  void setGatewaySSLTrustStore(String trustStore);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE}
   */
  @Deprecated
  String DEFAULT_GATEWAY_SSL_TRUSTSTORE = "";

  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE} property The name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE} property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_TRUSTSTORE_NAME = GATEWAY_SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE_PASSWORD}
   * property.
   *
   * @deprecated Geode 1.0 use {@link #getClusterSSLTrustStorePassword()}
   */
  @Deprecated
  @ConfigAttributeGetter(name = GATEWAY_SSL_TRUSTSTORE_PASSWORD)
  String getGatewaySSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE_PASSWORD} property.
   *
   * @deprecated Geode 1.0 use {@link #setClusterSSLKeyStorePassword(String)}
   */
  @Deprecated
  @ConfigAttributeSetter(name = GATEWAY_SSL_TRUSTSTORE_PASSWORD)
  void setGatewaySSLTrustStorePassword(String trusStorePassword);

  /**
   * The default {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE_PASSWORD} value.
   * <p>
   * Actual value of this constant is "".
   *
   * @deprecated Geode 1.0 use {@link #DEFAULT_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  String DEFAULT_GATEWAY_SSL_TRUSTSTORE_PASSWORD = "";

  /**
   * The name of the {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE_PASSWORD} property The
   * name of the
   * {@link ConfigurationProperties#GATEWAY_SSL_TRUSTSTORE_PASSWORD}
   * property
   *
   * @deprecated Geode 1.0 use
   *             {@link ConfigurationProperties#CLUSTER_SSL_TRUSTSTORE_PASSWORD}
   */
  @Deprecated
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_TRUSTSTORE_PASSWORD_NAME = GATEWAY_SSL_TRUSTSTORE_PASSWORD;

  /**
   * @deprecated Geode 1.0 use {@link #getClusterSSLProperties()}
   */
  @Deprecated
  Properties getGatewaySSLProperties();

  ConfigSource getConfigSource(String attName);

  /**
   * The name of the {@link ConfigurationProperties#LOCK_MEMORY} property. Used to cause pages to be
   * locked into memory, thereby preventing them from being swapped to disk.
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = Boolean.class)
  String LOCK_MEMORY_NAME = LOCK_MEMORY;
  boolean DEFAULT_LOCK_MEMORY = false;

  /**
   * Gets the value of {@link ConfigurationProperties#LOCK_MEMORY}
   * <p>
   * Gets the value of {@link ConfigurationProperties#LOCK_MEMORY}
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = LOCK_MEMORY)
  boolean getLockMemory();

  /**
   * Set the value of {@link ConfigurationProperties#LOCK_MEMORY}
   *
   * @param value the new setting
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = LOCK_MEMORY)
  void setLockMemory(boolean value);

  @ConfigAttribute(type = String.class)
  String SECURITY_SHIRO_INIT_NAME = SECURITY_SHIRO_INIT;

  @ConfigAttributeSetter(name = SECURITY_SHIRO_INIT)
  void setShiroInit(String value);

  @ConfigAttributeGetter(name = SECURITY_SHIRO_INIT)
  String getShiroInit();


  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_CLUSTER_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_CLUSTER_ALIAS)
  String getClusterSSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_CLUSTER_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_CLUSTER_ALIAS)
  void setClusterSSLAlias(String alias);

  /**
   * The Default Cluster SSL alias
   *
   * @since Geode 1.0
   */
  String DEFAULT_SSL_ALIAS = "";

  /**
   * The name of the {@link ConfigurationProperties#SSL_CLUSTER_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String CLUSTER_SSL_ALIAS_NAME = SSL_CLUSTER_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_LOCATOR_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_LOCATOR_ALIAS)
  String getLocatorSSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_LOCATOR_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_LOCATOR_ALIAS)
  void setLocatorSSLAlias(String alias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_LOCATOR_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String LOCATOR_SSL_ALIAS_NAME = SSL_LOCATOR_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_GATEWAY_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_GATEWAY_ALIAS)
  String getGatewaySSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_GATEWAY_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_GATEWAY_ALIAS)
  void setGatewaySSLAlias(String alias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_GATEWAY_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String GATEWAY_SSL_ALIAS_NAME = SSL_GATEWAY_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_CLUSTER_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_WEB_ALIAS)
  String getHTTPServiceSSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_WEB_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_WEB_ALIAS)
  void setHTTPServiceSSLAlias(String alias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_WEB_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String HTTP_SERVICE_SSL_ALIAS_NAME = SSL_WEB_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_JMX_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_JMX_ALIAS)
  String getJMXSSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_JMX_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_JMX_ALIAS)
  void setJMXSSLAlias(String alias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_JMX_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String JMX_SSL_ALIAS_NAME = SSL_JMX_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_SERVER_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_SERVER_ALIAS)
  String getServerSSLAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_SERVER_ALIAS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_SERVER_ALIAS)
  void setServerSSLAlias(String alias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_SERVER_ALIAS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = String.class)
  String SERVER_SSL_ALIAS_NAME = SSL_SERVER_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_ENDPOINT_IDENTIFICATION_ENABLED}
   * property.
   */
  @ConfigAttributeGetter(name = SSL_ENDPOINT_IDENTIFICATION_ENABLED)
  boolean getSSLEndPointIdentificationEnabled();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_ENDPOINT_IDENTIFICATION_ENABLED}
   * property.
   */
  @ConfigAttributeSetter(name = SSL_ENDPOINT_IDENTIFICATION_ENABLED)
  void setSSLEndPointIdentificationEnabled(boolean enabled);

  /**
   * The name of the {@link ConfigurationProperties#SSL_ENDPOINT_IDENTIFICATION_ENABLED} property
   */
  @ConfigAttribute(type = Boolean.class)
  String SSL_ENDPOINT_IDENTIFICATION_ENABLED_NAME = SSL_ENDPOINT_IDENTIFICATION_ENABLED;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_ENABLED_COMPONENTS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeGetter(name = SSL_ENABLED_COMPONENTS)
  SecurableCommunicationChannel[] getSecurableCommunicationChannels();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_ENABLED_COMPONENTS} property.
   *
   * @since Geode 1.0
   */
  @ConfigAttributeSetter(name = SSL_ENABLED_COMPONENTS)
  void setSecurableCommunicationChannels(SecurableCommunicationChannel[] sslEnabledComponents);

  /**
   * The name of the {@link ConfigurationProperties#SSL_ENABLED_COMPONENTS} property
   *
   * @since Geode 1.0
   */
  @ConfigAttribute(type = SecurableCommunicationChannel[].class)
  String SSL_ENABLED_COMPONENTS_NAME = SSL_ENABLED_COMPONENTS;

  /**
   * The default ssl enabled components
   *
   * @since Geode 1.0
   */
  @Immutable
  SecurableCommunicationChannel[] DEFAULT_SSL_ENABLED_COMPONENTS =
      new SecurableCommunicationChannel[] {};

  @Immutable
  String[] DEFAULT_SECURITY_AUTH_TOKEN_ENABLED_COMPONENTS = new String[0];

  boolean DEFAULT_SSL_USE_DEFAULT_CONTEXT = false;

  @ConfigAttribute(type = Boolean.class)
  String SSL_USE_DEFAULT_CONTEXT_NAME = SSL_USE_DEFAULT_CONTEXT;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_USE_DEFAULT_CONTEXT} property.
   */
  @ConfigAttributeGetter(name = SSL_USE_DEFAULT_CONTEXT)
  boolean getSSLUseDefaultContext();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_USE_DEFAULT_CONTEXT} property.
   */
  @ConfigAttributeSetter(name = SSL_USE_DEFAULT_CONTEXT)
  void setSSLUseDefaultContext(boolean defaultContext);

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_PROTOCOLS} property.
   */
  @ConfigAttributeGetter(name = SSL_PROTOCOLS)
  String getSSLProtocols();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_PROTOCOLS} property.
   */
  @ConfigAttributeSetter(name = SSL_PROTOCOLS)
  void setSSLProtocols(String protocols);

  /**
   * The name of the {@link ConfigurationProperties#SSL_PROTOCOLS} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_PROTOCOLS_NAME = SSL_PROTOCOLS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_CIPHERS} property.
   */
  @ConfigAttributeGetter(name = SSL_CIPHERS)
  String getSSLCiphers();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_CIPHERS} property.
   */
  @ConfigAttributeSetter(name = SSL_CIPHERS)
  void setSSLCiphers(String ciphers);

  /**
   * The name of the {@link ConfigurationProperties#SSL_CIPHERS} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_CIPHERS_NAME = SSL_CIPHERS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_REQUIRE_AUTHENTICATION} property.
   */
  @ConfigAttributeGetter(name = SSL_REQUIRE_AUTHENTICATION)
  boolean getSSLRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_REQUIRE_AUTHENTICATION} property.
   */
  @ConfigAttributeSetter(name = SSL_REQUIRE_AUTHENTICATION)
  void setSSLRequireAuthentication(boolean enabled);

  /**
   * The name of the {@link ConfigurationProperties#SSL_REQUIRE_AUTHENTICATION} property
   */
  @ConfigAttribute(type = Boolean.class)
  String SSL_REQUIRE_AUTHENTICATION_NAME = SSL_REQUIRE_AUTHENTICATION;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_KEYSTORE} property.
   */
  @ConfigAttributeGetter(name = SSL_KEYSTORE)
  String getSSLKeyStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_KEYSTORE} property.
   */
  @ConfigAttributeSetter(name = SSL_KEYSTORE)
  void setSSLKeyStore(String keyStore);

  /**
   * The name of the {@link ConfigurationProperties#SSL_KEYSTORE} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_KEYSTORE_NAME = SSL_KEYSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_KEYSTORE_TYPE} property.
   */
  @ConfigAttributeGetter(name = SSL_KEYSTORE_TYPE)
  String getSSLKeyStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_KEYSTORE_TYPE} property.
   */
  @ConfigAttributeSetter(name = SSL_KEYSTORE_TYPE)
  void setSSLKeyStoreType(String keyStoreType);

  /**
   * The name of the {@link ConfigurationProperties#SSL_KEYSTORE_TYPE} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_KEYSTORE_TYPE_NAME = SSL_KEYSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_KEYSTORE_PASSWORD} property.
   */
  @ConfigAttributeGetter(name = SSL_KEYSTORE_PASSWORD)
  String getSSLKeyStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_KEYSTORE_PASSWORD} property.
   */
  @ConfigAttributeSetter(name = SSL_KEYSTORE_PASSWORD)
  void setSSLKeyStorePassword(String keyStorePassword);

  /**
   * The name of the {@link ConfigurationProperties#SSL_KEYSTORE_PASSWORD} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_KEYSTORE_PASSWORD_NAME = SSL_KEYSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE} property.
   */
  @ConfigAttributeGetter(name = SSL_TRUSTSTORE)
  String getSSLTrustStore();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE} property.
   */
  @ConfigAttributeSetter(name = SSL_TRUSTSTORE)
  void setSSLTrustStore(String trustStore);

  /**
   * The name of the {@link ConfigurationProperties#SSL_TRUSTSTORE} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_TRUSTSTORE_NAME = SSL_TRUSTSTORE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_DEFAULT_ALIAS} property.
   */
  @ConfigAttributeGetter(name = SSL_DEFAULT_ALIAS)
  String getSSLDefaultAlias();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_DEFAULT_ALIAS} property.
   */
  @ConfigAttributeSetter(name = SSL_DEFAULT_ALIAS)
  void setSSLDefaultAlias(String sslDefaultAlias);

  /**
   * The name of the {@link ConfigurationProperties#SSL_DEFAULT_ALIAS} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_DEFAULT_ALIAS_NAME = SSL_DEFAULT_ALIAS;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE_PASSWORD} property.
   */
  @ConfigAttributeGetter(name = SSL_TRUSTSTORE_PASSWORD)
  String getSSLTrustStorePassword();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE_PASSWORD} property.
   */
  @ConfigAttributeSetter(name = SSL_TRUSTSTORE_PASSWORD)
  void setSSLTrustStorePassword(String trustStorePassword);

  /**
   * The name of the {@link ConfigurationProperties#SSL_TRUSTSTORE_PASSWORD} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_TRUSTSTORE_PASSWORD_NAME = SSL_TRUSTSTORE_PASSWORD;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE_TYPE} property.
   */
  @ConfigAttributeGetter(name = SSL_TRUSTSTORE_TYPE)
  String getSSLTrustStoreType();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_TRUSTSTORE_TYPE} property.
   */
  @ConfigAttributeSetter(name = SSL_TRUSTSTORE_TYPE)
  void setSSLTrustStoreType(String trustStoreType);


  /**
   * The name of the {@link ConfigurationProperties#SSL_TRUSTSTORE_TYPE} property
   */
  @ConfigAttribute(type = String.class)
  String SSL_TRUSTSTORE_TYPE_NAME = SSL_TRUSTSTORE_TYPE;

  /**
   * Returns the value of the {@link ConfigurationProperties#SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION}
   * property.
   */
  @ConfigAttributeGetter(name = SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION)
  boolean getSSLWebRequireAuthentication();

  /**
   * Sets the value of the {@link ConfigurationProperties#SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION}
   * property.
   */
  @ConfigAttributeSetter(name = SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION)
  void setSSLWebRequireAuthentication(boolean requiresAuthentication);

  /**
   * The name of the {@link ConfigurationProperties#SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION} property
   */
  @ConfigAttribute(type = Boolean.class)
  String SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION_NAME = SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION;

  /**
   * The default value for http service ssl mutual authentication
   */
  boolean DEFAULT_SSL_WEB_SERVICE_REQUIRE_AUTHENTICATION = false;

  /**
   * Returns the value of the {@link ConfigurationProperties#VALIDATE_SERIALIZABLE_OBJECTS} property
   */
  @ConfigAttributeGetter(name = VALIDATE_SERIALIZABLE_OBJECTS)
  boolean getValidateSerializableObjects();

  /**
   * Sets the value of the {@link ConfigurationProperties#VALIDATE_SERIALIZABLE_OBJECTS} property
   */
  @ConfigAttributeSetter(name = VALIDATE_SERIALIZABLE_OBJECTS)
  void setValidateSerializableObjects(boolean value);

  /**
   * The name of the {@link ConfigurationProperties#VALIDATE_SERIALIZABLE_OBJECTS} property
   */
  @ConfigAttribute(type = Boolean.class)
  String VALIDATE_SERIALIZABLE_OBJECTS_NAME = VALIDATE_SERIALIZABLE_OBJECTS;

  /**
   * The default value of the {@link ConfigurationProperties#VALIDATE_SERIALIZABLE_OBJECTS}
   * property.
   */
  boolean DEFAULT_VALIDATE_SERIALIZABLE_OBJECTS = false;

  /**
   * Returns the value of the {@link ConfigurationProperties#SERIALIZABLE_OBJECT_FILTER} property
   */
  @ConfigAttributeGetter(name = SERIALIZABLE_OBJECT_FILTER)
  String getSerializableObjectFilter();

  /**
   * Sets the value of the {@link ConfigurationProperties#SERIALIZABLE_OBJECT_FILTER} property
   */
  @ConfigAttributeSetter(name = SERIALIZABLE_OBJECT_FILTER)
  void setSerializableObjectFilter(String value);

  /**
   * The name of the {@link ConfigurationProperties#SERIALIZABLE_OBJECT_FILTER} property
   */
  @ConfigAttribute(type = String.class)
  String SERIALIZABLE_OBJECT_FILTER_NAME = SERIALIZABLE_OBJECT_FILTER;

  /**
   * The default value of the {@link ConfigurationProperties#SERIALIZABLE_OBJECT_FILTER} property.
   * Current value is a pattern for rejecting everything <code>"!*"</code>
   */
  String DEFAULT_SERIALIZABLE_OBJECT_FILTER = "!*";

  /**
   * Returns true if locators and mcast-port are not configured.
   */
  @Override
  boolean isLoner();

  // *************** Initializers to gather all the annotations in this class
  // ************************

  @MakeImmutable
  Map<String, ConfigAttribute> attributes = new HashMap<>();
  @MakeImmutable
  Map<String, Method> setters = new HashMap<>();
  @MakeImmutable
  Map<String, Method> getters = new HashMap<>();
  @MakeImmutable
  String[] dcValidAttributeNames = init();

  static String[] init() {
    List<String> atts = new ArrayList<>();
    for (Field field : DistributionConfig.class.getDeclaredFields()) {
      if (field.isAnnotationPresent(ConfigAttribute.class)) {
        try {
          atts.add((String) field.get(null));
          attributes.put((String) field.get(null), field.getAnnotation(ConfigAttribute.class));
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        }
      }
    }

    for (Method method : DistributionConfig.class.getDeclaredMethods()) {
      if (method.isAnnotationPresent(ConfigAttributeGetter.class)) {
        ConfigAttributeGetter getter = method.getAnnotation(ConfigAttributeGetter.class);
        getters.put(getter.name(), method);
      } else if (method.isAnnotationPresent(ConfigAttributeSetter.class)) {
        ConfigAttributeSetter setter = method.getAnnotation(ConfigAttributeSetter.class);
        setters.put(setter.name(), method);
      }
    }
    Collections.sort(atts);
    return atts.toArray(new String[0]);
  }
}
