/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2011, 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.data.efeature.internal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.geotools.data.Transaction;
import org.geotools.data.efeature.EFeature;
import org.geotools.data.efeature.EFeatureHints;
import org.geotools.data.efeature.EFeatureInfo;
import org.geotools.data.efeature.EFeatureUtils;
import org.geotools.data.efeature.ESimpleFeature;
import org.opengis.feature.Feature;
import org.opengis.feature.GeometryAttribute;
import org.opengis.feature.IllegalAttributeException;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.feature.type.AttributeDescriptor;
import org.opengis.feature.type.Name;
import org.opengis.filter.identity.FeatureId;
import org.opengis.geometry.BoundingBox;
/**
* This class implements {@link ESimpleFeature} by delegating
* to a {@link Feature} instance.
* <p>
* The references to delegate objects are weak, allowing
* the them to be garbage collected when needed.
* </p>
*
* @author kengu - 28. mai 2011
*
*/
public class ESimpleFeatureDelegate implements ESimpleFeature {
private EObject eObject;
private SimpleFeature feature;
private EFeatureInfo eStructure;
private EFeatureHints eHints;
// -----------------------------------------------------
// Constructors
// -----------------------------------------------------
/**
* This constructor creates a {@link ESimpleFeature} instance that
* delegates to given objects.
*/
public ESimpleFeatureDelegate(EFeatureInfo eStructure, EObject eObject, SimpleFeature feature, EFeatureHints eHints) {
this.feature = feature;
this.eObject = eObject;
this.eStructure = eStructure;
this.eHints = eHints == null ? new EFeatureHints(eStructure.eHints()) : eHints;
}
// -----------------------------------------------------
// ESimpleFeature implementation
// -----------------------------------------------------
@Override
public EObject eObject() {
if(eObject instanceof EFeatureDelegate) {
return ((EFeatureDelegate)eObject).eImpl;
}
return eObject;
}
@Override
public EFeature eFeature() {
//
// Return delegate if not a EFeature implementation
//
if(eObject instanceof EFeature) {
return (EFeature)eObject();
}
return new EFeatureDelegate(eStructure, (InternalEObject)eObject, false, eHints);
}
@Override
public boolean isDetached() {
return eHints.eValuesDetached();
}
@Override
public boolean isSingleton() {
return eHints.eSingletonFeatures();
}
@Override
public List<Object> read() throws IllegalStateException {
return read(Transaction.AUTO_COMMIT);
}
@Override
public List<Object> read(Transaction transaction) throws IllegalStateException {
//
// Decide if feature values is allowed to be updated from backing store
//
if(!isDetached()) {
throw new IllegalStateException("ESimpleFeature "
+ getType().getTypeName() + " is not detached");
}
//
// Read values from eImpl()
//
List<Object> eValues = EFeatureUtils.eGetFeatureValues(eStructure, eObject, transaction);
//
// Update feature values
//
feature.setAttributes(eValues);
//
// Finished
//
return eValues;
}
@Override
public List<Object> write() throws IllegalStateException {
return write(Transaction.AUTO_COMMIT);
}
@Override
public List<Object> write(Transaction transaction) throws IllegalStateException {
//
// Decide if feature values is allowed to be updated from backing store
//
if(!isDetached()) {
throw new IllegalStateException("ESimpleFeature "
+ getType().getTypeName() + " is not detached");
}
//
// Get feature values
//
List<Object> eValues = feature.getAttributes();
//
// Write values to eImpl()
//
EFeatureUtils.eSetFeatureValues(eStructure, eObject, eValues, transaction);
//
// Finished
//
return eValues;
}
@Override
public boolean isReleased() {
return eObject == null;
}
@Override
public void release() {
eObject = null;
}
// -----------------------------------------------------
// SimpleFeature implementation
// -----------------------------------------------------
@Override
public FeatureId getIdentifier() {
return getFeature().getIdentifier();
}
@Override
public AttributeDescriptor getDescriptor() {
return getFeature().getDescriptor();
}
@Override
public BoundingBox getBounds() {
return getFeature().getBounds();
}
@Override
public String getID() {
return getFeature().getID();
}
@Override
public SimpleFeatureType getType() {
return getFeature().getType();
}
@Override
public SimpleFeatureType getFeatureType() {
return getFeature().getFeatureType();
}
@Override
public void setValue(Object newValue) {
getFeature().setValue(newValue);
}
@Override
public List<Object> getAttributes() {
return getFeature().getAttributes();
}
@Override
public GeometryAttribute getDefaultGeometryProperty() {
return getFeature().getDefaultGeometryProperty();
}
@Override
public void setValue(Collection<Property> values) {
getFeature().setValue(values);
}
@Override
public void setAttributes(List<Object> values) {
getFeature().setAttributes(values);
}
@Override
public void setDefaultGeometryProperty(GeometryAttribute geometryAttribute) {
getFeature().setDefaultGeometryProperty(geometryAttribute);
}
@Override
public Collection<? extends Property> getValue() {
return getFeature().getValue();
}
@Override
public Collection<Property> getProperties(Name name) {
return getFeature().getProperties(name);
}
@Override
public void setAttributes(Object[] values) {
getFeature().setAttributes(values);
}
@Override
public Name getName() {
return getFeature().getName();
}
@Override
public Property getProperty(Name name) {
return getFeature().getProperty(name);
}
@Override
public Object getAttribute(String name) {
return getFeature().getAttribute(name);
}
@Override
public boolean isNillable() {
return getFeature().isNillable();
}
@Override
public void setAttribute(String name, Object value) {
getFeature().setAttribute(name, value);
}
@Override
public Map<Object, Object> getUserData() {
return getFeature().getUserData();
}
@Override
public Object getAttribute(Name name) {
return getFeature().getAttribute(name);
}
@Override
public Collection<Property> getProperties(String name) {
return getFeature().getProperties(name);
}
@Override
public void setAttribute(Name name, Object value) {
getFeature().setAttribute(name, value);
}
@Override
public Collection<Property> getProperties() {
return getFeature().getProperties();
}
@Override
public Property getProperty(String name) {
return getFeature().getProperty(name);
}
@Override
public Object getAttribute(int index) throws IndexOutOfBoundsException {
return getFeature().getAttribute(index);
}
@Override
public void setAttribute(int index, Object value) throws IndexOutOfBoundsException {
getFeature().setAttribute(index, value);
}
@Override
public void validate() throws IllegalAttributeException {
getFeature().validate();
}
@Override
public int getAttributeCount() {
return getFeature().getAttributeCount();
}
@Override
public Object getDefaultGeometry() {
return getFeature().getDefaultGeometry();
}
@Override
public void setDefaultGeometry(Object geometry) {
getFeature().setDefaultGeometry(geometry);
}
// -----------------------------------------------------
// Object equality implementation
// -----------------------------------------------------
@Override
public int hashCode() {
return feature.hashCode();
}
@Override
public boolean equals(Object obj) {
return feature.equals(obj);
}
// -----------------------------------------------------
// Helper methods
// -----------------------------------------------------
protected SimpleFeature getFeature() {
return feature;
}
}