Package org.geotools.data.efeature.internal

Source Code of org.geotools.data.efeature.internal.EFeatureGeometryDelegate$GeometryAttributeDelegate

/**
* <copyright>
* </copyright>
*
* $Id$
*/
package org.geotools.data.efeature.internal;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.emf.ecore.EAttribute;
import org.geotools.data.efeature.EFeatureGeometry;
import org.geotools.data.efeature.EFeatureGeometryInfo;
import org.geotools.data.efeature.EFeatureStatus;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.opengis.feature.GeometryAttribute;
import org.opengis.feature.type.GeometryDescriptor;
import org.opengis.feature.type.GeometryType;
import org.opengis.feature.type.Name;
import org.opengis.filter.identity.Identifier;
import org.opengis.geometry.BoundingBox;

import com.vividsolutions.jts.geom.Geometry;

/**
* An abstract implementation of the model data type {@link EFeatureGeometry}.
*
* @author kengu, 22. apr. 2011
*
* @source $URL$
*/
public class EFeatureGeometryDelegate<V extends Geometry> extends
        EFeaturePropertyDelegate<V, GeometryAttribute, EAttribute> implements EFeatureGeometry<V> {

    // -----------------------------------------------------
    //  Constructors
    // -----------------------------------------------------

    /**
     * Default constructor.
     * <p>
     * @param eInternal -
     * @param eName -
     * @param valueType - {@link #getValue() property value} type.
     */
    public EFeatureGeometryDelegate(EFeatureInternal eInternal,
            String eName, Class<V> valueType) {
        super(eInternal, eName, GeometryAttribute.class, valueType);
    }

    // -----------------------------------------------------
    //  EFeatureGeometry implementation
    // -----------------------------------------------------

    @Override
    public boolean isEmpty() {
        Geometry geom = getValue();
        return (geom == null || geom.isEmpty());
    }

    @Override
    public boolean isDefault() {
        return getStructure().isDefaultGeometry();
    }

    // -----------------------------------------------------
    //  EFeaturePropertyDelegate implementation
    // -----------------------------------------------------

    @Override
    public String getName() {
        return getStructure().eName();
    }

    @Override
    public EFeatureGeometryInfo getStructure() {
        return (EFeatureGeometryInfo) super.getStructure();
    }

    @Override
    protected GeometryAttribute create() {
        return new GeometryAttributeDelegate();
    }

    @Override
    protected V validate(GeometryAttribute data) {
        EFeatureStatus s;
        if (!(s = getStructure().validate(data)).isSuccess()) {
            throw new IllegalArgumentException(s.getMessage());
        }
        return eValueType.cast(data.getValue());
    }

    @Override
    protected V validate(Object value) {
        EFeatureStatus s;
        if (!(s = getStructure().validate(value)).isSuccess()) {
            throw new IllegalArgumentException(s.getMessage(), s.getCause());
        }

        // Is valid, cast to value type
        //
        return eValueType.cast(eData.getValue());
    }

    // -----------------------------------------------------
    //  GeometryAttribute delegate implementation
    // -----------------------------------------------------


    private class GeometryAttributeDelegate implements GeometryAttribute {

        /**
         * bounds, derived
         */
        private BoundingBox bounds;

        /**
         * Cached User data
         */
        private Map<Object, Object> userData;

        @Override
        public Identifier getIdentifier() {
            return null;
        }

        @Override
        public Name getName() {
            return getType().getName();
        }

        @Override
        public boolean isNillable() {
            return getDescriptor().isNillable();
        }

        @Override
        public GeometryType getType() {
            return getDescriptor().getType();
        }

        @Override
        public GeometryDescriptor getDescriptor() {
            return getStructure().getDescriptor();
        }

        @Override
        public Object getValue() {
            return EFeatureGeometryDelegate.this.getValue();
        }

        @Override
        public void setValue(Object newValue) {
            // Cast to value type
            //
            V value = eValueType.cast(newValue);
            //
            // Update delegate
            //
            EFeatureGeometryDelegate.this.setValue(value);
            // Geometry has changed, hence bounds must be recalculated
            //
            bounds = null;
        }

        @Override
        public BoundingBox getBounds() {
            if (bounds == null) {
                ReferencedEnvelope bbox = new ReferencedEnvelope(getType()
                        .getCoordinateReferenceSystem());
                V geom = EFeatureGeometryDelegate.this.getValue();
                if (geom != null) {
                    bbox.expandToInclude(geom.getEnvelopeInternal());
                } else {
                    bbox.setToNull();
                }
                bounds = bbox;
            }
            return bounds;
        }

        @Override
        public void setBounds(BoundingBox bounds) {
            this.bounds = bounds;
        }

        @Override
        public Map<Object, Object> getUserData() {
            if (userData == null) {
                userData = new HashMap<Object, Object>();
            }
            return userData;
        }

        @Override
        public void validate() throws IllegalArgumentException {
            EFeatureGeometryDelegate.this.validate(getValue());
        }

    }

} // EFeatureGeometryDelegate
TOP

Related Classes of org.geotools.data.efeature.internal.EFeatureGeometryDelegate$GeometryAttributeDelegate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.