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

View differences:

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