/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2006-2009 Sun Microsystems, Inc.
 */
package org.opends.server.admin.client.cli;
import org.opends.messages.Message;

import static org.opends.messages.AdminMessages.*;


import java.util.HashMap;

import org.opends.admin.ads.ADSContextException.ErrorType;

  /**
   *
   * The enumeration which defines the return code.
   *
   */
  public enum DsFrameworkCliReturnCode
  {
    /**
     * successful.
     */
    SUCCESSFUL(0, INFO_ADMIN_SUCCESSFUL.get()),

    /**
     * successful but no operation was performed.
     */
    SUCCESSFUL_NOP(SUCCESSFUL.getReturnCode(), INFO_ADMIN_SUCCESSFUL_NOP.get()),

    /**
     * Unable to initialize arguments.
     */
    CANNOT_INITIALIZE_ARGS(1, ERR_ADMIN_NO_MESSAGE.get()),

    /**
     * Cannot parse arguments.
     */
    ERROR_PARSING_ARGS(2, ERR_ADMIN_NO_MESSAGE.get()),
    /**
     * Return code: Cannot get the connection to the ADS.
     */
    CANNOT_CONNECT_TO_ADS(3, ERR_ADMIN_NO_MESSAGE.get()),

    /**
     * The host name is missing.
     */
    MISSING_HOSTNAME(4, ERR_ADMIN_MISSING_HOSTNAME.get()),

    /**
     * The host name is not valid.
     */
    NOVALID_HOSTNAME(5, ERR_ADMIN_NOVALID_HOSTNAME.get()),

    /**
     * The installation path is missing.
     */
    MISSING_IPATH(6, ERR_ADMIN_MISSING_IPATH.get()),

    /**
     * The installation path is not valid.
     */
    NOVALID_IPATH(7, ERR_ADMIN_NOVALID_IPATH.get()),

    /**
     * An access permission error.
     */
    ACCESS_PERMISSION(8, ERR_ADMIN_ACCESS_PERMISSION.get()),

    /**
     * The entity is already registered.
     */
    ALREADY_REGISTERED(9, ERR_ADMIN_ALREADY_REGISTERED.get()),

    /**
     * The installation is broken.
     */
    BROKEN_INSTALL(10, ERR_ADMIN_BROKEN_INSTALL.get()),

    /**
     * The entity is not yet registered.
     */
    NOT_YET_REGISTERED(11, ERR_ADMIN_NOT_YET_REGISTERED.get()),

    /**
     * The port is missing.
     */
    MISSING_PORT(12, ERR_ADMIN_MISSING_PORT.get()),

    /**
     * The port is not valid.
     */
    NOVALID_PORT(13, ERR_ADMIN_NOVALID_PORT.get()),

    /**
     * The name is missing.
     */
    MISSING_NAME(14, ERR_ADMIN_MISSING_NAME.get()),

    /**
     * The administration UID is missing.
     */
    MISSING_ADMIN_UID(15, ERR_ADMIN_MISSING_ADMIN_UID.get()),

    /**
     * The administrator password is missing.
     */
    MISSING_ADMIN_PASSWORD(16, ERR_ADMIN_MISSING_ADMIN_PASSWORD.get()),

    /**
     * Unexpected error (potential bug).
     */
    ERROR_UNEXPECTED(17, ERR_ADMIN_ERROR_UNEXPECTED.get()),

    /**
     * Unexpected error (potential bug).
     */
    CONFLICTING_ARGS(18, ERR_ADMIN_NO_MESSAGE.get()),

    /**
     * The server entity is not yet registered.
     */
    SERVER_NOT_REGISTERED(19, ERR_ADMIN_SERVER_NOT_REGISTERED.get()),

    /**
     * The merge of the ADS cannot be performed.
     */
    ERROR_MERGING(20, ERR_ADMIN_MERGING.get());

    // The retunCodevalue of the value.
    private final int returnCode;

    // The message id to be used of the value.
    private final Message message;

    // Private constructor.
    private DsFrameworkCliReturnCode(int returnCode, Message message)
    {
      this.returnCode = returnCode;
      this.message = message;
    }

    /**
     * Get the corresponding message.
     *
     * @return The corresponding message.
     */
    public Message getMessage()
    {
      return message;
    }

    /**
     * Get the corresponding return code value.
     *
     * @return The corresponding return code value.
     */
    public int getReturnCode()
    {
      return returnCode;
    }

  /**
   * Indicate whenever the association between ADS errors and return
   * has been done.
   */
  private static boolean initialized = false ;

  /**
   * The association map between ADS Error and Return code.
   */
  private static HashMap<ErrorType, DsFrameworkCliReturnCode>
    adsErrorToReturnCode = new HashMap<ErrorType, DsFrameworkCliReturnCode>();

  /**
   * Associates a set of ADS errors to return code.
   */
  private  static void registerAdsError()
  {
    adsErrorToReturnCode.put(ErrorType.MISSING_HOSTNAME,
        MISSING_HOSTNAME);
    adsErrorToReturnCode.put(ErrorType.NOVALID_HOSTNAME,
        NOVALID_HOSTNAME);
    adsErrorToReturnCode.put(ErrorType.MISSING_IPATH,
        MISSING_IPATH);
    adsErrorToReturnCode.put(ErrorType.NOVALID_IPATH,
        NOVALID_IPATH);
    adsErrorToReturnCode.put(ErrorType.ACCESS_PERMISSION,
        ACCESS_PERMISSION);
    adsErrorToReturnCode.put(ErrorType.ALREADY_REGISTERED,
        ALREADY_REGISTERED);
    adsErrorToReturnCode.put(ErrorType.BROKEN_INSTALL,
        BROKEN_INSTALL);
    adsErrorToReturnCode.put(ErrorType.UNEXPECTED_ADS_BACKEND_TYPE,
        BROKEN_INSTALL);
    adsErrorToReturnCode.put(ErrorType.NOT_YET_REGISTERED,
        NOT_YET_REGISTERED);
    adsErrorToReturnCode.put(ErrorType.MISSING_PORT,
        MISSING_PORT);
    adsErrorToReturnCode.put(ErrorType.NOVALID_PORT,
        NOVALID_PORT);
    adsErrorToReturnCode.put(ErrorType.MISSING_NAME,
        MISSING_NAME);
    adsErrorToReturnCode.put(ErrorType.MISSING_ADMIN_UID,
        MISSING_ADMIN_UID);
    adsErrorToReturnCode.put(ErrorType.MISSING_ADMIN_PASSWORD,
        MISSING_ADMIN_PASSWORD);
    adsErrorToReturnCode.put(ErrorType.ERROR_UNEXPECTED,
        ERROR_UNEXPECTED);
    adsErrorToReturnCode.put(ErrorType.ERROR_MERGING,
        ERROR_MERGING);
  }

  /**
   * Get ReturnCode from an ADS error.
   * @param error The ADS error
   * @return the ReturnCode associated to the ADS error.
   */
  public static DsFrameworkCliReturnCode
    getReturncodeFromAdsError(ErrorType error)
  {
    if (! initialized)
    {
      registerAdsError();
      initialized = true ;
    }
    return adsErrorToReturnCode.get(error);
  }
 }


