Revision 450

View differences:

org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/buildNumber.properties
1
#Tue Nov 14 16:27:40 CET 2017
2
buildNumber=2154
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
1
<assembly>
2
  <id>gvsig-plugin-package</id>
3
  <formats>
4
    <format>zip</format>
5
  </formats>
6
  <baseDirectory>${project.artifactId}</baseDirectory>
7
  <includeBaseDirectory>true</includeBaseDirectory>
8
  <files>
9
    <file>
10
      <source>target/${project.artifactId}-${project.version}.jar</source>
11
      <outputDirectory>lib</outputDirectory>
12
    </file>
13
    <file>
14
      <source>target/package.info</source>
15
    </file>
16
  </files>
17

  
18
  <fileSets>
19
    <fileSet>
20
      <directory>src/main/resources-plugin</directory>
21
      <outputDirectory>.</outputDirectory>
22
    </fileSet>
23
  </fileSets>
24

  
25
<!--
26
  <dependencySets>
27
    <dependencySet>
28
      <useProjectArtifact>false</useProjectArtifact>
29
      <useTransitiveDependencies>false</useTransitiveDependencies>
30
      <outputDirectory>lib</outputDirectory>
31
      <includes>
32
        <include>org.gvsig:org.gvsig.wfs.app.mainplugin</include>
33
      </includes>
34
    </dependencySet>
35
  </dependencySets>
36
-->
37

  
38
</assembly>
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSStoreProviderFactory.java
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
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.fmap.dal.store.wfs;
25

  
26

  
27
import org.slf4j.Logger;
28
import org.slf4j.LoggerFactory;
29

  
30
import org.gvsig.fmap.dal.DataParameters;
31
import org.gvsig.fmap.dal.DataStoreProvider;
32
import org.gvsig.fmap.dal.exception.InitializeException;
33
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProviderFactory;
34
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
35
import org.gvsig.tools.dynobject.DynObject;
36

  
37
public class WFSStoreProviderFactory extends AbstractFeatureStoreProviderFactory {
38

  
39
    private static final Logger logger = LoggerFactory.getLogger(WFSStoreProviderFactory.class);
40

  
41
	protected WFSStoreProviderFactory(String name, String description) {
42
		super(name, description);
43
	}
44

  
45
    @Override
46
	public DataStoreProvider createProvider(DataParameters parameters,
47
			DataStoreProviderServices providerServices)
48
			throws InitializeException {
49
		return new WFSStoreProvider((WFSOpenStoreParameters) parameters, providerServices);
50
	}
51

  
52
    @Override
53
	public DynObject createParameters() {
54
		return new WFSOpenStoreParameters();
55
	}
56

  
57
    @Override
58
	public int allowCreate() {
59
		return NO;
60
	}
61

  
62
    @Override
63
	public int allowWrite() {
64
		return NO;
65
	}
66

  
67
    @Override
68
	public int allowRead() {
69
		return YES;
70
	}
71

  
72
    @Override
73
	public int hasRasterSupport() {
74
		return NO;
75
	}
76

  
77
    @Override
78
	public int hasTabularSupport() {
79
		return YES;
80
	}
81

  
82
    @Override
83
	public int hasVectorialSupport() {
84
		return YES;
85
	}
86

  
87
    @Override
88
	public int allowMultipleGeometryTypes() {
89
		return YES;
90
	}
91

  
92

  
93
    @Override
94
    public int allowEditableFeatureType() {
95
        return NO;
96
    }
97

  
98
    @Override
99
    public int useLocalIndexesCanImprovePerformance() {
100
        return NO;
101
    }
102

  
103
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSTTransactionBuilder.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.fmap.dal.store.wfs;
23

  
24
import java.io.ByteArrayOutputStream;
25
import java.io.OutputStream;
26

  
27
import org.gvsig.fmap.dal.DataTypes;
28
import org.gvsig.fmap.dal.exception.DataException;
29
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
30
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
31
import org.gvsig.fmap.geom.Geometry;
32
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
33
import org.gvsig.fmap.geom.operation.GeometryOperationException;
34
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
35
import org.gvsig.gpe.lib.api.GPELocator;
36
import org.gvsig.gpe.lib.api.GPEManager;
37
import org.gvsig.gpe.lib.api.exceptions.WriterHandlerCreationException;
38
import org.gvsig.gpe.lib.api.writer.IGPEWriterHandler;
39
import org.gvsig.remoteclient.wfs.WFSClient;
40
import org.gvsig.remoteclient.wfs.WFSStatus;
41
import org.gvsig.remoteclient.wfs.edition.WFSTAttributesOperation;
42
import org.gvsig.remoteclient.wfs.edition.WFSTInsertOperation;
43
import org.gvsig.remoteclient.wfs.edition.WFSTTransaction;
44
import org.gvsig.remoteclient.wfs.edition.WFSTUpdateOperation;
45

  
46

  
47
/**
48
 * @author gvSIG Team
49
 * @version $Id$
50
 *
51
 */
52
public class WFSTTransactionBuilder {
53
    private WFSStatus wfsStatus;
54
    private WFSClient wfsClient;
55
    private static final GPEManager gpeManager = GPELocator.getGPEManager();
56
    private WFSTTransaction transaction = null;
57
    
58
    public WFSTTransactionBuilder(WFSStatus wfsStatus, WFSClient wfsClient) {
59
        super();
60
        this.wfsStatus = wfsStatus;
61
        this.wfsClient = wfsClient;
62
        transaction = wfsStatus.createNewTransaction();
63
    }  
64
    
65
    private void addFeatureAttributes(WFSTAttributesOperation attributesOperation, FeatureProvider featureProvider) throws WriterHandlerCreationException, GeometryOperationNotSupportedException, GeometryOperationException{
66
        for (int i=0 ; i<featureProvider.getType().size() ; i++){
67
            FeatureAttributeDescriptor featureAttributeDescriptor = featureProvider.getType().getAttributeDescriptor(i);
68
            String attributeValue = "";
69
            if (featureAttributeDescriptor.getType() != DataTypes.GEOMETRY){
70
                if (featureProvider.get(i) != null){
71
                    attributeValue = featureProvider.get(i).toString();
72
                }
73
            }else{
74
                Geometry geometry = (Geometry)featureProvider.get(i);
75
                attributeValue = toGML(geometry, featureAttributeDescriptor.getSRS().getAbrev());               
76
            }  
77
            attributesOperation.addAttribute(featureAttributeDescriptor.getName(), attributeValue);
78
        }
79
    }
80
    
81
    private String toGML(Geometry geometry, String srs) throws GeometryOperationNotSupportedException, GeometryOperationException, WriterHandlerCreationException{
82
        OutputStream os = new ByteArrayOutputStream();
83
        IGPEWriterHandler writerHandler = gpeManager.createWriterByMimeType("text/xml; subtype=gml/3.1.2");  
84
        writerHandler.setOutputStream(os);
85
        writerHandler.initialize();       
86
        GeometryOperationContext geometryOperationContext = new GeometryOperationContext();
87
        geometryOperationContext.setAttribute("writerHandler", writerHandler);
88
        geometryOperationContext.setAttribute("srs", srs);
89
        geometryOperationContext.setAttribute("id", null);
90
        geometry.invokeOperation("writeGml2", geometryOperationContext);
91
        writerHandler.close(); 
92
        //Remove the xml header
93
        String gml = os.toString();
94
        return gml.substring(38, gml.length());
95
    }
96
    
97
    public void addInsertFeature(FeatureProvider featureProvider) throws WriterHandlerCreationException, GeometryOperationNotSupportedException, GeometryOperationException{
98
        WFSTInsertOperation insertOperation = transaction.createInsertOperation();
99
        addFeatureAttributes(insertOperation, featureProvider);
100
    } 
101

  
102
    public void addUpdateFeature(FeatureProvider featureProvider) throws WriterHandlerCreationException, GeometryOperationNotSupportedException, GeometryOperationException{
103
        WFSTUpdateOperation updateOperation = transaction.createUpdateOperation(featureProvider.getOID().toString());
104
        addFeatureAttributes(updateOperation, featureProvider);
105
    }
106
    
107
    public void addDeleteFeature(String id) throws DataException{
108
        transaction.createDeleteOperation(id);      
109
    }
110
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSOpenStoreParameters.java
1
package org.gvsig.fmap.dal.store.wfs;
2

  
3
import org.gvsig.fmap.dal.DataParameters;
4
import org.gvsig.fmap.dal.exception.InitializeException;
5
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
6
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
7

  
8

  
9
public class WFSOpenStoreParameters 
10
    extends WFSBaseStoreParameters
11
    implements OpenFeatureStoreParameters
12
    {
13

  
14
    private static String PARAMETERS_NAME = "WFSStoreParameters";
15
    
16
    public WFSOpenStoreParameters() {
17
        super();
18
    }
19
    
20
	public WFSOpenStoreParameters(DataParameters dataParameters) throws InitializeException, ProviderNotRegisteredException{
21
		super(dataParameters);
22
    }
23

  
24
    @Override
25
    protected String getStoreParametersName() {
26
        return PARAMETERS_NAME;
27
    }
28
    
29
    public static void registerParameterClass() {
30
        WFSBaseStoreParameters.registerParameterClass(WFSOpenStoreParameters.class, PARAMETERS_NAME);
31
    }
32
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSLibrary.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22

  
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2009 {Iver T.I.}   {Task}
26
*/
27
 
28
package org.gvsig.fmap.dal.store.wfs;
29

  
30
import org.gvsig.fmap.dal.DALFileLocator;
31
import org.gvsig.fmap.dal.DALLibrary;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorer;
34
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorerFactory;
35
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorerParameters;
36
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
37
import org.gvsig.fmap.mapcontext.MapContextLibrary;
38
import org.gvsig.metadata.exceptions.MetadataException;
39
import org.gvsig.tools.ToolsLocator;
40
import org.gvsig.tools.extensionpoint.ExtensionPoint;
41
import org.gvsig.tools.extensionpoint.ExtensionPointManager;
42
import org.gvsig.tools.library.AbstractLibrary;
43
import org.gvsig.tools.library.LibraryException;
44

  
45
/**
46
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
47
 */
48
public class WFSLibrary extends AbstractLibrary {
49

  
50
    @Override
51
    public void doRegistration() {
52
        registerAsServiceOf(DALLibrary.class);
53
        require(MapContextLibrary.class);
54
    }
55

  
56
	@Override
57
	protected void doInitialize() throws LibraryException {
58
	}
59

  
60
	@Override
61
	protected void doPostInitialize() throws LibraryException {
62
		WFSOpenStoreParameters.registerParameterClass();
63
		try {
64
			WFSStoreProvider.registerMetadataDefinition();
65
		} catch (MetadataException e) {
66
			throw new LibraryException(this.getClass(), e);
67
		}
68

  
69
		DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator
70
    		.getDataManager();
71

  
72
        if (!dataman.getStoreProviders().contains(WFSStoreProvider.NAME)) {
73
            dataman.registerStoreProviderFactory(new WFSStoreProviderFactory(WFSStoreProvider.NAME, WFSStoreProvider.DESCRIPTION));
74

  
75
        }
76
            
77
		if (!dataman.getExplorerProviders().contains(WFSServerExplorer.NAME)){
78
            dataman.registerServerExplorerFactory(new WFSServerExplorerFactory());
79
		}	
80
		
81
		//Register the WFSStroreParams to be loaded from the catalog extension
82
		ExtensionPointManager extensionPointManager = ToolsLocator.getExtensionPointManager();
83
		ExtensionPoint extensionPoint = extensionPointManager.add("CatalogDataStoreParameters");
84
		extensionPoint.append("OGC:WFS", "Data store parameters to load a WFS layer", WFSOpenStoreParameters.class);
85
	}
86
}
87

  
88

  
89

  
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSStoreProvider.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

  
23
/*
24
 * AUTHORS (In addition to CIT):
25
 * 2009 {Iver T.I.}   {Task}
26
 */
27

  
28
package org.gvsig.fmap.dal.store.wfs;
29

  
30
import java.awt.geom.AffineTransform;
31
import java.io.File;
32
import java.io.IOException;
33
import java.util.ArrayList;
34
import java.util.Iterator;
35
import java.util.List;
36

  
37
import org.cresques.cts.ICoordTrans;
38
import org.cresques.cts.IProjection;
39
import org.gvsig.fmap.crs.CRSFactory;
40
import org.gvsig.fmap.dal.DALLocator;
41
import org.gvsig.fmap.dal.DataManager;
42
import org.gvsig.fmap.dal.DataServerExplorer;
43
import org.gvsig.fmap.dal.DataStoreParameters;
44
import org.gvsig.fmap.dal.DataTypes;
45
import org.gvsig.fmap.dal.exception.ConnectionServerException;
46
import org.gvsig.fmap.dal.exception.DataException;
47
import org.gvsig.fmap.dal.exception.InitializeException;
48
import org.gvsig.fmap.dal.exception.OpenException;
49
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
50
import org.gvsig.fmap.dal.exception.ReadException;
51
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
52
import org.gvsig.fmap.dal.feature.EditableFeatureType;
53
import org.gvsig.fmap.dal.feature.FeatureQuery;
54
import org.gvsig.fmap.dal.feature.FeatureStore;
55
import org.gvsig.fmap.dal.feature.FeatureType;
56
import org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider;
57
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
58
import org.gvsig.fmap.dal.feature.spi.FeatureReferenceProviderServices;
59
import org.gvsig.fmap.dal.feature.spi.FeatureSetProvider;
60
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
61
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorer;
62
import org.gvsig.fmap.dal.serverexplorer.wfs.WFSServerExplorerParameters;
63
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
64
import org.gvsig.fmap.dal.store.gpe.GPEStoreProvider;
65
import org.gvsig.fmap.geom.Geometry;
66
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
67
import org.gvsig.fmap.geom.GeometryLocator;
68
import org.gvsig.fmap.geom.GeometryManager;
69
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
70
import org.gvsig.fmap.geom.operation.GeometryOperationException;
71
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
72
import org.gvsig.fmap.geom.primitive.Envelope;
73
import org.gvsig.gpe.lib.api.exceptions.WriterHandlerCreationException;
74
import org.gvsig.metadata.MetadataLocator;
75
import org.gvsig.metadata.MetadataManager;
76
import org.gvsig.metadata.exceptions.MetadataException;
77
import org.gvsig.remoteclient.ogc.OGCClientOperation;
78
import org.gvsig.remoteclient.utils.BoundaryBox;
79
import org.gvsig.remoteclient.wfs.WFSClient;
80
import org.gvsig.remoteclient.wfs.WFSFeature;
81
import org.gvsig.remoteclient.wfs.WFSFeatureField;
82
import org.gvsig.remoteclient.wfs.WFSStatus;
83
import org.gvsig.remoteclient.wfs.exceptions.WFSException;
84
import org.gvsig.remoteclient.wfs.request.WFSGetFeatureRequestInformation;
85
import org.gvsig.remoteclient.wfs.request.WFSTransactionRequestInformation;
86
import org.gvsig.tools.ToolsLocator;
87
import org.gvsig.tools.dynobject.DynStruct;
88
import org.gvsig.xmlschema.lib.api.XMLSchemaLocator;
89
import org.gvsig.xmlschema.lib.api.XMLSchemaManager;
90
import org.gvsig.xmlschema.lib.api.som.IXSGeometryTypeDefinition;
91
import org.gvsig.xmlschema.lib.api.som.IXSTypeDefinition;
92
import org.slf4j.Logger;
93
import org.slf4j.LoggerFactory;
94

  
95
/**
96
 * @author <a href="mailto:jpiera@gvsig.org">Jorge Piera</a>
97
 */
98
public class WFSStoreProvider extends AbstractFeatureStoreProvider {
99
	private static final Logger logger = LoggerFactory
100
			.getLogger(WFSStoreProvider.class);
101
	public static String NAME = "WFSStore";
102
	public static String DESCRIPTION = "WFS store to load WFS resources";
103

  
104
	private static final MetadataManager metadataManager = MetadataLocator
105
			.getMetadataManager();
106
	private static final String METADATA_DEFINITION_NAME = "WFSStore";
107
	private static final String METADATA_DEFINITION_DESCRIPTION = "WFSStore metadata definition";
108

  
109
	// private IProjection projection;
110
	private long featureCount = -1;
111
	private boolean isKnownEnvelope = false;
112

  
113
	/**
114
	 * If the user has selected the filter by area option
115
	 */
116
	private boolean hasFilterByArea = false;
117

  
118
	/**
119
	 * GML provider used by delegation to read the GML files
120
	 */
121
	private GPEStoreProvider storeProviderDelegate = null;
122

  
123
	private static final DataManager dataManager = DALLocator.getDataManager();
124
	private static final XMLSchemaManager xmlSchemaManager = XMLSchemaLocator
125
			.getXMLSchemaManager();
126

  
127
	boolean isFilterByAreaSupported = true;
128

  
129
	// WFS Parameters
130
	private WFSClient wfsClient;
131
	private WFSStatus wfsStatus;
132

  
133
	public WFSStoreProvider(DataStoreParameters params,
134
			DataStoreProviderServices storeServices) throws InitializeException {
135
		super(
136
				params,
137
				storeServices,
138
				ToolsLocator
139
						.getDynObjectManager()
140
						.createDynObject(
141
								metadataManager
142
										.getDefinition(METADATA_DEFINITION_NAME)));
143
		initParams();
144
		try {
145
			initFeatureType();
146
		} catch (WFSException e) {
147
			throw new InitializeException(e);
148
		} catch (ReadException e) {
149
			throw new InitializeException(e);
150
		}
151
	}
152

  
153
	private void initParams() throws InitializeException {
154
		try {
155
			WFSOpenStoreParameters wfsParameters = getWFSParameters();
156
			try {
157
				if (wfsParameters.getVersion() == null) {
158
					wfsClient = new WFSClient(wfsParameters.getUrl(),
159
							wfsParameters.getIgnoreCache());
160
					wfsParameters.setVersion(wfsClient.getVersion());
161
				} else {
162
					wfsClient = new WFSClient(wfsParameters.getUrl(),
163
							wfsParameters.getVersion(),
164
							wfsParameters.getIgnoreCache());
165
				}
166
			} catch (IOException e) {
167
				throw new InitializeException(e);
168
			}
169
			wfsStatus = new WFSStatus(wfsParameters.getFeatureType(),
170
					wfsParameters.getFeatureNamespace());
171
			wfsStatus.setNamespacePrefix(wfsParameters.getFeaturePrefix());
172
			wfsStatus.setFields(wfsParameters.getFields());
173

  
174
			// Select the filter by area
175

  
176
			Geometry filterByAreaGeometry = wfsParameters
177
					.getFilterByAreaGeometry();
178
			Envelope filterByAreaEnvelope = wfsParameters
179
					.getFilterByAreaEnvelope();
180
			if (filterByAreaGeometry != null) {
181
				wfsStatus.setFilterByArea(filterByAreaGeometry,
182
						wfsParameters.getFilterByAreaAttribute(),
183
						wfsParameters.getFilterByAreaCrs().getFullCode(),
184
						wfsParameters.getFilterByAreaOperation());
185
			} else if (filterByAreaEnvelope != null) {
186
				wfsStatus.setFilterByArea(filterByAreaEnvelope,
187
						wfsParameters.getFilterByAreaAttribute(),
188
						wfsParameters.getFilterByAreaCrs().getFullCode(),
189
						wfsParameters.getFilterByAreaOperation());
190
			}
191
			this.hasFilterByArea = (wfsStatus.getFilterByArea() != null);
192

  
193
			// Select the filter by attribute
194
			wfsStatus.setFilterByAttribute(wfsParameters
195
					.getFilterEncodingByAttribute());
196

  
197
			String _srs = wfsParameters.getCrs();
198
			wfsStatus.setSrs(_srs);
199

  
200
			wfsStatus.setTimeout(wfsParameters.getTimeOut());
201
			wfsStatus.setMaxFeatures(wfsParameters.getMaxFeatures());
202
			wfsStatus.setUserName(wfsParameters.getUser());
203
			wfsStatus.setPassword(wfsParameters.getPassword());
204

  
205
			// Setting the envelope for the layer
206
			wfsClient.getCapabilities(wfsStatus, false, null);
207

  
208
			Envelope envelope = calculateFullEnvelope();
209
			if (envelope != null) {
210
				this.setDynValue("Envelope", envelope);
211
				isKnownEnvelope = true;
212
			}
213
		} catch (WFSException e) {
214
			throw new InitializeException("Impossible to retrieve the file", e);
215
		}
216
	}
217

  
218
	private WFSFeature getSelectedWFSFeature() throws ReadException,
219
			WFSException {
220
		WFSOpenStoreParameters wfsParameters = getWFSParameters();
221

  
222
		return ((WFSServerExplorer) getExplorer()).getFeatureInfo(
223
				wfsParameters.getFeatureNamespace(),
224
				wfsParameters.getFeatureType());
225
	}
226

  
227
	private void initFeatureType() throws WFSException, ReadException {
228
		WFSFeature feature = getSelectedWFSFeature();
229

  
230
		if (feature == null) {
231
			// TODO read from GML
232
			throw new WFSException("It is not possible to parse the schema");
233
		}
234

  
235
		IProjection ipro = null;
236
		try {
237
			ipro = CRSFactory.getCRS(wfsStatus.getSrs());
238
			this.setDynValue("CRS", ipro);
239
		} catch (Exception ex) {
240
			logger.info("Error: did not set CRS in store provider.", ex);
241
		}
242

  
243
		EditableFeatureType featureType = getStoreServices()
244
				.createFeatureType();
245

  
246
		for (int i = 0; i < feature.getFieldSize(); i++) {
247
			WFSFeatureField featureField = feature.getFieldAt(i);
248
			int dataType = DataTypes.STRING;
249
			String typeName = featureField.getType();
250
			EditableFeatureAttributeDescriptor attributeDescriptor = null;
251

  
252
			IXSTypeDefinition typeDefinition = null;
253

  
254
			if (typeName != null) {
255
				typeDefinition = xmlSchemaManager.getTypeDefinition(typeName);
256
			}
257

  
258
			if (typeDefinition != null) {
259
				if (typeDefinition.getDataType() != null) {
260
					if (typeDefinition.getDataType().getType() == DataTypes.GEOMETRY) {
261
						dataType = typeDefinition.getDataType().getType();
262
					}
263
				}
264
				attributeDescriptor = featureType.add(featureField.getName(),
265
						dataType);
266
				if (typeDefinition instanceof IXSGeometryTypeDefinition) {
267

  
268
					if (ipro != null) {
269
						attributeDescriptor.setSRS(ipro);
270
					} else {
271
						if (feature.getSrs().size() > 0) {
272
							attributeDescriptor.setSRS(CRSFactory
273
									.getCRS((String) feature.getSrs().get(0)));
274
						} else {
275
							logger.info("Unable to set CRS in feature type.");
276
						}
277
					}
278

  
279
					attributeDescriptor
280
							.setGeometryType(((IXSGeometryTypeDefinition) typeDefinition)
281
									.getGeometryType());
282
					attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM3D);
283
					featureType.setDefaultGeometryAttributeName(featureField
284
							.getName());
285
				}
286
			} else {
287
				attributeDescriptor = featureType.add(typeName, dataType);
288
			}
289
			// length, relevant for all (strings) except geometry
290
			attributeDescriptor.setSize(128);
291
		}
292
		featureType.setHasOID(true);
293

  
294
		FeatureType defaultType = featureType.getNotEditableCopy();
295
		List types = new ArrayList(1);
296
		types.add(defaultType);
297
		this.getStoreServices().setFeatureTypes(types, defaultType);
298
	}
299

  
300
	private Envelope calculateFullEnvelope() {
301
		GeometryManager geometryManager = GeometryLocator.getGeometryManager();
302

  
303
		try {
304
			WFSFeature feature = getSelectedWFSFeature();
305
			if (feature != null) {
306
				String _srs = wfsStatus.getSrs();
307
				if (_srs != null) {
308

  
309
					BoundaryBox boundaryBox = feature.getBbox(_srs);
310
					// The projection is found
311
					if (boundaryBox != null) {
312
						return geometryManager.createEnvelope(
313
								boundaryBox.getXmin(), boundaryBox.getYmin(),
314
								boundaryBox.getXmax(), boundaryBox.getYmax(),
315
								SUBTYPES.GEOM2D);
316
					}
317
					// Check if there is a latlon envelope
318
					boundaryBox = feature.getLatLonBbox();
319
					if (boundaryBox != null) {
320
						Envelope envelope = geometryManager.createEnvelope(
321
								boundaryBox.getXmin(), boundaryBox.getYmin(),
322
								boundaryBox.getXmax(), boundaryBox.getYmax(),
323
								SUBTYPES.GEOM2D);
324
						if (!"EPSG:4326".equals(_srs)) {
325
							IProjection sourceProjection = CRSFactory
326
									.getCRS("EPSG:4326");
327
							IProjection destinationProjection = CRSFactory
328
									.getCRS(_srs);
329
							if (destinationProjection != null) {
330
								ICoordTrans coordTrans = sourceProjection
331
										.getCT(destinationProjection);
332
								return envelope.convert(coordTrans);
333
							}
334
						}
335
					}
336
				} else {
337
					// If there is not a SRS is thrown a request for the first
338
					// 500 features
339
					int odlMaxFeatures = wfsStatus.getMaxFeatures();
340
					wfsStatus.setMaxFeatures(500);
341
					createSet(null, null);
342
					return storeProviderDelegate.getEnvelope();
343
				}
344
			}
345
		} catch (CreateEnvelopeException e) {
346
			logger.error("Impossible to create an envelope", e);
347
		} catch (ReadException e) {
348
			logger.error("Impossible to create an envelope", e);
349
		} catch (WFSException e) {
350
			logger.error("Impossible to create an envelope", e);
351
		} catch (DataException e) {
352
			logger.error("Impossible to create an envelope", e);
353
		}
354
		return null;
355
	}
356

  
357
	private WFSOpenStoreParameters getWFSParameters() {
358
		return (WFSOpenStoreParameters) getParameters();
359
	}
360

  
361
	/*
362
	 * (non-Javadoc)
363
	 *
364
	 * @see org.gvsig.fmap.dal.store.gpe.GPEStoreProvider#open()
365
	 */
366
	public void open() throws OpenException {
367
		try {
368
			List featureTypes = this.getFeatureStore().getFeatureTypes();
369
			for (int i = 0; i < featureTypes.size(); i++) {
370
				FeatureType featureType = (FeatureType) featureTypes.get(i);
371
			}
372
		} catch (DataException e) {
373
			throw new OpenException("Reading the geometry type", e);
374
		}
375
	}
376

  
377
	protected static void registerMetadataDefinition() throws MetadataException {
378
		if (metadataManager.getDefinition(METADATA_DEFINITION_NAME) == null) {
379
			DynStruct metadataDefinition = metadataManager.addDefinition(
380
					METADATA_DEFINITION_NAME, METADATA_DEFINITION_DESCRIPTION);
381

  
382
			metadataDefinition.addDynFieldObject("Envelope")
383
					.setClassOfValue(Envelope.class).setMandatory(false);
384
			metadataDefinition.addDynFieldObject("CRS")
385
					.setClassOfValue(IProjection.class).setMandatory(true);
386

  
387
			metadataDefinition.extend(metadataManager
388
					.getDefinition(FeatureStore.METADATA_DEFINITION_NAME));
389
		}
390
	}
391

  
392
	/*
393
	 * (non-Javadoc)
394
	 *
395
	 * @see
396
	 * org.gvsig.fmap.dal.feature.spi.AbstractFeatureStoreProvider#getExplorer()
397
	 */
398
	public DataServerExplorer getExplorer() throws ReadException {
399
		DataManager manager = DALLocator.getDataManager();
400
		WFSServerExplorerParameters params;
401
		try {
402
			params = (WFSServerExplorerParameters) manager
403
					.createServerExplorerParameters(WFSServerExplorer.NAME);
404
			params.setUrl(wfsClient.getHost());
405
			return manager.openServerExplorer(WFSServerExplorer.NAME, params);
406
		} catch (Exception e) {
407
			throw new ReadException(this.getName(), e);
408
		}
409
	}
410

  
411
	public String getProviderName() {
412
		return NAME;
413
	}
414

  
415
	public FeatureSetProvider createSet(FeatureQuery query)
416
			throws DataException {
417
		return createSet(query, null);
418
	}
419

  
420
	public FeatureSetProvider createSet(FeatureQuery query,
421
			FeatureType featureType) throws DataException {
422
		if ((featureCount == -1) || (storeProviderDelegate == null)
423
				|| (featureCount >= wfsStatus.getMaxFeatures())) {
424

  
425
			File file = executeSpatialQuery();
426

  
427
			storeProviderDelegate = createProvider(file);
428
		}
429

  
430
		return storeProviderDelegate.createSet(query, featureType);
431
	}
432

  
433
	/**
434
	 * It creates the provider that is used to retrieve features from a file.
435
	 *
436
	 * @param file
437
	 *            the file that contains the downloaded file
438
	 * @return
439
	 * @throws InitializeException
440
	 * @throws ProviderNotRegisteredException
441
	 */
442
	private GPEStoreProvider createProvider(File file)
443
			throws InitializeException, ProviderNotRegisteredException {
444
		return new GPEStoreProvider(createStoreParameters(file),
445
				getStoreServices());
446
	}
447

  
448
	private DataStoreParameters createStoreParameters(File file)
449
			throws InitializeException, ProviderNotRegisteredException {
450
		DataStoreParameters parameters = dataManager
451
				.createStoreParameters(GPEStoreProvider.NAME);
452

  
453
		parameters.setDynValue("File", file.getAbsolutePath());
454
		parameters.setDynValue("Envelope", this.getDynValue("Envelope"));
455
		parameters.setDynValue("useAxisOrderYX", this.getWFSParameters()
456
				.getUseAxisOrderYX());
457
		parameters.setDynValue("Crs", this.getWFSParameters().getCrs());
458
		return parameters;
459
	}
460

  
461
	private File executeSpatialQuery() throws DataException {
462
		try {
463
			Envelope filterByAreaEnvelope = getWFSParameters()
464
					.getFilterByAreaEnvelope();
465
			Geometry filterByAreaGeometry = getWFSParameters()
466
					.getFilterByAreaGeometry();
467
			if (filterByAreaEnvelope != null) {
468
				String crs = getWFSParameters().getCrs();
469
				String the_geom = getWFSParameters().getFilterByAreaAttribute();
470
				int operator = getWFSParameters().getFilterByAreaOperation();
471

  
472
				IProjection envelopeCrs = this.getWFSParameters().getFilterByAreaCrs();
473

  
474
				if (!crs.equalsIgnoreCase(envelopeCrs.getFullCode())) {
475
					Envelope envelope = null;
476
					try {
477
						envelope = (Envelope) filterByAreaEnvelope.clone();
478
					} catch (CloneNotSupportedException e) {
479
						// Do nothing
480
					}
481
					ICoordTrans ct = envelopeCrs.getCT(CRSFactory.getCRS(crs));
482
					filterByAreaEnvelope = envelope.convert(ct);
483
				}
484

  
485
				if (this.getWFSParameters().getUseAxisOrderYX()) {
486
					Envelope envelope = null;
487
					try {
488
						envelope = (Envelope) filterByAreaEnvelope.clone();
489
					} catch (CloneNotSupportedException e) {
490
						// Do nothing
491
					}
492
					double x = envelope.getLowerCorner().getX();
493
					envelope.getLowerCorner().setX(
494
							envelope.getLowerCorner().getY());
495
					envelope.getLowerCorner().setY(x);
496

  
497
					x = envelope.getUpperCorner().getX();
498
					envelope.getUpperCorner().setX(
499
							envelope.getUpperCorner().getY());
500
					envelope.getUpperCorner().setY(x);
501
					filterByAreaEnvelope = envelope;
502
				}
503
				wfsStatus.setFilterByArea(filterByAreaEnvelope, the_geom, crs,
504
						operator);
505
			} else if (filterByAreaGeometry != null) {
506
				String crs = getWFSParameters().getCrs();
507
				String the_geom = getWFSParameters().getFilterByAreaAttribute();
508
				int operator = getWFSParameters().getFilterByAreaOperation();
509

  
510
				IProjection geometryCrs = this.getWFSParameters().getFilterByAreaCrs();
511

  
512
				if (!crs.equalsIgnoreCase(geometryCrs.getFullCode())) {
513
					Geometry geom = null;
514
					geom = (Geometry) filterByAreaGeometry.cloneGeometry();
515
					ICoordTrans ct = geometryCrs.getCT(CRSFactory.getCRS(crs));
516
					geom.reProject(ct);
517
					filterByAreaGeometry = geom;
518
				}
519

  
520
				if (this.getWFSParameters().getUseAxisOrderYX()) {
521
					Geometry geom = filterByAreaGeometry.cloneGeometry();
522
					AffineTransform at = new AffineTransform(0, 1, 1, 0, 0, 1);
523
					geom.transform(at);
524
					filterByAreaGeometry = geom;
525
				}
526
				wfsStatus.setFilterByArea(filterByAreaGeometry, the_geom, crs,
527
						operator);
528

  
529
			}
530
			wfsStatus.setProtocol(OGCClientOperation.PROTOCOL_POST);
531
			// If it is not possible to calculate the
532
			wfsStatus.setResultType(WFSStatus.RESULTYPE_RESULTS);
533
			return wfsClient.getFeature(wfsStatus, getWFSParameters()
534
					.getIgnoreCache(), null);
535
		} catch (WFSException e) {
536
			throw new InitializeException("Impossible to retrieve the file", e);
537
		}
538
	}
539

  
540
	public Object getSourceId() {
541
		StringBuffer sourceID = new StringBuffer(getWFSParameters().getUrl());
542
		sourceID.append("_" + getWFSParameters().getFeatureType());
543
		int hash = sourceID.hashCode();
544
		if (sourceID.length() > 60) {
545
			return sourceID.substring(0, 60) + "_" + hash;
546
		} else {
547
			return sourceID.toString() + "_" + hash;
548
		}
549
	}
550

  
551
	public Object createNewOID() {
552
		try {
553
			return String.valueOf(getFeatureCount() + 1);
554
		} catch (DataException e) {
555
			return String.valueOf(Math.random());
556
		}
557
	}
558

  
559
	public long getFeatureCount() throws DataException {
560
		if (featureCount == -1) {
561
			wfsStatus.setResultType(WFSStatus.RESULTYPE_HITS);
562
				// The filter encoding is better supported using POST
563
				if (hasFilterByArea) {
564
					wfsStatus.setProtocol(OGCClientOperation.PROTOCOL_POST);
565
				} else {
566
					wfsStatus.setProtocol(OGCClientOperation.PROTOCOL_GET);
567
				}
568
				File file = executeSpatialQuery();
569
				featureCount = ((WFSGetFeatureRequestInformation) wfsClient
570
						.getLastWfsRequestInformation()).getNumberOfFeatures();
571
				// If the service doesn't support RESULTTYPE_HITS, parse the
572
				// file and get the FeatureCount
573
				if (featureCount == -1) {
574
					storeProviderDelegate = createProvider(file);
575
					featureCount = storeProviderDelegate.getFeatureCount();
576
				}
577
		}
578
		return featureCount;
579
	}
580

  
581
	public int getOIDType() {
582
		return DataTypes.STRING;
583
	}
584

  
585
	public ResourceProvider getResource() {
586
		return storeProviderDelegate.getResource();
587
	}
588

  
589
	protected FeatureProvider internalGetFeatureProviderByReference(
590
			FeatureReferenceProviderServices reference, FeatureType featureType)
591
			throws DataException {
592
		return storeProviderDelegate.internalGetFeatureProviderByReference(
593
				reference, featureType);
594
	}
595

  
596
	public String getFullName() {
597
		return getWFSParameters().getUrl() + "_"
598
				+ getWFSParameters().getFeatureType();
599
	}
600

  
601
	public String getName() {
602
		return getWFSParameters().getFeatureType();
603
	}
604

  
605
	public boolean isKnownEnvelope() {
606
		return isKnownEnvelope;
607
	}
608

  
609
	public boolean hasRetrievedFeaturesLimit() {
610
		return true;
611
	}
612

  
613
	public int getRetrievedFeaturesLimit() {
614
		// WFS 1.0.0 can not know where is the limit
615
		if (getWFSParameters().getVersion().equals("1.0.0")) {
616
			return 0;
617
		} else {
618
			return wfsClient.getServiceInformation().getMaxFeatures();
619
		}
620
	}
621

  
622
	public void performChanges(Iterator deleteds, Iterator inserteds,
623
			Iterator updateds, Iterator featureTypesChanged)
624
			throws DataException {
625
		wfsStatus.setProtocol(OGCClientOperation.PROTOCOL_POST);
626
		WFSTTransactionBuilder transactionBuilder = new WFSTTransactionBuilder(
627
				wfsStatus, wfsClient);
628

  
629
		// Create the Query
630
		try {
631
			// Add new features
632
			while (inserteds.hasNext()) {
633
				transactionBuilder.addInsertFeature((FeatureProvider) inserteds
634
						.next());
635
			}
636
			// Add deleted features
637
			while (deleteds.hasNext()) {
638
				transactionBuilder
639
						.addDeleteFeature(internalGetFeatureProviderByReference(
640
								(FeatureReferenceProviderServices) deleteds
641
										.next(), null).getOID().toString());
642
				;
643
			}
644
			// Add updated features
645
			while (updateds.hasNext()) {
646
				transactionBuilder.addUpdateFeature((FeatureProvider) updateds
647
						.next());
648
			}
649
		} catch (WriterHandlerCreationException e) {
650
			throw new WFSTTRansactionException(e);
651
		} catch (GeometryOperationNotSupportedException e) {
652
			throw new WFSTTRansactionException(e);
653
		} catch (GeometryOperationException e) {
654
			throw new WFSTTRansactionException(e);
655
		}
656

  
657
		// Send the query to the server
658
		try {
659
			wfsClient.transaction(wfsStatus, true, null);
660
			WFSTransactionRequestInformation transactionRequestInformation = (WFSTransactionRequestInformation) wfsClient
661
					.getLastWfsRequestInformation();
662
			if (transactionRequestInformation.getStatus() == WFSTransactionRequestInformation.STATUS_FAILED) {
663
				throw new WFSTTRansactionException(
664
						transactionRequestInformation.getMessage());
665
			}
666
		} catch (WFSException e) {
667
			throw new WFSTTRansactionException(e);
668
		}
669
	}
670

  
671
	public boolean allowWrite() {
672
		return wfsClient.getServiceInformation().isOperationSupported(
673
				"Transaction");
674
	}
675

  
676
	public Envelope getEnvelope() throws DataException {
677
		return (Envelope) this.getDynValue("Envelope");
678
	}
679

  
680
	public FeatureProvider createFeatureProvider(FeatureType type)
681
			throws DataException {
682
		return super.createFeatureProvider(type);
683
	}
684

  
685
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSTTRansactionException.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.fmap.dal.store.wfs;
23

  
24
import org.gvsig.fmap.dal.exception.DataException;
25

  
26

  
27
/**
28
 * @author gvSIG Team
29
 * @version $Id$
30
 *
31
 */
32
public class WFSTTRansactionException extends DataException {
33
   private static final long serialVersionUID = -5529148262961765052L;
34

  
35
   private final static String MESSAGE_FORMAT = "Can't write the feature.";
36
   private final static String MESSAGE_KEY = "_WFSTTranscationException";
37

  
38
   public WFSTTRansactionException(Throwable cause) {
39
       super(MESSAGE_FORMAT, cause, MESSAGE_KEY, serialVersionUID);  
40
   }
41
   
42
   public WFSTTRansactionException(String message) {
43
       super(message, MESSAGE_KEY, serialVersionUID);  
44
   }
45
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSFeatureFiller.java
1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.fmap.dal.store.wfs;
23

  
24
import java.io.File;
25
import java.io.FileInputStream;
26
import java.io.FileNotFoundException;
27
import java.util.Iterator;
28

  
29
import org.gvsig.remoteclient.wfs.WFSFeature;
30
import org.gvsig.tools.dataTypes.DataType;
31
import org.gvsig.xmlschema.lib.api.XMLSchemaLocator;
32
import org.gvsig.xmlschema.lib.api.XMLSchemaManager;
33
import org.gvsig.xmlschema.lib.api.exceptions.SchemaCreationException;
34
import org.gvsig.xmlschema.lib.api.som.IXSComplexContent;
35
import org.gvsig.xmlschema.lib.api.som.IXSComplexTypeDefinition;
36
import org.gvsig.xmlschema.lib.api.som.IXSContentType;
37
import org.gvsig.xmlschema.lib.api.som.IXSElementDeclaration;
38
import org.gvsig.xmlschema.lib.api.som.IXSExtension;
39
import org.gvsig.xmlschema.lib.api.som.IXSGroup;
40
import org.gvsig.xmlschema.lib.api.som.IXSRestriction;
41
import org.gvsig.xmlschema.lib.api.som.IXSSchema;
42
import org.gvsig.xmlschema.lib.api.som.IXSSimpleContent;
43
import org.gvsig.xmlschema.lib.api.som.IXSSimpleTypeDefinition;
44
import org.gvsig.xmlschema.lib.api.som.IXSTypeDefinition;
45
import org.slf4j.Logger;
46
import org.slf4j.LoggerFactory;
47

  
48

  
49
/**
50
 * @author gvSIG Team
51
 * @version $Id$
52
 *
53
 */
54
public class WFSFeatureFiller {
55
   private static final Logger LOG = LoggerFactory.getLogger(WFSFeatureFiller.class);
56
    private XMLSchemaManager xmlSchemaManager = null;
57
    private static final String XMLSCHEMA_PARSER_PROVIDER_NAME = "xmlschema.providers.kxml";
58
    private WFSFeature feature;
59
    
60
    public WFSFeatureFiller(WFSFeature feature) {
61
        super();
62
        xmlSchemaManager =  XMLSchemaLocator.getXMLSchemaManager();
63
        this.feature = feature;
64
    }
65

  
66
    /**
67
     * @param describeFeatureTypeFile
68
     * @param feature
69
     * @throws FileNotFoundException 
70
     * @throws SchemaCreationException 
71
     */
72
    public void fill(File describeFeatureTypeFile) throws SchemaCreationException, FileNotFoundException {
73
        IXSSchema schema = xmlSchemaManager.parse(XMLSCHEMA_PARSER_PROVIDER_NAME, new FileInputStream(describeFeatureTypeFile));
74
        IXSElementDeclaration elementDeclaration = null;
75
        if (feature.getNamespace() == null){
76
            elementDeclaration = schema.getElementDeclarationByName(null, feature.getName()); 
77
        }else{
78
            elementDeclaration = schema.getElementDeclarationByName(feature.getNamespace().getLocation(), feature.getLocalName());
79
        }
80
        if (elementDeclaration == null){
81
            return;
82
        }
83
        IXSTypeDefinition typeDefinition = elementDeclaration.getTypeDefinition();
84
        if (typeDefinition == null){
85
            return;
86
        }
87
        if (typeDefinition instanceof IXSSimpleTypeDefinition){
88
            
89
        }else if (typeDefinition instanceof IXSComplexTypeDefinition){ 
90
            fill((IXSComplexTypeDefinition)typeDefinition);
91
        }
92
        feature.setCompleted(true);
93
    }
94

  
95
    /**
96
     * @param typeDefinition
97
     */
98
    private void fill(IXSComplexTypeDefinition complexTypeDefinition) {
99
        IXSContentType contentType = complexTypeDefinition.getContentType();
100
        if (contentType != null){
101
            fill((IXSContentType)contentType);
102
        }
103
        IXSGroup group = complexTypeDefinition.getGroup();
104
        if (group != null){
105
            fill((IXSGroup)contentType);
106
        }        
107
    }
108

  
109
    /**
110
     * @param complexTypeDefinition
111
     */
112
    private void fill(IXSGroup group) {
113
        Iterator it = group.getItems().iterator();
114
        while (it.hasNext()){
115
            Object item = it.next();
116
            if (item instanceof IXSElementDeclaration){
117
                IXSElementDeclaration elementDeclaration = (IXSElementDeclaration)item;       
118
                DataType dataType = null;
119
                if (elementDeclaration.getTypeDefinition() != null){
120
                    dataType = elementDeclaration.getTypeDefinition().getDataType();
121
                }
122
                
123
                if (dataType == null || elementDeclaration.getNodeName() == null) {
124
                    LOG.info("Feature attribute type not recognized: "
125
                        + elementDeclaration.toString(),
126
                        new Exception("Feature attribute type not recognized: "
127
                        + elementDeclaration.toString()));
128
                } else {
129
                    feature.addField(elementDeclaration.getNodeName(), elementDeclaration.getTypeName(), dataType);
130
                }
131
                       
132
            }else {
133
                LOG.info("Feature attribute not recognized: "
134
                    + (item == null ? "NULL" : item.getClass().getName()),
135
                        new Exception("Feature attribute not recognized"));
136
            }               
137
        }      
138
    }
139

  
140
    /**
141
     * @param complexTypeDefinition
142
     */
143
    private void fill(IXSContentType contentType) {
144
        if (contentType instanceof IXSSimpleContent){
145
           fill((IXSSimpleContent)contentType);
146
        }else if (contentType instanceof IXSComplexContent){
147
            fill((IXSComplexContent)contentType);
148
        }else if (contentType instanceof IXSGroup){
149
           fill((IXSGroup)contentType);
150
        }        
151
    }
152
    
153
    private void fill(IXSSimpleContent simpleContent) {
154
        IXSRestriction restriction = simpleContent.getRestriction();
155
        if (restriction != null){
156
            fill(restriction);
157
        }
158
        IXSExtension extension = simpleContent.getExtension();
159
        if (extension != null){
160
            fill(extension);
161
        }
162
    }
163
    
164
    private void fill(IXSComplexContent complexContent) {
165
        IXSRestriction restriction = complexContent.getRestriction();
166
        if (restriction != null){
167
            fill(restriction);
168
        }
169
        IXSExtension extension = complexContent.getExtension();
170
        if (extension != null){
171
            fill(extension);
172
        }
173
    }
174

  
175
    /**
176
     * @param extension
177
     */
178
    private void fill(IXSExtension extension) {
179
        IXSGroup group = extension.getGroup();
180
        if (group != null){
181
            fill(group);
182
        }        
183
    }
184

  
185
    /**
186
     * @param restriction
187
     */
188
    private void fill(IXSRestriction restriction) {
189
        IXSGroup group = restriction.getGroup();
190
        if (group != null){
191
            fill(group);
192
        }            
193
    }
194
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSNewStoreParameters.java
1
package org.gvsig.fmap.dal.store.wfs;
2

  
3
import org.gvsig.fmap.dal.DataParameters;
4
import org.gvsig.fmap.dal.exception.InitializeException;
5
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
6
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
7

  
8

  
9
public class WFSNewStoreParameters 
10
    extends WFSBaseStoreParameters
11
    implements OpenFeatureStoreParameters
12
    {
13

  
14
    private static String PARAMETERS_NAME = "WFSNewStoreParameters";
15
    
16
    public WFSNewStoreParameters() {
17
        super();
18
    }
19
    
20
	public WFSNewStoreParameters(DataParameters dataParameters) throws InitializeException, ProviderNotRegisteredException{
21
		super(dataParameters);
22
    }
23

  
24
    @Override
25
    protected String getStoreParametersName() {
26
        return PARAMETERS_NAME;
27
    }
28
    
29
    public static void registerParameterClass() {
30
        WFSBaseStoreParameters.registerParameterClass(WFSOpenStoreParameters.class, PARAMETERS_NAME);
31
    }
32
}
org.gvsig.wfs.app/tags/org.gvsig.wfs.app-2.0.72/org.gvsig.wfs.app.mainplugin/src/main/java/org/gvsig/fmap/dal/store/wfs/WFSBaseStoreParameters.java
1

  
2
package org.gvsig.fmap.dal.store.wfs;
3

  
4
import org.apache.commons.lang3.BooleanUtils;
5
import org.cresques.cts.IProjection;
6
import org.gvsig.fmap.dal.DataParameters;
7
import org.gvsig.fmap.dal.DataStoreParameters;
8
import org.gvsig.fmap.dal.DataTypes;
9
import org.gvsig.fmap.dal.exception.InitializeException;
10
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
11
import org.gvsig.fmap.dal.spi.AbstractDataParameters;
12
import org.gvsig.fmap.geom.Geometry;
13
import org.gvsig.fmap.geom.primitive.Envelope;
14
import org.gvsig.tools.ToolsLocator;
15
import org.gvsig.tools.dynobject.DelegatedDynObject;
16
import org.gvsig.tools.dynobject.DynClass;
17
import org.gvsig.tools.dynobject.DynStruct;
18
import org.gvsig.tools.persistence.PersistenceManager;
19

  
20

  
21
public abstract class WFSBaseStoreParameters 
22
    extends AbstractDataParameters 
23
    implements DataStoreParameters
24
    {
25
	protected static DynClass DYNCLASS = null;
26

  
27
	public static final String FIELD_URL = "url";
28
	public static final String FIELD_VERSION = "version";
29
	public static final String FIELD_TYPENAME = "typeName";
30
	public static final String FIELD_NAMESPACE = "namespace";
31
	public static final String DYNFIELDNAME_NAMESPACEPREFIX = "namespacePrefix";
32
	public static final String DYNFIELDNAME_FIELDS = "fields";
33
	public static final String FIELD_FILTER_ENCODING_BY_ATTRIBUTE = "filterEncodingByAttribute";
34
	public static final String DYNFIELDNAME_MAXFEATURES = "maxFeatures";
35
	public static final String DYNFIELDNAME_TIMEOUT = "timeOut";
36
	public static final String DYNFIELDNAME_USER = "user";
37
	public static final String DYNFIELDNAME_PASSWORD = "password";
38
	public static final String DYNFIELDNAME_FILTER_BY_AREA_GEOMETRY = "filterByAreaGeometry";
39
	public static final String DYNFIELDNAME_FILTER_BY_AREA_ENVELOPE = "filterByAreaEnvelope";
40
	public static final String DYNFIELDNAME_FILTER_BY_AREA_OPERATION = "filterByAreaOperation";
41
	public static final String DYNFIELDNAME_FILTER_BY_AREA_ATTRIBUTE = "filterByAreaAttribute";
42
	public static final String DYNFIELDNAME_FILTER_BY_AREA_CRS = "filterByAreaCrs";
43
	public static final String DYNFIELDNAME_CRS = "Crs";
44

  
45
	private DelegatedDynObject delegatedDynObject;
46

  
47
	public WFSBaseStoreParameters() {
48
		super();
49
		this.delegatedDynObject = (DelegatedDynObject) ToolsLocator
50
            .getDynObjectManager().createDynObject(DYNCLASS);
51
	}
52

  
53
	@Override
54
	protected DelegatedDynObject getDelegatedDynObject() {
55
		return delegatedDynObject;
56
	}
57
    
58
    protected abstract String getStoreParametersName();
59

  
60
	public WFSBaseStoreParameters(DataParameters dataParameters) throws InitializeException, ProviderNotRegisteredException{
61
		this();
62
		setUrl((String)dataParameters.getDynValue(FIELD_URL));
63
		String namespace = null;
64
		String namespacePrefix = null;
65
		if (dataParameters.hasDynValue(FIELD_NAMESPACE)){
66
			namespace = (String)dataParameters.getDynValue(FIELD_NAMESPACE);
67
		}
68
		if (dataParameters.hasDynValue(DYNFIELDNAME_NAMESPACEPREFIX)){
69
			namespacePrefix = (String)dataParameters.getDynValue(DYNFIELDNAME_NAMESPACEPREFIX);
70
		}
71
		setFeatureType(namespacePrefix, namespace,
72
				(String)dataParameters.getDynValue(FIELD_TYPENAME));
73
		if (dataParameters.hasDynValue(DYNFIELDNAME_MAXFEATURES)){
74
			setMaxFeatures((Integer)dataParameters.getDynValue(DYNFIELDNAME_MAXFEATURES));
75
		}else{
76
			setMaxFeatures(1000);
77
		}
78
		if (dataParameters.hasDynValue(DYNFIELDNAME_TIMEOUT)){
79
			setTimeOut((Integer)dataParameters.getDynValue(DYNFIELDNAME_TIMEOUT));
80
		}else{
81
			setTimeOut(10000);
82
		}
83
		if (dataParameters.hasDynValue(DYNFIELDNAME_FILTER_BY_AREA_GEOMETRY)){
84
			setFilterByAreaGeometry((Geometry)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_GEOMETRY));
85
			setFilterByAreaAttribute((String)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_ATTRIBUTE));
86
			setFilterByAreaCrs((IProjection)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_CRS));
87
			setFilterByAreaOperation((Integer)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_OPERATION));
88
		}
89
		if (dataParameters.hasDynValue(DYNFIELDNAME_FILTER_BY_AREA_ENVELOPE)){
90
			setFilterByAreaEnvelope((Envelope)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_ENVELOPE));
91
			setFilterByAreaAttribute((String)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_ATTRIBUTE));
92
			setFilterByAreaCrs((IProjection)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_CRS));
93
			setFilterByAreaOperation((Integer)dataParameters.getDynValue(DYNFIELDNAME_FILTER_BY_AREA_OPERATION));
94
		}
95
		if (dataParameters.hasDynValue(FIELD_VERSION)){
96
			setVersion((String)dataParameters.getDynValue(FIELD_VERSION));
97
		}
98
		if (dataParameters.hasDynValue(FIELD_FILTER_ENCODING_BY_ATTRIBUTE)){
99
			setFilterEncodingByAttribute((String)dataParameters.getDynValue(FIELD_FILTER_ENCODING_BY_ATTRIBUTE));
100
		}
101
		if (dataParameters.hasDynValue(DYNFIELDNAME_USER)){
102
			setUser((String)dataParameters.getDynValue(DYNFIELDNAME_USER));
103
		}
104
		if (dataParameters.hasDynValue(DYNFIELDNAME_PASSWORD)){
105
			setPassword((String)dataParameters.getDynValue(DYNFIELDNAME_PASSWORD));
106
		}
107
		if (dataParameters.hasDynValue(DYNFIELDNAME_CRS)){
108
			setCrs((String)dataParameters.getDynValue(DYNFIELDNAME_CRS));
109
		}
110
	}
111

  
112
	protected static void registerParameterClass(Class parametersClass, String parametersName) {
113
		if (DYNCLASS == null) {
114
			PersistenceManager manager = ToolsLocator.getPersistenceManager();
115
			DynStruct definition = manager.addDefinition(
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff