/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2004-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.type; import org.geotools.feature.AttributeType; import org.geotools.feature.DefaultAttributeType; import org.geotools.feature.Feature; import org.geotools.feature.FeatureType; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.NameImpl; import org.opengis.filter.Filter; /** * Represents an ordered list of AttributeTypes. For SFS this will be a * FeatureType. For GML this is the same as an element whose complexType * contains a Sequence of Attributes. * * @author dzwiers * @source $URL$ */ public class FeatureAttributeType extends AttributeDescriptorImpl implements AttributeType { private final FeatureType featureType; /** * @param copy */ public FeatureAttributeType(FeatureAttributeType copy) { super(copy.getType(),copy.getName(),copy.getMinOccurs(),copy.getMaxOccurs(),copy.isNillable(),copy.getDefaultValue()); featureType = copy.getFeatureType(); } // The field for 'Class type' should be added when GT has moved to java 1.5 public FeatureAttributeType(String name,FeatureType featureType, boolean nillable, int min, int max) { super(DefaultAttributeType.createAttributeType(name, Feature.class, Filter.INCLUDE),new NameImpl(name),min,max,nillable,null); this.featureType = featureType; } public FeatureAttributeType(String name,FeatureType featureType, boolean nillable){ this(name,featureType, nillable, 1, 1); } public Filter getRestriction(){ return DefaultAttributeType.getRestriction(this); } protected FeatureType getFeatureType(){return featureType;} /** * {@inheritDoc} */ public String getLocalName() { return DefaultAttributeType.getLocalName(this); } /** * {@inheritDoc} */ public Class getBinding() { return DefaultAttributeType.getBinding(this); } /* (non-Javadoc) * @see org.geotools.feature.AttributeType#isGeometry() */ public boolean isGeometry() { return false; } /* (non-Javadoc) * @see org.geotools.feature.AttributeType#parse(java.lang.Object) */ public Object parse(Object value) throws IllegalArgumentException { if (value instanceof Feature) { return value; } if(value instanceof Object[]) try { return featureType.create((Object[])value); } catch (IllegalAttributeException e) { IllegalArgumentException ee = new IllegalArgumentException(e.getMessage()); ee.initCause(e); throw ee; } throw new IllegalArgumentException(getLocalName()+" needs to parse an array of Objects"); } /* (non-Javadoc) * @see org.geotools.feature.AttributeType#validate(java.lang.Object) */ public void validate(Object obj) throws IllegalArgumentException { if(obj instanceof Feature){ try { featureType.duplicate((Feature)obj); return; } catch (IllegalAttributeException e) { IllegalArgumentException ee = new IllegalArgumentException(e.getMessage()); ee.initCause(e); throw ee; } } //users should call parse first - ch. /*if(obj instanceof Object[]){ try { featureType.create((Object[])obj); return; } catch (IllegalAttributeException e) { IllegalArgumentException ee = new IllegalArgumentException(e.getMessage()); ee.initCause(e); throw ee; } }*/ throw new IllegalArgumentException("Not a Feature"); } /* (non-Javadoc) * @see org.geotools.feature.AttributeType#duplicate(java.lang.Object) */ public Object duplicate(Object src) throws IllegalAttributeException { if(src instanceof Feature){ return featureType.duplicate((Feature)src); } throw new IllegalArgumentException("Not an Object []"); } /* (non-Javadoc) * @see org.geotools.feature.AttributeType#createDefaultValue() */ public Object createDefaultValue() { Object[] t = new Object[featureType.getAttributeCount()]; for(int i=0;i<t.length;i++) t[i] = null; try { return featureType.create(t); } catch (IllegalAttributeException e) { // do nothing return null; } } /** * This is only used twice in the whole geotools code base, and one of * those is for a test, so we're removing it from the interface. If * getAttributeType does not have the AttributeType it will just return * null. Gets the number of occurrences of this attribute. * * @param xPath XPath pointer to attribute type. * * @return Number of occurrences. */ public boolean hasAttributeType(String xPath) { return getAttributeType(xPath) != null; } /** * Returns the number of attributes at the first 'level' of the schema. * * @return equivalent value to getAttributeTypes().length */ public int getAttributeCount(){ return featureType.getAttributeCount(); } /** * Gets the attributeType at this xPath, if the specified attributeType * does not exist then null is returned. * * @param xPath XPath pointer to attribute type. * * @return True if attribute exists. */ public AttributeType getAttributeType(String xPath) { return featureType.getAttributeType(xPath); } /** * Find the position of a given AttributeType. * * @param type The type to search for. * * @return -1 if not found, a zero-based index if found. */ public int find(AttributeType type) {return featureType.find(type); } /** * Find the position of an AttributeType which matches the given String. * @param attName the name to look for * @return -1 if not found, zero-based index otherwise */ public int find(String attName) { return featureType.find(attName); } /** * Gets the attributeType at the specified index. * * @param position the position of the attribute to check. * * @return The attribute type at the specified position. */ public AttributeType getAttributeType(int position) { return featureType.getAttributeType(position); } public AttributeType[] getAttributeTypes() { return featureType.getAttributeTypes(); } }