Revision 112 org.gvsig.wfs.app/trunk/org.gvsig.wfs.app/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSStoreProvider.java
WFSStoreProvider.java | ||
---|---|---|
27 | 27 |
|
28 | 28 |
package org.gvsig.fmap.dal.store.wfs; |
29 | 29 |
|
30 |
import java.awt.geom.AffineTransform; |
|
30 | 31 |
import java.io.File; |
31 | 32 |
import java.io.IOException; |
32 | 33 |
import java.util.ArrayList; |
... | ... | |
105 | 106 |
public static String DESCRIPTION = "WFS store to load WFS resources"; |
106 | 107 |
|
107 | 108 |
private static final MetadataManager metadataManager = MetadataLocator.getMetadataManager(); |
108 |
private static final String METADATA_DEFINITION_NAME = "WFSStore";
|
|
109 |
private static final String METADATA_DEFINITION_NAME = "WFSStore"; |
|
109 | 110 |
private static final String METADATA_DEFINITION_DESCRIPTION = "WFSStore metadata definition"; |
110 | 111 |
|
111 |
// private IProjection projection;
|
|
112 |
// private IProjection projection; |
|
112 | 113 |
private long featureCount = -1; |
113 | 114 |
private boolean isKnownEnvelope = false; |
114 | 115 |
|
... | ... | |
122 | 123 |
*/ |
123 | 124 |
private GPEStoreProvider storeProviderDelegate = null; |
124 | 125 |
|
125 |
private static final DataManager dataManager = DALLocator.getDataManager();
|
|
126 |
private static final XMLSchemaManager xmlSchemaManager = XMLSchemaLocator.getXMLSchemaManager();
|
|
126 |
private static final DataManager dataManager = DALLocator.getDataManager(); |
|
127 |
private static final XMLSchemaManager xmlSchemaManager = XMLSchemaLocator.getXMLSchemaManager(); |
|
127 | 128 |
|
128 | 129 |
boolean isFilterByAreaSupported = true; |
129 | 130 |
|
... | ... | |
134 | 135 |
public WFSStoreProvider(DataStoreParameters params, |
135 | 136 |
DataStoreProviderServices storeServices) |
136 | 137 |
throws InitializeException { |
137 |
super(params, storeServices,
|
|
138 |
ToolsLocator.getDynObjectManager().createDynObject(metadataManager.getDefinition(METADATA_DEFINITION_NAME)));
|
|
138 |
super(params, storeServices, |
|
139 |
ToolsLocator.getDynObjectManager().createDynObject(metadataManager.getDefinition(METADATA_DEFINITION_NAME))); |
|
139 | 140 |
initParams(); |
140 | 141 |
try { |
141 | 142 |
initFeatureType(); |
... | ... | |
165 | 166 |
wfsStatus.setFields(wfsParameters.getFields()); |
166 | 167 |
|
167 | 168 |
//Select the filter by area |
168 |
wfsStatus.setFilterByArea(wfsParameters.getFilterByAreaGeometry(), wfsParameters.getFilterByAreaAttribute(), |
|
169 |
|
|
170 |
Geometry filterByAreaGeometry = wfsParameters.getFilterByAreaGeometry(); |
|
171 |
Envelope filterByAreaEnvelope = wfsParameters.getFilterByAreaEnvelope(); |
|
172 |
if (filterByAreaGeometry != null){ |
|
173 |
wfsStatus.setFilterByArea(filterByAreaGeometry, wfsParameters.getFilterByAreaAttribute(), |
|
169 | 174 |
wfsParameters.getFilterByAreaCrs(), wfsParameters.getFilterByAreaOperation()); |
175 |
} else if (filterByAreaEnvelope != null) { |
|
176 |
wfsStatus.setFilterByArea(filterByAreaEnvelope, wfsParameters.getFilterByAreaAttribute(), |
|
177 |
wfsParameters.getFilterByAreaCrs(), wfsParameters.getFilterByAreaOperation()); |
|
178 |
} |
|
170 | 179 |
this.hasFilterByArea = (wfsStatus.getFilterByArea() != null); |
171 | 180 |
|
172 | 181 |
//Select the filter by attribute |
173 | 182 |
wfsStatus.setFilterByAttribute(wfsParameters.getFilterEncodingByAttribute()); |
174 |
|
|
183 |
|
|
175 | 184 |
String _srs = wfsParameters.getFilterByAreaCrs(); |
176 | 185 |
wfsStatus.setSrs(_srs); |
177 | 186 |
|
... | ... | |
187 | 196 |
if (envelope != null){ |
188 | 197 |
this.setDynValue("Envelope", envelope); |
189 | 198 |
isKnownEnvelope = true; |
190 |
}
|
|
199 |
} |
|
191 | 200 |
} catch (WFSException e) { |
192 | 201 |
throw new InitializeException("Impossible to retrieve the file", e); |
193 | 202 |
} |
... | ... | |
200 | 209 |
wfsParameters.getFeatureType()); |
201 | 210 |
} |
202 | 211 |
|
203 |
private void initFeatureType() throws WFSException, ReadException{
|
|
212 |
private void initFeatureType() throws WFSException, ReadException{ |
|
204 | 213 |
WFSFeature feature = getSelectedWFSFeature(); |
205 | 214 |
|
206 | 215 |
if (feature == null){ |
... | ... | |
218 | 227 |
|
219 | 228 |
EditableFeatureType featureType = getStoreServices().createFeatureType(); |
220 | 229 |
|
221 |
for (int i=0 ; i<feature.getFieldSize() ; i++){
|
|
222 |
WFSFeatureField featureField = feature.getFieldAt(i);
|
|
223 |
int dataType = DataTypes.STRING;
|
|
230 |
for (int i=0 ; i<feature.getFieldSize() ; i++){ |
|
231 |
WFSFeatureField featureField = feature.getFieldAt(i); |
|
232 |
int dataType = DataTypes.STRING; |
|
224 | 233 |
String typeName = featureField.getType(); |
225 | 234 |
EditableFeatureAttributeDescriptor attributeDescriptor = null; |
226 | 235 |
|
227 | 236 |
IXSTypeDefinition typeDefinition = null; |
228 |
|
|
237 |
|
|
229 | 238 |
if (typeName != null){ |
230 | 239 |
typeDefinition = xmlSchemaManager.getTypeDefinition(typeName); |
231 | 240 |
} |
232 |
|
|
233 |
if (typeDefinition != null){
|
|
241 |
|
|
242 |
if (typeDefinition != null){ |
|
234 | 243 |
if (typeDefinition.getDataType() != null){ |
235 | 244 |
if (typeDefinition.getDataType().getType() == DataTypes.GEOMETRY){ |
236 | 245 |
dataType = typeDefinition.getDataType().getType(); |
237 | 246 |
} |
238 | 247 |
} |
239 |
attributeDescriptor = featureType.add(featureField.getName(), dataType);
|
|
248 |
attributeDescriptor = featureType.add(featureField.getName(), dataType); |
|
240 | 249 |
if (typeDefinition instanceof IXSGeometryTypeDefinition){ |
241 |
|
|
250 |
|
|
242 | 251 |
if (ipro != null) { |
243 | 252 |
attributeDescriptor.setSRS(ipro); |
244 | 253 |
} else { |
... | ... | |
248 | 257 |
logger.info("Unable to set CRS in feature type."); |
249 | 258 |
} |
250 | 259 |
} |
251 |
|
|
252 |
|
|
260 |
|
|
261 |
|
|
253 | 262 |
attributeDescriptor.setGeometryType(((IXSGeometryTypeDefinition)typeDefinition).getGeometryType()); |
254 | 263 |
attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM3D); |
255 | 264 |
featureType.setDefaultGeometryAttributeName(featureField.getName()); |
256 |
}
|
|
265 |
} |
|
257 | 266 |
}else{ |
258 |
attributeDescriptor = featureType.add(typeName, dataType);
|
|
259 |
}
|
|
267 |
attributeDescriptor = featureType.add(typeName, dataType); |
|
268 |
} |
|
260 | 269 |
// length, relevant for all (strings) except geometry |
261 | 270 |
attributeDescriptor.setSize(128); |
262 |
}
|
|
271 |
} |
|
263 | 272 |
featureType.setHasOID(true); |
264 | 273 |
|
265 | 274 |
FeatureType defaultType = featureType.getNotEditableCopy(); |
... | ... | |
273 | 282 |
|
274 | 283 |
try{ |
275 | 284 |
WFSFeature feature = getSelectedWFSFeature(); |
276 |
if (feature != null){
|
|
285 |
if (feature != null){ |
|
277 | 286 |
String _srs = wfsStatus.getSrs(); |
278 | 287 |
if (_srs != null) { |
279 | 288 |
|
... | ... | |
294 | 303 |
if (destinationProjection != null){ |
295 | 304 |
ICoordTrans coordTrans = sourceProjection.getCT(destinationProjection); |
296 | 305 |
return envelope.convert(coordTrans); |
297 |
}
|
|
306 |
} |
|
298 | 307 |
} |
299 | 308 |
} |
300 | 309 |
}else{ |
... | ... | |
335 | 344 |
} |
336 | 345 |
} |
337 | 346 |
|
338 |
protected static void registerMetadataDefinition() throws MetadataException {
|
|
347 |
protected static void registerMetadataDefinition() throws MetadataException { |
|
339 | 348 |
if (metadataManager.getDefinition(METADATA_DEFINITION_NAME) == null) { |
340 | 349 |
DynStruct metadataDefinition = metadataManager.addDefinition( |
341 | 350 |
METADATA_DEFINITION_NAME, METADATA_DEFINITION_DESCRIPTION); |
... | ... | |
377 | 386 |
FeatureType featureType) throws DataException { |
378 | 387 |
if ((featureCount == -1) || |
379 | 388 |
(storeProviderDelegate == null) || |
380 |
(featureCount >= wfsStatus.getMaxFeatures())){
|
|
389 |
(featureCount >= wfsStatus.getMaxFeatures())){ |
|
381 | 390 |
|
382 |
File file = null;
|
|
391 |
File file = executeSpatialQuery();
|
|
383 | 392 |
|
384 |
if (query == null){ |
|
385 |
file = executeQuery(); |
|
386 |
}else{ |
|
387 |
//If it is possible to execute a spatial query... |
|
388 |
if ((query.getFilter() != null) && (!hasFilterByArea)){ |
|
389 |
file = executeSpatialQuery(query); |
|
390 |
}else{ |
|
391 |
file = executeQuery(); |
|
392 |
} |
|
393 |
|
|
394 |
} |
|
395 | 393 |
storeProviderDelegate = createProvider(file); |
396 | 394 |
} |
397 |
|
|
395 |
|
|
398 | 396 |
return storeProviderDelegate.createSet(query, featureType); |
399 | 397 |
} |
400 | 398 |
|
... | ... | |
408 | 406 |
*/ |
409 | 407 |
private GPEStoreProvider createProvider(File file) throws InitializeException, ProviderNotRegisteredException{ |
410 | 408 |
return new GPEStoreProvider(createStoreParameters(file), getStoreServices()); |
411 |
}
|
|
409 |
} |
|
412 | 410 |
|
413 | 411 |
private DataStoreParameters createStoreParameters(File file) throws InitializeException, ProviderNotRegisteredException{ |
414 | 412 |
DataStoreParameters parameters = dataManager.createStoreParameters(GPEStoreProvider.NAME); |
... | ... | |
419 | 417 |
return parameters; |
420 | 418 |
} |
421 | 419 |
|
422 |
/** |
|
423 |
* It executes a wfs Query without spatial filter |
|
424 |
* @throws DataException |
|
425 |
*/ |
|
426 |
private File executeQuery() throws DataException{ |
|
427 |
try{ |
|
428 |
wfsStatus.setResultType(WFSStatus.RESULTYPE_RESULTS); |
|
429 |
if (!hasFilterByArea){ |
|
430 |
wfsStatus.removeFilterByArea(); |
|
431 |
} |
|
432 |
return wfsClient.getFeature(wfsStatus, getWFSParameters().getIgnoreCache(), null); |
|
433 |
} catch (WFSException e) { |
|
434 |
throw new InitializeException("Impossible to retrieve the file", e); |
|
435 |
} |
|
436 |
} |
|
437 | 420 |
|
438 |
/** |
|
439 |
* Executes a new query sending the FilterEncoding request to the server |
|
440 |
* @param query |
|
441 |
* The Query to send |
|
442 |
* @throws InitializeException |
|
443 |
* If there is a problem with the request or the parsing process |
|
444 |
*/ |
|
445 |
private File executeSpatialQuery(FeatureQuery query) throws DataException{ |
|
446 |
EvaluatorFieldsInfo fieldsInfo = query.getFilter().getFieldsInfo(); |
|
447 |
String[] fields = fieldsInfo.getFieldNames(); |
|
448 |
for (int i=0 ; i<fields.length ; i++){ |
|
449 |
EvaluatorFieldValue[] evaluatorFieldValues = fieldsInfo.getFieldValues(fields[i]); |
|
450 |
for (int j=0 ; j<evaluatorFieldValues.length ; j++){ |
|
451 |
if (EvaluatorFieldValue.MATCH == evaluatorFieldValues[j].getType()){ |
|
452 |
EvaluatorFieldValueMatch evaluatorFieldValueMatch = (EvaluatorFieldValueMatch)evaluatorFieldValues[j]; |
|
453 |
Object area = evaluatorFieldValueMatch.getValue(); |
|
454 |
if (area instanceof Envelope){ |
|
455 |
return executeSpatialQueryFromEnvelope(evaluatorFieldValueMatch.getFieldName(), |
|
456 |
(Envelope)area); |
|
457 |
}else if (area instanceof Geometry){ |
|
458 |
return executeSpatialQueryFromGeometry(evaluatorFieldValueMatch.getFieldName(), |
|
459 |
(Geometry)area); |
|
460 |
} |
|
461 |
} |
|
462 |
} |
|
463 |
} |
|
464 |
return null; |
|
465 |
} |
|
421 |
private File executeSpatialQuery() throws DataException{ |
|
422 |
try { |
|
423 |
Envelope filterByAreaEnvelope = getWFSParameters().getFilterByAreaEnvelope(); |
|
424 |
Geometry filterByAreaGeometry = getWFSParameters().getFilterByAreaGeometry(); |
|
425 |
if (filterByAreaEnvelope!=null){ |
|
426 |
String crs = getWFSParameters().getFilterByAreaCrs(); |
|
427 |
String the_geom = getWFSParameters().getFilterByAreaAttribute(); |
|
428 |
int operator = getWFSParameters().getFilterByAreaOperation(); |
|
466 | 429 |
|
467 |
private File executeSpatialQueryFromGeometry(String the_geom, Geometry geometry) throws DataException{ |
|
468 |
wfsStatus.setFilterByArea(geometry, the_geom, wfsStatus.getSrs(), |
|
469 |
FilterEncoding.GEOMETRIC_OPERATOR_CONTAINS); |
|
470 |
return executeSpatialQuery(); |
|
471 |
} |
|
430 |
if (this.getWFSParameters().getUseAxisOrderYX()){ |
|
431 |
Envelope envelope = null; |
|
432 |
try { |
|
433 |
envelope = (Envelope)filterByAreaEnvelope.clone(); |
|
434 |
} catch (CloneNotSupportedException e) { |
|
435 |
//Do nothing |
|
436 |
} |
|
437 |
double x = envelope.getLowerCorner().getX(); |
|
438 |
envelope.getLowerCorner().setX(envelope.getLowerCorner().getY()); |
|
439 |
envelope.getLowerCorner().setY(x); |
|
472 | 440 |
|
473 |
private File executeSpatialQueryFromEnvelope(String the_geom, Envelope envelope) throws DataException{ |
|
474 |
wfsStatus.setFilterByArea(envelope, the_geom, wfsStatus.getSrs(), |
|
475 |
FilterEncoding.GEOMETRIC_OPERATOR_CONTAINS); |
|
476 |
return executeSpatialQuery(); |
|
477 |
} |
|
441 |
x = envelope.getUpperCorner().getX(); |
|
442 |
envelope.getUpperCorner().setX(envelope.getUpperCorner().getY()); |
|
443 |
envelope.getUpperCorner().setY(x); |
|
444 |
filterByAreaEnvelope = envelope; |
|
445 |
} |
|
446 |
wfsStatus.setFilterByArea(filterByAreaEnvelope, the_geom, crs,operator); |
|
447 |
} else if (filterByAreaGeometry!=null){ |
|
448 |
String crs = getWFSParameters().getFilterByAreaCrs(); |
|
449 |
String the_geom = getWFSParameters().getFilterByAreaAttribute(); |
|
450 |
int operator = getWFSParameters().getFilterByAreaOperation(); |
|
478 | 451 |
|
479 |
private File executeSpatialQuery() throws DataException{ |
|
480 |
try { |
|
452 |
if (this.getWFSParameters().getUseAxisOrderYX()){ |
|
453 |
Geometry geom = filterByAreaGeometry.cloneGeometry(); |
|
454 |
AffineTransform at = new AffineTransform(0,1,1,0,0,1); |
|
455 |
geom.transform(at); |
|
456 |
filterByAreaGeometry = geom; |
|
457 |
} |
|
458 |
wfsStatus.setFilterByArea(filterByAreaGeometry, the_geom, crs,operator); |
|
459 |
|
|
460 |
} |
|
481 | 461 |
wfsStatus.setProtocol(OGCClientOperation.PROTOCOL_POST); |
482 |
//If it is not possible to calculate the
|
|
462 |
//If it is not possible to calculate the |
|
483 | 463 |
wfsStatus.setResultType(WFSStatus.RESULTYPE_RESULTS); |
484 | 464 |
return wfsClient.getFeature(wfsStatus, getWFSParameters().getIgnoreCache(), null); |
485 | 465 |
} catch (WFSException e) { |
486 | 466 |
throw new InitializeException("Impossible to retrieve the file", e); |
487 | 467 |
} |
488 |
}
|
|
468 |
} |
|
489 | 469 |
|
490 | 470 |
public Object getSourceId() { |
491 | 471 |
StringBuffer sourceID = new StringBuffer(getWFSParameters().getUrl()); |
... | ... | |
497 | 477 |
return sourceID.toString() + "_" + hash; |
498 | 478 |
} |
499 | 479 |
} |
500 |
|
|
501 |
public Object createNewOID() {
|
|
480 |
|
|
481 |
public Object createNewOID() { |
|
502 | 482 |
try { |
503 | 483 |
return String.valueOf(getFeatureCount()+1); |
504 | 484 |
} catch (DataException e) { |
... | ... | |
544 | 524 |
return storeProviderDelegate.internalGetFeatureProviderByReference(reference, featureType); |
545 | 525 |
} |
546 | 526 |
|
547 |
public String getFullName() {
|
|
527 |
public String getFullName() { |
|
548 | 528 |
return getWFSParameters().getUrl() + "_" + getWFSParameters().getFeatureType(); |
549 | 529 |
} |
550 | 530 |
|
551 |
public String getName() {
|
|
531 |
public String getName() { |
|
552 | 532 |
return getWFSParameters().getFeatureType(); |
553 | 533 |
} |
554 | 534 |
|
555 |
public boolean isKnownEnvelope(){
|
|
535 |
public boolean isKnownEnvelope(){ |
|
556 | 536 |
return isKnownEnvelope; |
557 | 537 |
} |
558 | 538 |
|
... | ... | |
597 | 577 |
} catch (GeometryOperationException e) { |
598 | 578 |
throw new WFSTTRansactionException(e); |
599 | 579 |
} |
600 |
|
|
580 |
|
|
601 | 581 |
//Send the query to the server |
602 | 582 |
try { |
603 | 583 |
wfsClient.transaction(wfsStatus, true, null); |
... | ... | |
614 | 594 |
return wfsClient.getServiceInformation().isOperationSupported("Transaction"); |
615 | 595 |
} |
616 | 596 |
|
617 |
public Envelope getEnvelope() throws DataException {
|
|
597 |
public Envelope getEnvelope() throws DataException { |
|
618 | 598 |
return (Envelope) this.getDynValue("Envelope"); |
619 | 599 |
} |
620 | 600 |
|
621 | 601 |
public FeatureProvider createFeatureProvider(FeatureType type) |
622 |
throws DataException {
|
|
602 |
throws DataException { |
|
623 | 603 |
return super.createFeatureProvider(type); |
624 | 604 |
} |
625 | 605 |
|
Also available in: Unified diff