/*
 *   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.directory.server.config;


/**
 * Constants defined for the elements of config schema
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public enum ConfigSchemaConstants
{
    //------------------------------------------------------------------------------------
    // The ObjectClasses
    //------------------------------------------------------------------------------------
    ADS_BASE_OC("ads-base", "1.3.6.1.4.1.18060.0.4.1.3.0"),

    ADS_TRANSPORT_OC("ads-transport", "1.3.6.1.4.1.18060.0.4.1.3.18"),

    ADS_TCP_TRANSPORT_OC("ads-tcpTransport", "1.3.6.1.4.1.18060.0.4.1.3.19"),

    ADS_UDP_TRANSPORT_OC("ads-udpTransport", "1.3.6.1.4.1.18060.0.4.1.3.20"),

    ADS_DIRECTORY_SERVICE_OC("ads-directoryService", "1.3.6.1.4.1.18060.0.4.1.3.100"),

    ADS_CHANGE_LOG_OC("ads-changeLog", "1.3.6.1.4.1.18060.0.4.1.3.120"),

    ADS_INTERCEPTOR_OC("ads-interceptor", "1.3.6.1.4.1.18060.0.4.1.3.130"),

    ADS_AUTHENTICATION_INTERCEPTOR_OC("ads-authenticationInterceptor", "1.3.6.1.4.1.18060.0.4.1.3.131"),

    ADS_JOURNAL_OC("ads-journal", "1.3.6.1.4.1.18060.0.4.1.3.140"),

    ADS_PARTITION_OC("ads-partition", "1.3.6.1.4.1.18060.0.4.1.3.150"),

    ADS_JDBM_PARTITION_OC("ads-jdbmPartition", "1.3.6.1.4.1.18060.0.4.1.3.151"),

    ADS_INDEX_OC("ads-index", "1.3.6.1.4.1.18060.0.4.1.3.160"),

    ADS_JDBM_INDEX_OC("ads-jdbmIndex", "1.3.6.1.4.1.18060.0.4.1.3.161"),

    ADS_SERVER_OC("ads-server", "1.3.6.1.4.1.18060.0.4.1.3.250"),

    ADS_DS_BASED_SERVER_OC("ads-dsBasedServer", "1.3.6.1.4.1.18060.0.4.1.3.260"),

    ADS_LDAP_SERVER_OC("ads-ldapServer", "1.3.6.1.4.1.18060.0.4.1.3.300"),

    ADS_KERBEROS_SERVER_OC("ads-kdcServer", "1.3.6.1.4.1.18060.0.4.1.3.400"),

    ADS_DNS_SERVER_OC("ads-dnsServer", "1.3.6.1.4.1.18060.0.4.1.3.500"),

    ADS_DHCP_SERVER_OC("ads-dhcpServer", "1.3.6.1.4.1.18060.0.4.1.3.600"),

    ADS_NTP_SERVER_OC("ads-ntpServer", "1.3.6.1.4.1.18060.0.4.1.3.700"),

    ADS_CHANGE_PASSWORD_SERVER_OC("ads-changePasswordServer", "1.3.6.1.4.1.18060.0.4.1.3.800"),

    ADS_SASL_MECH_HANDLER_OC("ads-saslMechHandler", "1.3.6.1.4.1.18060.0.4.1.3.801"),

    ADS_EXTENDED_OP_HANDLER_OC("ads-extendedOpHandler", "1.3.6.1.4.1.18060.0.4.1.3.802"),

    ADS_HTTP_WEB_APP_OC("ads-httpWebApp", "1.3.6.1.4.1.18060.0.4.1.3.803"),

    ADS_HTTP_SERVER_OC("ads-httpServer", "1.3.6.1.4.1.18060.0.4.1.3.804"),

    ADS_REPL_EVENT_LOG_OC("ads-replEventLog", "1.3.6.1.4.1.18060.0.4.1.3.805"),

    ADS_REPL_CONSUMER_OC("ads-replConsumer", "1.3.6.1.4.1.18060.0.4.1.3.806"),

    ADS_PASSWORD_POLICY_OC("ads-passwordPolicy", "1.3.6.1.4.1.18060.0.4.1.3.900"),

    ADS_AUTHENTICATOR_OC("ads-authenticator", "1.3.6.1.4.1.18060.0.4.1.3.901"),

    ADS_AUTHENTICATOR_IMPL_OC("ads-authenticatorImpl", "1.3.6.1.4.1.18060.0.4.1.3.902"),

    ADS_DELEGATING_AUTHENTICATOR_OC("ads-delegatingAuthenticator", "1.3.6.1.4.1.18060.0.4.1.3.904"),

    ADS_CONFIG_ID("ads-configId", ""),

    ADS_COMPOSITE_ELEMENT_AT("ads-compositeElement", "1.3.6.1.4.1.18060.0.4.1.2.0"),

    ADS_SERVER_ID("ads-serverId", ""),

    ADS_TRANSPORTS("ads-transports", ""),

    ADS_KRB_ALLOWABLE_CLOCKSKEW("ads-krbAllowableClockSkew", ""),

    ADS_KRB_ENCRYPTION_TYPES("ads-krbEncryptionTypes", ""),

    ADS_KRB_EMPTY_ADDRESSES_ALLOWED("ads-krbEmptyAddressesAllowed", ""),

    ADS_KRB_FORWARDABLE_ALLOWED("ads-krbForwardableAllowed", ""),

    ADS_KRB_PAENC_TIMESTAMP_REQUIRED("ads-krbPaEncTimestampRequired", ""),

    ADS_KRB_POSTDATED_ALLOWED("ads-krbPostdatedAllowed", ""),

    ADS_KRB_PROXIABLE_ALLOWED("ads-krbProxiableAllowed", ""),

    ADS_KRB_RENEWABLE_ALLOWED("ads-krbRenewableAllowed", ""),

    ADS_KRB_KDC_PRINCIPAL("ads-krbKdcPrincipal", ""),

    ADS_KRB_MAXIMUM_RENEWABLE_LIFETIME("ads-krbMaximumRenewableLifetime", ""),

    ADS_KRB_MAXIMUM_TICKET_LIFETIME("ads-krbMaximumTicketLifetime", ""),

    ADS_KRB_PRIMARY_REALM("ads-krbPrimaryRealm", ""),

    ADS_KRB_BODY_CHECKSUM_VERIFIED("ads-krbBodyChecksumVerified", ""),

    ADS_HTTP_CONFFILE("ads-httpConfFile", ""),

    ADS_DIRECTORYSERVICE_ID("ads-directoryServiceId", ""),

    //ADS_DS_REPLICA_ID( "ads-dsReplicaId", "" ),

    ADS_DSINTERCEPTORS("ads-dsInterceptors", ""),

    ADS_DSPARTITIONS("ads-dsPartitions", ""),

    ADS_DS_ACCESSCONTROL_ENABLED("ads-dsAccessControlEnabled", ""),

    ADS_DS_ALLOW_ANONYMOUS_ACCESS("ads-dsAllowAnonymousAccess", ""),

    ADS_DSCHANGELOG("ads-dsChangeLog", ""),

    ADS_DS_DENORMALIZE_OPATTRS_ENABLED("ads-dsDenormalizeOpAttrsEnabled", ""),

    ADS_DSJOURNAL("ads-dsJournal", ""),

    ADS_DS_MAXPDU_SIZE("ads-dsMaxPDUSize", ""),

    ADS_DS_PASSWORD_HIDDEN("ads-dsPasswordHidden", ""),

    //ADS_DS_REPLICATION( "ads-dsReplication", "" ),

    ADS_DS_SYNCPERIOD_MILLIS("ads-dsSyncPeriodMillis", ""),

    ADS_DS_TEST_ENTRIES("ads-dsTestEntries", ""),

    ADS_INTERCEPTOR_ID("ads-interceptorId", ""),

    ADS_INTERCEPTOR_CLASSNAME("ads-interceptorClassName", ""),

    ADS_INTERCEPTOR_ORDER("ads-interceptorOrder", ""),

    ADS_JDBMPARTITION("ads-jdbmPartition", ""),

    ADS_PARTITION_ID("ads-partitionId", ""),

    ADS_PARTITION_SUFFIX("ads-partitionSuffix", ""),

    ADS_PARTITION_CACHE_SIZE("ads-partitionCacheSize", ""),

    ADS_JDBM_PARTITION_OPTIMIZER_ENABLED("ads-jdbmPartitionOptimizerEnabled", ""),

    ADS_PARTITION_SYNCONWRITE("ads-partitionSyncOnWrite", ""),

    ADS_PARTITION_INDEXED_ATTRIBUTES("ads-partitionIndexedAttributes", ""),

    ADS_INDEX_ATTRIBUTE_ID("ads-indexAttributeId", ""),

    ADS_INDEX_HAS_REVERSE("ads-indexHasReverse", ""),

    ADS_JDBMINDEX("ads-jdbmIndex", ""),

    ADS_INDEX_CACHESIZE("ads-indexCacheSize", ""),

    ADS_INDEX_NUM_DUP_LIMIT("ads-indexNumDupLimit", ""),

    ADS_TRANSPORT_ID("ads-transportId", ""),

    ADS_TCP_TRANSPORT("ads-tcpTransport", ""),

    ADS_UDP_TRANSPORT("ads-udpTransport", ""),

    ADS_SYSTEM_PORT("ads-systemPort", ""),

    ADS_TRANSPORT_ADDRESS("ads-transportAddress", ""),

    ADS_TRANSPORT_BACKLOG("ads-transportBacklog", ""),

    ADS_TRANSPORT_ENABLE_SSL("ads-transportEnableSSL", ""),

    ADS_TRANSPORT_NBTHREADS("ads-transportNbThreads", ""),

    ADS_CHANGELOG_ENABLED("ads-changeLogEnabled", ""),

    ADS_CHANGELOG_EXPOSED("ads-changeLogExposed", ""),

    ADS_JOURNAL_FILENAME("ads-journalFileName", ""),

    ADS_JOURNAL_WORKINGDIR("ads-journalWorkingDir", ""),

    ADS_JOURNAL_ROTATION("ads-journalRotation", ""),

    ADS_JOURNAL_ENABLED("ads-journalEnabled", ""),

    ADS_HTTP_WARFILE("ads-httpWarFile", ""),

    ADS_HTTP_APP_CTX_PATH("ads-httpAppCtxPath", ""),

    ADS_ENABLED("ads-enabled", ""),

    ADS_CHANGEPWD_POLICY_CATEGORY_COUNT("ads-chgPwdPolicyCategoryCount", ""),

    ADS_CHANGEPWD_POLICY_PASSWORD_LENGTH("ads-chgPwdPolicyPasswordLength", ""),

    ADS_CHANGEPWD_POLICY_TOKEN_SIZE("ads-chgPwdPolicyTokenSize", ""),

    ADS_CHANGEPWD_SERVICE_PRINCIPAL("ads-chgPwdServicePrincipal", ""),

    //ADS_REPL_SEARCH_FILTER( "ads-replSearchFilter", "" ),

    //ADS_REPL_LAST_SENT_CSN( "ads-replLastSentCsn", "" ),

    //ADS_REPL_ALIAS_DEREF_MODE( "ads-replAliasDerefMode", "" ),

    //ADS_SEARCH_BASE( "ads-searchBaseDN", "" ),

    //ADS_REPL_SEARCH_SCOPE( "ads-replSearchScope", "" ),

    //ADS_REPL_REFRESH_N_PERSIST( "ads-replRefreshNPersist", "" ),

    //ADS_REPL_PROV_HOST_NAME( "ads-replProvHostName", "" ),

    //ADS_REPL_PROV_PORT( "ads-replProvPort", "" ),

    //ADS_REPL_USER_DN( "ads-replUserDn", "" ),

    //ADS_REPL_USER_PASSWORD( "ads-replUserPassword", "" ),

    //ADS_REPL_REFRESH_INTERVAL( "ads-replRefreshInterval", "" ),

    //ADS_REPL_ATTRIBUTE( "ads-replAttributes", "" ),

    //ADS_REPL_SEARCH_SIZE_LIMIT( "ads-replSearchSizeLimit", "" ),

    //ADS_REPL_SEARCH_TIMEOUT( "ads-replSearchTimeOut", "" ),

    //ADS_REPL_COOKIE( "ads-replCookie", "" ),

    ADS_REPL_REQ_HANDLER("ads-replReqHandler", ""),

    ADS_REPL_ENABLE_PROVIDER("ads-enableReplProvider", ""),

    //ADS_REPL_USE_TLS( "ads-replUseTls", "" ),

    ADS_LDAP_SERVER_SASL_MECH_NAME("ads-ldapServerSaslMechName", ""),

    ADS_LDAP_SERVER_SASL_MECH_CLASS_NAME("ads-ldapServerSaslMechClassName", ""),

    ADS_LDAP_SERVER_NTLM_MECH_PROVIDER("ads-ldapServerNtlmMechProvider", ""),

    ADS_LDAP_SERVER_EXT_OP_HANDLER_FQCN("ads-ldapServerExtendedOpHandlerClass", ""),

    ADS_LDAP_SERVER_KEYSTORE_FILE("ads-ldapserverkeystorefile", ""),

    ADS_LDAP_SERVER_CERT_PASSWORD("ads-ldapServerCertificatePassword", "");

    /** The interned value */
    private String value;

    /** The associated OID */
    private String oid;


    /** A private constructor */
    ConfigSchemaConstants( String value, String oid )
    {
        this.value = value;
        this.oid = oid;
    }


    /**
     * @return The interned String
     */
    public String getValue()
    {
        return value;
    }


    /**
     * @return The associated OID
     */
    public String getOid()
    {
        return oid;
    }
}
