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