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