/* * Map and oceanographical data visualisation * Copyright (C) 1998 University Corporation for Atmospheric Research (Unidata) * 1998 Bill Hibbard & al. (VisAD) * 1999 P�ches et Oc�ans Canada * 2000 Institut de Recherche pour le D�veloppement * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details (http://www.gnu.org/). * * * Contacts: * FRANCE: Surveillance de l'Environnement Assist�e par Satellite * Institut de Recherche pour le D�veloppement / US-Espace * mailto:seasnet@teledetection.fr * * CANADA: Observatoire du Saint-Laurent * Institut Maurice-Lamontagne * mailto:osl@osl.gc.ca * * * This package is inspired from the units package of VisAD. * Unidata and Visad's work is fully acknowledged here. * * THIS IS A TEMPORARY CLASS * * This is a placeholder for future <code>Unit</code> class. * This skeleton will be removed when the real classes from * JSR-108: Units specification will be publicly available. */ package org.deegree.model.csct.units; // Entr�s/sorties import java.io.Serializable; import org.deegree.model.csct.resources.WeakHashSet; /** * Repr�sentation d'un pr�fix du syst�me m�trique. Un objet <code>Prefix</code> * peut par exemple repr�senter des "centi" (symbole "c") comme dans "centim�tres" (symbole "cm"). * La description du paquet <code>javax.units</code> donne une liste des pr�fix standards du * syst�me SI. * * <p><em>Note: this class has a natural ordering that is inconsistent with equals.</em> * La m�thode {@link #compareTo} ne compare que le champ {@link #amount}, tandis que la m�thode * {@link #equals} compare tous les champs ({@link #name}, {@link #symbol} et {@link #amount}).</p> * * @version 1.0 * @author Martin Desruisseaux */ /*public*/final class Prefix implements Comparable, Serializable { /** * Banque des objets qui ont �t� pr�c�demment cr��s et * enregistr�s par un appel � la m�thode {@link #intern}. */ static final WeakHashSet pool = new WeakHashSet(); /** * Nom neutre du pr�fix. Le syst�me SI d�finit plusieurs noms de pr�fix, parmi lesquels on trouve * "milli", "centi" et "kilo". Certaines unit�s (notamment des unit�s du type ) * pourront combiner leurs noms avec un nom de pr�fix. Par exemple le pr�fix "centi" (symbole "c") * pourra �tre combin� avec les unit�s "m�tres" (symbole "m") pour former les "centim�tres" (symbole * "cm"). La cha�ne <code>name</code> peut �tre vide, mais ne sera jamais nulle. Notez enfin que * <code>name</code> est "language-neutral". Pour obtenir un nom dans la langue de l'utilisateur, * utilisez la m�thode {@link #getLocalizedName}. */ public final String name; /** * Symbole du pr�fix. La plupart des symboles de pr�fix n'ont qu'une seule lettre. Il s'agit * la plupart du temps de la premi�re lettre de <code>name</code>, parfois en majuscule. Les * majuscules et minuscules sont significatifs et tr�s importants. Par exemple le symbole "m" * est pour "milli" tandis que le symbole "M" est pour "mega". */ public final String symbol; /** * Quantit� repr�sent� par ce pr�fix. Pour les pr�fix SI, cette quantit� est toujours une puissance de 10. * Par exemple pour les "kilo" (symbole 'k'), la quantit� <code>amount</code> est 1000. Cette quantit� ne * sera jamais <code>NaN</code> ni infinie. */ public final double amount; /** * Construit un pr�fix temporaire. Ce constructeur ne sert qu'� effectuer * des recherches dans une liste de pr�fix par {@link PrefixSet}. */ Prefix( final double amount ) { this.name = ""; this.symbol = ""; this.amount = amount; } /** * Construit un nouveau pr�fix. * * @param name Nom du pr�fix (par exemple "centi" comme dans "centim�tres"). * @param symbol Symbole du pr�fix (par exemple "c" pour "centim�tres"). * @param amount Quantit� repr�sent� par ce pr�fix (par exemple 0.01 pour "c"). */ private Prefix( final String name, final String symbol, final double amount ) { this.name = name.trim(); this.symbol = symbol.trim(); this.amount = amount; if ( !( amount > 0 ) || Double.isInfinite( amount ) ) throw new IllegalArgumentException(); } /** * Construit un nouveau pr�fix. * * @param name Nom du pr�fix (par exemple "centi" comme dans "centim�tres"). * @param symbol Symbole du pr�fix (par exemple "c" pour "centim�tres"). * @param amount Quantit� repr�sent� par ce pr�fix (par exemple 0.01 pour "c"). */ public static Prefix getPrefix( final String name, final String symbol, final double amount ) { return new Prefix( name, symbol, amount ).intern(); } /** * Retourne le nom du pr�fix dans la langue de l'utilisateur. * Par exemple le pr�fix "deci" est �crit "d�ci" en fran�ais. */ public String getLocalizedName() { return org.deegree.model.csct.units.resources.Prefix.localize( name ); } /** * Retourne le symbole du pr�fix. Cette m�thode retourne * syst�matiquement le champ {@link #symbol}. */ public String toString() { return symbol; } /** * Compare deux pr�fix. Cette m�thode compare les quantit�s {@link #amount} de fa�on � permettre un classement * des pr�fix en ordre croissant de quantit�. Contrairement � la m�thode {@link #equals}, <code>compareTo</code> * ne compare pas les noms et symboles des pr�fix. Ainsi, deux pr�fix repr�sentant la m�me quantit� mais avec * des symboles diff�rents seront consid�r�s �gaux par <code>compareTo</code>. */ public int compareTo( final Object object ) { final Prefix that = (Prefix) object; if ( this.amount > that.amount ) return +1; if ( this.amount < that.amount ) return -1; return 0; } /** * Indique si ce pr�fix est identique � l'objet sp�cifi�. * Cette m�thode retourne <code>true</code> si <code>object</code> est aussi un * objet <code>Prefix</code> et si les deux pr�fix ont les m�mes nom et symbole * et repr�sentent la m�me quantit� {@link #amount}. */ public boolean equals( final Object object ) { if ( object == this ) return true; // slight optimisation if ( object instanceof Prefix ) { final Prefix prefix = (Prefix) object; return Double.doubleToLongBits( amount ) == Double.doubleToLongBits( prefix.amount ) && symbol.equals( prefix.symbol ) && name.equals( prefix.name ); } return false; } /** * Retourne un code repr�sentant ce pr�fix. */ public int hashCode() { final long code = Double.doubleToLongBits( amount ); return (int) code ^ (int) ( code >>> 32 ); } /** * Retourne un exemplaire unique de ce pr�fix. Une banque de pr�fix, initialement * vide, est maintenue de fa�on interne par la classe <code>Prefix</code>. Lorsque * la m�thode <code>intern</code> est appel�e, elle recherchera un pr�fix �gale � * <code>this</code> au sens de la m�thode {@link #equals}. Si un tel pr�fix est * trouv�, il sera retourn�. Sinon, le pr�fix <code>this</code> sera ajout� � la * banque de donn�es en utilisant une r�f�rence faible et cette m�thode retournera * <code>this</code>. * <br><br> * De cette m�thode il s'ensuit que pour deux pr�fix <var>u</var> et <var>v</var>, * la condition <code>u.intern()==v.intern()</code> sera vrai si et seulement si * <code>u.equals(v)</code> est vrai. */ private final Prefix intern() { return (Prefix) pool.intern( this ); } /** * Apr�s la lecture d'une unit�, v�rifie si ce pr�fix * appara�t d�j� dans la banque des pr�fix. Si oui, * l'exemplaire de la banque sera retourn� plut�t * que de garder inutilement le pr�fix courant comme copie. */ private Object readResolve() { return intern(); } }