org.deegree_impl.model.resources
Class ClassChanger

java.lang.Object
  extended byorg.deegree_impl.model.resources.ClassChanger

public abstract class ClassChanger
extends java.lang.Object

Transforme un objet d'une classe vers une autre. Cette classe sert principalement à convertir en Number des objets d'une autre classe, par exemple Date. Une méthode statique, toNumber(java.lang.Comparable), se charge d'effectuer ce genre de conversion en prenant en compte toutes les classes qui auront été déclarées à ClassChanger.

Pour déclarer une nouvelle classe, on peut procéder comme suit. L'exemple ci-dessous inscrit une classe qui convertira des objets Date en objets Long. Notez qu'il ne s'agit que d'un exemple. Ce convertisseur n'a pas besoin d'être déclaré car ClassChanger comprend déjà les objets Date par défaut.

  ClassChanger.register(new ClassChanger(Date.class, Long.class)
  {
      protected Number convert(final Comparable o)
      {return new Long(((Date) o).getTime());}
  
      protected Comparable inverseConvert(final Number number)
      {return new Date(number.longValue());}
  });
 

Version:
1.0
Author:
Martin Desruisseaux

Field Summary
private static ClassChanger[] list
          Liste des classes d'objets pouvant être convertis en nombre.
private  java.lang.Class source
          Parent class for convert(java.lang.Comparable)'s input objects.
private  java.lang.Class target
          Parent class for convert(java.lang.Comparable)'s output objects.
 
Constructor Summary
protected ClassChanger(java.lang.Class source, java.lang.Class target)
          Construct a new class changer.
 
Method Summary
protected abstract  java.lang.Number convert(java.lang.Comparable object)
          Returns the numerical value for an object.
private static ClassChanger getClassChanger(java.lang.Class source)
          Returns the class changer for the specified classe.
static java.lang.Class getTransformedClass(java.lang.Class source)
          Returns the target class for the specified source class, if a suitable transformation is known.
protected abstract  java.lang.Comparable inverseConvert(java.lang.Number value)
          Returns an instance of the converted classe from a numerical value.
static void register(ClassChanger converter)
          Inscrit un nouvel objet ClassChanger.
static java.lang.Comparable toComparable(java.lang.Number value, java.lang.Class classe)
          Wrap the specified number as an instance of the specified classe.
static java.lang.Number toNumber(java.lang.Comparable object)
          Returns the numeric value for the specified object.
 java.lang.String toString()
          Returns a string representation for this class changer.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

list

private static ClassChanger[] list
Liste des classes d'objets pouvant être convertis en nombre. Cette liste contiendra par défaut quelques instances de ClassChanger pour quelques classes standards du Java, telle que Date. Toutefois, d'autres objets pourront être ajoutés par la suite. Cette liste est ordonnée. Les classe le plus hautes dans la hierarchie (les classes parentes) doivent apparaître à la fin.


source

private final java.lang.Class source
Parent class for convert(java.lang.Comparable)'s input objects.


target

private final java.lang.Class target
Parent class for convert(java.lang.Comparable)'s output objects.

Constructor Detail

ClassChanger

protected ClassChanger(java.lang.Class source,
                       java.lang.Class target)
Construct a new class changer.

Parameters:
source - Parent class for convert(java.lang.Comparable)'s input objects.
target - Parent class for convert(java.lang.Comparable)'s output objects.
Method Detail

convert

protected abstract java.lang.Number convert(java.lang.Comparable object)
                                     throws java.lang.ClassCastException
Returns the numerical value for an object.

Parameters:
object - Object to convert (may be null).
Returns:
The object's numerical value.
Throws:
java.lang.ClassCastException - if object is not of the expected class.

inverseConvert

protected abstract java.lang.Comparable inverseConvert(java.lang.Number value)
Returns an instance of the converted classe from a numerical value.

Parameters:
value - The value to wrap.
Returns:
An instance of the source classe.

toString

public java.lang.String toString()
Returns a string representation for this class changer.


register

public static void register(ClassChanger converter)
                     throws java.lang.IllegalStateException
Inscrit un nouvel objet ClassChanger. Les objets ClassChanger inscrits ici seront pris en compte par la méthode toNumber(java.lang.Comparable). Si un objet ClassChanger existait déjà pour une même classe, une exception sera lancée. Cette spécification est justifiée par le fait qu'on enregistre souvent un objet ClassChanger lors de l'initialisation d'une classe qui vient d'être chargée pour la première fois. En interdisant tout changements aux objets ClassChanger après l'initialisation d'une classe, on évite que la façon de convertir des objets en nombres réels ne change au cours d'une exécution de la machine virtuelle. Notez que si converter ne peut pas prendre en charge une même classe que celle d'un autre objet ClassChanger, il peut toutefois prendre en charge une classe parente ou une classe fille.

Parameters:
converter - Convertisseur à ajouter à la liste des convertisseurs déjà existants.
Throws:
java.lang.IllegalStateException - si un autre objet ClassChanger prennait déjà en charge la même classe (l'argument classe déclaré au constructeur) que converter.

getClassChanger

private static ClassChanger getClassChanger(java.lang.Class source)
                                     throws java.lang.ClassNotFoundException
Returns the class changer for the specified classe.

Throws:
java.lang.ClassNotFoundException - if source is not a registered class.

getTransformedClass

public static java.lang.Class getTransformedClass(java.lang.Class source)
Returns the target class for the specified source class, if a suitable transformation is known. The source class is a Comparable subclass that will be specified as input to convert(java.lang.Comparable). The target class is a Number subclass that wimm be returned as output by convert(java.lang.Comparable). If no suitable mapping is found, then source is returned.


toNumber

public static java.lang.Number toNumber(java.lang.Comparable object)
                                 throws java.lang.ClassNotFoundException
Returns the numeric value for the specified object. For example the code toNumber(new Date()) returns the Date.getTime() value of the specified date object as a Long.

Parameters:
object - Object to convert (may be null).
Returns:
null if object was null; otherwise object if the supplied object is already an instance of Number; otherwise a new number with the numerical value.
Throws:
java.lang.ClassNotFoundException - if object is not an instance of a registered class.

toComparable

public static java.lang.Comparable toComparable(java.lang.Number value,
                                                java.lang.Class classe)
                                         throws java.lang.ClassNotFoundException
Wrap the specified number as an instance of the specified classe. For example toComparable(Date.class, new Long(time)) is equivalent to new Date(time). There is of course no point to use this method if the destination class is know at compile time. This method is useful for creating instance of classes choosen dynamically at run time.

Parameters:
value - The numerical value (may be null).
classe - The desired classe for return value.
Throws:
java.lang.ClassNotFoundException - if classe is not a registered class.