001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/resources/Utilities.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/exse/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 It has been implemented within SEAGIS - An OpenSource implementation of OpenGIS specification 012 (C) 2001, Institut de Recherche pour le D�veloppement (http://sourceforge.net/projects/seagis/) 013 SEAGIS Contacts: Surveillance de l'Environnement Assist�e par Satellite 014 Institut de Recherche pour le D�veloppement / US-Espace 015 mailto:seasnet@teledetection.fr 016 017 018 This library is free software; you can redistribute it and/or 019 modify it under the terms of the GNU Lesser General Public 020 License as published by the Free Software Foundation; either 021 version 2.1 of the License, or (at your option) any later version. 022 023 This library is distributed in the hope that it will be useful, 024 but WITHOUT ANY WARRANTY; without even the implied warranty of 025 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 026 Lesser General Public License for more details. 027 028 You should have received a copy of the GNU Lesser General Public 029 License along with this library; if not, write to the Free Software 030 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 031 032 Contact: 033 034 Andreas Poth 035 lat/lon GmbH 036 Aennchenstr. 19 037 53115 Bonn 038 Germany 039 E-Mail: poth@lat-lon.de 040 041 Klaus Greve 042 Department of Geography 043 University of Bonn 044 Meckenheimer Allee 166 045 53115 Bonn 046 Germany 047 E-Mail: klaus.greve@uni-bonn.de 048 049 050 ---------------------------------------------------------------------------*/ 051 package org.deegree.model.csct.resources; 052 053 // Collections 054 import java.util.Arrays; 055 056 /** 057 * A set of miscellaneous methods. 058 * 059 * @version 1.0 060 * @author Martin Desruisseaux 061 */ 062 public final class Utilities { 063 /** 064 * An array of strings containing only white spaces. String length are equal 065 * to their index + 1 in the <code>spacesFactory</code> array. For example, 066 * <code>spacesFactory[4]</code> contains a string of length 5. Strings are 067 * constructed only when first needed. 068 */ 069 private static final String[] spacesFactory = new String[20]; 070 071 /** 072 * Forbive object creation. 073 */ 074 private Utilities() { 075 } 076 077 /** 078 * Determines whether the character is a superscript. Most superscripts have 079 * unicode value from \\u2070 to \\u207F inclusive. Superscripts are the 080 * following symbols: 081 * 082 * <blockquote><pre> 083 * \u2070 \u00B9 \u00B2 \u00B3 \u2074 \u2075 \u2076 \u2077 \u2078 \u2079 \u207A \u207B \u207C \u207D \u207E \u207F 084 * </pre></blockquote> 085 */ 086 public static boolean isSuperScript( final char c ) { 087 switch ( c ) { 088 /*1*/case '\u2071': 089 /*2*/case '\u2072': 090 /*3*/case '\u2073': 091 return false; 092 /*1*/case '\u00B9': 093 /*2*/case '\u00B2': 094 /*3*/case '\u00B3': 095 return true; 096 } 097 return ( c >= '\u2070' && c <= '\u207F' ); 098 } 099 100 /** 101 * Determines whether the character is a subscript. Most subscripts have 102 * unicode value from \\u2080 ti \\u208E inclusive. Subscripts are the 103 * following symbols: 104 * 105 * <blockquote><pre> 106 * \u2080 \u2081 \u2082 \u2083 \u2084 \u2085 \u2086 \u2087 \u2088 \u2089 \u208A \u208B \u208C \u208D \u208E 107 * </pre></blockquote> 108 */ 109 public static boolean isSubScript( final char c ) { 110 return ( c >= '\u2080' && c <= '\u208E' ); 111 } 112 113 /** 114 * Converts the character argument to superscript. 115 * Only the following characters can be converted 116 * (other characters are left unchanged): 117 * 118 * <blockquote><pre> 119 * 0 1 2 3 4 5 6 7 8 9 + - = ( ) n 120 * </pre></blockquote> 121 */ 122 public static char toSuperScript( final char c ) { 123 switch ( c ) { 124 case '1': 125 return '\u00B9'; 126 case '2': 127 return '\u00B2'; 128 case '3': 129 return '\u00B3'; 130 case '+': 131 return '\u207A'; 132 case '-': 133 return '\u207B'; 134 case '=': 135 return '\u207C'; 136 case '(': 137 return '\u207D'; 138 case ')': 139 return '\u207E'; 140 case 'n': 141 return '\u207F'; 142 } 143 if ( c >= '0' && c <= '9' ) 144 return (char) ( c + ( '\u2070' - '0' ) ); 145 return c; 146 } 147 148 /** 149 * Converts the character argument to subscript. 150 * Only the following characters can be converted 151 * (other characters are left unchanged): 152 * 153 * <blockquote><pre> 154 * 0 1 2 3 4 5 6 7 8 9 + - = ( ) n 155 * </pre></blockquote> 156 */ 157 public static char toSubScript( final char c ) { 158 switch ( c ) { 159 case '+': 160 return '\u208A'; 161 case '-': 162 return '\u208B'; 163 case '=': 164 return '\u208C'; 165 case '(': 166 return '\u208D'; 167 case ')': 168 return '\u208E'; 169 } 170 if ( c >= '0' && c <= '9' ) 171 return (char) ( c + ( '\u2080' - '0' ) ); 172 return c; 173 } 174 175 /** 176 * Converts the character argument to normal script. 177 */ 178 public static char toNormalScript( final char c ) { 179 switch ( c ) { 180 case '\u00B9': 181 return '1'; 182 case '\u00B2': 183 return '2'; 184 case '\u00B3': 185 return '3'; 186 case '\u2071': 187 return c; 188 case '\u2072': 189 return c; 190 case '\u2073': 191 return c; 192 case '\u207A': 193 return '+'; 194 case '\u207B': 195 return '-'; 196 case '\u207C': 197 return '='; 198 case '\u207D': 199 return '('; 200 case '\u207E': 201 return ')'; 202 case '\u207F': 203 return 'n'; 204 case '\u208A': 205 return '+'; 206 case '\u208B': 207 return '-'; 208 case '\u208C': 209 return '='; 210 case '\u208D': 211 return '('; 212 case '\u208E': 213 return ')'; 214 } 215 if ( c >= '\u2070' && c <= '\u2079' ) 216 return (char) ( c - ( '\u2070' - '0' ) ); 217 if ( c >= '\u2080' && c <= '\u2089' ) 218 return (char) ( c - ( '\u2080' - '0' ) ); 219 return c; 220 } 221 222 /** 223 * Returns a string of the specified length filled with white spaces. 224 * This method try to returns a pre-allocated string if possible. 225 * 226 * @param length The string length. Negative values are clamp to 0. 227 * @return A string of length <code>length</code> filled with with spaces. 228 */ 229 public static String spaces( int length ) { 230 // No need to synchronize. In the unlikely case where two threads 231 // call this method in the same time and the two calls create a new 232 // string, the String.intern() call will take care to canonicalize 233 // the strings. 234 final int last = spacesFactory.length - 1; 235 if ( length < 0 ) 236 length = 0; 237 if ( length <= last ) { 238 if ( spacesFactory[length] == null ) { 239 if ( spacesFactory[last] == null ) { 240 char[] blancs = new char[last]; 241 Arrays.fill( blancs, ' ' ); 242 spacesFactory[last] = new String( blancs ).intern(); 243 } 244 spacesFactory[length] = spacesFactory[last].substring( 0, length ).intern(); 245 } 246 return spacesFactory[length]; 247 } 248 char[] blancs = new char[length]; 249 Arrays.fill( blancs, ' ' ); 250 return new String( blancs ); 251 252 } 253 254 /** 255 * Returns a short class name for the specified class. This method will 256 * ommit the package name. For exemple, it will returns "String" instead 257 * of "java.lang.String" for a {@link String} object. 258 * 259 * @param classe The object (may be <code>null</code>). 260 * @return A short class name for the specified object. 261 */ 262 public static String getShortName( final Class classe ) { 263 if ( classe == null ) 264 return "<*>"; 265 String name = classe.getName(); 266 int lower = name.lastIndexOf( '.' ); 267 int upper = name.length(); 268 return name.substring( lower + 1, upper ).replace( '$', '.' ); 269 } 270 271 /** 272 * Returns a short class name for the specified object. This method will 273 * ommit the package name. For exemple, it will returns "String" instead 274 * of "java.lang.String" for a {@link String} object. 275 * 276 * @param object The object (may be <code>null</code>). 277 * @return A short class name for the specified object. 278 */ 279 public static String getShortClassName( final Object object ) { 280 return getShortName( object != null ? object.getClass() : null ); 281 } 282 283 /** 284 * Convenience method for testing two objects for 285 * equality. One or both objects may be null. 286 */ 287 public static boolean equals( final Object object1, final Object object2 ) { 288 return ( object1 == object2 ) || ( object1 != null && object1.equals( object2 ) ); 289 } 290 291 292 }