commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Eric Pugh" <ep...@upstate.com>
Subject RE: [COLLECTIONS/BEANUTILS] Is there a comparator that can dynamically pick a method to call on a bean?
Date Fri, 07 Jun 2002 15:07:12 GMT
I forged ahead..  I had a need to sort in asc/desc...  so I have added a
sortPolarity and sortProperty methods..

Here is what I created...

package com.upstate.util;

import org.apache.commons.beanutils.WrapDynaBean;
import org.apache.commons.beanutils.*;

import org.apache.log4j.Category;

/**
 *  Description of the Class
 *
 *@author     epugh
 *@created    May 5, 2002
 */
public class BeanMethodComparator implements java.util.Comparator {

	public final static String ASC = "ASC";
	public final static String DESC = "DESC";

	private static Category log = Category.getInstance(
BeanMethodComparator.class.getName() );
	private String sortProperty;
	private String sortPolarity = "ASC";

	/**  Constructor for the BeanMethodComparator object */
	public BeanMethodComparator() { }

	/**
	 *  Constructor for the BeanMetodComparator object
	 *
	 *@param  sortProperty  Description of Parameter
	 *@param  sortPolarity  Description of Parameter
	 */
	public BeanMethodComparator( String sortProperty, String sortPolarity ) {
		setSortProperty( sortProperty );
		setSortPolarity( sortPolarity );
	}

	/**
	 *  Sets the sortProperty attribute of the SortDaughterboard object
	 *
	 *@param  sortProperty  The new sortProperty value
	 */
	public void setSortProperty( String sortProperty ) {
		this.sortProperty = sortProperty;
	}

	/**
	 *  Sets the sortPolarity attribute of the SortDaughterboard object
	 *
	 *@param  sortPolarity                            The new sortPolarity
value.
	 *      Can be either "ASC"/"DESC".
	 *@exception  java.lang.IllegalArgumentException  Thrown if you pass in a
bad
	 *      sortPolarity.
	 */
	public void setSortPolarity( String sortPolarity )
		throws java.lang.IllegalArgumentException {
		sortPolarity = sortPolarity.toUpperCase();
		if ( sortPolarity.equals( ASC ) || sortPolarity.equals( DESC ) ) {
			throw new java.lang.IllegalArgumentException( "The argument:" +
sortPolarity + " was invalid." );
		}
		this.sortPolarity = sortPolarity;
	}

	/**
	 *  Gets the sortPolarity attribute of the SortDaughterboard object
	 *
	 *@return    The sortPolarity value
	 */
	public String getSortPolarity() {
		return sortPolarity;
	}


	/**
	 *  Gets the sortProperty attribute of the SortDaughterboard object
	 *
	 *@return    The sortProperty value
	 */
	public String getSortProperty() {
		return sortProperty;
	}

	/**
	 *  Description of the Method
	 *
	 *@param  o1  Description of Parameter
	 *@param  o2  Description of Parameter
	 *@return     Description of the Returned Value
	 */
	public int compare( Object o1, Object o2 ) {
		try {
			WrapDynaBean bean1 = new WrapDynaBean( o1 );
			WrapDynaBean bean2 = new WrapDynaBean( o2 );

			Comparable value1 = (Comparable) bean1.get( sortProperty );
			Comparable value2 = (Comparable) bean2.get( sortProperty );

			int sort = 0;

			if ( ( value1 == null ) & ( value2 == null ) ) {
				sort = 0;
			}
			else if ( value1 == null & value2 != null ) {
				sort = 1;
			}
			else if ( value1 != null & value2 == null ) {
				sort = -1;
			}
			else {
				sort = value1.compareTo( value2 );
			}

			if ( sortPolarity.equals( DESC ) ) {
				sort = sort * -1;
			}

			return sort;
		}

		catch ( Exception e ) {
			log.error( "Problem in Sort. sortPolarity:" + sortPolarity + ",
sortProperty:" + sortProperty, e );
			return 0;
		}
	}

}

Eric Pugh


-----Original Message-----
From: Henri Yandell [mailto:bayard@generationjava.com]
Sent: Friday, June 07, 2002 10:50 AM
To: Jakarta Commons Developers List
Subject: Re: [COLLECTIONS/BEANUTILS] Is there a comparator that can
dynamically pick a method to call on a bean?



I don't think there is one in Commons yet. I've had one for myself for a
bit and it can be a lifesaver sometimes.

BeanComparator bc = new BeanComparator("[1]"); was very sweet when I
realised that would work :) Not just Beans but also arrays/collections.

I'm +1 for a BeanComparator, +1 in that I plan to do it sometime but have
not had the time to learn the Jakarta BeanUtils and stop using my own.

Hen

On Fri, 7 Jun 2002, Eric Pugh wrote:

> Hi all,
>
> I have a series of Torque objects that I want to sort.  Sometimes I want
to
> sort by MethodA, sometiems by MethodB.  (Basically mapping onto all the
> columns in my database).
>
> Right now, I have a comparator compare method that looks like this:
> public int compare( Object o1, Object o2 ) {
> 		Daughterboard db1 = (Daughterboard) o1;
> 		Daughterboard db2 = (Daughterboard) o2;
> 		int sort = 0;
> 		if ( sortMethod.equals( "ScintillationFileNumber" ) ) {
> 			/*
> 			 *  if ( db1 == null == db2 ) {
> 			 *  return 0;
> 			 *  }
> 			 *  else if (db1 == null &&
> 			 */
> 			sort = Strings.clean( db1.getScintillationFileNumber() ).compareTo(
> Strings.clean( db2.getScintillationFileNumber() ) );
>
> 		}
> 		else if ( sortMethod.equals( "DaughterboardId" ) ) {
> 			sort = db1.getDaughterboardId().compareTo( db2.getDaughterboardId() );
> 		}
> 		if ( sortPolarity.equals( "desc" ) ) {
> 			sort = sort * -1;
> 		}
>
> 		return sort;
> 	}
>
> What I really want to do is pass in a sortMethod like
> ScintillationFileNumber, and dynamically call the objects getter for that
> name.  If I wrap my object in a WrapDynaBean, and use that to call the
data,
> will is actually change the ordering of my objects?  Or should I just use
> the WrapDynaBean locally inside of my compare method to facilitate calling
> the methods?
>
> First time using BeanUtils, but it looks great..
>
> Lastly, would a comparator like this be something of general interest to
add
> to the collections list of comparators?
>
> Eric
>
>
>
> --
> To unsubscribe, e-mail:
<mailto:commons-dev-unsubscribe@jakarta.apache.org>
> For additional commands, e-mail:
<mailto:commons-dev-help@jakarta.apache.org>
>
>


--
To unsubscribe, e-mail:
<mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail:
<mailto:commons-dev-help@jakarta.apache.org>


--
To unsubscribe, e-mail:   <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>


Mime
View raw message