Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.spi / src / main / java / org / gvsig / fmap / dal / feature / spi / DefaultFeatureProvider.java @ 44376

History | View | Annotate | Download (8.77 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or modify it under
7
 * the terms of the GNU General Public License as published by the Free Software
8
 * Foundation; either version 3 of the License, or (at your option) any later
9
 * version.
10
 *
11
 * This program is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
14
 * details.
15
 *
16
 * You should have received a copy of the GNU General Public License along with
17
 * this program; if not, write to the Free Software Foundation, Inc., 51
18
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us at info AT
21
 * gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.fmap.dal.feature.spi;
24

    
25
import org.apache.commons.lang3.StringUtils;
26
import org.gvsig.fmap.dal.DataTypes;
27
import org.gvsig.fmap.dal.feature.EditableFeatureType;
28
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
29
import org.gvsig.fmap.dal.feature.FeatureType;
30
import org.gvsig.fmap.geom.Geometry;
31
import org.gvsig.fmap.geom.primitive.Envelope;
32
import org.gvsig.timesupport.Time;
33
import org.gvsig.tools.ToolsLocator;
34
import org.gvsig.tools.dataTypes.CoercionException;
35

    
36
/**
37
 * Default implementation for {@link FeatureProvider}
38
 *
39
 */
40
public class DefaultFeatureProvider implements FeatureProvider {
41

    
42
    protected FeatureType featureType;
43
    protected boolean[] nulls;
44
    protected Object[] values;
45
    protected Geometry defaultGeometry;
46
    protected Envelope envelope;
47
    private Object oid;
48
    private boolean isNew = false;
49
    
50
    private String[] extraValuesNames;
51
    private Object[] extraValues;
52

    
53
    public DefaultFeatureProvider(FeatureType type) {
54
        if (type instanceof EditableFeatureType) {
55
            throw new IllegalArgumentException("type can't by editable.");
56
        }
57
        this.featureType = type;
58
        this.values = new Object[featureType.size()];
59
        this.nulls = new boolean[featureType.size()];
60

    
61
        this.envelope = null;
62
        this.defaultGeometry = null;
63
        this.oid = null;
64
    }
65

    
66
    public DefaultFeatureProvider(FeatureType type, Object oid) {
67
        this(type);
68
        this.oid = oid;
69
    }
70

    
71
    public DefaultFeatureProvider(FeatureType type, DefaultFeatureProvider data) {
72
        this(type);
73
        this.oid = data.oid;
74
        this.defaultGeometry = data.defaultGeometry;
75
        this.envelope = data.envelope;
76
        this.isNew = data.isNew;
77
    }
78

    
79
    public boolean isReadOnly(int i) {
80
        FeatureAttributeDescriptor attribute = featureType.getAttributeDescriptor(i);
81
        if (attribute.getEvaluator() != null) {
82
            return true;
83
        }
84
        return false;
85
    }
86

    
87
    @Override
88
    public void set(int i, Object value) {
89
        FeatureAttributeDescriptor attribute = featureType.getAttributeDescriptor(i);
90
//        if (this.isReadOnly(i)) {
91
//            return;
92
//        }
93
        if (featureType.getDefaultGeometryAttributeIndex() == i) {
94
            if (value instanceof Geometry) {
95
                defaultGeometry = (Geometry) value;
96
            } else {
97
                try {
98
                    defaultGeometry = (Geometry) ToolsLocator.getDataTypesManager().coerce(DataTypes.GEOMETRY, value);
99
                } catch (CoercionException ex) {
100

    
101
                }
102
            }
103
            envelope = null;
104
        }
105
        if (value == null) {
106
            nulls[i] = true;
107
            values[i] = attribute.getDefaultValue();
108
        } else {
109
            values[i] = value;
110
            nulls[i] = false;
111
        }
112
    }
113

    
114
    /*
115
     * (non-Javadoc)
116
     *
117
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#set(java.lang.String,
118
     * java.lang.Object)
119
     */
120
    public void set(String name, Object value) {
121
        set(featureType.getIndex(name), value);
122
    }
123

    
124
    /*
125
     * (non-Javadoc)
126
     *
127
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#get(int)
128
     */
129
    public Object get(int i) {
130
        return values[i];
131
    }
132

    
133
    /*
134
     * (non-Javadoc)
135
     *
136
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#get(java.lang.String)
137
     */
138
    public Object get(String name) {
139
        FeatureAttributeDescriptor featureAttributeDescriptor = featureType.getAttributeDescriptor(name);
140
        return values[featureAttributeDescriptor.getIndex()];
141
    }
142

    
143
    /*
144
     * (non-Javadoc)
145
     *
146
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#getType()
147
     */
148
    public FeatureType getType() {
149
        return featureType;
150
    }
151

    
152
    /*
153
     * (non-Javadoc)
154
     *
155
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#getCopy()
156
     */
157
    public FeatureProvider getCopy() {
158
        DefaultFeatureProvider data = new DefaultFeatureProvider(
159
                this.getType());
160
        return getCopy(data);
161
    }
162

    
163
    /**
164
     * Copy values from current instance to <code>data</code>
165
     */
166
    protected FeatureProvider getCopy(DefaultFeatureProvider data) {
167
        data.oid = this.oid;
168
        System.arraycopy(this.values, 0, data.values, 0, this.values.length);
169
        data.defaultGeometry = this.defaultGeometry;
170
        data.envelope = this.envelope;
171
        data.isNew = this.isNew;
172
        return data;
173
    }
174

    
175
    /*
176
     * (non-Javadoc)
177
     *
178
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#getDefaultEnvelope()
179
     */
180
    public Envelope getDefaultEnvelope() {
181
        if (envelope == null && getDefaultGeometry() != null) {
182
            envelope = getDefaultGeometry().getEnvelope();
183
        }
184
        return envelope;
185
    }
186

    
187
    /*
188
     * (non-Javadoc)
189
     *
190
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#getDefaultGeometry()
191
     */
192
    public Geometry getDefaultGeometry() {
193
        return this.defaultGeometry;
194
    }
195

    
196
    @Override
197
    public Time getDefaultTime() {
198
        int index = featureType.getDefaultTimeAttributeIndex();
199
        Object value = this.get(index);
200
        if (! (value instanceof Time) ) {
201
            try {
202
                value = (Time) ToolsLocator.getDataTypesManager().coerce(DataTypes.INSTANT, value);
203
            } catch (CoercionException ex) {
204

    
205
            }
206
        }
207
        return (Time) value;
208
    }
209

    
210
    /*
211
     * (non-Javadoc)
212
     *
213
     * @see
214
     * org.gvsig.fmap.dal.feature.spi.FeatureProvider#setDefaultEnvelope(org
215
     * .gvsig.fmap.geom.primitive.Envelope)
216
     */
217
    public void setDefaultEnvelope(Envelope envelope) {
218
        this.envelope = envelope;
219
    }
220

    
221
    @Override
222
    public void setDefaultGeometry(Geometry geom) {
223
        int i = featureType.getDefaultGeometryAttributeIndex();
224
        this.set(i, geom);
225
    }
226

    
227
    @Override
228
    public void setDefaultTime(Time time) {
229
        int i = featureType.getDefaultTimeAttributeIndex();
230
        this.set(i, time);
231
    }
232

    
233

    
234
    public boolean isNull(int i) {
235
        return nulls[i];
236
    }
237

    
238
    /*
239
     * (non-Javadoc)
240
     *
241
     * @see
242
     * org.gvsig.fmap.dal.feature.spi.FeatureProvider#isNull(java.lang.String)
243
     */
244
    public boolean isNull(String name) {
245
        int i = featureType.getIndex(name);
246
        return isNull(i);
247
    }
248

    
249
    /*
250
     * (non-Javadoc)
251
     *
252
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#getOID()
253
     */
254
    public Object getOID() {
255
        return this.oid;
256
    }
257

    
258
    /*
259
     * (non-Javadoc)
260
     *
261
     * @see
262
     * org.gvsig.fmap.dal.feature.spi.FeatureProvider#setOID(java.lang.Object)
263
     */
264
    public void setOID(Object oid) {
265
        this.oid = oid;
266
    }
267

    
268
    /*
269
     * (non-Javadoc)
270
     *
271
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#isNew()
272
     */
273
    public boolean isNew() {
274
        return isNew;
275
    }
276

    
277
    /*
278
     * (non-Javadoc)
279
     *
280
     * @see org.gvsig.fmap.dal.feature.spi.FeatureProvider#setNew(boolean)
281
     */
282
    public void setNew(boolean isNew) {
283
        this.isNew = isNew;
284
    }
285

    
286
    @Override
287
    public void setExtraValue(int index, Object value) {
288
        this.extraValues[index] = value;
289
    }
290

    
291
    @Override
292
    public Object getExtraValue(int index) {
293
        if( this.extraValues == null ) {
294
            return null;
295
        }
296
        return this.extraValues[index];
297
    }
298

    
299
    @Override
300
    public Object getExtraValue(String name) {
301
        if( this.extraValuesNames == null || this.extraValues == null) {
302
            return null;
303
        }
304
        for (int i = 0; i < this.extraValuesNames.length; i++) {
305
            if( StringUtils.equalsIgnoreCase(this.extraValuesNames[i], name) ) {
306
                return this.extraValues[i];
307
            }
308
        }
309
        return null;
310
    }
311

    
312
    @Override
313
    public void setExtraValueNames(String[] extraValueNames) {
314
        this.extraValuesNames = extraValueNames;
315
        this.extraValues = new Object[this.extraValuesNames.length];
316
    }
317
    
318
    
319
}