Wolf
Accueil
News
Recherche
Articles
Liens
 Accès membre 
 
Identifiant :

Mot de passe:
 ok
 Nous rejoindre
 
topten
Les 10 meilleurs
news et articles
au classement des votes!


articles

Comment ecrire un Qualifier
Note :
Publié le 16/12/2002 à 17:43
Par vgadreau

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é:


  • D'abord créer une classe dérivée de EOQualifier. Il n'y a pas de constructeur specifique dont il faut s'occuper, mais il est pratique d'en faire un.

public BetweenQualifier(String aKey, Object aMinimumValue, Object aMaximumValue)

this();

this.setKey(aKey );

this.setMinimumValue(aMinimumValue );

this.setMaximumValue(aMaximumValue );

    }


  • Les méthodes de EOQualifier. Il y a des méthodes assez peu interressantes que vous devriez implémenter:

public void addQualifierKeysToSet(NSMutableSet aSet)

public EOQualifier qualifierWithBindings(NSDictionary someBindings, boolean requiresAll)

public void validateKeysWithRootClassDescription(EOClassDescription aClassDescription)


Aucun d'elle n'est critique.

  • Le corps d'un qualifier est d'habitude dans EOQualifierSQLGeneration. C'est la que vous avez besoin d'implementer la logique SQL pour votre qualifier:

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;

}


  • La seconde plus importante interface est EOQualifierEvaluation. C'est pour l évaluation en mémoire” de votre qualifier. C'est hautement recommandé!

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;

}


  • Finallement,il est souhaitable d'implementer l'interface Cloneable



//
// ===========================================================================
//
// 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;
}
}


how to write a qualifier

[ 0 commentaires ]



Haut de la page

Wolf
 © 2002 SOPHIACOM - A propos de ce site