You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by ju...@apache.org on 2004/06/02 15:44:41 UTC

cvs commit: jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search XResourceImpl.java

juergen     2004/06/02 06:44:41

  Modified:    proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search
                        Tag: TWS421_BRANCH XResourceImpl.java
  Log:
  First fix for a proper sorting.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.4.1   +150 -4    jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XResourceImpl.java
  
  Index: XResourceImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/proposals/tamino/src/store/org/apache/slide/store/tamino/datastore/search/XResourceImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.1.4.1
  diff -u -r1.1 -r1.1.4.1
  --- XResourceImpl.java	25 Mar 2004 16:18:02 -0000	1.1
  +++ XResourceImpl.java	2 Jun 2004 13:44:40 -0000	1.1.4.1
  @@ -24,16 +24,27 @@
   
   import org.apache.slide.store.tamino.common.XGlobals;
   import org.apache.slide.store.tamino.datastore.XContentId;
  +
  +import java.io.StringReader;
  +import java.io.StringWriter;
   import java.util.Iterator;
  +import java.util.List;
  +
   import org.apache.slide.common.SlideException;
   import org.apache.slide.content.NodeProperty;
   import org.apache.slide.search.SearchException;
   import org.apache.slide.search.basic.ComparableResourceImpl;
  +import org.apache.slide.search.basic.ComparableResource;
  +import org.apache.slide.search.CompareHint;
   import org.apache.slide.search.basic.IBasicQuery;
   import org.apache.slide.structure.ObjectNode;
   import org.apache.slide.util.XMLValue;
  +import org.jdom.Document;
   import org.jdom.Element;
   import org.jdom.Namespace;
  +import org.jdom.input.SAXBuilder;
  +import org.jdom.output.XMLOutputter;
  +import org.jdom.xpath.XPath;
   
   /**
    * Represents one result set object. This implementation deals with the xdav
  @@ -180,6 +191,141 @@
               xmlValue.add (result);
           }
       }
  +    
  +    
  +    /**
  +     * compares two RequestedResources according to OrderByHint. NULL values are
  +     * always considered as lessThan. (see [DASL] 5.6). Called in orderBy context
  +     * May only return 0 if the URIs are equal.
  +     * If both properties are XML valued and this value was created by an xpath
  +     * expression, do the specialised handling, else call the super method.
  +     *
  +     * @param    otherResource       a  RequestedResource
  +     * @param    hint                an OrderByHint
  +     *
  +     * @return   an int
  +     *
  +     */
  +    public int compareTo (ComparableResource otherResource, CompareHint hint) {
  +        int result = 0;
  +
  +        if (getInternalHref().equals (otherResource.getInternalHref()))
  +            return 0;
  +        
  +        Comparable otherValue = (Comparable)otherResource.getThisValue (hint.getPropName(), hint.getPropNamespace());
  +        Comparable thisValue  = (Comparable) getThisValue (hint.getPropName(), hint.getPropNamespace());
  +        
  +        if ((hint instanceof XCompareHint) && (((XCompareHint)hint).getSortBy() != null) &&
  +        		(otherValue instanceof XMLValue) && (thisValue instanceof XMLValue)) {
  +            if (thisValue != null && otherValue != null) {
  +                result = compareXpathDrivenValues((XMLValue)thisValue, (XMLValue)otherValue, (XCompareHint)hint);
  +            }
  +            else if (thisValue == null)
  +                result = -1;
  +                
  +            else if (otherValue == null)
  +                result = 1;
  +        }
  +        else {
  +        	return super.compareTo(otherResource, hint);
  +	
  +        }
  +
  +        if (hint.isAscending() == false)
  +            result = result * -1;
  +        
  +        return result;
  +    }
  +    
  +    public int compareXpathDrivenValues(XMLValue thisResource, XMLValue otherResource, XCompareHint hint) {
  +        int result = 0;
  +        
  +        try {
  +        	
  +	        List thisList  = XPath.newInstance("string(//"+hint.getSortBy()+")").selectNodes(getElementAsElement((Element)(thisResource.getList().get(1))));
  +	        List otherList = XPath.newInstance("string(//"+hint.getSortBy()+")").selectNodes(getElementAsElement((Element)(otherResource.getList().get(1))));
  +	
  +//	        System.out.println( );
  +//	        System.out.println("Element 1\n" + getElementAsString((Element)(thisResource.getList().get(1))));
  +//	        System.out.println("Element 2\n" + getElementAsString((Element)(otherResource.getList().get(1))));
  +//	        System.out.println("Comparing " );
  +//	        System.out.println("String1 = " + otherList.get(0) );
  +//	        System.out.println("String2 = " + thisList.get(0) );
  +	        
  +	        int thisSize  = thisList.size();
  +	        int otherSize = otherList.size();
  +	
  +	        // compare based on the size of the lists
  +	        if (thisSize != otherSize) {
  +	        	return new Integer(thisSize).compareTo(new Integer(otherSize));
  +	        }
  +	        
  +	        
  +	        for( int i=0; i < thisSize; i++ ) {
  +	        	String thisString = (String)thisList.get(i);
  +	        	String thatString = (String)otherList.get(i);
  +	
  +				if (!thisString.equals(thatString)) {
  +					return thisString.compareTo(thatString);
  +				}
  +	        }
  +	        
  +        }
  +        catch (Exception e) {
  +        	e.printStackTrace();
  +        }
  +    
  +    return result;
  +
  +    }
  +    
  +    
  +    
  +    
  +
  +
  +	/**
  +	 * @throws IOException
  +	 */
  +	private String getElementAsString(Element e)  {
  +		StringWriter writer = new StringWriter(); 
  +
  +		XMLOutputter o2 = new XMLOutputter("  ", true, "utf-8");
  +		o2.setTrimAllWhite(true);
  +		try {
  +		    o2.output( e, writer );
  +		}
  +		catch (Exception exception) {
  +			exception.printStackTrace();
  +		}
  +		
  +		return writer.toString();
  +
  +		}
  +	
  +	private Element getElementAsElement(Element e)  {
  +		return getStringAsElement(getElementAsString(e));
  +		}
  +
  +private Element getStringAsElement(String s)  {
  +	Element e = null;
  +	try {
  +		SAXBuilder b = new SAXBuilder();
  +	    Document d = b.build( new StringReader(s) );
  +	    e = d.getRootElement();
  +		
  +	} catch (Exception ex) {
  +		ex.printStackTrace();
  +	}
  +
  +	
  +	return e;
  +
  +	}
  +
  +
  +
  +
   }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org