[Geoserver-devel] moved wfs 1.1 to separate module on 1.6.x and 1.7.x

Hi all,

Recently it was required that GeoServer have the ability to disable wfs 1.1. So what I did was moved wfs 1.1 to a new module so that to disable wfs 1.1 all one must do is delete the jar for that (new) module. There should be no difference for the normal user.

However this solution is far from ideal and I have not committed it to trunk. On trunk I think we should use the new configuration to model the versions of a service which are enabled. And indeed the ServiceInfo interface has a getVersions() method for this purpose. Hooking our services up to will take some work but i believe its the right way to do it. Others may disagree.

-Justin

--
Justin Deoliveira
The Open Planning Project
jdeolive@anonymised.com

Justin Deoliveira ha scritto:

Hi all,

Recently it was required that GeoServer have the ability to disable wfs 1.1. So what I did was moved wfs 1.1 to a new module so that to disable wfs 1.1 all one must do is delete the jar for that (new) module. There should be no difference for the normal user.

Wow, the patch looks... big! :slight_smile:
At a quick look the size is due to some changes to the EMF models
that now have a "provided version", and then I see changes in the
response class hierarchies... could you very quickly summarize what
you did so that we can orientate in the new code structure?
Like in a bulleted list of short statements, something that gives
a feel of the change. No need to be fancy :slight_smile:

However this solution is far from ideal and I have not committed it to trunk. On trunk I think we should use the new configuration to model the versions of a service which are enabled. And indeed the ServiceInfo interface has a getVersions() method for this purpose. Hooking our services up to will take some work but i believe its the right way to do it. Others may disagree.

Yeah, I agree this seems like a better approach. I guess this could
be done in the dispacher no? In the dispatcher you already determine
the service and version, so if you have the list of enabled services
_and_ enabled versions you "just" have to perform a comparison,
and if the version is missing, just assume the highest enabled version?

Cheers
Andrea

Wow, the patch looks... big! :slight_smile:
At a quick look the size is due to some changes to the EMF models
that now have a "provided version", and then I see changes in the
response class hierarchies... could you very quickly summarize what
you did so that we can orientate in the new code structure?
Like in a bulleted list of short statements, something that gives
a feel of the change. No need to be fancy :slight_smile:

Apologies i should have gave a better description in my original mail :slight_smile: . Here it is.

The first thing i did was moved all the wfs 1.1 specific beans to a different application context. I also moved all the wfs 1.1 specific tests overt as well since they no longer pass due to lack of the 1.1 context around.

That was the easy part. Taking the new wfs11 module off the classpath i found that still 1.1 requests were being returned in cases where the version was not specified. There are a couple of checks in the code which fall back on 1.1 version when no version is specified. Instead of this hard coded check i added a list of Version to WebFeatureService. Now the version negotiation stuff actually looks for Service versions in the context and defaults to the highest, rather than hardcoding 1.1.

The other problem I had was access flipping. As you know there is the WFSProjectionUtil class which does access flipping in a wfs 1.1 request. So even though wfs11 is not enabled unless the client specifies version=1.0.0 they get things flipped. At first I tried to get the request readers to just set the version on the request object. However this lead to cite failures since in cases where the version is not specified we need to perserve the unset value until after the reqeust reading phase.

So what I did was add a new property to the wfs model (BaseRequestType) called 'providedVersion'. And what this property is the the version of the service handling the request, which may be different than the version specified by the client. THis property is set by teh dispatcher similar to how "baseUrl" is set.

I then changed all calls to WFSPRojectionUtil.getDeclaredCRS() to use providedVersion rather than version.

Ad it worked!! :).

  > Yeah, I agree this seems like a better approach. I guess this could

be done in the dispacher no? In the dispatcher you already determine
the service and version, so if you have the list of enabled services
_and_ enabled versions you "just" have to perform a comparison,
and if the version is missing, just assume the highest enabled version?

Indeed, and now that is how the providedVersion is set. The problem is i like the separation now of the dispatcher as it does not rely on the configuration. Having to load a services configuration object from the dispatcher will make it quite a bit messier. I am sure there is a way around it... we could add some sort of extension point (similar to transaction) to the dispatcher and add a check which matches us providedVersion and ensures that the ServiceInfo.getVersion() says that service is enabled... not sure.

Cheers
Andrea

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel

!DSPAM:4007,48649ae3224588992556831!

--
Justin Deoliveira
The Open Planning Project
jdeolive@anonymised.com