001    /*
002     * Copyright 2009-2016 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2009-2016 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.ldap.sdk.migrate.jndi;
022    
023    
024    
025    import javax.naming.NamingException;
026    
027    import com.unboundid.asn1.ASN1Exception;
028    import com.unboundid.asn1.ASN1OctetString;
029    import com.unboundid.ldap.sdk.ExtendedRequest;
030    import com.unboundid.util.NotMutable;
031    import com.unboundid.util.StaticUtils;
032    import com.unboundid.util.ThreadSafety;
033    import com.unboundid.util.ThreadSafetyLevel;
034    
035    
036    
037    /**
038     * This class provides a mechanism for converting between an LDAP extended
039     * request as used in JNDI and one used in the UnboundID LDAP SDK for Java.
040     *
041     * @see  ExtendedRequest
042     */
043    @NotMutable()
044    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
045    public final class JNDIExtendedRequest
046           implements javax.naming.ldap.ExtendedRequest
047    {
048      /**
049       * The serial version UID for this serializable class.
050       */
051      private static final long serialVersionUID = -8502230539753937274L;
052    
053    
054    
055      // The SDK extended request that backs this JNDI extended request.
056      private final ExtendedRequest r;
057    
058    
059    
060      /**
061       * Creates a new JNDI extended request from the provided SDK extended request.
062       *
063       * @param  r  The SDK extended request to use to create this JNDI extended
064       *            request.
065       */
066      public JNDIExtendedRequest(final ExtendedRequest r)
067      {
068        this.r = r;
069      }
070    
071    
072    
073      /**
074       * Creates a new JNDI extended request from the provided JNDI extended
075       * request.
076       *
077       * @param  r  The JNDI extended request to use to create this JNDI extended
078       *            request.
079       *
080       * @throws  NamingException  If a problem occurs while trying to create this
081       *                           JNDI extended request.
082       */
083      public JNDIExtendedRequest(final javax.naming.ldap.ExtendedRequest r)
084             throws NamingException
085      {
086        this.r = toSDKExtendedRequest(r);
087      }
088    
089    
090    
091      /**
092       * Retrieves the object identifier for this extended request.
093       *
094       * @return  The object identifier for this extended request.
095       */
096      public String getID()
097      {
098        return r.getOID();
099      }
100    
101    
102    
103      /**
104       * Retrieves the encoded value for this extended request (including the BER
105       * type and length), if available.
106       *
107       * @return  The encoded value for this extended request, or {@code null} if
108       *          there is no value.
109       */
110      public byte[] getEncodedValue()
111      {
112        final ASN1OctetString value = r.getValue();
113        if (value == null)
114        {
115          return null;
116        }
117        else
118        {
119          return value.encode();
120        }
121      }
122    
123    
124    
125      /**
126       * Creates a JNDI extended response with the provided information.
127       *
128       * @param  id        The object identifier for the response, or {@code null}
129       *                   if there should not be a value.
130       * @param  berValue  A byte array containing the encoded value (including BER
131       *                   type and length), or {@code null} if the response should
132       *                   not have a value.
133       * @param  offset    The offset within the provided array at which the value
134       *                   should begin.
135       * @param  length    The number of bytes contained in the value.
136       *
137       * @return  The created JNDI extended response.
138       *
139       * @throws  NamingException  If a problem occurs while creating the response.
140       */
141      public JNDIExtendedResponse createExtendedResponse(final String id,
142                                       final byte[] berValue, final int offset,
143                                       final int length)
144             throws NamingException
145      {
146        return new JNDIExtendedResponse(id, berValue, offset, length);
147      }
148    
149    
150    
151      /**
152       * Retrieves an LDAP SDK extended request that is the equivalent of this JNDI
153       * extended request.
154       *
155       * @return  An LDAP SDK extended request that is the equivalent of this JNDI
156       *          extended request.
157       */
158      public ExtendedRequest toSDKExtendedRequest()
159      {
160        return r;
161      }
162    
163    
164    
165      /**
166       * Retrieves an LDAP SDK extended request that is the equivalent of the
167       * provided JNDI extended request.
168       *
169       * @param  r  The JNDI extended request to convert to an LDAP SDK extended
170       *            request.
171       *
172       * @return  The LDAP SDK extended request converted from the provided JNDI
173       *          extended request.
174       *
175       * @throws  NamingException  If a problem occurs while decoding the provided
176       *                           JNDI extended request as an SDK extended request.
177       */
178      public static ExtendedRequest toSDKExtendedRequest(
179                                         final javax.naming.ldap.ExtendedRequest r)
180             throws NamingException
181      {
182        if (r == null)
183        {
184          return null;
185        }
186    
187        final ASN1OctetString value;
188        final byte[] valueBytes = r.getEncodedValue();
189        if (valueBytes == null)
190        {
191          value = null;
192        }
193        else
194        {
195          try
196          {
197            value = ASN1OctetString.decodeAsOctetString(valueBytes);
198          }
199          catch (ASN1Exception ae)
200          {
201            throw new NamingException(StaticUtils.getExceptionMessage(ae));
202          }
203        }
204    
205        return new ExtendedRequest(r.getID(), value);
206      }
207    
208    
209    
210      /**
211       * Retrieves a string representation of this JNDI extended request.
212       *
213       * @return  A string representation of this JNDI request.
214       */
215      @Override()
216      public String toString()
217      {
218        return r.toString();
219      }
220    }