Hi,
writing processes over and over let me to see some deficiencies in the
WPS annotations that
I would like to clear out. Some are general to processes, some are WPS
usage specific
(that's why I'm cross posting to gs-devevl).
One thing I see I do over and over at the start of a process is value
defaulting and validation.
For params that are not mandatory but have a default value, it would
be nice to just stick
the default value in the annotation:
@DescribeParameter(name = "multiplier", min = 0, default = 1d) double multiplier
For params that need validation it would be nice to have a set of
common validators so that we don't
have to roll the validation logic in the process code:
@DescribeParameter(name = "myparam", validator = new
RangeValidator(100, 200)) double myparam)
I would really hate to have to roll our own in this case, there is
plenty of validation packages
around on the web, but all seem to be focusing quite specifically on a
particular use case,
e.g., validating forms, validating a Swing GUI, or carrying around a
lot of extras. Sigh...
I guess we could roll our own built on top of commons-validator
routines, to avoid duplicating
really everything? Or use some convention and reflection, something like:
new Validator("double", "isInRange", 0, 100)
to end up calling DoubleValidator.isInRange(value, min, max).
Hmm... the above could be also done using code generation against all
the routines to get a
set of typesafe validation objects, or a factory exposing all the
validators, Validators.doubleIsInRange(0, 100) -> Validator
Moving on to something WPS specific, we need to be able to declare
what mime types the input files/streams
we are going to accept, and which ones we are going to produce.
Normally we avoid this issue in GeoServer by trading objects (e.g.,
RenderedImage, Coverage, FeatureCollection)
that specialized utility classes (ProcessParameterIO) turn into a
serialized format with a specific mime type.
But there are processes around that really do trade files, and
specific formats of them for what is worth.
For files that are inputs we could have something like:
@DescribeBinaryInput(..., mimeTypes = new String {image/png,
image/jpeg, ...} ...)
The mimeType would have then to be carried around by Parameter, which
has a metadata map
that we cannot read... can we add a getMetadata(key) method in there
to access some random
metadata?
Dealing with the output formats instead is going to be loads of fun.
We can have a
@DescribeBinaryResult( ... mimeTypes = new String {image/png,
image/jpeg, ...}
and that would allow us to run DescribeProcess, but when it comes to
executing the fun starts,
since the user will choose one of the output formats as part of the
_output_, not as part of
the input:
<wps:RawDataOutput mimeType="image/png">
<ows:Identifier>theImage</ows:Identifier>
</wps:RawDataOutput>
</wps:ResponseForm>
How is the process going to know that the user requested image/png as
the output format, since
that's not part of the inputs?
All I can think if being explicit about which of the input params is
going to be mapped to such choice,
and avoid exposing such param in the DescribeProcess:
@DescribeBinaryResult( ... mapToInput = "outputFormat")
@DescribeParameter(name="outputFormat") String outputFormat
Any better idea?
One final thing that happened to me while writing processes is
realizing that a process
will take long, that it cannot be written in a streaming manner for
some reason, and thus
really wanting the process to be only run in asynch mode.
Ideally it would be nice to have the following:
@DescribeProcess(... synch=false, asynch=true)
However I don't see a way to expose this from ProcessFactory, and it's
indeed something
that would be pretty WPS specific. Maybe we should augment the ProcessFactory
to return a open ended metadata map about the process?
Map<String, Object> getProcessMetadata(Name process)
Feedback welcomed.
Cheers
Andrea
--
Ing. Andrea Aime
GeoSolutions S.A.S.
Tech lead
Via Poggio alle Viti 1187
55054 Massarosa (LU)
Italy
phone: +39 0584 962313
fax: +39 0584 962313
mob: +39 339 8844549
http://www.geo-solutions.it
http://geo-solutions.blogspot.com/
http://www.youtube.com/user/GeoSolutionsIT
http://www.linkedin.com/in/andreaaime
http://twitter.com/geowolf