/* StartTlsRequest.java -- extended ldap TLS request
   Copyright (C) 2006 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package javax.naming.ldap;

import java.util.Iterator;

import gnu.classpath.ServiceFactory;

import javax.naming.NamingException;

/**
 * @since 1.4
 */
public class StartTlsRequest
    implements ExtendedRequest
{
  private static final long serialVersionUID = 4441679576360753397L;

  /**
   * The assigned object identifier for this response.
   */
  public static final String OID = "1.3.6.1.4.1.1466.20037"; 

  /**
   * Create a new instance.
   */
  public StartTlsRequest()
  {
  }

  /**
   * Return the response identifier.  This is simply the value
   * of the {@link #OID} field.
   */
  public String getID()
  {
    return OID;
  }

  /**
   * Return the encoded value.  This implementation always returns null.
   */
  public byte[] getEncodedValue()
  {
    return null;
  }

  /**
   * Create a new extended reponse object, using the standard service
   * provider approach to load a provider.  The provider will be a subclass
   * of StartTlsRequest with a no-argument constructor.  The key is
   * "javax.naming.ldap.StartTlsRequest".
   * @param id the identifier, must be {@link #OID} or null
   * @param berValue ignored
   * @param offset ignored
   * @param length ignored
   * @throws NamingException if there is a problem creating the response
   */
  public ExtendedResponse createExtendedResponse(String id, byte[] berValue,
                                                 int offset, int length)
      throws NamingException
  {
    if (id != null && ! OID.equals(id))
      throw new NamingException("incorrect id: was \"" + id
                                + "\", but expected: \"" + OID + "\"");
    Iterator it = ServiceFactory.lookupProviders(StartTlsRequest.class);
    if (it.hasNext())
      return (ExtendedResponse) it.next();
    throw new NamingException("couldn't find provider for "
                              + "javax.naming.ldap.StartTlsRequest");
  }
}
