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:[EMAIL PROTECTED]]
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:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>
>
--
To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>