//______________________________________________________________________________
//   |       |
//   | knipp |           Knipp Medien und Kommunikation GmbH
//    -------
//
//
//     Knipp RRI Toolkit
//
//
//     Copyright (C) 2005 by Knipp Medien und Kommunikation GmbH
//
//     This library is free software; you can redistribute it and/or
//     modify it under the terms of the GNU Lesser General Public License 
//     as published by the Free Software Foundation; either version 2.1 
//     of the License, or any later version.
// 
//     This library is distributed in the hope that it will be useful, 
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
//     GNU Lesser General Public License for more details.
//
//     You should have received a copy of the GNU Lesser General
//     Public License along with this library; if not, write to the 
//     Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
//     Boston, MA 02111-1307 USA 
//
//
//     initial author:    Klaus Malorny
//
//     version:           1.3 (15112), 2011/05/27 16:00:14
//                        $Revision: 14936 $ 
//                        $Date: 2010-11-05 15:57:40 +0100 (Fri, 05 Nov 2010) $
//                        $Author: Klaus.Malorny $
//

package de.knipp.rritoolkit.request;

import java.io.IOException;

import org.w3c.dom.DOMException;
import org.w3c.dom.Node;

import de.knipp.rritoolkit.KVList;
import de.knipp.rritoolkit.XmlBuilder;
import de.knipp.rritoolkit.EncodeException;
import de.knipp.rritoolkit.Port;

import de.knipp.rritoolkit.response.DomainMigrateDescrResponse;

import static de.knipp.rritoolkit.DenicConstants.NS_DOMAIN;
import static de.knipp.rritoolkit.DenicConstants.PREFIX_DOMAIN;

/**
 *  request to migrate a domain from the description format to the holder
 *  handle format
 *
 *  @version  $Revision: 14936 $
 *  @author   Klaus Malorny
 */

public class DomainMigrateDescrRequest extends Request
{
  /** the domain name */
  
  private String domainName;
  
  
  /** the encoded domain name */
  
  private String encodedDomainName;
  
  
  /** the holder handle */
  
  private String holderHandle;
  
  

  /**
   *  constructor
   */
  
  public DomainMigrateDescrRequest ()
  {
    // empty
  }
  
  

  /**
   *  constructor
   *
   *  @param theDomainName          the domain name
   *  @param theEncodedDomainName   the encoded domain name, may be {@code null}
   *                                for ASCII only domains
   *  @param theHolderHandle        the holder handle
   */
  
  public DomainMigrateDescrRequest (String theDomainName, 
    String theEncodedDomainName, String theHolderHandle)
  {
    domainName = theDomainName;
    encodedDomainName = theEncodedDomainName;
    holderHandle = theHolderHandle;
  }


  
  /**
   *  constructor
   *
   *  @param theDomainName             the domain name
   *  @param theHolderHandle           the holder handle
   */
  
  public DomainMigrateDescrRequest (String theDomainName, 
    String theHolderHandle)
  {
    this (theDomainName, null, theHolderHandle);
  }
  
  //--- implementation of Request ----------------------------------------------
  
    
  /**
   *  execute the this request on the given port. 
   *
   *  @param port                 the port on which this request shall
   *                              be executed
   *  @return                     the response
   *  @throws IOException         if the execution failed
   */
  
  @Override
  public DomainMigrateDescrResponse execute (Port port)
    throws IOException
  {
    return (DomainMigrateDescrResponse) super.execute (port);
  }
  
  
  /**
   *  method that needs to be implemented by subclasses for the XML conversion
   *
   *  @param node                 the node where the request shall be added to
   *  @throws DOMException        on DOM exceptions
   *  @throws EncodeException     if the encoding fails for some reason
   */

  @Override
  protected void requestToXml (Node node)
    throws DOMException, EncodeException
  {
    if (domainName == null) throw new EncodeException ("domain name not set");
    
    if (holderHandle == null) 
      throw new EncodeException ("holder handler not set");
    
    XmlBuilder xb = new XmlBuilder (node);

    xb.es (NS_DOMAIN, PREFIX_DOMAIN, "migrate-descr");
    xb.elt (NS_DOMAIN, PREFIX_DOMAIN, "handle", domainName);
    
    if (encodedDomainName != null) 
      xb.elt (NS_DOMAIN, PREFIX_DOMAIN, "ace", encodedDomainName);

    xb.es (NS_DOMAIN, PREFIX_DOMAIN, "contact").attr ("role", "holder").
      t (holderHandle).ee ();
    
    xb.ee ();
  }
  

  
  /**
   *  return the action string for this request
   *
   *  @return                     the action string
   */

  @Override
  protected String getActionCode ()
  {
    return "migrate-descr";
  }
  

  
  /**
   *  method that needs to be implemented by subclasses for the 
   *  key-value list conversion
   *
   *  @param list                   the list that has to be filled
   *  @throws EncodeException       if the encoding fails for some reason
   */

  @Override
  protected void requestToKVList (KVList list)
    throws EncodeException
  {
    if (domainName == null) throw new EncodeException ("domain name not set");
    
    list.set ("domain", domainName);
    if (encodedDomainName != null) list.set ("domain-ace", encodedDomainName);
    list.set ("holder", holderHandle);
  }
  
  
  
  
  /**
   *  return a string representation for debugging purposes
   *
   *  @return                 the representation
   */
  
  @Override
  public String toString ()
  {
    return super.toString () + "  domain name: " + domainName +
      "\n  encoded domain name: " + encodedDomainName +
      "\n  holder handle: " + holderHandle +
      "\n";
  }
  
  
  //--- access methods ---------------------------------------------------------
  
  /**
   *  return the domain name
   *
   *  @return                    the domain name
   */
  
  public String getDomainName ()
  {
    return domainName;
  }
  
  
  
  /**
   *  return the encoded domain name
   *
   *  @return                    the encoded domain name
   */
  
  public String getEncodedDomainName ()
  {
    return encodedDomainName;
  }
  
  
  
  /**
   *  set the domain name. The encoded domain name is cleared.
   *  This version should be use for non-IDNs only
   *
   *  @param theDomainName             the domain name
   */
  
  public void setDomainName (String theDomainName)
  {
    domainName = theDomainName;
    encodedDomainName = null;
  }
  
  
  
  /**
   *  set the domain name
   *
   *  @param theDomainName             the domain name
   *  @param theEncodedDomainName      the encoded domain name
   */
  
  public void setDomainName (String theDomainName, String theEncodedDomainName)
  {
    domainName = theDomainName;
    encodedDomainName = theEncodedDomainName;
  }

  
  /**
   *  return the holder handle
   *
   *  @return                          the holder handle
   */
  
  public String getHolderHandle ()
  {
    return holderHandle;
  }
  
  
  /**
   *  set the holder handle
   *
   *  @param theHolderHandle           the holder handle
   */
  
  public void setHolderHandle (String theHolderHandle)
  {
    holderHandle = theHolderHandle;
  }
  
}


