Hey folks, I was tired and not in position to act clearly when these
gaps were noticed last year.
We can tighten up the api definition, at least with the changes made
we can now notice when an absolute path was used.
I never quite managed to communicate the separation between using a
file URL and File access (when DataStores wish to access local
files) as distinct from use of a resource for managing configuration
files.
I suspect you both (Niels and Gabe) have met this distinction first
hand - but it is hard to explain the value.
Documentation is as added here:
https://docs.geoserver.org/latest/en/developer/programming-guide/config/resource.html
This could your review and input.
Jody
On Wed, Jul 5, 2023 at 2:34 PM Gabriel Roldan
<gabriel.rol...@gmail.com> wrote:
If "the codebase had drifted away from the intended use over
time" I think it's even more important to stick to the contract
and not the other way around.
As far as I can see, there are two abstractions, ResourceStore
and Resource, the former clearly says
"This abstraction assumes a unix like file system, all paths are
relative and use forward slash {@code /} as the separator",
the latter "Resource used for configuration storage.".
Only by adhering to this contract, we could provide alternative
implementations.
So if the changes were made to accommodate "common usage" on the
specific case of a filesystem-based ResourceStore
implementation, it should be the other way around, to find out
usages that don't adhere to the spec and fix them.
Concretely, I _think_ the only place where absolute URI's would
be requested to the ResourceStore, is where a data, not
configuration,
file, is resolved, expecting the ResourceStore to be smart and
resolve "file:data/roads.shp" relative to the datadir, and
"file:/data/roads.shp"
relative to the file system.
Now, in doing so, we're asking the ResourceStore to do what it's
not intended to. The test case Niels mentioned used to check
that a leading "/"
had no meaning for the resource store (i.e. /data/roads.shp ==
data/roads.shp), and that was changed to mean the opposite.
So, IMHO, the responsibility of resolving files outside the
datadir shouldn't be on ResourceStore, but on the client code.
Something like:
String path = ...
File shp;
if(Paths.isAbsolute(path))
shp = new File(path);
else
shp = resourceStore.get(path).file();
As a matter of fact, Resource.file():java.io.File should be
deprecated and eventually removed. Resource is for config
contents and
has Resource.in():InputStream and Resource.out():OutputStream.
It is hard enough already to adhere to lax interface contracts
(catalog's default workspace hello) as to keep on making it more
and more difficult.
So what do we do? can we get to an agreement that the contract
in the interfaces is mandatory and work from there?
cheers,
On Tue, 4 Jul 2023 at 17:49, Niels Charlier via Geoserver-devel
<geoserver-devel@lists.sourceforge.net> wrote:
Hello Jody,
Yes, I admit it's my own fault for missing this discussion
at the time.
I think it would be a shame to let the codebase further
drift away from the intended use of the resource store. We
have done the work to make the entirety of geoserver generic
with respect to the implementation of the data directory and
it is only a minimal effort to keep it this way. Even though
jdbc store is still a community module and the Redis based
geoserver project has been discontinued, it has been proven
that alternative implementations for the data directory work
and the jdbc store module is actually being used in
production successfully.
Now, interestingly, I have discovered that there are
contradictions in how it works / is documented now.
- I discovered that while 'theoryRootIsAbsolute' test is
successful, it is actually very misleading. At least on
linux, paths starting with '/' *still create a file relative
to the data directory*!. The only difference is the string
returned by the path() method. So while the path might seem
absolute, the file you are accessing is not. So the path()
method is misleading and in reality the leading slash is
still being ignored (again, at least on linux).
- Note that the javadoc of ResourceStore still says:
This abstraction assumes a unix like file system, *all paths
are relative*
There it says it: all paths are relative for the
resourcestore. Absolute paths have no meaning or function
when it comes to the resource store.
- I think this contradiction could be resolved in two
possible ways:
1) the test 'theoryIsRootSlashIsIgnored' should come back
instead of 'theoryRootIsAbsolute'. The root slash is ignored
and removed from the path.
2) The resource store throws an exception when you ask for
an absolute path.
Either way, all absolute paths should be handled _outside
of_ the ResourceStore, for instance by calling
Files.asResource(). So problems with absolute paths in the
rest service should be resolved in the rest service, or some
other layer that is used by the rest service.
Kind Regards
Niels
On 04/07/2023 21:59, Jody Garnett wrote:
Hello Niels,
The PRs for this activity contain extensive discussion.
The fundamental issue was the handling of absolute paths
which was done differently by different sections of code.
Specifically we found that the REST API endpoint was
allowing paths *//data* and */data *to both reference
content in the data directory, rather than treating the
first one as an absolute path. In response we tightened up
the javadocs and added test cases including the one you
mentioned.
I agree that this goes against the goal of resource store,
but the codebase had drifted away from the intended use
over time.
Now that you are present in the discussion it would be a
good opportunity to discuss this with the parties involved.
--
Jody Garnett
On Jul 3, 2023 at 2:50:02 PM, Niels Charlier
<ni...@scitus.be> wrote:
Hello Jody and others,
I am having trouble understanding the changes that were
made about 6 months ago to the ResourceStore's expected
behaviour.
In particular, in the class
'org.geoserver.platform.resource.ResourceTheoryTest', the
unit test 'theoryRootSlashIsIgnored' was replaced by
'theoryRootIsAbsolute'. I cannot make sense out of this
theory test at all.
This seems to be entirely contradictory to the whole
reason that the ResourceStore API was created, that is to
make an abstraction of the /Data Directory/, so that it
can be replaced by something else (such as jdbc store or
other implementations that have been made). There was
already support for absolute file paths in all
circumstances by using "file:" URLs. This will bypass the
resource store and call Files.asResource instead. But
resource: URLs are for the data directory or alternative
resource store only. How does it make sense to get
absolute paths from the resource store?
In order to make jdbc-config pass the tests, I will have
to turn off this particular method. But why should the
test even be there if the file resource store is the only
one that could ever support it? Programmers and users will
rely on this behaviour and support for all alternative
implementations of ResourceStore will be broken. In this
case we may as well do away with the API and just use the
file system directly again.
Kind Regards
Niels
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel
--
Gabriel Roldán
--
--
Jody Garnett