Traduit d'après l'article "how to write a qualifier"
de petite_abeille@mac.com
Voici un petit exemple de comment écrire un EOQualifier personnalisé:
public BetweenQualifier(String aKey, Object aMinimumValue, Object aMaximumValue)
this();
this.setKey(aKey );
this.setMinimumValue(aMinimumValue );
this.setMaximumValue(aMaximumValue );
public void addQualifierKeysToSet(NSMutableSet aSet)
public EOQualifier qualifierWithBindings(NSDictionary someBindings, boolean requiresAll)
public void validateKeysWithRootClassDescription(EOClassDescription aClassDescription)
Aucun d'elle n'est critique.
public String sqlStringForSQLExpression(EOSQLExpression aSQLExpression)
{
if ( ( aSQLExpression != null ) &&
(aSQLExpression.entity() != null ) )
{
EOEntityanEntity = aSQLExpression.entity();
StringaKey= this.key();
ObjectaMinimumValue = this.minimumValue();
ObjectaMaximumValue = this.maximumValue();
if ( ( aKey != null ) && ( aMinimumValue != null ) && (aMaximumValue != null ) ){
StringBufferaBuffer= new StringBuffer();
EOKeyValueQualifier aMinimumQualifier= new EOKeyValueQualifier(aKey, EOQualifier.QualifierOperatorEqual, aMinimumValue);
EOKeyValueQualifier aMaximumQualifier = new EOKeyValueQualifier(aKey, EOQualifier.QualifierOperatorEqual, aMaximumValue);
aMinimumQualifier= (EOKeyValueQualifier) anEntity.schemaBasedQualifier(aMinimumQualifier );
aMaximumQualifier= (EOKeyValueQualifier) anEntity.schemaBasedQualifier(aMaximumQualifier );
aBuffer.append(aSQLExpression.sqlStringForAttributeNamed( aMinimumQualifier.key() ));
aBuffer.append(BetweenQualifier.BetweenStatement );
aBuffer.append( aSQLExpression.sqlStringForValue( aMinimumQualifier.value(), aMinimumQualifier.key() ) );
aBuffer.append(BetweenQualifier.Separator );
aBuffer.append(aSQLExpression.sqlStringForValue(aMaximumQualifier.value(), aMaximumQualifier.key() ) );
return aBuffer.toString();
}
}
return null;
}
public boolean evaluateWithObject(Object anObject)
{
if ( ( anObject != null ) && ( ( anObject instanceof NSKeyValueCoding ) == true ) ){
StringaKey = this.key();
ObjectaMinimumValue = this.minimumValue();
ObjectaMaximumValue = this.maximumValue();
if ( ( aKey != null ) && ( aMinimumValue != null ) && (aMaximumValue != null ) ){
ObjectaValue = ( (NSKeyValueCoding) anObject ).valueForKey( aKey );
if( aValue != null ){
NSComparatoraComparator = this.comparatorForObject( aValue );
if ( aComparator != null ){
booleancontainsObject = false;
try{
intanOrder = aComparator.compare( aMinimumValue, aValue );
if( ( anOrder == NSComparator.OrderedSame) || ( anOrder == NSComparator.OrderedAscending ) ){
anOrder = aComparator.compare( aMaximumValue, aValue );
if ( ( anOrder == NSComparator.OrderedSame ) || ( anOrder == NSComparator.OrderedDescending ) ){
containsObject = true;
}
}
}
catch(NSComparator.ComparisonException anException)
{
}
return containsObject;
}
}
}
}
return false;
}
//
// ===========================================================================
//
// Title: BetweenQualifier.java
// Description: [Description]
// Author: Petite Abeille
// Creation Date: Mon 20-Aug-2001
// Legal: Copyright (C) 2001 Petite Abeille. All Rights Reserved.
// This class is hereby released for all uses.
// No warranties whatsoever.
// Motto: "Victory belongs to those who believe in it the longest"
//
// ---------------------------------------------------------------------------
//
package enterprise;
import com.webobjects.eocontrol.EOQualifierEvaluation;
import com.webobjects.eocontrol.EOQualifier;
import com.webobjects.eocontrol.EOKeyValueQualifier;
import com.webobjects.eocontrol.EOClassDescription;
import com.webobjects.eoaccess.EOQualifierSQLGeneration;
import com.webobjects.eoaccess.EOSQLExpression;
import com.webobjects.eoaccess.EOEntity;
import com.webobjects.foundation.NSKeyValueCoding;
import com.webobjects.foundation.NSArray;
import com.webobjects.foundation.NSDictionary;
import com.webobjects.foundation.NSMutableSet;
import com.webobjects.foundation.NSComparator;
import com.webobjects.foundation.NSTimestamp;
import foundation.Log;
public class BetweenQualifier extends EOQualifier implements EOQualifierSQLGeneration, EOQualifierEvaluation, Cloneable
{
// ===========================================================================
// Constant(s)
// ---------------------------------------------------------------------------
private static final String BetweenStatement = " BETWEEN ";
private static final String Separator = " AND ";
// ===========================================================================
// Class variable(s)
// ---------------------------------------------------------------------------
// ===========================================================================
// Instance variable(s)
// ---------------------------------------------------------------------------
private String _key = null;
private Object _minimumValue = null;
private Object _maximumValue = null;
// ===========================================================================
// Constructor method(s)
// ---------------------------------------------------------------------------
public BetweenQualifier()
{
super();
}
public BetweenQualifier(String aKey, Object aMinimumValue, Object aMaximumValue)
{
this();
this.setKey( aKey );
this.setMinimumValue( aMinimumValue );
this.setMaximumValue( aMaximumValue );
}
// ===========================================================================
// Class method(s)
// ---------------------------------------------------------------------------
// ===========================================================================
// Instance method(s)
// ---------------------------------------------------------------------------
public String key()
{
return _key;
}
public void setKey(String aValue)
{
_key = aValue;
}
public Object minimumValue()
{
return _minimumValue;
}
public void setMinimumValue(Object aValue)
{
_minimumValue = aValue;
}
public Object maximumValue()
{
return _maximumValue;
}
public void setMaximumValue(Object aValue)
{
_maximumValue = aValue;
}
// ===========================================================================
// EOQualifier method(s)
// ---------------------------------------------------------------------------
public void addQualifierKeysToSet(NSMutableSet aSet)
{
if ( aSet != null )
{
String aKey = this.key();
if ( aKey != null )
{
aSet.addObject( aKey );
}
}
}
public EOQualifier qualifierWithBindings(NSDictionary someBindings, boolean requiresAll)
{
return (EOQualifier) this.clone();
}
// FIXME: Should do something here...
public void validateKeysWithRootClassDescription(EOClassDescription aClassDescription)
{
}
// ===========================================================================
// EOQualifierSQLGeneration method(s)
// ---------------------------------------------------------------------------
public String sqlStringForSQLExpression(EOSQLExpression aSQLExpression)
{
if ( ( aSQLExpression != null ) && ( aSQLExpression.entity() != null ) )
{
EOEntity anEntity = aSQLExpression.entity();
String aKey = this.key();
Object aMinimumValue = this.minimumValue();
Object aMaximumValue = this.maximumValue();
if ( ( aKey != null ) && ( aMinimumValue != null ) && ( aMaximumValue != null ) )
{
StringBuffer aBuffer = new StringBuffer();
EOKeyValueQualifier aMinimumQualifier = new EOKeyValueQualifier( aKey, EOQualifier.QualifierOperatorEqual, aMinimumValue );
EOKeyValueQualifier aMaximumQualifier = new EOKeyValueQualifier( aKey, EOQualifier.QualifierOperatorEqual, aMaximumValue );
aMinimumQualifier = (EOKeyValueQualifier) anEntity.schemaBasedQualifier( aMinimumQualifier );
aMaximumQualifier = (EOKeyValueQualifier) anEntity.schemaBasedQualifier( aMaximumQualifier );
aBuffer.append( aSQLExpression.sqlStringForAttributeNamed( aMinimumQualifier.key() ) );
aBuffer.append( BetweenQualifier.BetweenStatement );
aBuffer.append( aSQLExpression.sqlStringForValue( aMinimumQualifier.value(), aMinimumQualifier.key() ) );
aBuffer.append( BetweenQualifier.Separator );
aBuffer.append( aSQLExpression.sqlStringForValue( aMaximumQualifier.value(), aMaximumQualifier.key() ) );
return aBuffer.toString();
}
}
return null;
}
public EOQualifier schemaBasedQualifierWithRootEntity(EOEntity anEntity)
{
return (EOQualifier) this.clone();
}
public EOQualifier qualifierMigratedFromEntityRelationshipPath(EOEntity anEntity, String aPath)
{
return (EOQualifier) this.clone();
}
// ===========================================================================
// EOQualifierEvaluation method(s)
// ---------------------------------------------------------------------------
private NSComparator comparatorForObject(Object anObject)
{
if ( anObject != null )
{
Class anObjectClass = anObject.getClass();
Class[] someClasses = { String.class, Number.class, NSTimestamp.class };
NSComparator[] someComparators = { NSComparator.AscendingStringComparator, NSComparator.AscendingNumberComparator, NSComparator.AscendingTimestampComparator };
int count = someClasses.length;
for ( int index = 0; index < count; index++ )
{
Class aClass = someClasses[ index ];
if ( aClass.isAssignableFrom( anObjectClass ) == true )
{
return someComparators[ index ];
}
}
}
return null;
}
public boolean evaluateWithObject(Object anObject)
{
if ( ( anObject != null ) && ( ( anObject instanceof NSKeyValueCoding ) == true ) )
{
String aKey = this.key();
Object aMinimumValue = this.minimumValue();
Object aMaximumValue = this.maximumValue();
if ( ( aKey != null ) && ( aMinimumValue != null ) && ( aMaximumValue != null ) )
{
Object aValue = ( (NSKeyValueCoding) anObject ).valueForKey( aKey );
if ( aValue != null )
{
NSComparator aComparator = this.comparatorForObject( aValue );
if ( aComparator != null )
{
boolean containsObject = false;
try
{
int anOrder = aComparator.compare( aMinimumValue, aValue );
if ( ( anOrder == NSComparator.OrderedSame ) || ( anOrder == NSComparator.OrderedAscending ) )
{
anOrder = aComparator.compare( aMaximumValue, aValue );
if ( ( anOrder == NSComparator.OrderedSame ) || ( anOrder == NSComparator.OrderedDescending ) )
{
containsObject = true;
}
}
}
catch(NSComparator.ComparisonException anException)
{
}
return containsObject;
}
}
}
}
return false;
}
// ===========================================================================
// Cloneable method(s)
// ---------------------------------------------------------------------------
public Object clone()
{
BetweenQualifier aClone = new BetweenQualifier();
aClone.setKey( new String( this.key() ) );
aClone.setMinimumValue( this.minimumValue() );
aClone.setMaximumValue( this.maximumValue() );
return aClone;
}
}