001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/model/feature/FeatureFactory.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.model.feature; 037 038 import java.net.URI; 039 import java.util.List; 040 041 import org.deegree.datatypes.QualifiedName; 042 import org.deegree.datatypes.Types; 043 import org.deegree.datatypes.UnknownTypeException; 044 import org.deegree.framework.log.ILogger; 045 import org.deegree.framework.log.LoggerFactory; 046 import org.deegree.model.feature.schema.DefaultFeatureType; 047 import org.deegree.model.feature.schema.FeaturePropertyType; 048 import org.deegree.model.feature.schema.FeatureType; 049 import org.deegree.model.feature.schema.GeometryPropertyType; 050 import org.deegree.model.feature.schema.MultiGeometryPropertyType; 051 import org.deegree.model.feature.schema.PropertyType; 052 import org.deegree.model.feature.schema.SimplePropertyType; 053 import org.deegree.ogcbase.CommonNamespaces; 054 055 /** 056 * This factory offers methods for creating Features, FeatureCollection and all direct related 057 * classes/interfaces that are part of the org.deegree.model.feature package. 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 public class FeatureFactory { 065 066 private final static ILogger LOG = LoggerFactory.getLogger( FeatureFactory.class ); 067 068 private static URI GMLNS = CommonNamespaces.GMLNS; 069 070 /** 071 * Creates an instance of a <code>PropertyType</code> from the given parameters. 072 * <p> 073 * Determines the right type from the given type name. 074 * 075 * @param name 076 * name of the property type 077 * @param typeName 078 * type name of the property type 079 * @param nullable 080 * set to true, if property type may be omitted 081 * @return corresponding PropertyType instance 082 * @throws UnknownTypeException 083 */ 084 public static PropertyType createPropertyType( QualifiedName name, QualifiedName typeName, boolean nullable ) 085 throws UnknownTypeException { 086 return createPropertyType( name, typeName, nullable ? 0 : 1, 1 ); 087 } 088 089 /** 090 * Creates an instance of a <code>PropertyType</code> from the given parameters. 091 * <p> 092 * Determines the right type from the given type name. 093 * 094 * @param name 095 * name of the property type 096 * @param typeName 097 * type name of the property type 098 * @param minOccurs 099 * @param maxOccurs 100 * @return corresponding PropertyType instance 101 * @throws UnknownTypeException 102 */ 103 public static PropertyType createPropertyType( QualifiedName name, QualifiedName typeName, int minOccurs, 104 int maxOccurs ) 105 throws UnknownTypeException { 106 107 PropertyType type = null; 108 109 int typeCode = determinePropertyType( typeName ); 110 switch ( typeCode ) { 111 case Types.FEATURE: { 112 type = new FeaturePropertyType( name, typeName, typeCode, minOccurs, maxOccurs ); 113 break; 114 } 115 case Types.GEOMETRY: { 116 type = new GeometryPropertyType( name, typeName, typeCode, minOccurs, maxOccurs ); 117 break; 118 } 119 case Types.MULTIGEOMETRY: { 120 type = new MultiGeometryPropertyType( name, typeName, typeCode, minOccurs, maxOccurs ); 121 break; 122 } 123 default: { 124 type = new SimplePropertyType( name, typeCode, minOccurs, maxOccurs ); 125 } 126 } 127 return type; 128 } 129 130 /** 131 * Creates an instance of a <code>SimplePropertyType</code> from the given parameters. 132 * 133 * @param name 134 * name of the property type 135 * @param typeCode 136 * type code of the property type 137 * @param nullable 138 * set to true, if property type may be omitted 139 * @return generated SimplePropertyType instance 140 * @see Types 141 */ 142 public static PropertyType createSimplePropertyType( QualifiedName name, int typeCode, boolean nullable ) { 143 return createSimplePropertyType( name, typeCode, nullable ? 0 : 1, 1 ); 144 } 145 146 /** 147 * Creates an instance of a <code>SimplePropertyType</code> from the given parameters. 148 * 149 * @param name 150 * name of the property type 151 * @param typeCode 152 * type code of the property type 153 * @param minOccurs 154 * @param maxOccurs 155 * @return generated SimplePropertyType instance 156 * @see Types 157 */ 158 public static SimplePropertyType createSimplePropertyType( QualifiedName name, int typeCode, int minOccurs, 159 int maxOccurs ) { 160 return new SimplePropertyType( name, typeCode, minOccurs, maxOccurs ); 161 } 162 163 /** 164 * Creates an instance of a <code>GeometryPropertyType</code> from the given parameters. 165 * 166 * @param name 167 * name of the property type 168 * @param typeName 169 * typeName of the property type 170 * @param minOccurs 171 * @param maxOccurs 172 * @return generated GeometryPropertyType instance 173 * @see Types 174 */ 175 public static GeometryPropertyType createGeometryPropertyType( QualifiedName name, QualifiedName typeName, 176 int minOccurs, int maxOccurs ) { 177 return new GeometryPropertyType( name, typeName, Types.GEOMETRY, minOccurs, maxOccurs ); 178 } 179 180 /** 181 * Creates an instance of a <code>FeaturePropertyType</code> from the given parameters. 182 * 183 * @param name 184 * name of the property type 185 * @param minOccurs 186 * @param maxOccurs 187 * @return generated FeaturePropertyType instance 188 * @see Types 189 */ 190 public static FeaturePropertyType createFeaturePropertyType( QualifiedName name, int minOccurs, int maxOccurs ) { 191 return new FeaturePropertyType( name, Types.FEATURE_PROPERTY_NAME, Types.FEATURE, minOccurs, maxOccurs ); 192 } 193 194 /** 195 * Determines the type code for the given type name. 196 * 197 * @param typeName 198 * name to determine 199 * @return type code for the given type name 200 * @throws UnknownTypeException 201 * if the type name cannot be determined 202 * @see Types 203 */ 204 public static int determinePropertyType( QualifiedName typeName ) 205 throws UnknownTypeException { 206 LOG.logDebug( "Determining property type code for property type='" + typeName + "'..." ); 207 int type = Types.FEATURE; 208 if ( typeName.isInNamespace( CommonNamespaces.XSNS ) ) { 209 LOG.logDebug( "Must be a basic XSD type." ); 210 try { 211 type = Types.getJavaTypeForXSDType( typeName.getLocalName() ); 212 } catch ( UnknownTypeException e ) { 213 throw new UnknownTypeException( e ); 214 } 215 } else if ( typeName.isInNamespace( GMLNS ) ) { 216 LOG.logDebug( "Maybe a geometry property type?" ); 217 try { 218 type = Types.getJavaTypeForGMLType( typeName.getLocalName() ); 219 LOG.logDebug( "Yes." ); 220 } catch ( UnknownTypeException e ) { 221 LOG.logDebug( "No. Should be a generic GML feature of some kind." ); 222 // TODO check all possible GML types here, feature array property type 223 } 224 } else { 225 throw new UnknownTypeException( "Cannot determine property type for type '" + typeName + "'." ); 226 } 227 return type; 228 } 229 230 /** 231 * creates an instance of a FeatureType from an array of FeatureTypeProperties, and its name but 232 * without parents and childs 233 * 234 * @param name 235 * name of the <code>FeatureType</code> 236 * @param isAbstract 237 * <code>true</code> if the feature type to create is abstract, <code>false</code> 238 * otherwise 239 * @param properties 240 * properties containing the <code>FeatureType</code>s content 241 * @return instance of a <code>FeatureType</code> 242 */ 243 public static FeatureType createFeatureType( QualifiedName name, boolean isAbstract, PropertyType[] properties ) { 244 return new DefaultFeatureType( name, isAbstract, properties ); 245 } 246 247 /** 248 * creates an instance of a FeatureType from an array of FeatureTypeProperties, and its name but 249 * without parents and childs 250 * 251 * @param name 252 * name of the <code>FeatureType</code> 253 * @param isAbstract 254 * <code>true</code> if the feature type to create is abstract, <code>false</code> 255 * otherwise 256 * @param properties 257 * properties containing the <code>FeatureType</code>s content 258 * @return instance of a <code>FeatureType</code> 259 */ 260 public static FeatureType createFeatureType( String name, boolean isAbstract, PropertyType[] properties ) { 261 return new DefaultFeatureType( new QualifiedName( name ), isAbstract, properties ); 262 } 263 264 /** 265 * creates an instance of a FeatureType from an array of FeatureTypeProperties, and its name but 266 * without parents and childs 267 * 268 * @param name 269 * name of the <code>FeatureType</code> 270 * @param isAbstract 271 * <code>true</code> if the feature type to create is abstract, <code>false</code> 272 * otherwise 273 * @param schemaLocation 274 * @param properties 275 * properties containing the <code>FeatureType</code>s content 276 * @return instance of a <code>FeatureType</code> 277 */ 278 public static FeatureType createFeatureType( QualifiedName name, boolean isAbstract, URI schemaLocation, 279 PropertyType[] properties ) { 280 return new DefaultFeatureType( name, isAbstract, schemaLocation, properties ); 281 } 282 283 /** 284 * creates an instance of a FeatureType from an array of FeatureTypeProperties, and its name but 285 * without parents and childs 286 * 287 * @param name 288 * name of the <code>FeatureType</code> 289 * @param isAbstract 290 * <code>true</code> if the feature type to create is abstract, <code>false</code> 291 * otherwise 292 * @param schemaLocation 293 * @param properties 294 * properties containing the <code>FeatureType</code>s content 295 * @return instance of a <code>FeatureType</code> 296 */ 297 public static FeatureType createFeatureType( String name, boolean isAbstract, URI schemaLocation, 298 PropertyType[] properties ) { 299 QualifiedName gName = new QualifiedName( name ); 300 return new DefaultFeatureType( gName, isAbstract, schemaLocation, properties ); 301 } 302 303 /** 304 * creates an instance of a FeatureProperty from its name and the data (value) it contains 305 * 306 * @param name 307 * name of the <code>FeatureProperty</code> 308 * @return an instance of a <code>FeatureProperty</code> 309 * @param value 310 * value of the <code>FeatureProperty</code> 311 */ 312 public static FeatureProperty createFeatureProperty( QualifiedName name, Object value ) { 313 return new DefaultFeatureProperty( name, value ); 314 } 315 316 /** 317 * creates an instance of a FeatureProperty from its name and the data (value) it contains 318 * 319 * @param name 320 * name of the <code>FeatureProperty</code> 321 * @return an instance of a <code>FeatureProperty</code> 322 * @param value 323 * value of the <code>FeatureProperty</code> 324 * @deprecated use {@link #createFeatureProperty (QualifiedName, Object)} instead 325 */ 326 @Deprecated 327 public static FeatureProperty createFeatureProperty( String name, Object value ) { 328 QualifiedName qn = new QualifiedName( name ); 329 return new DefaultFeatureProperty( qn, value ); 330 } 331 332 /** 333 * creates an instance of a Feature from its FeatureType and an array of Objects that represents 334 * it properties. It is assumed that the order of the properties is identical to the order of 335 * the FeatureTypeProperties of the the FeatureType. 336 * 337 * @param id 338 * unique id of the <code>Feature</code> 339 * @param featureType 340 * <code>FeatureType</code> of the <code>Feature</code> 341 * @param properties 342 * properties (content) of the <code>Feature</code> 343 * @return instance of a <code>Feature</code> 344 */ 345 public static Feature createFeature( String id, FeatureType featureType, FeatureProperty[] properties ) { 346 return new DefaultFeature( id, featureType, properties ); 347 } 348 349 /** 350 * creates an instance of a Feature from its FeatureType and an array of Objects that represents 351 * it properties. It is assumed that the order of the properties is identical to the order of 352 * the FeatureTypeProperties of the the FeatureType. 353 * 354 * @param id 355 * unique id of the <code>Feature</code> 356 * @param featureType 357 * <code>FeatureType</code> of the <code>Feature</code> 358 * @param properties 359 * properties (content) of the <code>Feature</code> 360 * @return instance of a <code>Feature</code> 361 */ 362 public static Feature createFeature( String id, FeatureType featureType, List<FeatureProperty> properties ) { 363 FeatureProperty[] fps = properties.toArray( new FeatureProperty[properties.size()] ); 364 return new DefaultFeature( id, featureType, fps ); 365 } 366 367 /** 368 * creates an instance of a FeatureCollection with an initial capacity. The returned 369 * FeatureCollection doesn't have a FeatureType nor properties. It is just a collection of 370 * Features. 371 * 372 * @param id 373 * unique id of the <code>FeatureCollection</code> 374 * @param initialCapacity 375 * initial capacity of the <code>FeatureCollection</code> 376 * @return instance of an empty <code>FeatureCollection</code> 377 */ 378 public static FeatureCollection createFeatureCollection( String id, int initialCapacity ) { 379 return new DefaultFeatureCollection( id, initialCapacity ); 380 } 381 382 /** 383 * creates an instance of a FeatureCollection from an array of Features. The returned 384 * FeatureCollection doesn't have a FeatureType nor properties. It is just a collection of 385 * Features. 386 * 387 * @param id 388 * unique id of the <code>FeatureCollection</code> instance 389 * @param features 390 * <code>Feature</code>s to fill in into the <code>FeatureCollection</code> 391 * @return instance of a <code>FeatureCollection</code> containing the submitted features 392 */ 393 public static FeatureCollection createFeatureCollection( String id, Feature[] features ) { 394 return new DefaultFeatureCollection( id, features ); 395 } 396 397 /** 398 * creates an instance of a FeatureCollection from an array of Features. The returned 399 * FeatureCollection doesn't have a FeatureType nor properties. It is just a collection of 400 * Features. With it's name set to the given qualifiedName 401 * 402 * @param id 403 * unique id of the <code>FeatureCollection</code> instance 404 * @param features 405 * <code>Feature</code>s to fill in into the <code>FeatureCollection</code> 406 * @param qName 407 * name of the featureCollection 408 * @return instance of a <code>FeatureCollection</code> containing the submitted features 409 */ 410 public static FeatureCollection createFeatureCollection( String id, Feature[] features, QualifiedName qName ) { 411 return new DefaultFeatureCollection( id, features, qName ); 412 } 413 414 /** 415 * Creates a {@link FeatureTupleCollection} for the given feature tuples. 416 * 417 * @param id 418 * id for the <code>FeatureCollection</code> instance 419 * @param featureTuples 420 * list of feature tuples (array length must match tupleLength parameter) 421 * @param tupleLength 422 * number of features per tuple 423 * @return <code>FeatureTupleCollection</code> containing the given feature tuples 424 */ 425 public static FeatureTupleCollection createFeatureCollection( String id, List<Feature[]> featureTuples, 426 int tupleLength ) { 427 return new FeatureTupleCollection( id, featureTuples, tupleLength ); 428 } 429 }