| | |
| | | |
| | | import static org.opends.server.core.CoreConstants.*; |
| | | import static org.opends.server.loggers.Access.*; |
| | | import static org.opends.server.loggers.Debug.*; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugCought; |
| | | import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; |
| | | import org.opends.server.types.DebugLogLevel; |
| | | import static org.opends.server.messages.CoreMessages.*; |
| | | import static org.opends.server.messages.MessageHandler.*; |
| | | import static org.opends.server.util.ServerConstants.*; |
| | |
| | | PostOperationSearchOperation, PostResponseSearchOperation, |
| | | SearchEntrySearchOperation, SearchReferenceSearchOperation |
| | | { |
| | | /** |
| | | * The fully-qualified name of this class for debugging purposes. |
| | | */ |
| | | private static final String CLASS_NAME = |
| | | "org.opends.server.core.SearchOperation"; |
| | | |
| | | |
| | | |
| | |
| | | { |
| | | super(clientConnection, operationID, messageID, requestControls); |
| | | |
| | | assert debugConstructor(CLASS_NAME, |
| | | new String[] |
| | | { |
| | | String.valueOf(clientConnection), |
| | | String.valueOf(operationID), |
| | | String.valueOf(messageID), |
| | | String.valueOf(requestControls), |
| | | String.valueOf(rawBaseDN), |
| | | String.valueOf(scope), |
| | | String.valueOf(derefPolicy), |
| | | String.valueOf(sizeLimit), |
| | | String.valueOf(timeLimit), |
| | | String.valueOf(typesOnly), |
| | | String.valueOf(rawFilter), |
| | | String.valueOf(attributes) |
| | | }); |
| | | |
| | | this.rawBaseDN = rawBaseDN; |
| | | this.scope = scope; |
| | |
| | | { |
| | | super(clientConnection, operationID, messageID, requestControls); |
| | | |
| | | assert debugConstructor(CLASS_NAME, |
| | | new String[] |
| | | { |
| | | String.valueOf(clientConnection), |
| | | String.valueOf(operationID), |
| | | String.valueOf(messageID), |
| | | String.valueOf(requestControls), |
| | | String.valueOf(baseDN), |
| | | String.valueOf(scope), |
| | | String.valueOf(derefPolicy), |
| | | String.valueOf(sizeLimit), |
| | | String.valueOf(timeLimit), |
| | | String.valueOf(typesOnly), |
| | | String.valueOf(filter), |
| | | String.valueOf(attributes) |
| | | }); |
| | | |
| | | this.baseDN = baseDN; |
| | | this.scope = scope; |
| | |
| | | */ |
| | | public final ByteString getRawBaseDN() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRawBaseDN"); |
| | | |
| | | return rawBaseDN; |
| | | } |
| | |
| | | */ |
| | | public final void setRawBaseDN(ByteString rawBaseDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setRawBaseDN", String.valueOf(rawBaseDN)); |
| | | |
| | | this.rawBaseDN = rawBaseDN; |
| | | |
| | |
| | | */ |
| | | public final DN getBaseDN() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getBaseDN"); |
| | | |
| | | return baseDN; |
| | | } |
| | |
| | | */ |
| | | public final void setBaseDN(DN baseDN) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setBaseDN", String.valueOf(baseDN)); |
| | | |
| | | this.baseDN = baseDN; |
| | | } |
| | |
| | | */ |
| | | public final SearchScope getScope() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getScope"); |
| | | |
| | | return scope; |
| | | } |
| | |
| | | */ |
| | | public final void setScope(SearchScope scope) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setScope", String.valueOf(scope)); |
| | | |
| | | this.scope = scope; |
| | | } |
| | |
| | | */ |
| | | public final DereferencePolicy getDerefPolicy() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getDerefPolicy"); |
| | | |
| | | return derefPolicy; |
| | | } |
| | |
| | | */ |
| | | public final void setDerefPolicy(DereferencePolicy derefPolicy) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setDerefPolicy", |
| | | String.valueOf(derefPolicy)); |
| | | |
| | | this.derefPolicy = derefPolicy; |
| | | } |
| | |
| | | */ |
| | | public final int getSizeLimit() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getSizeLimit"); |
| | | |
| | | return sizeLimit; |
| | | } |
| | |
| | | */ |
| | | public final void setSizeLimit(int sizeLimit) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setSizeLimit", String.valueOf(sizeLimit)); |
| | | |
| | | this.sizeLimit = sizeLimit; |
| | | } |
| | |
| | | */ |
| | | public final int getTimeLimit() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getTimeLimit"); |
| | | |
| | | return timeLimit; |
| | | } |
| | |
| | | */ |
| | | public final void setTimeLimit(int timeLimit) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setTimeLimit", String.valueOf(timeLimit)); |
| | | |
| | | this.timeLimit = timeLimit; |
| | | } |
| | |
| | | */ |
| | | public final boolean getTypesOnly() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getTypesOnly"); |
| | | |
| | | return typesOnly; |
| | | } |
| | |
| | | */ |
| | | public final void setTypesOnly(boolean typesOnly) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setTypesOnly", String.valueOf(typesOnly)); |
| | | |
| | | this.typesOnly = typesOnly; |
| | | } |
| | |
| | | */ |
| | | public final LDAPFilter getRawFilter() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getRawFilter"); |
| | | |
| | | return rawFilter; |
| | | } |
| | |
| | | */ |
| | | public final void setRawFilter(LDAPFilter rawFilter) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setRawFilter", String.valueOf(rawFilter)); |
| | | |
| | | this.rawFilter = rawFilter; |
| | | |
| | |
| | | */ |
| | | public final SearchFilter getFilter() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getFilter"); |
| | | |
| | | return filter; |
| | | } |
| | |
| | | */ |
| | | public final LinkedHashSet<String> getAttributes() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getAttributes"); |
| | | |
| | | return attributes; |
| | | } |
| | |
| | | */ |
| | | public final void setAttributes(LinkedHashSet<String> attributes) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setAttributes", |
| | | String.valueOf(attributes)); |
| | | |
| | | if (attributes == null) |
| | | { |
| | |
| | | */ |
| | | public final int getEntriesSent() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getEntriesSent"); |
| | | |
| | | return entriesSent; |
| | | } |
| | |
| | | */ |
| | | public final int getReferencesSent() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getReferencesSent"); |
| | | |
| | | return referencesSent; |
| | | } |
| | |
| | | @Override() |
| | | public final long getProcessingStartTime() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getProcessingStartTime"); |
| | | |
| | | return processingStartTime; |
| | | } |
| | |
| | | @Override() |
| | | public final long getProcessingStopTime() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getProcessingStopTime"); |
| | | |
| | | return processingStopTime; |
| | | } |
| | |
| | | @Override() |
| | | public final long getProcessingTime() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getProcessingTime"); |
| | | |
| | | return (processingStopTime - processingStartTime); |
| | | } |
| | |
| | | */ |
| | | public final boolean returnEntry(Entry entry, List<Control> controls) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "returnEntry", String.valueOf(entry)); |
| | | |
| | | |
| | | // See if the operation has been abandoned. If so, then don't send the |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // See if the size limit has been exceeded. If so, then don't send the |
| | | // entry and indicate that the search should end. |
| | | if ((sizeLimit > 0) && (entriesSent >= sizeLimit)) |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // See if the time limit has expired. If so, then don't send the entry and |
| | | // indicate that the search should end. |
| | | if ((timeLimit > 0) && (TimeThread.getTime() >= timeLimitExpiration)) |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // Determine whether the provided entry is a subentry and if so whether it |
| | | // should be returned. |
| | | if ((scope != SearchScope.BASE_OBJECT) && (! returnLDAPSubentries) && |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "returnEntry", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | public final boolean returnReference(SearchResultReference reference) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "returnReference", String.valueOf(reference)); |
| | | |
| | | // See if the operation has been abandoned. If so, then don't send the |
| | | // reference and indicate that the search should end. |
| | |
| | | */ |
| | | public final void sendSearchResultDone() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "sendSearchResultDone"); |
| | | |
| | | |
| | | // Send the search result done message to the client. We want to make sure |
| | |
| | | @Override() |
| | | public final List<Control> getResponseControls() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getResponseControls"); |
| | | |
| | | return responseControls; |
| | | } |
| | |
| | | @Override() |
| | | public final void run() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "run"); |
| | | |
| | | setResultCode(ResultCode.UNDEFINED); |
| | | boolean sendResponse = true; |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | appendErrorMessage(de.getErrorMessage()); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | appendErrorMessage(de.getErrorMessage()); |
| | |
| | | } |
| | | catch (LDAPException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | setResultCode(ResultCode.valueOf(le.getResultCode())); |
| | | appendErrorMessage(le.getMessage()); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(ResultCode.PROTOCOL_ERROR); |
| | | |
| | |
| | | } |
| | | catch (LDAPException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | setResultCode(ResultCode.valueOf(le.getResultCode())); |
| | | appendErrorMessage(le.getMessage()); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | appendErrorMessage(de.getErrorMessage()); |
| | |
| | | } |
| | | catch (LDAPException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | setResultCode(ResultCode.valueOf(le.getResultCode())); |
| | | appendErrorMessage(le.getMessage()); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | appendErrorMessage(de.getErrorMessage()); |
| | |
| | | } |
| | | catch (LDAPException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | setResultCode(ResultCode.valueOf(le.getResultCode())); |
| | | appendErrorMessage(le.getMessage()); |
| | |
| | | } |
| | | catch (LDAPException le) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", le); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, le); |
| | | } |
| | | |
| | | setResultCode(ResultCode.valueOf(le.getResultCode())); |
| | | appendErrorMessage(le.getMessage()); |
| | |
| | | } |
| | | catch (DirectoryException de) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", de); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, de); |
| | | } |
| | | |
| | | setResultCode(de.getResultCode()); |
| | | appendErrorMessage(de.getErrorMessage()); |
| | |
| | | } |
| | | catch (CancelledOperationException coe) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", coe); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, coe); |
| | | } |
| | | |
| | | CancelResult cancelResult = coe.getCancelResult(); |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "run", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | |
| | | setResultCode(DirectoryServer.getServerErrorResultCode()); |
| | | |
| | |
| | | private final void searchBackend(Backend backend) |
| | | throws DirectoryException, CancelledOperationException |
| | | { |
| | | assert debugEnter(CLASS_NAME, "searchBackend", String.valueOf(backend)); |
| | | |
| | | |
| | | // Check for and handle a request to cancel this operation. |
| | |
| | | @Override() |
| | | public final CancelResult cancel(CancelRequest cancelRequest) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "cancel", String.valueOf(cancelRequest)); |
| | | |
| | | this.cancelRequest = cancelRequest; |
| | | |
| | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | assert debugException(CLASS_NAME, "cancel", e); |
| | | if (debugEnabled()) |
| | | { |
| | | debugCought(DebugLogLevel.ERROR, e); |
| | | } |
| | | } |
| | | |
| | | cancelResult = getCancelResult(); |
| | |
| | | @Override() |
| | | public final CancelRequest getCancelRequest() |
| | | { |
| | | assert debugEnter(CLASS_NAME, "getCancelRequest"); |
| | | |
| | | return cancelRequest; |
| | | } |
| | |
| | | @Override() |
| | | boolean setCancelRequest(CancelRequest cancelRequest) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "setCancelRequest", |
| | | String.valueOf(cancelRequest)); |
| | | |
| | | this.cancelRequest = cancelRequest; |
| | | return true; |
| | |
| | | @Override() |
| | | public final void toString(StringBuilder buffer) |
| | | { |
| | | assert debugEnter(CLASS_NAME, "toString", "java.lang.StringBuilder"); |
| | | |
| | | buffer.append("SearchOperation(connID="); |
| | | buffer.append(clientConnection.getConnectionID()); |