001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.protocols.internal;
028
029
030
031 import java.util.LinkedHashSet;
032 import java.util.LinkedList;
033 import java.util.List;
034
035 import org.opends.server.api.ClientConnection;
036 import org.opends.server.core.SearchOperationBasis;
037 import org.opends.server.types.ByteString;
038 import org.opends.server.types.Control;
039 import org.opends.server.types.DN;
040 import org.opends.server.types.DereferencePolicy;
041 import org.opends.server.types.DirectoryException;
042 import org.opends.server.types.RawFilter;
043 import org.opends.server.types.SearchFilter;
044 import org.opends.server.types.SearchResultEntry;
045 import org.opends.server.types.SearchResultReference;
046 import org.opends.server.types.SearchScope;
047
048
049
050 /**
051 * This class defines a subclass of the core search operation that is
052 * to be used for internal searches. The primary difference between
053 * this class and the core search operation is that the search entries
054 * and references will be queued in memory rather than sent to a
055 * client since there is no real client.
056 */
057 @org.opends.server.types.PublicAPI(
058 stability=org.opends.server.types.StabilityLevel.UNCOMMITTED,
059 mayInstantiate=true,
060 mayExtend=false,
061 mayInvoke=true)
062 public final class InternalSearchOperation
063 extends SearchOperationBasis
064 {
065 // The internal search listener for this search, if one was
066 // provided.
067 private InternalSearchListener searchListener;
068
069 // The set of matching entries returned for this search.
070 private LinkedList<SearchResultEntry> entryList;
071
072 // The set of search references returned for this search.
073 private LinkedList<SearchResultReference> referenceList;
074
075
076
077 /**
078 * Creates a new internal search operation with the provided
079 * information.
080 *
081 * @param internalConnection The internal client connection with
082 * which this internal search operation
083 * is associated.
084 * @param operationID The operation ID for this internal
085 * search.
086 * @param messageID The message ID for this internal
087 * search.
088 * @param requestControls The set of request controls for this
089 * internal search.
090 * @param rawBaseDN The raw base DN for this internal
091 * search.
092 * @param scope The scope for this internal search.
093 * @param derefPolicy The alias dereferencing policy for
094 * this internal search.
095 * @param sizeLimit The size limit for this internal
096 * search.
097 * @param timeLimit The time limit for this internal
098 * search.
099 * @param typesOnly The typesOnly flag for this internal
100 * search.
101 * @param rawFilter The raw filter for this internal
102 * search.
103 * @param attributes The names of the requested attributes
104 * for this internal search.
105 * @param searchListener The internal search listener that
106 * should be used to process the
107 * results, or <CODE>null</CODE> if
108 * they should be collected internally.
109 */
110 public InternalSearchOperation(
111 ClientConnection internalConnection,
112 long operationID, int messageID,
113 List<Control> requestControls, ByteString rawBaseDN,
114 SearchScope scope, DereferencePolicy derefPolicy,
115 int sizeLimit, int timeLimit, boolean typesOnly,
116 RawFilter rawFilter, LinkedHashSet<String> attributes,
117 InternalSearchListener searchListener)
118 {
119 super(internalConnection, operationID, messageID, requestControls,
120 rawBaseDN, scope, derefPolicy, sizeLimit, timeLimit,
121 typesOnly, rawFilter, attributes);
122
123
124
125
126 if (searchListener == null)
127 {
128 this.searchListener = null;
129 this.entryList = new LinkedList<SearchResultEntry>();
130 this.referenceList = new LinkedList<SearchResultReference>();
131 }
132 else
133 {
134 this.searchListener = searchListener;
135 this.entryList = null;
136 this.referenceList = null;
137 }
138
139 setInternalOperation(true);
140 }
141
142
143
144 /**
145 * Creates a new internal search operation with the provided
146 * information.
147 *
148 * @param internalConnection The internal client connection with
149 * which this internal search operation
150 * is associated.
151 * @param operationID The operation ID for this internal
152 * search.
153 * @param messageID The message ID for this internal
154 * search.
155 * @param requestControls The set of request controls for this
156 * internal search.
157 * @param baseDN The base DN for this internal search.
158 * @param scope The scope for this internal search.
159 * @param derefPolicy The alias dereferencing policy for
160 * this internal search.
161 * @param sizeLimit The size limit for this internal
162 * search.
163 * @param timeLimit The time limit for this internal
164 * search.
165 * @param typesOnly The typesOnly flag for this internal
166 * search.
167 * @param filter The filter for this internal search.
168 * @param attributes The names of the requested attributes
169 * for this internal search.
170 * @param searchListener The internal search listener that
171 * should be used to process the
172 * results, or <CODE>null</CODE> if
173 * they should be collected internally.
174 */
175 public InternalSearchOperation(
176 ClientConnection internalConnection,
177 long operationID, int messageID,
178 List<Control> requestControls, DN baseDN,
179 SearchScope scope, DereferencePolicy derefPolicy,
180 int sizeLimit, int timeLimit, boolean typesOnly,
181 SearchFilter filter, LinkedHashSet<String> attributes,
182 InternalSearchListener searchListener)
183 {
184 super(internalConnection, operationID, messageID, requestControls,
185 baseDN, scope, derefPolicy, sizeLimit, timeLimit,
186 typesOnly, filter, attributes);
187
188
189
190
191 if (searchListener == null)
192 {
193 this.searchListener = null;
194 this.entryList = new LinkedList<SearchResultEntry>();
195 this.referenceList = new LinkedList<SearchResultReference>();
196 }
197 else
198 {
199 this.searchListener = searchListener;
200 this.entryList = null;
201 this.referenceList = null;
202 }
203
204 setInternalOperation(true);
205 }
206
207
208
209 /**
210 * Retrieves the set of search result entries returned for this
211 * search.
212 *
213 * @return The set of search result entries returned for this
214 * search, or <CODE>null</CODE> if a custom internal search
215 * listener is to be used.
216 */
217 public LinkedList<SearchResultEntry> getSearchEntries()
218 {
219 return entryList;
220 }
221
222
223
224 /**
225 * Provides the provided search result entry to the internal search
226 * listener if one was provided, or stores it in an internal list
227 * otherwise.
228 *
229 * @param searchEntry The search result entry returned for this
230 * search.
231 *
232 * @throws DirectoryException If a problem occurs while processing
233 * the provided entry and the search
234 * should be terminated.
235 */
236 @org.opends.server.types.PublicAPI(
237 stability=org.opends.server.types.StabilityLevel.PRIVATE,
238 mayInstantiate=false,
239 mayExtend=false,
240 mayInvoke=false)
241 public void addSearchEntry(SearchResultEntry searchEntry)
242 throws DirectoryException
243 {
244 if (searchListener == null)
245 {
246 entryList.add(searchEntry);
247 }
248 else
249 {
250 searchListener.handleInternalSearchEntry(this, searchEntry);
251 }
252 }
253
254
255
256 /**
257 * Retrieves the set of search result references returned for this
258 * search.
259 *
260 * @return The set of search result references returned for this
261 * search, or <CODE>null</CODE> if a custom internal search
262 * listener is to be used.
263 */
264 public LinkedList<SearchResultReference> getSearchReferences()
265 {
266 return referenceList;
267 }
268
269
270
271 /**
272 * Provides the provided search result reference to the internal
273 * search listener if one was provided, or stores it in an internal
274 * list otherwise.
275 *
276 * @param searchReference The search result reference returned for
277 * this search.
278 *
279 * @throws DirectoryException If a problem occurs while processing
280 * the provided reference and the
281 * search should be terminated.
282 */
283 @org.opends.server.types.PublicAPI(
284 stability=org.opends.server.types.StabilityLevel.PRIVATE,
285 mayInstantiate=false,
286 mayExtend=false,
287 mayInvoke=false)
288 public void addSearchReference(
289 SearchResultReference searchReference)
290 throws DirectoryException
291 {
292 if (searchListener == null)
293 {
294 referenceList.add(searchReference);
295 }
296 else
297 {
298 searchListener.handleInternalSearchReference(this,
299 searchReference);
300 }
301 }
302
303
304
305 /**
306 * Sends the provided search result entry to the client.
307 *
308 * @param searchEntry The search result entry to be sent to the
309 * client.
310 *
311 * @throws DirectoryException If a problem occurs while attempting
312 * to send the entry to the client and
313 * the search should be terminated.
314 */
315 @org.opends.server.types.PublicAPI(
316 stability=org.opends.server.types.StabilityLevel.PRIVATE,
317 mayInstantiate=false,
318 mayExtend=false,
319 mayInvoke=false)
320 @Override()
321 public void sendSearchEntry(SearchResultEntry searchEntry)
322 throws DirectoryException
323 {
324 addSearchEntry(searchEntry);
325 }
326
327
328
329 /**
330 * Sends the provided search result reference to the client.
331 *
332 * @param searchReference The search result reference to be sent
333 * to the client.
334 *
335 * @return {@code true} if the client is able to accept referrals,
336 * or {@code false} if the client cannot handle referrals
337 * and no more attempts should be made to send them for the
338 * associated search operation.
339 *
340 * @throws DirectoryException If a problem occurs while attempting
341 * to send the reference to the client
342 * and the search should be terminated.
343 */
344 @org.opends.server.types.PublicAPI(
345 stability=org.opends.server.types.StabilityLevel.PRIVATE,
346 mayInstantiate=false,
347 mayExtend=false,
348 mayInvoke=false)
349 @Override()
350 public boolean sendSearchReference(
351 SearchResultReference searchReference)
352 throws DirectoryException
353 {
354 addSearchReference(searchReference);
355 return true;
356 }
357 }
358