/**
 * Copyright (C) 2000, Intalio Inc.
 *
 * The program(s) herein may be used and/or copied only with the
 * written permission of Intalio Inc. or in accordance with the terms
 * and conditions stipulated in the agreement/contract under which the
 * program(s) have been supplied.
 *
 * $Id: BasicSearchQuery.java,v 1.1 2001/07/16 22:56:34 kothapa Exp $
 */


package org.apache.slide.search;

import java.util.Enumeration;

import org.apache.webdav.lib.methods.DepthSupport;

/**
 * Object representation of query as defined in DAV Searching & Locating (DASL), 
 * an application of HTTP/1.1 forming a lightweight search protocol to transport queries and result sets 
 * and allows clients to make use of server-side search facilities.
 *
 * @author <a href="kothapa@intalio.com">Rajkumar Kothapa</a>
 * @version $Revision: 1.1 $
 */
public class BasicSearchQuery extends SearchQuery {

    public static final String DAV_PREFIX = "D:"; 

	public static final String DAV_NAMESPACE = "DAV:" ;

    /**
     * Request of named properties.
     */
    public static final int BY_NAME = 0;


    /**
     * Request of all properties name and value.
     */
    public static final int ALL = 1;


    public BasicSearchQuery(String href) {
		  basicSearchScope = new BasicSearchScope(href , DepthSupport.DEPTH_INFINITY );
		  type = ALL;
	}
     

    public BasicSearchQuery(String href,int depth) {
		  basicSearchScope = new BasicSearchScope(href , depth);
		  type = ALL;
	}

	public BasicSearchQuery(BasicSearchScope basicSearchScope) {
          this.basicSearchScope = basicSearchScope;
		  type = ALL;
	}

	/**
	 *  Constructor
	 */
    public BasicSearchQuery(Enumeration properties,String href) {
	      this.properties = properties;
		  basicSearchScope = new BasicSearchScope(href , DepthSupport.DEPTH_INFINITY );
		  type = BY_NAME;
	}

	public BasicSearchQuery(Enumeration properties,String href,int depth ) {
          this.properties = properties;
		  basicSearchScope = new BasicSearchScope(href,depth);
		  type = BY_NAME;
	}

    /**
	 *   Create the query with the given property names and the search scope 
	 */
    public BasicSearchQuery(Enumeration properties,BasicSearchScope basicSearchScope) {
          this.properties = properties;
		  this.basicSearchScope = basicSearchScope; 
		  type = BY_NAME;
	}

	/**
	 *  create the query with the given property names, scope and the condition  
	 */
	 public BasicSearchQuery(Enumeration properties,BasicSearchScope basicSearchScope,BasicSearchCondition basicSearchCondition) {
          this.properties = properties;
		  this.basicSearchScope = basicSearchScope;
		  this.basicSearchCondition = basicSearchCondition;
          type = BY_NAME;
	 }

	 /**
	  *  create the query with the given property names, scope,condition  and order   
	  */
	 public BasicSearchQuery(Enumeration properties,BasicSearchScope basicSearchScope,BasicSearchCondition basicSearchCondition,
		                         BasicSearchOrder basicSearchOrder) {
          this.properties = properties;
		  this.basicSearchScope = basicSearchScope;
		  this.basicSearchCondition = basicSearchCondition;
		  this.basicSearchOrder = basicSearchOrder;
		  type = BY_NAME;
	 }

	 /**
	  *  create the query for all property names, scope,condition  and order   
	  */
	 public BasicSearchQuery(BasicSearchScope basicSearchScope,BasicSearchCondition basicSearchCondition,
		                         BasicSearchOrder basicSearchOrder) {
          this.properties = properties;
		  this.basicSearchScope = basicSearchScope;
		  this.basicSearchCondition = basicSearchCondition;
		  this.basicSearchOrder = basicSearchOrder;
		  type = ALL;
	 }

	 /**
	  *  create the query for all property names, scope and condition     
	  */
	 public BasicSearchQuery(BasicSearchScope basicSearchScope,BasicSearchCondition basicSearchCondition ) {
     	  this.basicSearchScope = basicSearchScope;
		  this.basicSearchCondition = basicSearchCondition;
		  type = ALL;
	 }


    /**
	 *  Type of the search
	 */
	protected int type = ALL;

	/**
	 *  The search order 
	 */
	protected BasicSearchOrder basicSearchOrder;

	/**
	 *  The search scope
	 */
    protected BasicSearchScope basicSearchScope;

	/**
	 * the search condition
	 */
    protected BasicSearchCondition basicSearchCondition;

	/**
	 *  The list of properties in the select element 
	 */
    protected Enumeration properties;

	/**
	 *  The maximum number of results that should be returned in the result  
	 */
    protected int limit = -1 ;
    
 
    /**
	 *  Sets the search condition
	 */
    public void setSearchCondition(BasicSearchCondition basicSearchCondition) {
	   	 this.basicSearchCondition = basicSearchCondition; 
	}

    /**
	 *  Sets the limit on the number of results in the response
	 */
    public void setLimit(int limit) {
		 this.limit = limit;
    }


	public void addSearchOrder(SearchProperty property) {
         if(basicSearchOrder==null) 
              basicSearchOrder = new BasicSearchOrder(property) ; 
		 
		 basicSearchOrder.addOrder(property);
		 
	}

	public void addSearchOrder(SearchProperty property,int order) {
         if(basicSearchOrder==null) 
              basicSearchOrder = new BasicSearchOrder(property,order) ; 
		 
		 basicSearchOrder.addOrder(property,order);
		 
	}

	public void addSearchOrder(SearchProperty property,int order,boolean caseSensitive) {
         if(basicSearchOrder==null) 
              basicSearchOrder = new BasicSearchOrder(property,order,caseSensitive) ; 
		 
		 basicSearchOrder.addOrder(property,order,caseSensitive);
		 
	}

	public void addSearchOrder(SearchProperty property,boolean caseSensitive) {
         if(basicSearchOrder==null) 
              basicSearchOrder = new BasicSearchOrder(property,caseSensitive) ; 
		 
	     basicSearchOrder.addOrder(property,caseSensitive);
		 
	}

	public void setSearchOrder(BasicSearchOrder basicSearchOrder) {
         this.basicSearchOrder = basicSearchOrder;
	}


    /**
	 *  returns the search order
	 */
	public BasicSearchOrder getSearchOrder() {
          return basicSearchOrder;          
	}

    /**
	 *  returns the search scope
	 */
	public BasicSearchScope getSearchScope() {
          return basicSearchScope;          
	}


    /**
	 *  returns the search condition
	 */
	public BasicSearchCondition getSearchCondition() {
          return basicSearchCondition;          
	}

	/**
	 *  Returns the property selection type
	 */
    public int getPropertySelectionType() {
          return type ;
	}

    /**
	 *  return the list of properties asked for or null if all the properties were requested
	 */
    public Enumeration getProperties() {
	     if(type == ALL) {
		      return null;	 
		 }

		 return properties;
	}


	/**
  	 *  Returns a xml string representation of the search criteria 
	 */
	public String toXML() {
         String result = "<"  + BasicSearchQuery.DAV_PREFIX + "searchrequest" + ">" ;
		 result +=  "<"  + BasicSearchQuery.DAV_PREFIX + "basicsearch" + ">" ;
         result +=  "<"  + BasicSearchQuery.DAV_PREFIX + "select" + ">" ;
		 if(type == ALL) {
               result += "<"  + BasicSearchQuery.DAV_PREFIX + "allprop" + " />" ;
		 }else {
               result += "<"  + BasicSearchQuery.DAV_PREFIX + "prop>" ;
			   while(properties.hasMoreElements()) {
                    result +=  "<"  + BasicSearchQuery.DAV_PREFIX + ((SearchProperty)properties.nextElement()).getPropertyName()
						                              + " />" ;
			   }
                
               result += "</"  + BasicSearchQuery.DAV_PREFIX + "prop>" ;
		 }
         
		 result +=  "</"  + BasicSearchQuery.DAV_PREFIX + "select" + ">" ;

		 if(basicSearchScope!=null ) {
               result += basicSearchScope.toXML();
		 }

		 if(basicSearchCondition!=null) {
               result += basicSearchCondition.toXML();
		 }

		 if(basicSearchOrder!=null ) {
               result += basicSearchOrder.toXML();
		 }

         if(limit!=-1) {
               result += "<"  + BasicSearchQuery.DAV_PREFIX + "limit" + ">" ;
               result += "<"  + BasicSearchQuery.DAV_PREFIX + "nresults" + ">" ;
               result += limit;
               result += "</"  + BasicSearchQuery.DAV_PREFIX + "nresults" + ">" ;
			   result += "</"  + BasicSearchQuery.DAV_PREFIX + "limit" + ">" ;
		 }
		  
         result +=  "</"  + BasicSearchQuery.DAV_PREFIX + "basicsearch" + ">" ;
         result +=  "</"  + BasicSearchQuery.DAV_PREFIX + "searchrequest" + ">" ;

		 return result;
	}
} 