001    /*
002     * Copyright 2008-2015 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2015 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.unboundidds.extensions;
022    
023    
024    
025    import com.unboundid.asn1.ASN1Element;
026    import com.unboundid.asn1.ASN1Long;
027    import com.unboundid.asn1.ASN1OctetString;
028    import com.unboundid.ldap.sdk.Control;
029    import com.unboundid.ldap.sdk.ExtendedResult;
030    import com.unboundid.ldap.sdk.LDAPException;
031    import com.unboundid.ldap.sdk.ResultCode;
032    import com.unboundid.util.NotMutable;
033    import com.unboundid.util.ThreadSafety;
034    import com.unboundid.util.ThreadSafetyLevel;
035    
036    import static com.unboundid.ldap.sdk.unboundidds.extensions.ExtOpMessages.*;
037    import static com.unboundid.util.Debug.*;
038    
039    
040    
041    /**
042     * <BLOCKQUOTE>
043     *   <B>NOTE:</B>  This class is part of the Commercial Edition of the UnboundID
044     *   LDAP SDK for Java.  It is not available for use in applications that
045     *   include only the Standard Edition of the LDAP SDK, and is not supported for
046     *   use in conjunction with non-UnboundID products.
047     * </BLOCKQUOTE>
048     * This class implements a data structure for storing the information from an
049     * extended result for the get connection ID extended request.  It is able to
050     * decode a generic extended result to obtain the associated connection ID.
051     */
052    @NotMutable()
053    @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE)
054    public final class GetConnectionIDExtendedResult
055           extends ExtendedResult
056    {
057      /**
058       * The serial version UID for this serializable class.
059       */
060      private static final long serialVersionUID = -3161975076326146250L;
061    
062    
063    
064      // The connection ID for the associated client connection.
065      private final long connectionID;
066    
067    
068    
069      /**
070       * Creates a new get connection ID extended result from the provided generic
071       * extended result.
072       *
073       * @param  extendedResult  The generic extended result to be decoded.
074       *
075       * @throws  LDAPException  If a problem occurs while attempting to decode the
076       *                         provided extended result as a get connection ID
077       *                         result.
078       */
079      public GetConnectionIDExtendedResult(final ExtendedResult extendedResult)
080             throws LDAPException
081      {
082        super(extendedResult);
083    
084        final ASN1OctetString value = extendedResult.getValue();
085        if (value == null)
086        {
087          connectionID = -1;
088          return;
089        }
090    
091        try
092        {
093          final ASN1Element e = ASN1Element.decode(value.getValue());
094          connectionID = ASN1Long.decodeAsLong(e).longValue();
095        }
096        catch (Exception e)
097        {
098          debugException(e);
099          throw new LDAPException(ResultCode.DECODING_ERROR,
100                                  ERR_GET_CONN_ID_RESPONSE_VALUE_NOT_INT.get(), e);
101        }
102      }
103    
104    
105    
106      /**
107       * Creates a get connection ID extended result with the provided information.
108       *
109       * @param  messageID          The message ID for the LDAP message that is
110       *                            associated with this LDAP result.
111       * @param  resultCode         The result code from the response.
112       * @param  diagnosticMessage  The diagnostic message from the response, if
113       *                            available.
114       * @param  matchedDN          The matched DN from the response, if available.
115       * @param  referralURLs       The set of referral URLs from the response, if
116       *                            available.
117       * @param  connectionID       The connection ID for the response.
118       * @param  responseControls   The set of controls from the response, if
119       *                            available.
120       */
121      public GetConnectionIDExtendedResult(final int messageID,
122                                           final ResultCode resultCode,
123                                           final String diagnosticMessage,
124                                           final String matchedDN,
125                                           final String[] referralURLs,
126                                           final Long connectionID,
127                                           final Control[] responseControls)
128      {
129        super(messageID, resultCode, diagnosticMessage, matchedDN, referralURLs,
130              null, encodeValue(connectionID), responseControls);
131    
132        if (connectionID == null)
133        {
134          this.connectionID = -1;
135        }
136        else
137        {
138          this.connectionID = connectionID;
139        }
140      }
141    
142    
143    
144      /**
145       * Encodes the value for this extended result using the provided information.
146       *
147       * @param  connectionID  The connection ID for the response.
148       *
149       * @return  An ASN.1 octet string containing the properly-encoded value, or
150       *          {@code null} if there should be no value.
151       */
152      private static ASN1OctetString encodeValue(final Long connectionID)
153      {
154        if ((connectionID == null) || (connectionID < 0))
155        {
156          return null;
157        }
158        else
159        {
160          return new ASN1OctetString(new ASN1Long(connectionID).encode());
161        }
162      }
163    
164    
165    
166      /**
167       * Retrieves the connection ID from this response.
168       *
169       * @return  The connection ID from this response, or -1 if the connection ID
170       *          is not available for some reason (e.g., because this is an error
171       *          response).
172       */
173      public long getConnectionID()
174      {
175        return connectionID;
176      }
177    
178    
179    
180      /**
181       * {@inheritDoc}
182       */
183      @Override()
184      public String getExtendedResultName()
185      {
186        return INFO_EXTENDED_RESULT_NAME_GET_CONNECTION_ID.get();
187      }
188    
189    
190    
191      /**
192       * {@inheritDoc}
193       */
194      @Override()
195      public void toString(final StringBuilder buffer)
196      {
197        buffer.append("GetConnectionIDExtendedResult(connectionID=");
198        buffer.append(connectionID);
199    
200        buffer.append(", resultCode=");
201        buffer.append(getResultCode());
202    
203        final int messageID = getMessageID();
204        if (messageID >= 0)
205        {
206          buffer.append(", messageID=");
207          buffer.append(messageID);
208        }
209    
210        final String diagnosticMessage = getDiagnosticMessage();
211        if (diagnosticMessage != null)
212        {
213          buffer.append(", diagnosticMessage='");
214          buffer.append(diagnosticMessage);
215          buffer.append('\'');
216        }
217    
218        final String matchedDN = getMatchedDN();
219        if (matchedDN != null)
220        {
221          buffer.append(", matchedDN='");
222          buffer.append(matchedDN);
223          buffer.append('\'');
224        }
225    
226        final String[] referralURLs = getReferralURLs();
227        if ((referralURLs != null) && (referralURLs.length > 0))
228        {
229          buffer.append(", referralURLs={ '");
230          for (int i=0; i < referralURLs.length; i++)
231          {
232            if (i > 0)
233            {
234              buffer.append("', '");
235            }
236            buffer.append(referralURLs[i]);
237          }
238    
239          buffer.append("' }");
240        }
241    
242        final Control[] controls = getResponseControls();
243        if (controls.length > 0)
244        {
245          buffer.append(", controls={");
246          for (int i=0; i < controls.length; i++)
247          {
248            if (i > 0)
249            {
250              buffer.append(", ");
251            }
252    
253            buffer.append(controls[i]);
254          }
255          buffer.append('}');
256        }
257    
258        buffer.append(')');
259      }
260    }