35 |
35 |
import java.util.List;
|
36 |
36 |
import java.util.Map;
|
37 |
37 |
import java.util.Objects;
|
38 |
|
import org.gvsig.json.Json;
|
39 |
38 |
import javax.json.JsonObject;
|
40 |
|
import org.gvsig.json.JsonObjectBuilder;
|
41 |
39 |
import org.apache.commons.lang3.ArrayUtils;
|
42 |
40 |
import org.apache.commons.lang3.StringUtils;
|
43 |
41 |
import org.cresques.cts.IProjection;
|
... | ... | |
53 |
51 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
|
54 |
52 |
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
|
55 |
53 |
import org.gvsig.fmap.dal.feature.FeatureAttributeGetter;
|
|
54 |
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
|
56 |
55 |
import org.gvsig.fmap.dal.feature.FeatureReference;
|
57 |
56 |
import org.gvsig.fmap.dal.feature.FeatureStore;
|
58 |
57 |
import org.gvsig.fmap.dal.feature.FeatureType;
|
... | ... | |
63 |
62 |
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
|
64 |
63 |
import org.gvsig.fmap.geom.Geometry;
|
65 |
64 |
import org.gvsig.fmap.geom.primitive.Envelope;
|
|
65 |
import org.gvsig.json.Json;
|
|
66 |
import org.gvsig.json.JsonObjectBuilder;
|
66 |
67 |
import org.gvsig.tools.ToolsLocator;
|
67 |
68 |
import org.gvsig.tools.dataTypes.Coercion;
|
68 |
69 |
import org.gvsig.tools.dataTypes.CoercionException;
|
|
70 |
import org.gvsig.tools.dataTypes.DataType;
|
69 |
71 |
import org.gvsig.tools.dataTypes.DataTypesManager;
|
|
72 |
import org.gvsig.tools.dataTypes.impl.coercion.CoerceToString;
|
70 |
73 |
import org.gvsig.tools.dynobject.DynObject;
|
71 |
74 |
import org.gvsig.tools.evaluator.Evaluator;
|
72 |
75 |
import org.gvsig.tools.evaluator.EvaluatorData;
|
... | ... | |
74 |
77 |
import org.gvsig.tools.exception.BaseException;
|
75 |
78 |
import org.gvsig.tools.exception.BaseRuntimeException;
|
76 |
79 |
import org.gvsig.tools.lang.Cloneable;
|
77 |
|
import org.gvsig.fmap.dal.feature.FeatureExtraColumns;
|
78 |
|
import org.gvsig.tools.dataTypes.DataType;
|
|
80 |
import org.slf4j.Logger;
|
|
81 |
import org.slf4j.LoggerFactory;
|
79 |
82 |
|
80 |
83 |
@SuppressWarnings("UseSpecificCatch")
|
81 |
84 |
public class DefaultFeature implements Feature, EvaluatorData, Cloneable {
|
82 |
85 |
|
83 |
|
private static DataTypesManager dataTypesManager = null;
|
84 |
|
protected FeatureProvider data;
|
85 |
|
protected FeatureReference reference;
|
86 |
|
private WeakReference storeRef;
|
|
86 |
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultFeature.class);
|
87 |
87 |
|
88 |
|
private boolean inserted = false;
|
89 |
|
private Object[] extraValuesData;
|
90 |
|
private Map<String,Object> extraValues; // not persistent
|
|
88 |
private static DataTypesManager dataTypesManager = null;
|
|
89 |
protected FeatureProvider data;
|
|
90 |
protected FeatureReference reference;
|
|
91 |
private WeakReference storeRef;
|
91 |
92 |
|
|
93 |
private boolean inserted = false;
|
|
94 |
private Object[] extraValuesData;
|
|
95 |
private Map<String, Object> extraValues; // not persistent
|
|
96 |
|
92 |
97 |
/*
|
93 |
98 |
* Usar con mucha precaucion o mejor no usar. Lo precisa el
|
94 |
99 |
* DefaultFeatureSet en la ordenacion.
|
95 |
|
*/
|
96 |
|
public DefaultFeature(FeatureStore store) {
|
97 |
|
this.storeRef = new WeakReference(store);
|
98 |
|
this.reference = null;
|
99 |
|
}
|
|
100 |
*/
|
|
101 |
public DefaultFeature(FeatureStore store) {
|
|
102 |
this.storeRef = new WeakReference(store);
|
|
103 |
this.reference = null;
|
|
104 |
}
|
100 |
105 |
|
101 |
|
public DefaultFeature(FeatureStore store, FeatureProvider data) {
|
102 |
|
this.data = data;
|
103 |
|
this.extraValuesData = null;
|
104 |
|
this.storeRef = new WeakReference(store);
|
105 |
|
this.reference = null;
|
106 |
|
this.inserted = !data.isNew();
|
107 |
|
}
|
|
106 |
public DefaultFeature(FeatureStore store, FeatureProvider data) {
|
|
107 |
this.data = data;
|
|
108 |
this.extraValuesData = null;
|
|
109 |
this.storeRef = new WeakReference(store);
|
|
110 |
this.reference = null;
|
|
111 |
this.inserted = !data.isNew();
|
|
112 |
}
|
108 |
113 |
|
109 |
|
DefaultFeature(DefaultFeature feature) {
|
110 |
|
this.data = feature.data.getCopy();
|
111 |
|
this.extraValuesData = ArrayUtils.clone(feature.extraValuesData);
|
112 |
|
this.storeRef = feature.storeRef;
|
113 |
|
this.reference = feature.reference;
|
114 |
|
this.inserted = feature.isInserted();
|
115 |
|
}
|
|
114 |
DefaultFeature(DefaultFeature feature) {
|
|
115 |
this.data = feature.data.getCopy();
|
|
116 |
this.extraValuesData = ArrayUtils.clone(feature.extraValuesData);
|
|
117 |
this.storeRef = feature.storeRef;
|
|
118 |
this.reference = feature.reference;
|
|
119 |
this.inserted = feature.isInserted();
|
|
120 |
}
|
116 |
121 |
|
117 |
122 |
public DefaultFeature(FeatureType targetType, Feature sourceFeature) {
|
118 |
|
DefaultFeature defaultFeature = (DefaultFeature)sourceFeature;
|
119 |
|
this.data = new DefaultFeatureProvider(targetType, (DefaultFeatureProvider)defaultFeature.getData());
|
|
123 |
DefaultFeature defaultFeature = (DefaultFeature) sourceFeature;
|
|
124 |
this.data = new DefaultFeatureProvider(targetType, (DefaultFeatureProvider) defaultFeature.getData());
|
120 |
125 |
this.extraValuesData = null;
|
121 |
126 |
this.storeRef = defaultFeature.storeRef;
|
122 |
127 |
this.reference = defaultFeature.reference;
|
... | ... | |
125 |
130 |
FeatureType sourceType = sourceFeature.getType();
|
126 |
131 |
|
127 |
132 |
for (FeatureAttributeDescriptor targetAttrDescriptor : targetType) {
|
128 |
|
if ( targetAttrDescriptor.isComputed() ) {
|
129 |
|
continue;
|
|
133 |
if (targetAttrDescriptor.isComputed()) {
|
|
134 |
continue;
|
130 |
135 |
}
|
131 |
136 |
int sourceIndex = sourceType.getIndex(targetAttrDescriptor.getName());
|
132 |
|
if (sourceIndex<0){
|
|
137 |
if (sourceIndex < 0) {
|
133 |
138 |
continue;
|
134 |
139 |
}
|
135 |
140 |
Object value = sourceFeature.get(sourceIndex);
|
136 |
141 |
if (value == null && !targetAttrDescriptor.allowNull()) {
|
137 |
142 |
continue;
|
138 |
143 |
}
|
139 |
|
this.setforced(targetAttrDescriptor.getIndex(), targetAttrDescriptor,value);
|
|
144 |
this.setforced(targetAttrDescriptor.getIndex(), targetAttrDescriptor, value);
|
140 |
145 |
}
|
141 |
146 |
}
|
142 |
147 |
|
143 |
|
public void setData(FeatureProvider data) {
|
144 |
|
this.data = data;
|
145 |
|
this.extraValuesData = null;
|
146 |
|
this.reference = null;
|
147 |
|
this.inserted = true;
|
148 |
|
}
|
|
148 |
public void setData(FeatureProvider data) {
|
|
149 |
this.data = data;
|
|
150 |
this.extraValuesData = null;
|
|
151 |
this.reference = null;
|
|
152 |
this.inserted = true;
|
|
153 |
}
|
149 |
154 |
|
150 |
|
public FeatureProvider getData() {
|
151 |
|
return this.data;
|
152 |
|
}
|
|
155 |
public FeatureProvider getData() {
|
|
156 |
return this.data;
|
|
157 |
}
|
153 |
158 |
|
154 |
|
protected DataTypesManager getDataTypesManager() {
|
155 |
|
if( dataTypesManager==null ) {
|
156 |
|
dataTypesManager = ToolsLocator.getDataTypesManager();
|
157 |
|
}
|
158 |
|
return dataTypesManager;
|
159 |
|
}
|
|
159 |
protected DataTypesManager getDataTypesManager() {
|
|
160 |
if (dataTypesManager == null) {
|
|
161 |
dataTypesManager = ToolsLocator.getDataTypesManager();
|
|
162 |
}
|
|
163 |
return dataTypesManager;
|
|
164 |
}
|
160 |
165 |
|
161 |
166 |
protected void set(FeatureAttributeDescriptor attribute, Object value) {
|
162 |
167 |
int i = attribute.getIndex();
|
163 |
168 |
|
164 |
|
if ( attribute.isReadOnly() ) {
|
|
169 |
if (attribute.isReadOnly()) {
|
165 |
170 |
throw new SetReadOnlyAttributeException(attribute.getName(), this.getType());
|
166 |
171 |
}
|
167 |
172 |
FeatureAttributeEmulator emulator = attribute.getFeatureAttributeEmulator();
|
168 |
|
if( emulator!= null ) {
|
169 |
|
emulator.set((EditableFeature) this,value);
|
|
173 |
if (emulator != null) {
|
|
174 |
emulator.set((EditableFeature) this, value);
|
170 |
175 |
return;
|
171 |
176 |
}
|
172 |
177 |
|
173 |
|
if ( value == null ) {
|
174 |
|
if ( !attribute.allowNull() ) {
|
175 |
|
if ( !attribute.isAutomatic() ) {
|
|
178 |
if (value == null) {
|
|
179 |
if (!attribute.allowNull()) {
|
|
180 |
if (!attribute.isAutomatic()) {
|
176 |
181 |
throw new IllegalValueException(attribute, value);
|
177 |
182 |
}
|
178 |
183 |
}
|
... | ... | |
181 |
186 |
|
182 |
187 |
}
|
183 |
188 |
|
184 |
|
if ( attribute.getFeatureAttributeGetter() != null ) {
|
|
189 |
if (attribute.getFeatureAttributeGetter() != null) {
|
185 |
190 |
value = attribute.getFeatureAttributeGetter().setter(value);
|
186 |
191 |
}
|
187 |
192 |
this.setforced(i, attribute, value);
|
... | ... | |
190 |
195 |
private void setforced(int i, FeatureAttributeDescriptor attribute, Object value) {
|
191 |
196 |
|
192 |
197 |
Class objectClass = attribute.getObjectClass();
|
193 |
|
if( objectClass!=null ) {
|
194 |
|
if ( objectClass.isInstance(value) ) {
|
195 |
|
if( attribute.getType()==DataTypes.DECIMAL ) {
|
196 |
|
BigDecimal d = (BigDecimal) value;
|
197 |
|
if( d.scale()==attribute.getScale() && d.precision()<=attribute.getPrecision() ) {
|
|
198 |
if (objectClass != null) {
|
|
199 |
if (objectClass.isInstance(value)) {
|
|
200 |
if (attribute.getType() == DataTypes.DECIMAL) {
|
|
201 |
BigDecimal d = (BigDecimal) value;
|
|
202 |
if (d.scale() == attribute.getScale() && d.precision() <= attribute.getPrecision()) {
|
|
203 |
this.data.set(i, value);
|
|
204 |
return;
|
|
205 |
}
|
|
206 |
} else {
|
198 |
207 |
this.data.set(i, value);
|
199 |
208 |
return;
|
200 |
|
}
|
201 |
|
} else {
|
202 |
|
this.data.set(i, value);
|
203 |
|
return;
|
204 |
209 |
}
|
205 |
210 |
}
|
206 |
211 |
DataProfile dataProfile = attribute.getDataProfile();
|
207 |
|
if( dataProfile!=null ) {
|
|
212 |
if (dataProfile != null) {
|
208 |
213 |
try {
|
209 |
214 |
value = dataProfile.coerce(
|
210 |
215 |
attribute.getDataType(),
|
211 |
|
value,
|
|
216 |
value,
|
212 |
217 |
attribute.getTags()
|
213 |
218 |
);
|
214 |
219 |
} catch (CoercionException e) {
|
215 |
220 |
|
216 |
221 |
}
|
217 |
|
}
|
|
222 |
}
|
218 |
223 |
try {
|
219 |
224 |
Coercion coercer = attribute.getDataType().getCoercion();
|
220 |
|
if(attribute.getType()==DataTypes.STRING && value instanceof Boolean ){
|
|
225 |
if (attribute.getType() == DataTypes.STRING && value instanceof Boolean) {
|
221 |
226 |
value = coercer.coerce(value, attribute.getCoercionContext());
|
222 |
227 |
value = StringUtils.left((String) value, attribute.getSize());
|
223 |
228 |
} else {
|
224 |
|
value= coercer.coerce(value, attribute.getCoercionContext());
|
|
229 |
value = coercer.coerce(value, attribute.getCoercionContext());
|
225 |
230 |
}
|
226 |
231 |
} catch (CoercionException e) {
|
227 |
232 |
throw new IllegalArgumentException("Can't convert to "
|
228 |
233 |
+ attribute.getDataType().getName()
|
229 |
234 |
+ " from '"
|
230 |
|
+ value==null? "NULL":value.getClass().getName()
|
231 |
|
+ "' with value '"
|
232 |
|
+ Objects.toString(value)
|
233 |
|
+ "' and context '"
|
234 |
|
+ attribute.getCoercionContext()
|
235 |
|
+ "'.");
|
|
235 |
+ value == null ? "NULL" : value.getClass().getName()
|
|
236 |
+ "' with value '"
|
|
237 |
+ Objects.toString(value)
|
|
238 |
+ "' and context '"
|
|
239 |
+ attribute.getCoercionContext()
|
|
240 |
+ "'.");
|
236 |
241 |
}
|
237 |
242 |
}
|
238 |
243 |
this.data.set(i, value);
|
239 |
244 |
}
|
240 |
245 |
|
241 |
|
private Object get(int index,Class theClass, int type) {
|
|
246 |
private Object get(int index, Class theClass, int type) {
|
242 |
247 |
Object value = this.get(index);
|
243 |
|
if( theClass.isInstance(value) ) {
|
|
248 |
if (theClass.isInstance(value)) {
|
244 |
249 |
return value;
|
245 |
250 |
}
|
246 |
251 |
try {
|
... | ... | |
251 |
256 |
return null;
|
252 |
257 |
}
|
253 |
258 |
throw new IllegalArgumentException(
|
254 |
|
"Can't convert to "+theClass.getName()+
|
255 |
|
" from '"+value.getClass().getName()+
|
256 |
|
"' with value '"+value.toString()+"'.");
|
|
259 |
"Can't convert to " + theClass.getName()
|
|
260 |
+ " from '" + value.getClass().getName()
|
|
261 |
+ "' with value '" + value.toString() + "'.");
|
257 |
262 |
}
|
258 |
263 |
}
|
259 |
264 |
|
... | ... | |
261 |
266 |
FeatureType type = this.getType();
|
262 |
267 |
for (FeatureAttributeDescriptor attribute : type) {
|
263 |
268 |
if (attribute.isAutomatic() || attribute.isReadOnly()
|
264 |
|
|| attribute.isComputed() ) {
|
|
269 |
|| attribute.isComputed()) {
|
265 |
270 |
continue;
|
266 |
271 |
}
|
267 |
272 |
if (attribute.getDefaultValue() == null && !attribute.allowNull()) {
|
268 |
273 |
continue;
|
269 |
274 |
}
|
270 |
|
Object value = attribute.getDefaultValue();
|
271 |
|
if( value instanceof CharSequence ) {
|
272 |
|
String s = ((CharSequence)value).toString();
|
273 |
|
if( ExpressionUtils.isDynamicText(s) ) {
|
274 |
|
try {
|
275 |
|
value = ExpressionUtils.evaluateDynamicText(s);
|
276 |
|
} catch(Throwable th) {
|
277 |
|
value = null;
|
|
275 |
Object value = attribute.getDefaultValue();
|
|
276 |
if (value instanceof CharSequence) {
|
|
277 |
String s = ((CharSequence) value).toString();
|
|
278 |
if (ExpressionUtils.isDynamicText(s)) {
|
|
279 |
try {
|
|
280 |
value = ExpressionUtils.evaluateDynamicText(s);
|
|
281 |
} catch (Throwable th) {
|
|
282 |
value = null;
|
|
283 |
}
|
278 |
284 |
}
|
279 |
|
}
|
280 |
285 |
}
|
281 |
286 |
this.set(attribute, value);
|
282 |
287 |
}
|
... | ... | |
287 |
292 |
}
|
288 |
293 |
|
289 |
294 |
public void initializeValues(Feature feature) {
|
290 |
|
FeatureType myType=this.getType();
|
291 |
|
FeatureType type =feature.getType();
|
|
295 |
FeatureType myType = this.getType();
|
|
296 |
FeatureType type = feature.getType();
|
292 |
297 |
extraValuesData = null;
|
293 |
298 |
for (FeatureAttributeDescriptor attribute : type) {
|
294 |
|
FeatureAttributeDescriptor myAttribute=myType.getAttributeDescriptor(attribute.getName());
|
|
299 |
FeatureAttributeDescriptor myAttribute = myType.getAttributeDescriptor(attribute.getName());
|
295 |
300 |
if (myAttribute != null) {
|
296 |
301 |
this.set(myAttribute, feature.get(attribute.getIndex()));
|
297 |
302 |
}
|
298 |
303 |
}
|
299 |
304 |
}
|
300 |
305 |
|
301 |
|
|
302 |
306 |
@Override
|
303 |
307 |
public FeatureStore getStore() {
|
304 |
308 |
return (FeatureStore) this.storeRef.get();
|
... | ... | |
339 |
343 |
@Override
|
340 |
344 |
public Object getOrDefault(String name, Object defaultValue) {
|
341 |
345 |
int index = this.data.getType().getIndex(name);
|
342 |
|
if( index < 0 ) {
|
|
346 |
if (index < 0) {
|
343 |
347 |
return defaultValue;
|
344 |
348 |
}
|
345 |
349 |
return this.get(index);
|
... | ... | |
348 |
352 |
@Override
|
349 |
353 |
public String getStringOrDefault(String name, String defaultValue) {
|
350 |
354 |
int index = this.data.getType().getIndex(name);
|
351 |
|
if( index < 0 ) {
|
|
355 |
if (index < 0) {
|
352 |
356 |
return defaultValue;
|
353 |
357 |
}
|
354 |
358 |
try {
|
355 |
359 |
return (String) this.get(index);
|
356 |
|
} catch(Throwable th) {
|
|
360 |
} catch (Throwable th) {
|
357 |
361 |
return defaultValue;
|
358 |
362 |
}
|
359 |
363 |
}
|
... | ... | |
361 |
365 |
@Override
|
362 |
366 |
public boolean getBooleanOrDefault(String name, boolean defaultValue) {
|
363 |
367 |
int index = this.data.getType().getIndex(name);
|
364 |
|
if( index < 0 ) {
|
|
368 |
if (index < 0) {
|
365 |
369 |
return defaultValue;
|
366 |
370 |
}
|
367 |
371 |
try {
|
368 |
372 |
return this.getBoolean(index);
|
369 |
|
} catch(Throwable th) {
|
|
373 |
} catch (Throwable th) {
|
370 |
374 |
return defaultValue;
|
371 |
375 |
}
|
372 |
376 |
}
|
... | ... | |
374 |
378 |
@Override
|
375 |
379 |
public int getIntOrDefault(String name, int defaultValue) {
|
376 |
380 |
int index = this.data.getType().getIndex(name);
|
377 |
|
if( index < 0 ) {
|
|
381 |
if (index < 0) {
|
378 |
382 |
return defaultValue;
|
379 |
383 |
}
|
380 |
384 |
try {
|
381 |
385 |
return this.getInt(index);
|
382 |
|
} catch(Throwable th) {
|
|
386 |
} catch (Throwable th) {
|
383 |
387 |
return defaultValue;
|
384 |
388 |
}
|
385 |
389 |
}
|
... | ... | |
387 |
391 |
@Override
|
388 |
392 |
public long getLongOrDefault(String name, long defaultValue) {
|
389 |
393 |
int index = this.data.getType().getIndex(name);
|
390 |
|
if( index < 0 ) {
|
|
394 |
if (index < 0) {
|
391 |
395 |
return defaultValue;
|
392 |
396 |
}
|
393 |
397 |
try {
|
394 |
398 |
return this.getLong(index);
|
395 |
|
} catch(Throwable th) {
|
|
399 |
} catch (Throwable th) {
|
396 |
400 |
return defaultValue;
|
397 |
401 |
}
|
398 |
402 |
}
|
... | ... | |
400 |
404 |
@Override
|
401 |
405 |
public float getFloatOrDefault(String name, float defaultValue) {
|
402 |
406 |
int index = this.data.getType().getIndex(name);
|
403 |
|
if( index < 0 ) {
|
|
407 |
if (index < 0) {
|
404 |
408 |
return defaultValue;
|
405 |
409 |
}
|
406 |
410 |
try {
|
407 |
411 |
return this.getFloat(index);
|
408 |
|
} catch(Throwable th) {
|
|
412 |
} catch (Throwable th) {
|
409 |
413 |
return defaultValue;
|
410 |
414 |
}
|
411 |
415 |
}
|
... | ... | |
413 |
417 |
@Override
|
414 |
418 |
public double getDoubleOrDefault(String name, double defaultValue) {
|
415 |
419 |
int index = this.data.getType().getIndex(name);
|
416 |
|
if( index < 0 ) {
|
|
420 |
if (index < 0) {
|
417 |
421 |
return defaultValue;
|
418 |
422 |
}
|
419 |
423 |
try {
|
420 |
424 |
return this.getDouble(index);
|
421 |
|
} catch(Throwable th) {
|
|
425 |
} catch (Throwable th) {
|
422 |
426 |
return defaultValue;
|
423 |
427 |
}
|
424 |
428 |
}
|
... | ... | |
426 |
430 |
@Override
|
427 |
431 |
public BigDecimal getDecimalOrDefault(String name, BigDecimal defaultValue) {
|
428 |
432 |
int index = this.data.getType().getIndex(name);
|
429 |
|
if( index < 0 ) {
|
|
433 |
if (index < 0) {
|
430 |
434 |
return defaultValue;
|
431 |
435 |
}
|
432 |
436 |
try {
|
433 |
437 |
return this.getDecimal(index);
|
434 |
|
} catch(Throwable th) {
|
|
438 |
} catch (Throwable th) {
|
435 |
439 |
return defaultValue;
|
436 |
440 |
}
|
437 |
441 |
}
|
... | ... | |
439 |
443 |
@Override
|
440 |
444 |
public Date getDateOrDefault(String name, Date defaultValue) {
|
441 |
445 |
int index = this.data.getType().getIndex(name);
|
442 |
|
if( index < 0 ) {
|
|
446 |
if (index < 0) {
|
443 |
447 |
return defaultValue;
|
444 |
448 |
}
|
445 |
449 |
try {
|
446 |
450 |
return this.getDate(index);
|
447 |
|
} catch(Throwable th) {
|
|
451 |
} catch (Throwable th) {
|
448 |
452 |
return defaultValue;
|
449 |
453 |
}
|
450 |
454 |
}
|
451 |
455 |
|
452 |
456 |
@Override
|
453 |
457 |
public Object getOrDefault(int index, Object defaultValue) {
|
454 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
458 |
if (index < 0 || index >= this.data.getType().size()) {
|
455 |
459 |
return defaultValue;
|
456 |
460 |
}
|
457 |
461 |
try {
|
458 |
462 |
return this.get(index);
|
459 |
|
} catch(Throwable th) {
|
|
463 |
} catch (Throwable th) {
|
460 |
464 |
return defaultValue;
|
461 |
465 |
}
|
462 |
466 |
}
|
463 |
467 |
|
464 |
468 |
@Override
|
465 |
469 |
public String getStringOrDefault(int index, String defaultValue) {
|
466 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
470 |
if (index < 0 || index >= this.data.getType().size()) {
|
467 |
471 |
return defaultValue;
|
468 |
472 |
}
|
469 |
473 |
try {
|
470 |
474 |
return this.getString(index);
|
471 |
|
} catch(Throwable th) {
|
|
475 |
} catch (Throwable th) {
|
472 |
476 |
return defaultValue;
|
473 |
477 |
}
|
474 |
478 |
}
|
475 |
479 |
|
476 |
480 |
@Override
|
477 |
481 |
public boolean getBooleanOrDefault(int index, boolean defaultValue) {
|
478 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
482 |
if (index < 0 || index >= this.data.getType().size()) {
|
479 |
483 |
return defaultValue;
|
480 |
484 |
}
|
481 |
485 |
try {
|
482 |
486 |
return this.getBoolean(index);
|
483 |
|
} catch(Throwable th) {
|
|
487 |
} catch (Throwable th) {
|
484 |
488 |
return defaultValue;
|
485 |
489 |
}
|
486 |
490 |
}
|
487 |
491 |
|
488 |
|
|
489 |
492 |
@Override
|
490 |
493 |
public int getIntOrDefault(int index, int defaultValue) {
|
491 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
494 |
if (index < 0 || index >= this.data.getType().size()) {
|
492 |
495 |
return defaultValue;
|
493 |
496 |
}
|
494 |
497 |
try {
|
495 |
498 |
return this.getInt(index);
|
496 |
|
} catch(Throwable th) {
|
|
499 |
} catch (Throwable th) {
|
497 |
500 |
return defaultValue;
|
498 |
501 |
}
|
499 |
502 |
}
|
500 |
503 |
|
501 |
504 |
@Override
|
502 |
505 |
public long getLongOrDefault(int index, long defaultValue) {
|
503 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
506 |
if (index < 0 || index >= this.data.getType().size()) {
|
504 |
507 |
return defaultValue;
|
505 |
508 |
}
|
506 |
509 |
try {
|
507 |
510 |
return this.getLong(index);
|
508 |
|
} catch(Throwable th) {
|
|
511 |
} catch (Throwable th) {
|
509 |
512 |
return defaultValue;
|
510 |
513 |
}
|
511 |
514 |
}
|
512 |
515 |
|
513 |
516 |
@Override
|
514 |
517 |
public float getFloatOrDefault(int index, float defaultValue) {
|
515 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
518 |
if (index < 0 || index >= this.data.getType().size()) {
|
516 |
519 |
return defaultValue;
|
517 |
520 |
}
|
518 |
521 |
try {
|
519 |
522 |
return this.getFloat(index);
|
520 |
|
} catch(Throwable th) {
|
|
523 |
} catch (Throwable th) {
|
521 |
524 |
return defaultValue;
|
522 |
525 |
}
|
523 |
526 |
}
|
524 |
527 |
|
525 |
528 |
@Override
|
526 |
529 |
public double getDoubleOrDefault(int index, double defaultValue) {
|
527 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
530 |
if (index < 0 || index >= this.data.getType().size()) {
|
528 |
531 |
return defaultValue;
|
529 |
532 |
}
|
530 |
533 |
try {
|
531 |
534 |
return this.getDouble(index);
|
532 |
|
} catch(Throwable th) {
|
|
535 |
} catch (Throwable th) {
|
533 |
536 |
return defaultValue;
|
534 |
537 |
}
|
535 |
538 |
}
|
536 |
539 |
|
537 |
540 |
@Override
|
538 |
541 |
public BigDecimal getDecimalOrDefault(int index, BigDecimal defaultValue) {
|
539 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
542 |
if (index < 0 || index >= this.data.getType().size()) {
|
540 |
543 |
return defaultValue;
|
541 |
544 |
}
|
542 |
545 |
try {
|
543 |
546 |
return this.getDecimal(index);
|
544 |
|
} catch(Throwable th) {
|
|
547 |
} catch (Throwable th) {
|
545 |
548 |
return defaultValue;
|
546 |
549 |
}
|
547 |
550 |
}
|
548 |
551 |
|
549 |
552 |
@Override
|
550 |
553 |
public Date getDateOrDefault(int index, Date defaultValue) {
|
551 |
|
if( index < 0 || index >= this.data.getType().size() ) {
|
|
554 |
if (index < 0 || index >= this.data.getType().size()) {
|
552 |
555 |
return defaultValue;
|
553 |
556 |
}
|
554 |
557 |
try {
|
555 |
558 |
return this.getDate(index);
|
556 |
|
} catch(Throwable th) {
|
|
559 |
} catch (Throwable th) {
|
557 |
560 |
return defaultValue;
|
558 |
561 |
}
|
559 |
562 |
}
|
... | ... | |
571 |
574 |
@SuppressWarnings("OverridableMethodCallInConstructor")
|
572 |
575 |
public UnableToGetReferenceException(BaseException exception) {
|
573 |
576 |
super("Unable to get reference", "_UnableToGetReferenceException",
|
574 |
|
serialVersionUID);
|
|
577 |
serialVersionUID);
|
575 |
578 |
this.initCause(exception);
|
576 |
579 |
|
577 |
580 |
}
|
... | ... | |
579 |
582 |
}
|
580 |
583 |
|
581 |
584 |
@Override
|
582 |
|
public void validate(int mode) throws DataException {
|
|
585 |
public void validate(int mode) throws DataException {
|
583 |
586 |
((DefaultFeatureType) this.data.getType()).validateFeature(this, mode);
|
584 |
587 |
}
|
585 |
588 |
|
... | ... | |
592 |
595 |
@Override
|
593 |
596 |
public Envelope getDefaultEnvelope() {
|
594 |
597 |
Envelope envelope = this.data.getDefaultEnvelope();
|
595 |
|
if( envelope == null ) {
|
|
598 |
if (envelope == null) {
|
596 |
599 |
int i = this.data.getType().getDefaultGeometryAttributeIndex();
|
597 |
|
if( i<0 ) {
|
|
600 |
if (i < 0) {
|
598 |
601 |
return null;
|
599 |
602 |
}
|
600 |
603 |
Geometry geom = this.getDefaultGeometry();
|
601 |
|
if( geom!=null ) {
|
|
604 |
if (geom != null) {
|
602 |
605 |
envelope = geom.getEnvelope();
|
603 |
606 |
}
|
604 |
607 |
}
|
... | ... | |
607 |
610 |
|
608 |
611 |
@Override
|
609 |
612 |
public Geometry getDefaultGeometry() {
|
610 |
|
Geometry geom = this.data.getDefaultGeometry();
|
611 |
|
if( geom == null ) {
|
|
613 |
Geometry geom = this.data.getDefaultGeometry();
|
|
614 |
if (geom == null) {
|
612 |
615 |
int i = this.data.getType().getDefaultGeometryAttributeIndex();
|
613 |
|
if( i<0 ) {
|
|
616 |
if (i < 0) {
|
614 |
617 |
return null;
|
615 |
618 |
}
|
616 |
619 |
Object x = this.get(i);
|
617 |
|
if( x instanceof Geometry ) {
|
|
620 |
if (x instanceof Geometry) {
|
618 |
621 |
geom = (Geometry) x;
|
619 |
622 |
} else {
|
620 |
623 |
geom = this.getGeometry(i);
|
621 |
624 |
}
|
622 |
625 |
}
|
623 |
|
if( geom != null ) {
|
624 |
|
if( geom.getProjection()==null ) {
|
|
626 |
if (geom != null) {
|
|
627 |
if (geom.getProjection() == null) {
|
625 |
628 |
FeatureType type = this.getType();
|
626 |
629 |
DefaultFeatureAttributeDescriptor attrdesc = (DefaultFeatureAttributeDescriptor) type.get(type.getDefaultGeometryAttributeIndex());
|
627 |
630 |
IProjection proj = attrdesc.getSRS(this.storeRef);
|
... | ... | |
649 |
652 |
@Override
|
650 |
653 |
public IProjection getDefaultSRS() {
|
651 |
654 |
IProjection srs = this.data.getType().getDefaultSRS();
|
652 |
|
if( srs == null ) {
|
|
655 |
if (srs == null) {
|
653 |
656 |
FeatureType type = this.getType();
|
654 |
657 |
DefaultFeatureAttributeDescriptor attrdesc = (DefaultFeatureAttributeDescriptor) type.get(type.getDefaultGeometryAttributeIndex());
|
655 |
658 |
srs = attrdesc.getSRS(this.storeRef);
|
... | ... | |
668 |
671 |
FeatureAttributeDescriptor descriptor = this.data.getType().getAttributeDescriptor(index);
|
669 |
672 |
Object value = this.get(index);
|
670 |
673 |
String profileName = descriptor.getDataProfileName();
|
671 |
|
if( StringUtils.isBlank(profileName) ) {
|
|
674 |
if (StringUtils.isBlank(profileName)) {
|
672 |
675 |
return value;
|
673 |
676 |
}
|
674 |
677 |
DataProfile profile = DALLocator.getDataManager().getDataProfile(profileName);
|
675 |
|
if( profile==null ) {
|
|
678 |
if (profile == null) {
|
676 |
679 |
return value;
|
677 |
680 |
}
|
678 |
681 |
return profile.createData(value, descriptor.getTags());
|
... | ... | |
687 |
690 |
@Override
|
688 |
691 |
public Object get(String name) {
|
689 |
692 |
int index = this.data.getType().getIndex(name);
|
690 |
|
if( index < 0 ) {
|
|
693 |
if (index < 0) {
|
691 |
694 |
// buscamos en los extra cols
|
692 |
|
if(hasExtraColumnValue(name)) {
|
|
695 |
if (hasExtraColumnValue(name)) {
|
693 |
696 |
return getExtraColumnValue(name);
|
694 |
697 |
}
|
695 |
698 |
if (hasExtraValue(name)) {
|
696 |
699 |
return getExtraValue(name);
|
697 |
700 |
}
|
698 |
701 |
// y si esta ahi return
|
699 |
|
throw new IllegalArgumentException("Attribute name '"+name+"' not found in the feature.");
|
|
702 |
throw new IllegalArgumentException("Attribute name '" + name + "' not found in the feature.");
|
700 |
703 |
}
|
701 |
704 |
return this.get(index);
|
702 |
705 |
}
|
703 |
|
|
|
706 |
|
704 |
707 |
@Override
|
705 |
708 |
public boolean isNull(int index) {
|
706 |
709 |
FeatureType type = this.data.getType();
|
707 |
|
if( index <0 || index >= type.size() ) {
|
708 |
|
throw new IllegalArgumentException("Attribute index '"+index+"' out of range (0 to "+this.data.getType().size()+".");
|
|
710 |
if (index < 0 || index >= type.size()) {
|
|
711 |
throw new IllegalArgumentException("Attribute index '" + index + "' out of range (0 to " + this.data.getType().size() + ".");
|
709 |
712 |
}
|
710 |
713 |
FeatureAttributeDescriptor attribute = type.getAttributeDescriptor(index);
|
711 |
714 |
if (!this.data.getType().hasEvaluators()) {
|
712 |
|
return this.data.get(index)==null;
|
|
715 |
return this.data.get(index) == null;
|
713 |
716 |
}
|
714 |
717 |
Evaluator eval = attribute.getEvaluator();
|
715 |
718 |
if (eval == null) {
|
716 |
|
return this.data.get(index)==null;
|
|
719 |
return this.data.get(index) == null;
|
717 |
720 |
}
|
718 |
721 |
Object value = this.data.get(index);
|
719 |
722 |
if (value != null) {
|
... | ... | |
725 |
728 |
throw new DataEvaluatorRuntimeException(e);
|
726 |
729 |
}
|
727 |
730 |
this.data.set(index, value);
|
728 |
|
return value==null;
|
|
731 |
return value == null;
|
729 |
732 |
}
|
730 |
|
|
|
733 |
|
731 |
734 |
@Override
|
732 |
735 |
public boolean isNull(String name) {
|
733 |
736 |
int index = this.data.getType().getIndex(name);
|
734 |
|
if( index < 0 ) {
|
735 |
|
throw new IllegalArgumentException("Attribute name '"+name+"' not found in the feature.");
|
|
737 |
if (index < 0) {
|
|
738 |
throw new IllegalArgumentException("Attribute name '" + name + "' not found in the feature.");
|
736 |
739 |
}
|
737 |
740 |
return this.isNull(index);
|
738 |
741 |
}
|
... | ... | |
744 |
747 |
|
745 |
748 |
public List<String> keys() {
|
746 |
749 |
List<String> ks = new ArrayList<>();
|
747 |
|
for( FeatureAttributeDescriptor attr : this.getType()) {
|
|
750 |
for (FeatureAttributeDescriptor attr : this.getType()) {
|
748 |
751 |
ks.add(attr.getName());
|
749 |
752 |
}
|
750 |
753 |
return ks;
|
... | ... | |
760 |
763 |
|
761 |
764 |
@Override
|
762 |
765 |
public String next() {
|
763 |
|
return ((FeatureAttributeDescriptor)it.next()).getName();
|
|
766 |
return ((FeatureAttributeDescriptor) it.next()).getName();
|
764 |
767 |
}
|
765 |
768 |
|
766 |
769 |
@Override
|
... | ... | |
780 |
783 |
|
781 |
784 |
@Override
|
782 |
785 |
public Map.Entry next() {
|
783 |
|
final String name = ((FeatureAttributeDescriptor)it.next()).getName();
|
|
786 |
final String name = ((FeatureAttributeDescriptor) it.next()).getName();
|
784 |
787 |
return new Map.Entry<String, Object>() {
|
785 |
788 |
@Override
|
786 |
789 |
public String getKey() {
|
... | ... | |
810 |
813 |
@Override
|
811 |
814 |
public Object get(int index) {
|
812 |
815 |
FeatureType type = this.data.getType();
|
813 |
|
if( index <0 || index >= type.size() ) {
|
814 |
|
throw new IllegalArgumentException("Attribute index '"+index+"' out of range (0 to "+this.data.getType().size()+".");
|
|
816 |
if (index < 0 || index >= type.size()) {
|
|
817 |
throw new IllegalArgumentException("Attribute index '" + index + "' out of range (0 to " + this.data.getType().size() + ".");
|
815 |
818 |
}
|
816 |
819 |
Object value = this.data.get(index);
|
817 |
820 |
FeatureAttributeDescriptor attribute = type.getAttributeDescriptor(index);
|
818 |
821 |
if (type.hasEvaluators()) {
|
819 |
|
Evaluator eval = attribute.getEvaluator();
|
820 |
|
if (eval != null) {
|
821 |
|
if (value == null) { // Ya hemos calculado el campo ?
|
822 |
|
// FIXME: para comprobar si esta calculado usar un array especifico.
|
823 |
|
try {
|
824 |
|
value = eval.evaluate(this);
|
825 |
|
} catch (EvaluatorException e) {
|
826 |
|
throw new DataEvaluatorRuntimeException(e);
|
827 |
|
}
|
828 |
|
this.data.set(index, value);
|
829 |
|
}
|
830 |
|
}
|
|
822 |
Evaluator eval = attribute.getEvaluator();
|
|
823 |
if (eval != null) {
|
|
824 |
if (value == null) { // Ya hemos calculado el campo ?
|
|
825 |
// FIXME: para comprobar si esta calculado usar un array especifico.
|
|
826 |
try {
|
|
827 |
value = eval.evaluate(this);
|
|
828 |
} catch (EvaluatorException e) {
|
|
829 |
throw new DataEvaluatorRuntimeException(e);
|
|
830 |
}
|
|
831 |
this.data.set(index, value);
|
|
832 |
}
|
|
833 |
}
|
831 |
834 |
}
|
832 |
835 |
value = get(attribute, value);
|
833 |
|
return value;
|
|
836 |
return value;
|
834 |
837 |
}
|
835 |
838 |
|
836 |
|
private Object get(FeatureAttributeDescriptor featureAttributeDescriptor, Object value){
|
|
839 |
private Object get(FeatureAttributeDescriptor featureAttributeDescriptor, Object value) {
|
837 |
840 |
FeatureAttributeEmulator emulator = featureAttributeDescriptor.getFeatureAttributeEmulator();
|
838 |
|
if( emulator != null ) {
|
|
841 |
if (emulator != null) {
|
839 |
842 |
// int index = featureAttributeDescriptor.getIndex();
|
840 |
843 |
// value = this.data.get(index);
|
841 |
844 |
// if( value==null ) {
|
842 |
|
value = emulator.get(this);
|
|
845 |
value = emulator.get(this);
|
843 |
846 |
// this.data.set(index,value);
|
844 |
847 |
// }
|
845 |
848 |
} else {
|
846 |
849 |
FeatureAttributeGetter getter = featureAttributeDescriptor.getFeatureAttributeGetter();
|
847 |
|
if( getter != null ) {
|
|
850 |
if (getter != null) {
|
848 |
851 |
value = getter.getter(value);
|
849 |
852 |
}
|
850 |
853 |
}
|
851 |
854 |
DataType dataType = featureAttributeDescriptor.getDataType();
|
852 |
855 |
Class<? extends DataType> theClass = dataType.getDefaultClass();
|
853 |
|
if( theClass!=null && !theClass.isInstance(value) ) {
|
|
856 |
if (theClass != null && !theClass.isInstance(value)) {
|
854 |
857 |
try {
|
855 |
858 |
value = this.getDataTypesManager().coerce(dataType.getType(), value);
|
856 |
859 |
} catch (CoercionException e) {
|
857 |
|
throw new IllegalArgumentException(
|
858 |
|
"Can't convert to "+theClass.getSimpleName()+
|
859 |
|
" from '"+value.getClass().getSimpleName()+
|
860 |
|
"' with value '"+value.toString()+"'.");
|
|
860 |
throw new IllegalArgumentException(
|
|
861 |
"Can't convert to " + theClass.getSimpleName()
|
|
862 |
+ " from '" + value.getClass().getSimpleName()
|
|
863 |
+ "' with value '" + value.toString() + "'.");
|
861 |
864 |
}
|
862 |
865 |
}
|
863 |
|
if( featureAttributeDescriptor.getType()==DataTypes.GEOMETRY ) {
|
864 |
|
if( value != null ) {
|
865 |
|
Geometry geom = (Geometry)value;
|
866 |
|
if( geom.getProjection()==null ) {
|
867 |
|
IProjection proj = ((DefaultFeatureAttributeDescriptor)featureAttributeDescriptor).getSRS(this.storeRef);
|
|
866 |
if (featureAttributeDescriptor.getType() == DataTypes.GEOMETRY) {
|
|
867 |
if (value != null) {
|
|
868 |
Geometry geom = (Geometry) value;
|
|
869 |
if (geom.getProjection() == null) {
|
|
870 |
IProjection proj = ((DefaultFeatureAttributeDescriptor) featureAttributeDescriptor).getSRS(this.storeRef);
|
868 |
871 |
geom.setProjection(proj);
|
869 |
872 |
}
|
870 |
873 |
}
|
... | ... | |
899 |
902 |
|
900 |
903 |
@Override
|
901 |
904 |
public boolean getBoolean(int index) {
|
902 |
|
Boolean value = ((Boolean) this.get(index,Boolean.class,DataTypes.BOOLEAN));
|
|
905 |
Boolean value = ((Boolean) this.get(index, Boolean.class, DataTypes.BOOLEAN));
|
903 |
906 |
if (value == null) {
|
904 |
907 |
return false;
|
905 |
908 |
}
|
... | ... | |
913 |
916 |
|
914 |
917 |
@Override
|
915 |
918 |
public byte getByte(int index) {
|
916 |
|
Byte value = ((Byte) this.get(index,Byte.class,DataTypes.BYTE));
|
|
919 |
Byte value = ((Byte) this.get(index, Byte.class, DataTypes.BYTE));
|
917 |
920 |
if (value == null) {
|
918 |
921 |
return 0;
|
919 |
922 |
}
|
... | ... | |
927 |
930 |
|
928 |
931 |
@Override
|
929 |
932 |
public java.sql.Date getDate(int index) {
|
930 |
|
java.sql.Date value = ((java.sql.Date) this.get(index,java.sql.Date.class,DataTypes.DATE));
|
|
933 |
java.sql.Date value = ((java.sql.Date) this.get(index, java.sql.Date.class, DataTypes.DATE));
|
931 |
934 |
return value;
|
932 |
935 |
}
|
933 |
936 |
|
... | ... | |
938 |
941 |
|
939 |
942 |
@Override
|
940 |
943 |
public java.sql.Time getTime(int index) {
|
941 |
|
java.sql.Time value = ((java.sql.Time) this.get(index,java.sql.Time.class,DataTypes.TIME));
|
|
944 |
java.sql.Time value = ((java.sql.Time) this.get(index, java.sql.Time.class, DataTypes.TIME));
|
942 |
945 |
return value;
|
943 |
946 |
}
|
944 |
947 |
|
... | ... | |
949 |
952 |
|
950 |
953 |
@Override
|
951 |
954 |
public java.sql.Timestamp getTimestamp(int index) {
|
952 |
|
java.sql.Timestamp value = ((java.sql.Timestamp) this.get(index,java.sql.Timestamp.class,DataTypes.TIMESTAMP));
|
|
955 |
java.sql.Timestamp value = ((java.sql.Timestamp) this.get(index, java.sql.Timestamp.class, DataTypes.TIMESTAMP));
|
953 |
956 |
return value;
|
954 |
957 |
}
|
955 |
958 |
|
... | ... | |
961 |
964 |
@Override
|
962 |
965 |
public double getDouble(int index) {
|
963 |
966 |
|
964 |
|
Double value = ((Double) this.get(index,Double.class,DataTypes.DOUBLE));
|
|
967 |
Double value = ((Double) this.get(index, Double.class, DataTypes.DOUBLE));
|
965 |
968 |
if (value == null) {
|
966 |
969 |
return 0;
|
967 |
970 |
}
|
... | ... | |
975 |
978 |
|
976 |
979 |
@Override
|
977 |
980 |
public BigDecimal getDecimal(int index) {
|
978 |
|
BigDecimal value = ((BigDecimal) this.get(index,BigDecimal.class,DataTypes.DECIMAL));
|
|
981 |
BigDecimal value = ((BigDecimal) this.get(index, BigDecimal.class, DataTypes.DECIMAL));
|
979 |
982 |
return value;
|
980 |
983 |
}
|
981 |
984 |
|
... | ... | |
996 |
999 |
|
997 |
1000 |
@Override
|
998 |
1001 |
public float getFloat(int index) {
|
999 |
|
Float value = ((Float) this.get(index,Float.class,DataTypes.FLOAT));
|
|
1002 |
Float value = ((Float) this.get(index, Float.class, DataTypes.FLOAT));
|
1000 |
1003 |
if (value == null) {
|
1001 |
1004 |
return 0;
|
1002 |
1005 |
}
|
... | ... | |
1010 |
1013 |
|
1011 |
1014 |
@Override
|
1012 |
1015 |
public Geometry getGeometry(int index) {
|
1013 |
|
return (Geometry) this.get(index,Geometry.class,DataTypes.GEOMETRY);
|
|
1016 |
return (Geometry) this.get(index, Geometry.class, DataTypes.GEOMETRY);
|
1014 |
1017 |
}
|
1015 |
1018 |
|
1016 |
1019 |
@Override
|
... | ... | |
1020 |
1023 |
|
1021 |
1024 |
@Override
|
1022 |
1025 |
public int getInt(int index) {
|
1023 |
|
Integer value = ((Integer) this.get(index,Integer.class,DataTypes.INT));
|
|
1026 |
Integer value = ((Integer) this.get(index, Integer.class, DataTypes.INT));
|
1024 |
1027 |
if (value == null) {
|
1025 |
1028 |
return 0;
|
1026 |
1029 |
}
|
... | ... | |
1034 |
1037 |
|
1035 |
1038 |
@Override
|
1036 |
1039 |
public long getLong(int index) {
|
1037 |
|
Long value = ((Long) this.get(index,Long.class,DataTypes.LONG));
|
|
1040 |
Long value = ((Long) this.get(index, Long.class, DataTypes.LONG));
|
1038 |
1041 |
if (value == null) {
|
1039 |
1042 |
return 0;
|
1040 |
1043 |
}
|
... | ... | |
1048 |
1051 |
|
1049 |
1052 |
@Override
|
1050 |
1053 |
public String getString(int index) {
|
1051 |
|
return (String) this.get(index,String.class,DataTypes.STRING);
|
|
1054 |
return (String) this.get(index, String.class, DataTypes.STRING);
|
1052 |
1055 |
}
|
1053 |
1056 |
|
1054 |
1057 |
@Override
|
... | ... | |
1072 |
1075 |
@Override
|
1073 |
1076 |
public Iterator getDataNames() {
|
1074 |
1077 |
class DataNamesIterator implements Iterator {
|
|
1078 |
|
1075 |
1079 |
Iterator attributeIteraror;
|
1076 |
1080 |
|
1077 |
1081 |
DataNamesIterator(DefaultFeature feature) {
|
... | ... | |
1104 |
1108 |
try {
|
1105 |
1109 |
return get(name);
|
1106 |
1110 |
} catch (IllegalArgumentException ex) {
|
1107 |
|
if( "defaultgeometry".equalsIgnoreCase(name )) {
|
|
1111 |
if ("defaultgeometry".equalsIgnoreCase(name)) {
|
1108 |
1112 |
return this.getDefaultGeometry();
|
1109 |
1113 |
}
|
1110 |
1114 |
throw ex;
|
... | ... | |
1114 |
1118 |
@Override
|
1115 |
1119 |
public Iterator getDataValues() {
|
1116 |
1120 |
class DataValuesIterator implements Iterator {
|
|
1121 |
|
1117 |
1122 |
DefaultFeature feature;
|
1118 |
1123 |
int current = 0;
|
1119 |
1124 |
|
... | ... | |
1197 |
1202 |
|
1198 |
1203 |
@Override
|
1199 |
1204 |
public String toString() {
|
1200 |
|
StringBuilder builder = new StringBuilder();
|
1201 |
|
FeatureAttributeDescriptor[] attributeDescriptors =
|
1202 |
|
getType().getAttributeDescriptors();
|
|
1205 |
StringBuilder builder = new StringBuilder();
|
|
1206 |
FeatureAttributeDescriptor[] attributeDescriptors
|
|
1207 |
= getType().getAttributeDescriptors();
|
1203 |
1208 |
for (int i = 0; i < attributeDescriptors.length; i++) {
|
1204 |
1209 |
String name = attributeDescriptors[i].getName();
|
1205 |
1210 |
Object value = get(name);
|
... | ... | |
1211 |
1216 |
return builder.toString();
|
1212 |
1217 |
}
|
1213 |
1218 |
|
1214 |
|
|
1215 |
|
|
1216 |
|
|
1217 |
|
/**
|
|
1219 |
/**
|
1218 |
1220 |
* @return the inserted
|
1219 |
1221 |
*/
|
1220 |
1222 |
public boolean isInserted() {
|
1221 |
1223 |
return inserted;
|
1222 |
1224 |
}
|
1223 |
1225 |
|
1224 |
|
|
1225 |
1226 |
/**
|
1226 |
1227 |
* @param inserted the inserted to set
|
1227 |
1228 |
*/
|
... | ... | |
1229 |
1230 |
this.inserted = inserted;
|
1230 |
1231 |
}
|
1231 |
1232 |
|
1232 |
|
@Override
|
|
1233 |
@Override
|
1233 |
1234 |
public EvaluatorData getEvaluatorData() {
|
1234 |
1235 |
return this;
|
1235 |
1236 |
}
|
... | ... | |
1238 |
1239 |
public int size() {
|
1239 |
1240 |
return this.data.getType().size();
|
1240 |
1241 |
}
|
1241 |
|
|
|
1242 |
|
1242 |
1243 |
public boolean isEmpty() {
|
1243 |
1244 |
return false;
|
1244 |
1245 |
}
|
... | ... | |
1257 |
1258 |
}
|
1258 |
1259 |
};
|
1259 |
1260 |
}
|
1260 |
|
|
|
1261 |
|
1261 |
1262 |
public boolean containsKey(String key) {
|
1262 |
|
return this.data.getType().get(key)!=null;
|
|
1263 |
return this.data.getType().get(key) != null;
|
1263 |
1264 |
}
|
1264 |
1265 |
|
1265 |
1266 |
@Override
|
1266 |
1267 |
public String getLabelOfValue(String name) {
|
1267 |
1268 |
FeatureAttributeDescriptor attrdesc = this.data.getType().getAttributeDescriptor(name);
|
1268 |
|
if( attrdesc==null ) {
|
1269 |
|
throw new IllegalArgumentException("Attribute name '"+name+"' not found in the feature.");
|
|
1269 |
if (attrdesc == null) {
|
|
1270 |
throw new IllegalArgumentException("Attribute name '" + name + "' not found in the feature.");
|
1270 |
1271 |
}
|
1271 |
1272 |
Object value = this.get(attrdesc.getIndex());
|
1272 |
1273 |
String label = attrdesc.getLabelOfValue(value);
|
1273 |
1274 |
return label;
|
1274 |
1275 |
}
|
1275 |
|
|
|
1276 |
|
1276 |
1277 |
@Override
|
1277 |
1278 |
public void setExtraValue(String name, Object value) {
|
1278 |
|
if( this.extraValues==null ) {
|
1279 |
|
this.extraValues = new HashMap<>();
|
1280 |
|
}
|
1281 |
|
this.extraValues.put(name, value);
|
|
1279 |
if (this.extraValues == null) {
|
|
1280 |
this.extraValues = new HashMap<>();
|
|
1281 |
}
|
|
1282 |
this.extraValues.put(name, value);
|
1282 |
1283 |
}
|
1283 |
|
|
|
1284 |
|
1284 |
1285 |
public Object getExtraColumnValue(String name) {
|
1285 |
1286 |
Object value;
|
1286 |
1287 |
if (this.extraValues != null) {
|
... | ... | |
1298 |
1299 |
}
|
1299 |
1300 |
EditableFeatureAttributeDescriptor attrdesc = columns.get(index);
|
1300 |
1301 |
value = extraValuesData[index];
|
1301 |
|
if (value!=null) {
|
|
1302 |
if (value != null) {
|
1302 |
1303 |
return value;
|
1303 |
1304 |
}
|
1304 |
1305 |
value = this.getExtraValue(name);
|
1305 |
1306 |
extraValuesData[index] = value;
|
1306 |
1307 |
if (value == null && !this.hasExtraValue(name)) {
|
1307 |
|
if (attrdesc.getFeatureAttributeEmulator()!=null) {
|
|
1308 |
if (attrdesc.getFeatureAttributeEmulator() != null) {
|
1308 |
1309 |
value = attrdesc.getFeatureAttributeEmulator().get(this);
|
1309 |
1310 |
extraValuesData[index] = value;
|
1310 |
1311 |
}
|
... | ... | |
1317 |
1318 |
Object value = this.data.getExtraValue(name);
|
1318 |
1319 |
return value;
|
1319 |
1320 |
}
|
1320 |
|
|
|
1321 |
|
1321 |
1322 |
@Override
|
1322 |
1323 |
public boolean hasExtraValue(String name) {
|
1323 |
1324 |
return this.data.hasExtraValue(name);
|
1324 |
1325 |
}
|
1325 |
|
|
1326 |
1326 |
|
1327 |
1327 |
private boolean hasExtraColumnValue(String name) {
|
1328 |
|
if( this.extraValues!=null ) {
|
1329 |
|
if( this.extraValues.containsKey(name) ) {
|
1330 |
|
return true;
|
1331 |
|
}
|
|
1328 |
if (this.extraValues != null) {
|
|
1329 |
if (this.extraValues.containsKey(name)) {
|
|
1330 |
return true;
|
|
1331 |
}
|
1332 |
1332 |
}
|
1333 |
1333 |
FeatureExtraColumns columns = this.getType().getExtraColumns();
|
1334 |
1334 |
int index = columns.getIndexOf(name);
|
1335 |
|
if( index >= 0 ) {
|
1336 |
|
return true;
|
|
1335 |
if (index >= 0) {
|
|
1336 |
return true;
|
1337 |
1337 |
}
|
1338 |
1338 |
return false;
|
1339 |
1339 |
}
|
1340 |
|
|
|
1340 |
|
1341 |
1341 |
@Override
|
1342 |
1342 |
public boolean hasValue(String name) {
|
1343 |
1343 |
name = name.toLowerCase();
|
1344 |
|
return this.data.getType().getIndex(name) >= 0 ||
|
1345 |
|
hasExtraValue(name) ||
|
1346 |
|
hasExtraColumnValue(name);
|
|
1344 |
return this.data.getType().getIndex(name) >= 0
|
|
1345 |
|| hasExtraValue(name)
|
|
1346 |
|| hasExtraColumnValue(name);
|
1347 |
1347 |
}
|
1348 |
|
|
|
1348 |
|
1349 |
1349 |
@Override
|
1350 |
1350 |
public Object getExtraValue(int index) {
|
1351 |
1351 |
return this.data.getExtraValue(index);
|
... | ... | |
1356 |
1356 |
JsonObjectBuilder builder = this.toJsonBuilder();
|
1357 |
1357 |
return builder.build();
|
1358 |
1358 |
}
|
1359 |
|
|
|
1359 |
|
1360 |
1360 |
@Override
|
1361 |
1361 |
public JsonObjectBuilder toJsonBuilder() {
|
1362 |
1362 |
JsonObjectBuilder builder = Json.createObjectBuilder();
|
... | ... | |
1367 |
1367 |
if (desc.isComputed()) {
|
1368 |
1368 |
continue;
|
1369 |
1369 |
}
|
1370 |
|
switch(desc.getType()) {
|
|
1370 |
switch (desc.getType()) {
|
1371 |
1371 |
case DataTypes.GEOMETRY:
|
1372 |
1372 |
geom = this.getGeometry(desc.getIndex());
|
1373 |
|
if( geom!=null ) {
|
|
1373 |
if (geom != null) {
|
1374 |
1374 |
builder.add(desc.getName(), geom.convertToHexWKBQuietly());
|
1375 |
1375 |
}
|
1376 |
1376 |
break;
|
... | ... | |
1395 |
1395 |
case DataTypes.DATE:
|
1396 |
1396 |
// Format date as ISO 8601
|
1397 |
1397 |
date = this.getDate(desc.getIndex());
|
1398 |
|
if( date==null ) {
|
|
1398 |
if (date == null) {
|
1399 |
1399 |
builder.addNull(desc.getName());
|
1400 |
1400 |
} else {
|
1401 |
1401 |
LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
|
... | ... | |
1406 |
1406 |
case DataTypes.TIMESTAMP:
|
1407 |
1407 |
// Format date as ISO 8601
|
1408 |
1408 |
date = this.getTimestamp(desc.getIndex());
|
1409 |
|
if( date==null ) {
|
|
1409 |
if (date == null) {
|
1410 |
1410 |
builder.addNull(desc.getName());
|
1411 |
1411 |
} else {
|
1412 |
1412 |
LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
|
... | ... | |
1417 |
1417 |
case DataTypes.TIME:
|
1418 |
1418 |
// Format date as ISO 8601
|
1419 |
1419 |
date = this.getTime(desc.getIndex());
|
1420 |
|
if( date==null ) {
|
|
1420 |
if (date == null) {
|
1421 |
1421 |
builder.addNull(desc.getName());
|
1422 |
1422 |
} else {
|
1423 |
1423 |
LocalDateTime localDateTime = LocalDateTime.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());
|
... | ... | |
1426 |
1426 |
}
|
1427 |
1427 |
break;
|
1428 |
1428 |
default:
|
1429 |
|
builder.add(desc.getName(), Objects.toString(this.get(desc.getIndex()),""));
|
|
1429 |
builder.add(desc.getName(), this.getStringOrDefault(desc.getIndex(), ""));
|
1430 |
1430 |
}
|
1431 |
|
}
|
|
1431 |
}
|
1432 |
1432 |
return builder;
|
1433 |
1433 |
}
|
1434 |
1434 |
|
1435 |
1435 |
@Override
|
1436 |
1436 |
public List<String> getKeys() {
|
1437 |
|
List<String> l = new ArrayList<>();
|
1438 |
|
for (FeatureAttributeDescriptor descriptor : this.getType()) {
|
1439 |
|
l.add(descriptor.getName());
|
1440 |
|
}
|
1441 |
|
return l;
|
|
1437 |
List<String> l = new ArrayList<>();
|
|
1438 |
for (FeatureAttributeDescriptor descriptor : this.getType()) {
|
|
1439 |
l.add(descriptor.getName());
|
|
1440 |
}
|
|
1441 |
return l;
|
1442 |
1442 |
}
|
1443 |
1443 |
|
1444 |
1444 |
}
|