Return-Path: Delivered-To: apmail-jakarta-commons-dev-archive@apache.org Received: (qmail 8932 invoked from network); 7 Jun 2002 15:18:45 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 7 Jun 2002 15:18:45 -0000 Received: (qmail 29604 invoked by uid 97); 7 Jun 2002 15:18:16 -0000 Delivered-To: qmlist-jakarta-archive-commons-dev@jakarta.apache.org Received: (qmail 29546 invoked by uid 97); 7 Jun 2002 15:18:14 -0000 Mailing-List: contact commons-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Jakarta Commons Developers List" Reply-To: "Jakarta Commons Developers List" Delivered-To: mailing list commons-dev@jakarta.apache.org Received: (qmail 29436 invoked by uid 98); 7 Jun 2002 15:18:09 -0000 X-Antivirus: nagoya (v4198 created Apr 24 2002) From: "Eric Pugh" To: "'Jakarta Commons Developers List'" Subject: RE: [COLLECTIONS/BEANUTILS] Is there a comparator that can dynamically pick a method to call on a bean? Date: Fri, 7 Jun 2002 11:07:12 -0400 Message-ID: <001401c20e35$bab3db40$bdad94d0@mccom.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook CWS, Build 9.0.2416 (9.0.2910.0) X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Importance: Normal In-Reply-To: X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N 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: > For additional commands, e-mail: > > -- To unsubscribe, e-mail: For additional commands, e-mail: -- To unsubscribe, e-mail: For additional commands, e-mail: