001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/datatypes/Types.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstr. 19 030 53115 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 ---------------------------------------------------------------------------*/ 043 package org.deegree.datatypes; 044 045 import java.lang.reflect.Field; 046 import java.net.URI; 047 import java.util.HashMap; 048 import java.util.Map; 049 050 import org.deegree.framework.log.ILogger; 051 import org.deegree.framework.log.LoggerFactory; 052 import org.deegree.framework.util.BootLogger; 053 import org.deegree.ogcbase.CommonNamespaces; 054 055 /** 056 * General data type constants definition. the type values are the same as in 057 * <code>java.sql.Types<code>. Except for several geometry types, 058 * <code>UNKNOWN</code>, <code>FEATURE</code>, <code>FEATURES</code> and 059 * <code>FEATURECOLLECTION</code> that are not known by 060 * <code>java.sql.Types</code>. 061 * <p> 062 * NOTE: Generally, it would be feasible to extend <code>java.sql.Types</code>, 063 * but unfortunately, this is not possible, as it's default constructor is not visible. 064 * </p> 065 * 066 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a> 067 * @author last edited by: $Author: apoth $ 068 * 069 * @version $Revision: 6749 $, $Date: 2007-05-03 10:39:12 +0200 (Do, 03 Mai 2007) $ 070 * 071 * @see java.sql.Types 072 */ 073 public final class Types { 074 075 private static ILogger LOG = LoggerFactory.getLogger( Types.class ); 076 077 private static URI GMLNS = CommonNamespaces.GMLNS; 078 079 // generic sql types 080 081 public final static int ARRAY = java.sql.Types.ARRAY; 082 083 public final static int BIGINT = java.sql.Types.BIGINT; 084 085 public final static int BINARY = java.sql.Types.BINARY; 086 087 public final static int BIT = java.sql.Types.BIT; 088 089 public final static int BLOB = java.sql.Types.BLOB; 090 091 public final static int BOOLEAN = java.sql.Types.BOOLEAN; 092 093 public final static int CHAR = java.sql.Types.CHAR; 094 095 public final static int CLOB = java.sql.Types.CLOB; 096 097 public final static int DATALINK = java.sql.Types.DATALINK; 098 099 public final static int DATE = java.sql.Types.DATE; 100 101 public final static int DECIMAL = java.sql.Types.DECIMAL; 102 103 public final static int DISTINCT = java.sql.Types.DISTINCT; 104 105 public final static int DOUBLE = java.sql.Types.DOUBLE; 106 107 public final static int FLOAT = java.sql.Types.FLOAT; 108 109 public final static int INTEGER = java.sql.Types.INTEGER; 110 111 public final static int JAVA_OBJECT = java.sql.Types.JAVA_OBJECT; 112 113 public final static int LONGVARBINARY = java.sql.Types.LONGVARBINARY; 114 115 public final static int LONGVARCHAR = java.sql.Types.LONGVARCHAR; 116 117 public final static int NULL = java.sql.Types.NULL; 118 119 public final static int NUMERIC = java.sql.Types.NUMERIC; 120 121 public final static int OTHER = java.sql.Types.OTHER; 122 123 public final static int REAL = java.sql.Types.REAL; 124 125 public final static int REF = java.sql.Types.REF; 126 127 public final static int SMALLINT = java.sql.Types.SMALLINT; 128 129 public final static int STRUCT = java.sql.Types.STRUCT; 130 131 public final static int TIME = java.sql.Types.TIME; 132 133 public final static int TIMESTAMP = java.sql.Types.TIMESTAMP; 134 135 public final static int TINYINT = java.sql.Types.TINYINT; 136 137 public final static int VARBINARY = java.sql.Types.VARBINARY; 138 139 public final static int VARCHAR = java.sql.Types.VARCHAR; 140 141 // geometry + gml types 142 143 public static final int GEOMETRY = java.sql.Types.VARCHAR + 10000; 144 145 public static final int MULTIGEOMETRY = java.sql.Types.VARCHAR + 10001; 146 147 public static final int FEATURE = java.sql.Types.VARCHAR + 10002; 148 149 public static final int FEATURECOLLECTION = java.sql.Types.VARCHAR + 10004; 150 151 public static final int POINT = java.sql.Types.VARCHAR + 11000; 152 153 public static final int CURVE = java.sql.Types.VARCHAR + 11001; 154 155 public static final int SURFACE = java.sql.Types.VARCHAR + 11002; 156 157 public static final int MULTIPOINT = java.sql.Types.VARCHAR + 11003; 158 159 public static final int MULTICURVE = java.sql.Types.VARCHAR + 11004; 160 161 public static final int MULTISURFACE = java.sql.Types.VARCHAR + 11005; 162 163 public static final int ENVELOPE = java.sql.Types.VARCHAR + 11006; 164 165 public static final QualifiedName GEOMETRY_PROPERTY_NAME = new QualifiedName( "GeometryPropertyType", GMLNS ); 166 167 public static final QualifiedName MULTI_GEOMETRY_PROPERTY_NAME = new QualifiedName( "MultiGeometryPropertyType", 168 GMLNS ); 169 170 public static final QualifiedName FEATURE_PROPERTY_NAME = new QualifiedName( "FeaturePropertyType", GMLNS ); 171 172 // TODO check if this is really needed 173 public static final QualifiedName FEATURE_ARRAY_PROPERTY_NAME = new QualifiedName( "FeatureArrayPropertyType", 174 GMLNS ); 175 176 // key instances: Integer, value instances: String 177 private static Map<Integer, String> typeNameMap = new HashMap<Integer, String>(); 178 179 // key instances: String, value instances: Integer 180 private static Map<String, Integer> typeCodeMap = new HashMap<String, Integer>(); 181 182 static { 183 try { 184 Field[] fields = java.sql.Types.class.getFields(); 185 for ( int i = 0; i < fields.length; i++ ) { 186 String typeName = fields[i].getName(); 187 Integer typeCode = (Integer) fields[i].get( null ); 188 typeNameMap.put( typeCode, typeName ); 189 typeCodeMap.put( typeName, typeCode ); 190 } 191 } catch ( Exception e ) { 192 BootLogger.logError( "Error populating sql type code maps: " + e.getMessage(), e ); 193 } 194 } 195 196 /** 197 * Returns the generic sql type code for the given type name. 198 * 199 * @param typeName 200 * @return the generic sql type code for the given type name. 201 * @throws UnknownTypeException 202 * if the type name is not an sql type name 203 * @see java.sql.Types 204 */ 205 public static int getTypeCodeForSQLType( String typeName ) 206 throws UnknownTypeException { 207 Integer typeCode = typeCodeMap.get( typeName ); 208 if ( typeCode == null ) { 209 throw new UnknownTypeException( "Type name '" + typeName + "' does not denote an sql type." ); 210 } 211 return typeCode.intValue(); 212 } 213 214 /** 215 * Returns the generic sql type name for the given type code. 216 * 217 * @param typeCode 218 * @return the generic sql type name for the given type code. 219 * @throws UnknownTypeException 220 * if the type code is not an sql type code 221 * @see java.sql.Types 222 */ 223 public static String getTypeNameForSQLTypeCode( int typeCode ) 224 throws UnknownTypeException { 225 String typeName = typeNameMap.get( new Integer( typeCode ) ); 226 if ( typeName == null ) { 227 throw new UnknownTypeException( "Type code '" + typeCode + "' does not denote an sql type." ); 228 } 229 return typeName; 230 } 231 232 /** 233 * mapping between GML-typenames and java-classnames for GML-geometry types 234 * 235 * @param gmlTypeName 236 * the name of the GML type name 237 * @return the internal type 238 * @throws UnknownTypeException 239 * if the given name cannot be mapped to a known type. 240 */ 241 public static int getJavaTypeForGMLType( String gmlTypeName ) 242 throws UnknownTypeException { 243 if ( "GeometryPropertyType".equals( gmlTypeName ) ) 244 return Types.GEOMETRY; 245 246 if ( "PointPropertyType".equals( gmlTypeName ) ) 247 // return Types.POINT; 248 return Types.GEOMETRY; 249 250 if ( "MultiPointPropertyType".equals( gmlTypeName ) ) 251 // return Types.MULTIPOINT; 252 return Types.GEOMETRY; 253 254 if ( "PolygonPropertyType".equals( gmlTypeName ) ) 255 // return Types.SURFACE; 256 return Types.GEOMETRY; 257 258 if ( "MultiPolygonPropertyType".equals( gmlTypeName ) ) 259 // return Types.MULTISURFACE; 260 return Types.GEOMETRY; 261 262 if ( "LineStringPropertyType".equals( gmlTypeName ) ) 263 // return Types.CURVE; 264 return Types.GEOMETRY; 265 266 if ( "MultiLineStringPropertyType".equals( gmlTypeName ) ) 267 // return Types.MULTICURVE; 268 return Types.GEOMETRY; 269 270 if ( "CurvePropertyType".equals( gmlTypeName ) ) 271 // return Types.POINT; 272 return Types.GEOMETRY; 273 274 if ( "MultiCurvePropertyType".equals( gmlTypeName ) ) 275 // return Types.POINT; 276 return Types.GEOMETRY; 277 278 if ( "SurfacePropertyType".equals( gmlTypeName ) ) 279 // return Types.POINT; 280 return Types.GEOMETRY; 281 282 if ( "MultiSurfacePropertyType".equals( gmlTypeName ) ) 283 // return Types.POINT; 284 return Types.GEOMETRY; 285 286 throw new UnknownTypeException( "Unsupported Type: '" + gmlTypeName + "'" ); 287 } 288 289 /** 290 * mapping between xml-typenames and java-classnames for XMLSCHEMA-simple types 291 * 292 * @param schemaTypeName 293 * of the XML schema type 294 * @return the internal type 295 * @throws UnknownTypeException 296 * if the given name cannot be mapped to a known type. 297 * @todo TODO map them all over registry 298 */ 299 public static int getJavaTypeForXSDType( String schemaTypeName ) 300 throws UnknownTypeException { 301 302 if ( "integer".equals( schemaTypeName ) || "int".equals( schemaTypeName ) || "long".equals( schemaTypeName ) ) 303 return Types.INTEGER; 304 305 if ( "string".equals( schemaTypeName ) ) 306 return Types.VARCHAR; 307 308 if ( "date".equals( schemaTypeName ) ) 309 return Types.DATE; 310 311 if ( "boolean".equals( schemaTypeName ) ) 312 return Types.BOOLEAN; 313 314 if ( "float".equals( schemaTypeName ) ) 315 return Types.FLOAT; 316 317 if ( "double".equals( schemaTypeName ) ) 318 return Types.DOUBLE; 319 320 if ( "decimal".equals( schemaTypeName ) ) 321 return Types.DECIMAL; 322 323 if ( "dateTime".equals( schemaTypeName ) ) 324 return Types.TIMESTAMP; 325 326 if ( "time".equals( schemaTypeName ) ) 327 return Types.TIME; 328 329 if ( "date".equals( schemaTypeName ) ) 330 return Types.DATE; 331 332 if ( "anyURI".equals( schemaTypeName ) ) 333 return Types.VARCHAR; 334 335 throw new UnknownTypeException( "Unsupported Type:" + schemaTypeName ); 336 } 337 338 /** 339 * 340 * @param type 341 * SQL datatype code 342 * @param precision 343 * precision (just used for type NUMERIC) 344 * @return typename 345 */ 346 public static String getXSDTypeForSQLType( int type, int precision ) { 347 String s = null; 348 349 switch ( type ) { 350 case Types.VARCHAR: 351 case Types.CHAR: 352 s = "string"; 353 break; 354 case Types.NUMERIC: { 355 if ( precision <= 1 ) { 356 s = "integer"; 357 break; 358 } 359 s = "double"; 360 break; 361 } 362 case Types.DECIMAL: 363 s = "decimal"; 364 break; 365 case Types.DOUBLE: 366 case Types.REAL: 367 s = "double"; 368 break; 369 case Types.FLOAT: 370 s = "float"; 371 break; 372 case Types.INTEGER: 373 case Types.SMALLINT: 374 case Types.BIGINT: 375 s = "integer"; 376 break; 377 case Types.TIMESTAMP: 378 case Types.TIME: 379 case Types.DATE: 380 s = "dateTime"; 381 break; 382 case Types.CLOB: 383 s = "string"; 384 break; 385 case Types.BIT: 386 case Types.BOOLEAN: 387 s = "boolean"; 388 break; 389 case Types.GEOMETRY: 390 case Types.OTHER: 391 case Types.STRUCT: 392 s = "gml:GeometryPropertyType"; 393 break; 394 case Types.FEATURE: 395 s = "gml:FeaturePropertyType"; 396 break; 397 default: 398 LOG.logWarning( "could not determine XSDType for SQLType; using 'XXX': " + type ); 399 s = "code: " + type; 400 } 401 return s; 402 } 403 404 }