001    /*
002     * Copyright 2007-2015 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2008-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;
022    
023    
024    
025    import java.util.List;
026    
027    import com.unboundid.util.StaticUtils;
028    
029    
030    
031    /**
032     * This class defines an exception that can be thrown if a problem occurs while
033     * performing LDAP-related processing.  It includes all of the elements of the
034     * {@code SearchResult} object, potentially including entries and references
035     * returned before the failure result.
036     */
037    public final class LDAPSearchException
038           extends LDAPException
039    {
040      /**
041       * The serial version UID for this serializable class.
042       */
043      private static final long serialVersionUID = 350230437196125113L;
044    
045    
046    
047      // The search result with information from this exception.
048      private final SearchResult searchResult;
049    
050    
051    
052      /**
053       * Creates a new LDAP search exception with the provided information.
054       *
055       * @param  resultCode    The result code for this LDAP search exception.
056       * @param  errorMessage  The error message for this LDAP search exception.
057       */
058      public LDAPSearchException(final ResultCode resultCode,
059                                 final String errorMessage)
060      {
061        super(resultCode, errorMessage);
062    
063        searchResult = new SearchResult(-1, resultCode, errorMessage, null,
064             StaticUtils.NO_STRINGS, 0, 0, StaticUtils.NO_CONTROLS);
065      }
066    
067    
068    
069      /**
070       * Creates a new LDAP search exception with the provided information.
071       *
072       * @param  resultCode    The result code for this LDAP search exception.
073       * @param  errorMessage  The error message for this LDAP search exception.
074       * @param  cause         The underlying exception that triggered this LDAP
075       *                       search exception.
076       */
077      public LDAPSearchException(final ResultCode resultCode,
078                                 final String errorMessage, final Throwable cause)
079      {
080        super(resultCode, errorMessage, cause);
081    
082        searchResult = new SearchResult(-1, resultCode, errorMessage, null,
083             StaticUtils.NO_STRINGS , 0, 0, StaticUtils.NO_CONTROLS);
084      }
085    
086    
087    
088      /**
089       * Creates a new LDAP search exception from the provided exception.
090       *
091       * @param  ldapException  The LDAP exception with the information to include
092       *                        in this LDAP search exception.
093       */
094      public LDAPSearchException(final LDAPException ldapException)
095      {
096        super(ldapException.getResultCode(), ldapException.getMessage(),
097              ldapException.getMatchedDN(), ldapException.getReferralURLs(),
098              ldapException.getResponseControls(), ldapException);
099    
100        if (ldapException instanceof LDAPSearchException)
101        {
102          final LDAPSearchException lse = (LDAPSearchException) ldapException;
103          searchResult = lse.searchResult;
104        }
105        else
106        {
107          searchResult = new SearchResult(-1, ldapException.getResultCode(),
108                                          ldapException.getMessage(),
109                                          ldapException.getMatchedDN(),
110                                          ldapException.getReferralURLs(), 0, 0,
111                                          ldapException.getResponseControls());
112        }
113      }
114    
115    
116    
117      /**
118       * Creates a new LDAP search exception with the provided result.
119       *
120       * @param  searchResult  The search result to use to create this LDAP search
121       *                       exception.
122       */
123      public LDAPSearchException(final SearchResult searchResult)
124      {
125        super(searchResult);
126    
127        this.searchResult = searchResult;
128      }
129    
130    
131    
132      /**
133       * Retrieves the search result object associated with this LDAP search
134       * exception.
135       *
136       * @return  The search result object associated with this LDAP search
137       *          exception.
138       */
139      public SearchResult getSearchResult()
140      {
141        return searchResult;
142      }
143    
144    
145    
146      /**
147       * Retrieves the number of matching entries returned for the search operation
148       * before this exception was thrown.
149       *
150       * @return  The number of matching entries returned for the search operation
151       *          before this exception was thrown.
152       */
153      public int getEntryCount()
154      {
155        return searchResult.getEntryCount();
156      }
157    
158    
159    
160      /**
161       * Retrieves the number of search references returned for the search
162       * operation before this exception was thrown.
163       *
164       * @return  The number of search references returned for the search operation
165       *          before this exception was thrown.
166       */
167      public int getReferenceCount()
168      {
169        return searchResult.getReferenceCount();
170      }
171    
172    
173    
174      /**
175       * Retrieves a list containing the matching entries returned from the search
176       * operation before this exception was thrown.  This will only be available if
177       * a {@code SearchResultListener} was not used during the search.
178       *
179       * @return  A list containing the matching entries returned from the search
180       *          operation before this exception was thrown, or {@code null} if a
181       *          {@code SearchResultListener} was used during the search.
182       */
183      public List<SearchResultEntry> getSearchEntries()
184      {
185        return searchResult.getSearchEntries();
186      }
187    
188    
189    
190      /**
191       * Retrieves a list containing the search references returned from the search
192       * operation before this exception was thrown.  This will only be available if
193       * a {@code SearchResultListener} was not used during the search.
194       *
195       * @return  A list containing the search references returned from the search
196       *          operation before this exception was thrown, or {@code null} if a
197       *          {@code SearchResultListener} was used during the search.
198       */
199      public List<SearchResultReference> getSearchReferences()
200      {
201        return searchResult.getSearchReferences();
202      }
203    
204    
205    
206      /**
207       * Creates a new {@code SearchResult} object from this exception.
208       *
209       * @return  The {@code SearchResult} object created from this exception.
210       */
211      @Override()
212      public SearchResult toLDAPResult()
213      {
214        return searchResult;
215      }
216    
217    
218    
219      /**
220       * Appends a string representation of this LDAP exception to the provided
221       * buffer.
222       *
223       * @param  buffer  The buffer to which to append a string representation of
224       *                 this LDAP exception.
225       */
226      @Override()
227      public void toString(final StringBuilder buffer)
228      {
229        buffer.append("LDAPSearchException(resultCode=");
230        buffer.append(getResultCode());
231        buffer.append(", numEntries=");
232        buffer.append(searchResult.getEntryCount());
233        buffer.append(", numReferences=");
234        buffer.append(searchResult.getReferenceCount());
235    
236        final String errorMessage = getMessage();
237        if (errorMessage != null)
238        {
239          buffer.append(", errorMessage='");
240          buffer.append(errorMessage);
241          buffer.append('\'');
242        }
243    
244        final String matchedDN = getMatchedDN();
245        if (matchedDN != null)
246        {
247          buffer.append(", matchedDN='");
248          buffer.append(matchedDN);
249          buffer.append('\'');
250        }
251    
252        final String[] referralURLs = getReferralURLs();
253        if (referralURLs.length > 0)
254        {
255          buffer.append(", referralURLs={");
256    
257          for (int i=0; i < referralURLs.length; i++)
258          {
259            if (i > 0)
260            {
261              buffer.append(", ");
262            }
263    
264            buffer.append('\'');
265            buffer.append(referralURLs[i]);
266            buffer.append('\'');
267          }
268    
269          buffer.append('}');
270        }
271    
272        final Control[] responseControls = getResponseControls();
273        if (responseControls.length > 0)
274        {
275          buffer.append(", responseControls={");
276    
277          for (int i=0; i < responseControls.length; i++)
278          {
279            if (i > 0)
280            {
281              buffer.append(", ");
282            }
283    
284            buffer.append(responseControls[i]);
285          }
286    
287          buffer.append('}');
288        }
289    
290        buffer.append(')');
291      }
292    }