package org.safehaus.penrose.operation;
import org.safehaus.penrose.ldap.*;
import org.safehaus.penrose.filter.Filter;
import org.safehaus.penrose.schema.SchemaManager;
import org.safehaus.penrose.session.Session;
import org.safehaus.penrose.statistic.StatisticManager;
import org.ietf.ldap.LDAPException;
import java.util.Collection;
/**
* @author Endi Sukma Dewata
*/
public class BasicSearchOperation extends BasicOperation implements SearchOperation {
protected long createTimestamp;
protected long closeTimestamp;
protected SearchRequest searchRequest;
protected SearchResponse searchResponse;
protected long bufferSize;
protected DN bindDn;
protected DN dn;
protected Filter filter;
protected int scope;
protected int dereference;
protected boolean typesOnly;
protected long sizeLimit;
protected long timeLimit;
protected Collection<String> attributes;
protected long totalCount;
public BasicSearchOperation(Session session) {
super(session);
}
public void setRequest(Request request) {
setSearchRequest((SearchRequest)request);
}
public void setResponse(Response response) {
setSearchResponse((SearchResponse)response);
}
public SearchRequest getSearchRequest() {
return searchRequest;
}
public void setSearchRequest(SearchRequest searchRequest) {
super.setRequest(searchRequest);
this.searchRequest = searchRequest;
}
public SearchResponse getSearchResponse() {
return searchResponse;
}
public void setSearchResponse(SearchResponse searchResponse) {
super.setResponse(searchResponse);
this.searchResponse = searchResponse;
}
public DN getDn() {
return searchRequest.getDn();
}
public void setDn(DN dn) {
searchRequest.setDn(dn);
}
public Filter getFilter() {
return searchRequest.getFilter();
}
public void setFilter(Filter filter) {
searchRequest.setFilter(filter);
}
public int getScope() {
return searchRequest.getScope();
}
public void setScope(int scope) {
searchRequest.setScope(scope);
}
public int getDereference() {
return searchRequest.getDereference();
}
public void setDereference(int dereference) {
searchRequest.setDereference(dereference);
}
public boolean isTypesOnly() {
return searchRequest.isTypesOnly();
}
public void setTypesOnly(boolean typesOnly) {
searchRequest.setTypesOnly(typesOnly);
}
public Collection<String> getAttributes() {
return searchRequest.getAttributes();
}
public void setAttributes(Collection<String> attributes) {
searchRequest.setAttributes(attributes);
}
public long getSizeLimit() {
return searchRequest.getSizeLimit();
}
public void setSizeLimit(long sizeLimit) {
searchRequest.setSizeLimit(sizeLimit);
}
public long getTimeLimit() {
return searchRequest.getTimeLimit();
}
public void setTimeLimit(long timeLimit) {
searchRequest.setTimeLimit(timeLimit);
}
public void add(SearchResult result) throws Exception {
boolean debug = log.isDebugEnabled();
if (sizeLimit > 0 && totalCount >= sizeLimit) {
LDAPException exception = LDAP.createException(LDAP.SIZE_LIMIT_EXCEEDED);
response.setException(exception);
throw exception;
}
if (timeLimit > 0 && System.currentTimeMillis() - createTimestamp > timeLimit) {
LDAPException exception = LDAP.createException(LDAP.TIME_LIMIT_EXCEEDED);
response.setException(exception);
throw exception;
}
if (abandoned) {
if (debug) log.debug("Operation "+operationName+" has been abandoned.");
return;
}
if (debug) log.debug("Result: \""+result.getDn()+"\".");
searchResponse.add(result);
totalCount++;
}
public void add(SearchReference reference) throws Exception {
boolean debug = log.isDebugEnabled();
if (timeLimit > 0 && System.currentTimeMillis() - createTimestamp > timeLimit) {
LDAPException exception = LDAP.createException(LDAP.TIME_LIMIT_EXCEEDED);
response.setException(exception);
throw exception;
}
if (abandoned) {
if (debug) log.debug("Operation "+operationName+" has been abandoned.");
return;
}
if (debug) log.debug("Reference: \""+ reference.getDn()+"\".");
searchResponse.add(reference);
}
public void init() throws Exception {
createTimestamp = System.currentTimeMillis();
bindDn = session.getBindDn();
dn = searchRequest.getDn();
filter = searchRequest.getFilter();
scope = searchRequest.getScope();
dereference = searchRequest.getDereference();
typesOnly = searchRequest.isTypesOnly();
sizeLimit = searchRequest.getSizeLimit();
timeLimit = searchRequest.getTimeLimit();
attributes = searchRequest.getAttributes();
StatisticManager statisticManager = penrose.getStatisticManager();
SchemaManager schemaManager = session.getPenroseContext().getSchemaManager();
statisticManager.incrementCounter(StatisticManager.SEARCH);
dn = schemaManager.normalize(dn);
//searchRequest.setDn(dn);
attributes = schemaManager.normalize(attributes);
//searchRequest.setAttributes(attributes);
if (searchResponse != null) searchResponse.setBufferSize(bufferSize);
}
public void close() throws Exception {
boolean debug = log.isDebugEnabled();
if (searchResponse != null && searchResponse.isClosed()) {
if (debug) log.debug("Operation "+operationName+" already closed.");
return;
}
if (debug) log.debug("Closing operation "+operationName+".");
closeTimestamp = System.currentTimeMillis();
if (searchResponse != null) searchResponse.close();
}
public boolean isClosed() {
return searchResponse.isClosed();
}
public long getTotalCount() {
return searchResponse.getTotalCount();
}
public long getCreateTimestamp() {
return createTimestamp;
}
public long getCloseTimestamp() {
return closeTimestamp;
}
public void setBufferSize(long bufferSize) {
this.bufferSize = bufferSize;
}
public long getBufferSize() {
return bufferSize;
}
public void setException(LDAPException exception) {
boolean debug = log.isDebugEnabled();
if (debug) log.debug("Error: \""+exception.getMessage()+"\".");
super.setException(exception);
}
}