/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* 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
* Lesser General Public License for more details.
*/
package org.geotools.feature;
import java.util.Collections;
import java.util.Map;
import org.geotools.factory.Factory;
import org.opengis.filter.Filter;
/**
* Abstract class for AttributeType factories. Extending classes need only
* implement createAttributeType
*
* @author Ian Schneider, USDA-ARS
* @source $URL$
* @version $Id$
*/
public abstract class AttributeTypeFactory implements Factory {
/**
* Returns the default attribute factory for the system - constucting a new
* one if this is first time the method has been called.
*
* @return the default instance of AttributeTypeFactory.
*/
public static AttributeTypeFactory defaultInstance() {
// depend on CommonFactoryFinder to keep singleton cached
//
return new DefaultAttributeTypeFactory();
}
/**
* Returns a new instance of the current AttributeTypeFactory.
* <p>
* If no implementations are found then DefaultAttributeTypeFactory is returned.
* </p>
* @return A new instance of an AttributeTypeFactory.
* @deprecated Please use CommonFactoryFinder
*/
public static AttributeTypeFactory newInstance() {
return new DefaultAttributeTypeFactory(); // only need new instance if factory stateful?
}
/**
* Creates a new AttributeType with the given name, class and nillable
* values.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable If nulls are allowed (will force min=0)
*
* @return A new AttributeType of name, clazz and isNillable.
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable,int fieldLength,Object defaultValue) {
return defaultInstance().createAttributeType(name, clazz, isNillable,fieldLength, defaultValue);
}
/**
* Creates a new AttributeType with the addition of metadata like CRS.
* <p>
* Currently MetaData is used to supply the CoordinateSequence
* when making a GeometryAttributeType.
* </p>
* @param name name of the attribute type to be created
* @param clazz Class that objects will validate against
* @param isNillable If nulls are allowed (will force min=0)
* @param fieldLength A common restriction (this will produce a Filter)
* @param defaultValue Initial valid value for new Feature
* @param metaData Additional information (example a CoordinateReferenceSystem for a Geometry)
*
* @return Created AttributeType
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable,int fieldLength,Object defaultValue, Object metaData) {
return defaultInstance().createAttributeType(name, clazz, isNillable,fieldLength, defaultValue, metaData);
}
/**
* Creates a new AttributeType with the addition of metadata like CRS.
*
* @param name name of the attribute type to be created
* @param clazz Class that objects will validate against
* @param isNillable If nulls are allowed (will force min=0)
* @param restriction Filter restricting valid content
* @param defaultValue Initial valid value for new Feature
* @param metaData Additional information (example a CoordinateReferenceSystem for a Geometry)
*
* @return Created AttributeType
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable, Filter restriction,Object defaultValue, Object metaData) {
return defaultInstance().createAttributeType(name, clazz, isNillable, restriction, defaultValue, metaData);
}
/**
* Creates a new AttributeType.
*
* @param name name of the attribute type to be created
* @param clazz Class that objects will validate against
* @param isNillable If nulls are allowed (will force min=0)
* @param restriction
* @param defaultValue
* @param metaData metaData Additional information (example a CoordinateReferenceSystem for a Geometry)
* @param min minimum number of occurances for an array class
* @param max maximum number of occurances for an array class
* @return Created AttributeType
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable, Filter restriction,Object defaultValue, Object metaData, int min, int max ) {
return defaultInstance().createAttributeType(name, clazz, isNillable, restriction, defaultValue, metaData, min, max);
}
/**
* Creates a new AttributeType with the given name, class and nillable
* values.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable If nulls are allowed (will force min=0)
*
* @return A new AttributeType of name, clazz and isNillable.
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable,int fieldLength) {
return defaultInstance().createAttributeType(name, clazz, isNillable,fieldLength);
}
/**
* Creates a new AttributeType with the given name, class and nillable
* values.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable If nulls are allowed (will force min=0)
*
* @return A new AttributeType of name, clazz and isNillable.
*/
public static AttributeType newAttributeType(String name, Class clazz,
boolean isNillable) {
return defaultInstance().createAttributeType(name, clazz, isNillable,Integer.MAX_VALUE);
}
/**
* Convenience method to just specify name and class. Nulls are allowed as
* attributes by default (isNillable = <code>true</code>).
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
*
* @return A new AttributeType of name and clazz.
*/
public static AttributeType newAttributeType(String name, Class clazz) {
return newAttributeType(name, clazz, true);
}
/**
* Constucts a new AttributeType that accepts Features (specified by a
* FeatureType)
*
* @param name The name of the AttributeType to be created.
* @param type the FeatureType that features will validate agist
* @param isNillable If nulls are allowed (will force min=0)
*
* @return A new AttributeType of name, type, and isNillable.
*/
public static AttributeType newAttributeType(String name, FeatureType type,
boolean isNillable) {
return defaultInstance().createAttributeType(name, type, isNillable);
}
/**
* Constucts a new AttributeType that accepts Feature (specified by a
* FeatureType). Nulls are allowed as attributes by default (isNillable =
* <code>true</code>).
*
* @param name The name of the AttributeType to be created.
* @param type the FeatureType that features will validate agist
*
* @return A new AttributeType of name and type.
*/
public static AttributeType newAttributeType(String name, FeatureType type) {
return newAttributeType(name, type, true);
}
/**
* Create an AttributeType with the given name, Class, nillability,
* fieldLength, and provided defaultValue.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable if nulls are allowed in the new type.
*
* @return the new AttributeType
* @throws IllegalArgumentException If the field is not nillable, yet
*/
protected abstract AttributeType createAttributeType(String name,
Class clazz, boolean isNillable, int fieldLength, Object defaultValue);
/**
* Create an AttributeType with the given name, Class, nillability,
* fieldLength, and provided defaultValue.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable if nulls are allowed in the new type.
* @param restriction Used to limit the valid values
* @return the new AttributeType
* @throws IllegalArgumentException If the field is not nillable, yet
*/
protected abstract AttributeType createAttributeType(String name,
Class clazz, boolean isNillable, Filter restriction, Object defaultValue, Object metadata);
/**
* Create an AttributeType with the given name, Class, nillability,
* fieldLength, and provided defaultValue.
*
* @param name The name of the AttributeType to be created.
* @param clazz The class that objects will validate against.
* @param isNillable if nulls are allowed in the new type.
* @param restriction Used to limit the valid values
* @param min the minimum number of occurences of the attribute
* @param max the maximum number of occurences of the attribute
* @return the new AttributeType
* @throws IllegalArgumentException If the field is not nillable, yet
*/
protected abstract AttributeType createAttributeType(
String name, Class type, boolean isNillable, Filter restriction, Object defaultValue,
Object metaData, int min, int max
);
/**
* Create an AttributeType with the given name, Class, nillability, and
* fieldLength, defering the defaultValue to the type of Attribute.
*/
protected abstract AttributeType createAttributeType(String name,
Class clazz, boolean isNillable, int fieldLength);
/**
* Create a Feature AttributeType which holds the a Feature instance which
* is of the given FeatureType or null if any arbitrary Feature can be held.
*
* @param name The name of the AttributeType to be created.
* @param type The FeatureType that Features will validate against.
* @param isNillable if nulls are allowed in the new type.
*
* @return the new AttributeType
*/
protected abstract AttributeType createAttributeType(String name,
FeatureType type, boolean isNillable);
/**
* Create a Feature AttributeType which holds the a Feature instance which
* is of the given FeatureType or null if any arbitrary Feature can be held.
*
* @param name The name of the AttributeType to be created.
* @param type The FeatureType that Features will validate against.
* @param isNillable if nulls are allowed in the new type.
* @param defaultValue default value, may be null if isNilable is true
* @param metaData metadata for attribute type (such as CoordianteReferenceSystem)
* @return the new AttributeType
*/
protected abstract AttributeType createAttributeType( String name, Class type, boolean isNillable, int fieldLength, Object defaultValue, Object metaData );
/**
* Returns the implementation hints. The default implementation returns en empty map.
*/
public Map getImplementationHints() {
return Collections.EMPTY_MAP;
}
}