diff --git a/.github/workflows/assembly.yml b/.github/workflows/assembly.yml index 0df590b5514..89bd5e2c78a 100644 --- a/.github/workflows/assembly.yml +++ b/.github/workflows/assembly.yml @@ -40,12 +40,9 @@ jobs: - name: Package GeoServer modules and extensions run: | mvn -B -ntp -nsu -N -f src/pom.xml assembly:single - - name: Build community modules without tests + - name: Build and package community modules (without tests) run: | - mvn -B -ntp -U -T3 -DskipTests -PcommunityRelease -f src/community/pom.xml install - - name: Package community modules - run: | - mvn -B -ntp -nsu -N -f src/community/pom.xml assembly:single + mvn -B -ntp -U -T3 -DskipTests -PcommunityRelease,assembly -f src/community/pom.xml install - name: Remove SNAPSHOT jars from repository run: | find ~/.m2/repository -name "*SNAPSHOT*" -type d | xargs rm -rf {} diff --git a/data/release/demo/WCS_getCoverage.xml b/data/release/demo/WCS_getCoverage.xml index f74b0536c86..f22441aebd7 100644 --- a/data/release/demo/WCS_getCoverage.xml +++ b/data/release/demo/WCS_getCoverage.xml @@ -33,6 +33,6 @@ EPSG:32633 - GeoTIFF + image/png \ No newline at end of file diff --git a/doc/en/user/source/community/cog/cog.rst b/doc/en/user/source/community/cog/cog.rst index a6fad4ce13c..316cfd3110d 100644 --- a/doc/en/user/source/community/cog/cog.rst +++ b/doc/en/user/source/community/cog/cog.rst @@ -13,7 +13,18 @@ As a community module, the package needs to be downloaded from the `nightly buil picking the community folder of the corresponding GeoServer series (e.g. if working on the GeoServer main development branch nightly builds, pick the zip file form ``main/community-latest``). -To install the module, unpack the zip file contents into the GeoServer ``WEB-INF/lib`` directory and restart GeoServer. +The module is provided as four different packages, depending on the connection type: + +* ``cog-http`` for HTTP connections without a particular cloud target +* ``cog-aws`` for AWS S3 connections +* ``cog-google`` for Google Cloud Storage connections +* ``cog-azure`` for Azure Blob Storage connections + +To install the module, download the package you need, unpack the zip file contents into the GeoServer ``WEB-INF/lib`` directory and restart GeoServer. + +.. warning:: + + The dependencies of the various cloud providers might interfere with each other, so please never install together the AWS, Google and Azure modules. COG GeoTIFF Configuration Panel ------------------------------- diff --git a/doc/en/user/source/configuration/demos/img/demos_requests.png b/doc/en/user/source/configuration/demos/img/demos_requests.png index 94fb388d4d4..800e1312ba3 100644 Binary files a/doc/en/user/source/configuration/demos/img/demos_requests.png and b/doc/en/user/source/configuration/demos/img/demos_requests.png differ diff --git a/doc/en/user/source/configuration/demos/img/demos_requests_WFS.png b/doc/en/user/source/configuration/demos/img/demos_requests_WFS.png index 1f202e45bc9..66d86805eb5 100644 Binary files a/doc/en/user/source/configuration/demos/img/demos_requests_WFS.png and b/doc/en/user/source/configuration/demos/img/demos_requests_WFS.png differ diff --git a/doc/en/user/source/configuration/demos/img/demos_requests_WMS_feature.png b/doc/en/user/source/configuration/demos/img/demos_requests_WMS_feature.png index a2bbde3567d..fc3eef629cd 100644 Binary files a/doc/en/user/source/configuration/demos/img/demos_requests_WMS_feature.png and b/doc/en/user/source/configuration/demos/img/demos_requests_WMS_feature.png differ diff --git a/doc/en/user/source/configuration/demos/img/demos_requests_WMS_map.png b/doc/en/user/source/configuration/demos/img/demos_requests_WMS_map.png index d7daa84b8be..f9adeccb97b 100644 Binary files a/doc/en/user/source/configuration/demos/img/demos_requests_WMS_map.png and b/doc/en/user/source/configuration/demos/img/demos_requests_WMS_map.png differ diff --git a/doc/en/user/source/configuration/demos/img/demos_requests_schema.png b/doc/en/user/source/configuration/demos/img/demos_requests_schema.png index f6f692558fe..5cf98eea58e 100644 Binary files a/doc/en/user/source/configuration/demos/img/demos_requests_schema.png and b/doc/en/user/source/configuration/demos/img/demos_requests_schema.png differ diff --git a/doc/en/user/source/configuration/demos/img/demos_requests_transaction.png b/doc/en/user/source/configuration/demos/img/demos_requests_transaction.png new file mode 100644 index 00000000000..a5949eeb085 Binary files /dev/null and b/doc/en/user/source/configuration/demos/img/demos_requests_transaction.png differ diff --git a/doc/en/user/source/configuration/demos/index.rst b/doc/en/user/source/configuration/demos/index.rst index d7acb7dc9d4..b5e2a77e96e 100644 --- a/doc/en/user/source/configuration/demos/index.rst +++ b/doc/en/user/source/configuration/demos/index.rst @@ -39,25 +39,37 @@ Both :ref:`wfs` as well as :ref:`wcs` requests will display the request URL and .. figure:: img/demos_requests_WFS.png - WFS 1.1 DescribeFeatureType sample request + WFS 1.1 DescribeFeatureType sample request (Demo Request :guilabel:`WFS_describeFeatureType-1.1.xml`) -Click :guilabel:`Submit` to send the request to GeoServer. For WFS and WCS requests, GeoServer will automatically generate an XML response. +Click :guilabel:`Show Result` or :guilabel:`Show Result in New Page` to send the request to GeoServer. For WFS and WCS requests, GeoServer will automatically generate an XML response. + +:guilabel:`Show Result` will show GeoServer's response - both the response headers and the XML/image result - below the :guilabel:`Show Result` button. +If GeoServer's response is XML and you have ticked :guilabel:`Pretty Print XML`, GeoServer's response will be shown with an easy to read styled formatting. + +:guilabel:`Show Result in New Page` will show GeoServer's result in a new page (your browser will render the result). .. figure:: img/demos_requests_schema.png - XML response from a WFS 1.1 DescribeFeatureType sample request + Headers and XML response from a WFS 1.1 DescribeFeatureType sample request after pressing :guilabel:`Show Result`. (Demo Request :guilabel:`WFS_describeFeatureType-1.1.xml`) Submitting a WMS GetMap request displays an image based on the provided geographic data. .. figure:: img/demos_requests_WMS_map.png - OpenLayers WMS GetMap request + Headers and image response for a WMS GetMap request after pressing :guilabel:`Show Result`. (Demo Request :guilabel:`WMS_getMap_multilayer.url`) -WMS GetFeatureInfo requests retrieve information regarding a particular feature on the map image. +WMS GetFeatureInfo requests retrieve information regarding a particular feature on the map image. .. figure:: img/demos_requests_WMS_feature.png - WMS GetFeatureInfo request + Plain text WMS GetFeatureInfo request after pressing :guilabel:`Show Result`. (Demo Request :guilabel:`WMS_featureInfo.url`) + +.. figure:: img/demos_requests_transaction.png + + WFS Transaction result after pressing :guilabel:`Show Result in New Page` (Your browser may render this differently). (Demo Request :guilabel:`WFS_transactionInsert.xml`) + + + .. _srs_list: diff --git a/doc/en/user/source/data/webadmin/layers.rst b/doc/en/user/source/data/webadmin/layers.rst index 684fcdde165..611a574d255 100644 --- a/doc/en/user/source/data/webadmin/layers.rst +++ b/doc/en/user/source/data/webadmin/layers.rst @@ -66,7 +66,7 @@ The actions display an :ref:`Edit Layer ` page t Remove a Layer -------------- -To remove a layer, select it by clicking the checkbox next to the layer. As shown below, multiple layers can be selected for batch removal. Note that selections for removal will not persist from one results pages to the next. +To remove a layer, select it by clicking the checkbox next to the layer. As shown below, multiple layers can be selected for batch removal. Note that selections for removal will not persist from one results page to the next. .. figure:: img/data_layers_delete.png @@ -113,7 +113,7 @@ The metadata information will appear in the capabilities documents which refer t Coordinate Reference Systems ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -A coordinate reference system (CRS) defines how georeferenced spatial data relates to real locations on the Earth’s surface. CRSes are part of a more general model called Spatial Reference Systems (SRS), which includes referencing by coordinates and geographic identifiers. GeoServer needs to know the Coordinate Reference System of your data. This information is used for computing the latitude/longitude bounding box and reprojecting the data during both WMS and WFS requests. +A coordinate reference system (CRS) defines how georeferenced spatial data relates to real locations on the Earth’s surface. CRSs are part of a more general model called Spatial Reference Systems (SRS), which includes referencing by coordinates and geographic identifiers. GeoServer needs to know the Coordinate Reference System of your data. This information is used for computing the latitude/longitude bounding box and reprojecting the data during both WMS and WFS requests. .. figure:: img/data_layers_CRS.png @@ -121,7 +121,7 @@ A coordinate reference system (CRS) defines how georeferenced spatial data relat * **Native SRS**—Specifies the coordinate system the layer is stored in. Clicking the projection link displays a description of the SRS. * **Declared SRS**—Specifies the coordinate system GeoServer publishes to clients -* **SRS Handling**—Determines how GeoServer should handle projection when the two SRSes differ. Possible values are: +* **SRS Handling**—Determines how GeoServer should handle projection when the two SRSs differ. Possible values are: * **Force declared** (default): the declared SRS is forced upon the data, overwriting the native one. This is the default option and normally the best course of action, the declared code comes from the EPSG database and has a wealth of extra information in it, starting from a valid EPSG code, an area of validity, a link back in the @@ -131,7 +131,7 @@ A coordinate reference system (CRS) defines how georeferenced spatial data relat a EPSG code for the layers, with this setting the declared one will be advertised, and reprojection from native will happen on the fly as needed (in case a third CRS is requested, the reprojection will go directly from native to declared) * **Keep native**: this is a setting that should be used in very rare cases. Keeping native means using the declared one in the capabilities documents, but then - using the native CRS in all otherrequests (with no reprojection in between, unless explicitly requested from client). This is particularly problematic if the source + using the native CRS in all other requests (with no reprojection in between, unless explicitly requested from client). This is particularly problematic if the source is a shapefile, as the PRJ files lack all the extra information provided by the EPSG database (it will for example break WFS 1.1 and 2.0 SRS declarations in GML output). The setting meant to be used in cases where WMS is the primary target, and the native and declared CRSs have very small differences, avoiding on the fly reprojection and datum change. @@ -139,7 +139,7 @@ A coordinate reference system (CRS) defines how georeferenced spatial data relat In summary, use **Force Declared** as your primary option, **Reproject from native** only if your source data does not match any EPSG code, and **Keep Native** only if you really know what you're doing. -For WMS Server and WFS-NG layers with multiple supported CRS in capability document, the Native CRS can be selected from clicking Find button next to Native SRS field +For Cascaded WMS and WMTS servers and WFS-NG layers with multiple supported CRSs in the capabilities document, the Native CRS can be selected by clicking the Find button next to the Native SRS field. .. figure:: img/cascade_srs.png @@ -257,7 +257,7 @@ a hierarchy where the layer is the root instead. To enable this functionality, choose the **No** option from the Root Layer in Capabilities section. -By default this behaviour is inherited from the global WMS service settings (**WMS Global Settings** option). +By default this behavior is inherited from the global WMS service settings (**WMS Global Settings** option). Finally, it is possible to override the service settings and force a **Yes** to always include the GeoServer root element. .. figure:: img/data_layers_root_in_capabilities.png @@ -342,8 +342,8 @@ WCS Settings * **Request SRS**—Provides a list of SRSs the layer can be converted to. :guilabel:`New Request SRS` allows you to add an SRS to that list. * **Interpolation Methods**—Sets the raster rendering process, if applicable. -* **Formats**—Lists which output formats a layers supports. -* **GeoSearch**—When enabled, allows the Google Geosearch crawler to index from this particular layer. See `What is a Geo Sitemap? `_ for more information. +* **Formats**—Lists which output formats a layer supports. +* **GeoSearch**—When enabled, allows the Google GeoSearch crawler to index from this particular layer. Obsolete since 2012. See `Google Retired Geo Sitemap Support `_ for more information. KML Format Settings ^^^^^^^^^^^^^^^^^^^ @@ -381,14 +381,14 @@ For each enabled dimension the following configuration options are available: * **smallest domain value**—Uses the smallest available value from the data * **biggest domain value**—Uses the biggest available value from the data * **nearest to the reference value**—Selects the data value closest to the given reference value - * **reference value**—Tries to use the given reference value as-is, regardless of whether its actually available in the data or not. + * **reference value**—Tries to use the given reference value as-is, regardless of whether it's actually available in the data or not. -* **Reference value**—The default value specifier. Only shown for the default value strategies where its used. +* **Reference value**—The default value specifier. Only shown for the default value strategies where it's used. * **Nearest match**—Whether to enable, or not, WMS nearest match support on this dimension. Currently supported only on the time dimension. * **Nearest match on raw data**—Whether to enable, or not, nearest match support on this dimension for raw data requests (WCS for coverage layers, WFS for feature layers). Currently supported only on the time dimension for WCS service. * **Acceptable interval**—A maximum search distance from the specified value (available only when nearest match is enabled). Can be empty (no limit), a single value (symmetric search) or using a ``before/after`` syntax to - specify an asymmetric search range. Time distances should specified using the ISO period syntax. For example, ``PT1H/PT0H`` allows to search up to one hour before the user specified value, + specify an asymmetric search range. Time distances should be specified using the ISO period syntax. For example, ``PT1H/PT0H`` allows to search up to one hour before the user specified value, but not after. * **On nearest match fail**—What to do if the nearest match fails the acceptable interval. The default behavior is to use the original value and thus return an empty result, but can also be configured to throw an ``InvalidDimensionValue`` exception instead. In case the value is not set, it defaults to ignoring the nearest match and using the original value. To switch to the opposite default, set the following variable (system, environment, or web.xml, as usual): ``org.geoserver.wms.nearestFail=EXCEPTION``. * **Begin of data range**—A manually declared start value for the data range. When specified, the ``End of data range`` has to be specified also. @@ -406,7 +406,7 @@ For time dimension the value must be in ISO 8601 DateTime format ``yyyy-MM-ddThh Only for the "Reference value" strategy, it is also possible to use ranges or times and ranges of elevation, in the form ``fromValue/toValue``. Only for the "Reference value" strategy, and limited to times, it's also possible to use relative times like ``P1M/PRESENT``, but caution is given that the reference value -is copied verbatim into the capabilities document, and as a result, not all client might be recognizing that syntax. +is copied verbatim into the capabilities document, and as a result, not all clients might recognize that syntax. .. note:: For more information on specifying times, please see the section on :ref:`wms_time`. @@ -429,9 +429,9 @@ For each enabled dimension the following configuration options are available: * **smallest domain value**—Uses the smallest available value from the data * **biggest domain value**—Uses the biggest available value from the data * **nearest to the reference value**—Selects the data value closest to the given reference value - * **reference value**—Tries to use the given reference value as-is, regardless of whether its actually available in the data or not. + * **reference value**—Tries to use the given reference value as-is, regardless of whether it's actually available in the data or not. -* **Reference value**—The default value specifier. Only shown for the default value strategies where its used. +* **Reference value**—The default value specifier. Only shown for the default value strategies where it's used. * **Nearest match**—Whether to enable, or not, WMS nearest match support on this dimension. * **Acceptable interval**—A maximum search distance from the specified value (available only when nearest match is enabled). Can be empty (no limit), a single value (symmetric search) or using a ``before/after`` syntax to diff --git a/doc/en/user/source/extensions/mapml/index.rst b/doc/en/user/source/extensions/mapml/index.rst index 8153803757b..adda4c9c962 100644 --- a/doc/en/user/source/extensions/mapml/index.rst +++ b/doc/en/user/source/extensions/mapml/index.rst @@ -286,7 +286,7 @@ The link is generated so that it always work, if the CRS configured for the laye **MapML Output Format** -The output image format for the MapML resource should be specified using the format_options parameter with a key called ``mapml-wms-format``. If provided, the provided mime type must be a valid WMS format specifier. If not provided, it defaults to ``image/png``. +The output image format for the MapML resource should be specified using the format_options parameter with a key called ``mapml-wms-format``. If provided, the provided mime type must be a valid WMS format specifier. If not provided, it defaults to to the format set with the Default Mime Type dropdown under MapML Settings in the Publishing tab of the Edit Layer settings page. Example:: diff --git a/doc/en/user/source/gettingstarted/group-quickstart/index.rst b/doc/en/user/source/gettingstarted/group-quickstart/index.rst index fdc44f1329a..07ed66a7235 100644 --- a/doc/en/user/source/gettingstarted/group-quickstart/index.rst +++ b/doc/en/user/source/gettingstarted/group-quickstart/index.rst @@ -81,7 +81,7 @@ Create a layer group #. Locate the :guilabel:`Coordiante Reference Systems` and press :guilabel:`Generate Bounds`. - Now that layers are listed we they can be used to determine the corodinate reference system and bounds of the layer group. + Now that layers are listed we they can be used to determine the coordinate reference system and bounds of the layer group. .. figure:: images/layers_crs.png diff --git a/doc/en/user/source/security/tutorials/activedirectory/index.rst b/doc/en/user/source/security/tutorials/activedirectory/index.rst index a6d4f2d24d6..ca6eb3c376a 100644 --- a/doc/en/user/source/security/tutorials/activedirectory/index.rst +++ b/doc/en/user/source/security/tutorials/activedirectory/index.rst @@ -97,9 +97,9 @@ from the LDAP repository and allow access rights to be assigned to those roles. #. Click the ``Users,Group,Roles`` link located under the ``Security`` section of the navigation sidebar. -#. Click the ``Add new link`` under the ``Role Services`` section. +#. Click the ``Add new`` link under the ``Role Services`` section. -#. Click the ``LDAP`` option under the ``New Role Service`` section. +#. Click the ``LDAP`` option under the ``New Role Service`` section. .. figure:: images/ldap14.jpg :align: center @@ -134,4 +134,4 @@ Then we need to a choose a user to authenticate on the server (many LDAP server #. Save again. -You should now be able to see and assign the new ActiveDirectory roles wherever an ``Available Roles`` list is shown (for example in the ``Data`` and ``Services`` rules sections. \ No newline at end of file +You should now be able to see and assign the new ActiveDirectory roles wherever an ``Available Roles`` list is shown (for example in the ``Data`` and ``Services`` rules sections. diff --git a/doc/en/user/source/services/wcs/img/wcsrequestbuilder.png b/doc/en/user/source/services/wcs/img/wcsrequestbuilder.png index 1219ab1b90e..ff70f02e534 100644 Binary files a/doc/en/user/source/services/wcs/img/wcsrequestbuilder.png and b/doc/en/user/source/services/wcs/img/wcsrequestbuilder.png differ diff --git a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_100.png b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_100.png index c77aa554314..fd0fa17e4c7 100644 Binary files a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_100.png and b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_100.png differ diff --git a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_111.png b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_111.png index 8dd288c7c7c..57bdfc000a6 100644 Binary files a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_111.png and b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_111.png differ diff --git a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_demo.png b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_demo.png new file mode 100644 index 00000000000..e9ba148f1d1 Binary files /dev/null and b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_demo.png differ diff --git a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_xml.png b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_xml.png index b1399a20803..bbfc2bd97e8 100644 Binary files a/doc/en/user/source/services/wcs/img/wcsrequestbuilder_xml.png and b/doc/en/user/source/services/wcs/img/wcsrequestbuilder_xml.png differ diff --git a/doc/en/user/source/services/wcs/requestbuilder.rst b/doc/en/user/source/services/wcs/requestbuilder.rst index cdaf9520ef6..817a940fa81 100644 --- a/doc/en/user/source/services/wcs/requestbuilder.rst +++ b/doc/en/user/source/services/wcs/requestbuilder.rst @@ -67,12 +67,19 @@ Once selected, the remainder of the form will be displayed. The following option There is also a link for :guilabel:`Describe coverage` next to the :guilabel:`Coverage name` which will execute a :ref:`WCS DescribeCoverage ` request for the particular layer. -At the bottom of the form are two buttons for form submission: +At the bottom of the form are three buttons for form submission: -* :guilabel:`Get Coverage`—Executes a GetCoverage request using the parameters in the form. This will usually result in a file which can be downloaded. +* :guilabel:`Get Coverage in Demo Requests`—Opens the :ref:`demos_demorequests` page with the URL and XML Request filled out. -* :guilabel:`Generate GetCoverage XML`—Generates the GetCoverage request using the parameters in the form and then, instead of executing it, outputs the request itself to the screen. +* :guilabel:`Get Coverage in New Page`—Executes a GetCoverage request using the parameters in the form. This will usually result in a file which can be displayed or downloaded. +* :guilabel:`Generate GetCoverage XML`—Generates the GetCoverage XML request using the parameters in the form and then, instead of executing it, outputs the request itself to the screen. + +.. figure:: img/wcsrequestbuilder_demo.png + + Get Coverage request in Demo Requests + .. figure:: img/wcsrequestbuilder_xml.png WCS request builder showing GetCoverage XML + diff --git a/doc/en/user/source/services/wps/images/requestbuilder_demo.png b/doc/en/user/source/services/wps/images/requestbuilder_demo.png new file mode 100644 index 00000000000..10d1aee9038 Binary files /dev/null and b/doc/en/user/source/services/wps/images/requestbuilder_demo.png differ diff --git a/doc/en/user/source/services/wps/images/requestbuilderblank.png b/doc/en/user/source/services/wps/images/requestbuilderblank.png index 90857b1c9c6..a69e1038503 100644 Binary files a/doc/en/user/source/services/wps/images/requestbuilderblank.png and b/doc/en/user/source/services/wps/images/requestbuilderblank.png differ diff --git a/doc/en/user/source/services/wps/images/requestbuilderrequest.png b/doc/en/user/source/services/wps/images/requestbuilderrequest.png index ea4a91cb39e..3d57e34ed0a 100644 Binary files a/doc/en/user/source/services/wps/images/requestbuilderrequest.png and b/doc/en/user/source/services/wps/images/requestbuilderrequest.png differ diff --git a/doc/en/user/source/services/wps/images/requestbuilderresponse.png b/doc/en/user/source/services/wps/images/requestbuilderresponse.png index 0fd28226cc7..455d34f357f 100644 Binary files a/doc/en/user/source/services/wps/images/requestbuilderresponse.png and b/doc/en/user/source/services/wps/images/requestbuilderresponse.png differ diff --git a/doc/en/user/source/services/wps/images/requestbuildertoppstates.png b/doc/en/user/source/services/wps/images/requestbuildertoppstates.png index 684fbb43975..3e28fe5d215 100644 Binary files a/doc/en/user/source/services/wps/images/requestbuildertoppstates.png and b/doc/en/user/source/services/wps/images/requestbuildertoppstates.png differ diff --git a/doc/en/user/source/services/wps/requestbuilder.rst b/doc/en/user/source/services/wps/requestbuilder.rst index 3209b8dcd8d..01aa606209b 100644 --- a/doc/en/user/source/services/wps/requestbuilder.rst +++ b/doc/en/user/source/services/wps/requestbuilder.rst @@ -1 +1,68 @@ -.. _wps_request_builder: WPS Request Builder =================== The GeoServer WPS extension includes a request builder for testing out WPS processes through the :ref:`web_admin`. This tool can also be used to demonstrate processes, and construct your own examples. Accessing the request builder --------------------------------- To access the WPS Request Builder: #. Navigate to the main :ref:`web_admin`. #. Click on the :guilabel:`Demos` link on the left side. #. Select :guilabel:`WPS Request Builder` from the list of demos. .. figure:: images/demospage.png :align: center *WPS request builder in the list of demos* Using the request builder ------------------------- The WPS Request Builder primarily consists of a selection box listing all of the available processes, and two buttons, one to submit the WPS request, and another to display what the POST request looks like. .. figure:: images/requestbuilderblank.png :align: center *Blank WPS request builder form* The display changes depending on the process and input selected. JTS processes have available as inputs any of a GML/WKT-based feature collection, URL reference, or subprocess. GeoServer-specific processes have all these as options and also includes the ability to choose a GeoServer layer as input. For each process, a form will display based on the required and optional parameters associated with that process, if any. .. figure:: images/requestbuildertoppstates.png :align: center *WPS request builder form to determine the bounds of topp:states* To see the process as a POST request, click the :guilabel:`Generate XML from process inputs/outputs` button. .. figure:: images/requestbuilderrequest.png :align: center *Raw WPS POST request for the above process* To execute the process, click the :guilabel:`Execute Process` button. The response will be displayed in a window or .. figure:: images/requestbuilderresponse.png :align: center *WPS server response* \ No newline at end of file +.. _wps_request_builder: + +WPS Request Builder +=================== + +The GeoServer WPS extension includes a request builder for testing out WPS processes through the :ref:`web_admin`. This tool can also be used to demonstrate processes, and construct your own examples. + +Accessing the request builder +--------------------------------- + +To access the WPS Request Builder: + +#. Navigate to the main :ref:`web_admin`. + +#. Click on the :guilabel:`Demos` link on the left side. + + +#. Select :guilabel:`WPS Request Builder` from the list of demos. + +.. figure:: images/demospage.png + :align: center + + *WPS request builder in the list of demos* + +Using the request builder +------------------------- + +The WPS Request Builder primarily consists of a selection box listing all of the available processes, and two buttons, one to submit the WPS request, and another to display what the POST request looks like. + +.. figure:: images/requestbuilderblank.png + :align: center + + *Blank WPS request builder form* + +The display changes depending on the process and input selected. JTS processes have available as inputs any of a GML/WKT-based feature collection, URL reference, or subprocess. GeoServer-specific processes have all these as options and also includes the ability to choose a GeoServer layer as input. + +For each process, a form will display based on the required and optional parameters associated with that process, if any. + +.. figure:: images/requestbuildertoppstates.png + :align: center + + *WPS request builder form to determine the bounds of topp:states* + +To see the process as a POST request, click the :guilabel:`Generate XML from process inputs/outputs` button. + +.. figure:: images/requestbuilderrequest.png + :align: center + + *Raw WPS POST request for the above process* + +To execute the process, click the :guilabel:`Execute Process in New Page` button. The response will be displayed in the window. + +.. figure:: images/requestbuilderresponse.png + :align: center + + *WPS server response (Browsers may render differently)* + +To see and execute the request in :ref:`demos_demorequests`, click the :guilabel:`Execute Process in Demo Requests` button. + + +.. figure:: images/requestbuilder_demo.png + :align: center + + *Request and Response shown in Demo Requests* + + + + \ No newline at end of file diff --git a/src/community/README.md b/src/community/README.md new file mode 100644 index 00000000000..bbd0ee0c07a --- /dev/null +++ b/src/community/README.md @@ -0,0 +1,33 @@ +# Community modules + +The root of all the community modules. + +## Assembly definitions + +Rules to follow in order to create a zip for a module: + +* Add an ``assembly.xml`` descriptor to the module +* Add the ``false`` property to the module (this activates assembly generation) +* If assembly needs to pick files from multiple independent modules, create a dedicated assembly module for it (e.g., check ``backup-restore/assembly`` that depends on the others) +* The assembly process will automatically copy the dependencies into ``target/dependency``, depending on the nature of the module you might have to add the generated module jar found in ``target`` too (see existing ``assembly.xml`` files for reference). + +## Assembly execution + +To assemble the zip files of extensions, run the following: + +``` +mvn clean install -DskipTests -PcommunityRelease,assembly -T1C -nsu -fae +``` + +If the assembly of a particular module, or group of modules, is desired, then use the associated profile, e.g.: + +``` +mvn clean install -DskipTests -PcolorMap,assembly -T1C -nsu -fae +``` + +It is important to run at least one maven phase (e.g. ``install``) for the assembly machinery to work, e.g., calling a goal directly will not work: + +``` +mvn assembly:single -DskipTests -PcolorMap,assembly -T1C -nsu -fae +``` + diff --git a/src/community/backup-restore/assembly/pom.xml b/src/community/backup-restore/assembly/pom.xml new file mode 100644 index 00000000000..850ce350cac --- /dev/null +++ b/src/community/backup-restore/assembly/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-backup-restore + 2.26-SNAPSHOT + + + org.geoserver.community.backuprestore + gs-backup-restore-assembly + jar + Assembly module for backup-restore + + + + + org.geoserver.community.backuprestore + gs-backup-restore-core + ${project.version} + + + + org.geoserver.community.backuprestore + gs-backup-restore-rest + ${project.version} + + + + org.geoserver.community.backuprestore + gs-backup-restore-web + ${project.version} + + + + org.geoserver.community.backuprestore + gs-backup-restore-extension + ${project.version} + + + + + diff --git a/src/community/release/ext-backup-restore.xml b/src/community/backup-restore/assembly/src/assembly/assembly.xml similarity index 97% rename from src/community/release/ext-backup-restore.xml rename to src/community/backup-restore/assembly/src/assembly/assembly.xml index 5779d17c16c..3b9eb4e809b 100644 --- a/src/community/release/ext-backup-restore.xml +++ b/src/community/backup-restore/assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-backup-restore-web*.jar diff --git a/src/community/backup-restore/pom.xml b/src/community/backup-restore/pom.xml index 352d10839e0..b790c674150 100644 --- a/src/community/backup-restore/pom.xml +++ b/src/community/backup-restore/pom.xml @@ -19,6 +19,7 @@ rest extension web + assembly @@ -68,31 +69,4 @@ - - - - ${basedir}/src/test/resources - - **/* - - - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - diff --git a/src/community/cog/cog-azure/pom.xml b/src/community/cog/cog-azure/pom.xml new file mode 100644 index 00000000000..44801761452 --- /dev/null +++ b/src/community/cog/cog-azure/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-cog + 2.26-SNAPSHOT + + + org.geoserver.community + gs-cog-azure + jar + COG support module - Azure + + + + org.geoserver.community + gs-cog-core + ${project.version} + + + it.geosolutions.imageio-ext + imageio-ext-cog-rangereader-azure + ${imageio-ext.version} + + + diff --git a/src/community/release/ext-cog.xml b/src/community/cog/cog-azure/src/assembly/assembly.xml similarity index 94% rename from src/community/release/ext-cog.xml rename to src/community/cog/cog-azure/src/assembly/assembly.xml index 80d781fe9ec..32434ab852b 100644 --- a/src/community/release/ext-cog.xml +++ b/src/community/cog/cog-azure/src/assembly/assembly.xml @@ -1,12 +1,12 @@ - cog-plugin + cog-azure-plugin zip false - release/target/dependency + target/dependency annotations-2.*.jar diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/CogAzureRemoteHarvestOnlineTest.java b/src/community/cog/cog-azure/src/test/java/org/geoserver/rest/catalog/CogAzureRemoteHarvestOnlineTest.java similarity index 100% rename from src/community/cog/src/test/java/org/geoserver/rest/catalog/CogAzureRemoteHarvestOnlineTest.java rename to src/community/cog/cog-azure/src/test/java/org/geoserver/rest/catalog/CogAzureRemoteHarvestOnlineTest.java diff --git a/src/community/cog/cog-azure/src/test/java/org/geoserver/rest/catalog/test-data/azureempty.zip b/src/community/cog/cog-azure/src/test/java/org/geoserver/rest/catalog/test-data/azureempty.zip new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/community/cog/cog-core/pom.xml b/src/community/cog/cog-core/pom.xml new file mode 100644 index 00000000000..f6effde00f4 --- /dev/null +++ b/src/community/cog/cog-core/pom.xml @@ -0,0 +1,21 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-cog + 2.26-SNAPSHOT + + + org.geoserver.community + gs-cog-core + jar + COG support module - core + + diff --git a/src/community/cog/src/main/java/applicationContext.xml b/src/community/cog/cog-core/src/main/java/applicationContext.xml similarity index 100% rename from src/community/cog/src/main/java/applicationContext.xml rename to src/community/cog/cog-core/src/main/java/applicationContext.xml diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CogEncryptedFieldsProvider.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogEncryptedFieldsProvider.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/cog/CogEncryptedFieldsProvider.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogEncryptedFieldsProvider.java diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CogSettings.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettings.java similarity index 82% rename from src/community/cog/src/main/java/org/geoserver/cog/CogSettings.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettings.java index 909355d16c0..d964315e2db 100644 --- a/src/community/cog/src/main/java/org/geoserver/cog/CogSettings.java +++ b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettings.java @@ -4,10 +4,6 @@ */ package org.geoserver.cog; -import it.geosolutions.imageioimpl.plugins.cog.AzureRangeReader; -import it.geosolutions.imageioimpl.plugins.cog.GSRangeReader; -import it.geosolutions.imageioimpl.plugins.cog.HttpRangeReader; -import it.geosolutions.imageioimpl.plugins.cog.S3RangeReader; import java.io.Serializable; /** Basic Cog Settings such as RangeReader and caching capabilities */ @@ -32,7 +28,7 @@ public enum RangeReaderType { @Override String getRangeReaderClassName() { - return HttpRangeReader.class.getName(); + return "it.geosolutions.imageioimpl.plugins.cog.HttpRangeReader"; } }, /** Reader using the S3 API (with security support and whatnot) */ @@ -40,7 +36,7 @@ String getRangeReaderClassName() { @Override String getRangeReaderClassName() { - return S3RangeReader.class.getName(); + return "it.geosolutions.imageioimpl.plugins.cog.S3RangeReader"; } }, /** Reader using the Google Storage API (again, with security support) */ @@ -48,7 +44,7 @@ String getRangeReaderClassName() { @Override String getRangeReaderClassName() { - return GSRangeReader.class.getName(); + return "it.geosolutions.imageioimpl.plugins.cog.GSRangeReader"; } }, /** Reader using the Azure API (again, with security support) */ @@ -56,7 +52,7 @@ String getRangeReaderClassName() { @Override String getRangeReaderClassName() { - return AzureRangeReader.class.getName(); + return "it.geosolutions.imageioimpl.plugins.cog.AzureRangeReader"; } }; ; diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CogSettingsInitializer.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsInitializer.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/cog/CogSettingsInitializer.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsInitializer.java diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CogSettingsStore.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsStore.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/cog/CogSettingsStore.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsStore.java diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CogSettingsXStreamInitializer.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsXStreamInitializer.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/cog/CogSettingsXStreamInitializer.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CogSettingsXStreamInitializer.java diff --git a/src/community/cog/src/main/java/org/geoserver/cog/CoverageReaderCogInputObjectConverter.java b/src/community/cog/cog-core/src/main/java/org/geoserver/cog/CoverageReaderCogInputObjectConverter.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/cog/CoverageReaderCogInputObjectConverter.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/cog/CoverageReaderCogInputObjectConverter.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogInput.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogRasterEditPanel.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPanel.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsPluginPanel.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogSettingsStorePanel.java diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.html b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.html similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.html rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.html diff --git a/src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.java b/src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.java similarity index 100% rename from src/community/cog/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.java rename to src/community/cog/cog-core/src/main/java/org/geoserver/web/data/store/cog/panel/CogUrlParamPanel.java diff --git a/src/community/cog/src/main/resources/GeoServerApplication.properties b/src/community/cog/cog-core/src/main/resources/GeoServerApplication.properties similarity index 100% rename from src/community/cog/src/main/resources/GeoServerApplication.properties rename to src/community/cog/cog-core/src/main/resources/GeoServerApplication.properties diff --git a/src/community/cog/src/main/resources/GeoServerApplication_fr.properties b/src/community/cog/cog-core/src/main/resources/GeoServerApplication_fr.properties similarity index 100% rename from src/community/cog/src/main/resources/GeoServerApplication_fr.properties rename to src/community/cog/cog-core/src/main/resources/GeoServerApplication_fr.properties diff --git a/src/community/cog/cog-google/pom.xml b/src/community/cog/cog-google/pom.xml new file mode 100644 index 00000000000..a72c06d619c --- /dev/null +++ b/src/community/cog/cog-google/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-cog + 2.26-SNAPSHOT + + + org.geoserver.community + gs-cog-google + jar + COG support module - Google Storage + + + + org.geoserver.community + gs-cog-core + ${project.version} + + + it.geosolutions.imageio-ext + imageio-ext-cog-rangereader-gs + ${imageio-ext.version} + + + diff --git a/src/community/cog/cog-google/src/assembly/assembly.xml b/src/community/cog/cog-google/src/assembly/assembly.xml new file mode 100644 index 00000000000..711856b6ae3 --- /dev/null +++ b/src/community/cog/cog-google/src/assembly/assembly.xml @@ -0,0 +1,31 @@ + + cog-google-plugin + + zip + + false + + + target/dependency + + + gs-cog*.jar + imageio-ext-*rangereader*.jar + *google*.jar + guava*.jar + checker-qual*.jar + error_prone_annotations*.jar + objc-annotations*.jar + gson*.jar + auto-value-annotations* + gax* + api-common* + annotation-api* + grpc-context* + opencensus* + protobuf-java* + threetenbp* + + + + diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/CogGSRemoteHarvestOnlineTest.java b/src/community/cog/cog-google/src/test/java/org/geoserver/rest/catalog/CogGSRemoteHarvestOnlineTest.java similarity index 100% rename from src/community/cog/src/test/java/org/geoserver/rest/catalog/CogGSRemoteHarvestOnlineTest.java rename to src/community/cog/cog-google/src/test/java/org/geoserver/rest/catalog/CogGSRemoteHarvestOnlineTest.java diff --git a/src/community/cog/cog-google/src/test/java/org/geoserver/rest/catalog/test-data/gsempty.zip b/src/community/cog/cog-google/src/test/java/org/geoserver/rest/catalog/test-data/gsempty.zip new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/community/cog/cog-http/pom.xml b/src/community/cog/cog-http/pom.xml new file mode 100644 index 00000000000..2fc84a3a2b0 --- /dev/null +++ b/src/community/cog/cog-http/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-cog + 2.26-SNAPSHOT + + + org.geoserver.community + gs-cog-http + jar + COG support module - Plain HTTP + + + + org.geoserver.community + gs-cog-core + ${project.version} + + + it.geosolutions.imageio-ext + imageio-ext-cog-rangereader-http + ${imageio-ext.version} + + + diff --git a/src/community/cog/cog-http/src/assembly/assembly.xml b/src/community/cog/cog-http/src/assembly/assembly.xml new file mode 100644 index 00000000000..250bee6e13e --- /dev/null +++ b/src/community/cog/cog-http/src/assembly/assembly.xml @@ -0,0 +1,45 @@ + + cog-http-plugin + + zip + + false + + + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency + + + annotations-2.*.jar + auth-2.*.jar + aws-*-2.*.jar + azure-storage*.jar + client-runtime*.jar + gs-cog*.jar + http-client-spi-2*.jar + http*-osgi*.jar + imageio-ext-*rangereader*.jar + jackson-datatype*.jar + jackson-module*.jar + kotlin-stdlib*.jar + *netty*.jar + okhttp*.jar + okio*.jar + profiles-2.*.jar + protocol-core-2.*.jar + reactive-streams*.jar + regions-2.*.jar + rxjava*.jar + s3-2.*.jar + sdk-core-2.*.jar + utils-2.*.jar + + + + diff --git a/src/community/cog/cog-s3/pom.xml b/src/community/cog/cog-s3/pom.xml new file mode 100644 index 00000000000..d82c79151d6 --- /dev/null +++ b/src/community/cog/cog-s3/pom.xml @@ -0,0 +1,33 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-cog + 2.26-SNAPSHOT + + + org.geoserver.community + gs-cog-s3 + jar + COG support module - Amazon S3 + + + + org.geoserver.community + gs-cog-core + ${project.version} + + + it.geosolutions.imageio-ext + imageio-ext-cog-rangereader-s3 + ${imageio-ext.version} + + + diff --git a/src/community/cog/cog-s3/src/assembly/assembly.xml b/src/community/cog/cog-s3/src/assembly/assembly.xml new file mode 100644 index 00000000000..305c1a95c5c --- /dev/null +++ b/src/community/cog/cog-s3/src/assembly/assembly.xml @@ -0,0 +1,51 @@ + + cog-s3-plugin + + zip + + false + + + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency + + + annotations-2.*.jar + auth-2.*.jar + aws-*-2.*.jar + azure-storage*.jar + client-runtime*.jar + gs-cog*.jar + http-client-spi-2*.jar + http*-osgi*.jar + imageio-ext-*rangereader*.jar + jackson-datatype*.jar + jackson-module*.jar + kotlin-stdlib*.jar + *netty*.jar + okhttp*.jar + okio*.jar + profiles-2.*.jar + protocol-core-2.*.jar + reactive-streams*.jar + regions-2.*.jar + rxjava*.jar + s3-2.*.jar + sdk-core-2.*.jar + utils-2.*.jar + checksums-*2*.jar + crt-core-*-2*.jar + endpoints-spi-2*.jar + http-auth-*2*.jar + identity-spi*.jar + metrics-spi-2.*.jar + + + + diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/CogRemoteHarvestOnlineTest.java b/src/community/cog/cog-s3/src/test/java/org/geoserver/rest/catalog/CogRemoteHarvestOnlineTest.java similarity index 100% rename from src/community/cog/src/test/java/org/geoserver/rest/catalog/CogRemoteHarvestOnlineTest.java rename to src/community/cog/cog-s3/src/test/java/org/geoserver/rest/catalog/CogRemoteHarvestOnlineTest.java diff --git a/src/community/cog/cog-s3/src/test/java/org/geoserver/rest/catalog/test-data/empty.zip b/src/community/cog/cog-s3/src/test/java/org/geoserver/rest/catalog/test-data/empty.zip new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/community/cog/pom.xml b/src/community/cog/pom.xml index e3049119fcb..ae1192469e1 100644 --- a/src/community/cog/pom.xml +++ b/src/community/cog/pom.xml @@ -15,9 +15,17 @@ org.geoserver.community gs-cog - jar + pom COG support module + + cog-core + cog-http + cog-azure + cog-s3 + cog-google + + org.geotools @@ -33,26 +41,6 @@ imageio-ext-cog-reader ${imageio-ext.version} - - it.geosolutions.imageio-ext - imageio-ext-cog-rangereader-s3 - ${imageio-ext.version} - - - it.geosolutions.imageio-ext - imageio-ext-cog-rangereader-gs - ${imageio-ext.version} - - - it.geosolutions.imageio-ext - imageio-ext-cog-rangereader-azure - ${imageio-ext.version} - - - it.geosolutions.imageio-ext - imageio-ext-cog-rangereader-http - ${imageio-ext.version} - org.geoserver gs-restconfig diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/azureempty.zip b/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/azureempty.zip deleted file mode 100644 index 20ee0eb0e53..00000000000 Binary files a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/azureempty.zip and /dev/null differ diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/empty.zip b/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/empty.zip deleted file mode 100644 index e9c87bb9856..00000000000 Binary files a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/empty.zip and /dev/null differ diff --git a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/gsempty.zip b/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/gsempty.zip deleted file mode 100644 index 230273e71e9..00000000000 Binary files a/src/community/cog/src/test/java/org/geoserver/rest/catalog/test-data/gsempty.zip and /dev/null differ diff --git a/src/community/release/ext-colormap.xml b/src/community/colormap/src/assembly/assembly.xml similarity index 74% rename from src/community/release/ext-colormap.xml rename to src/community/colormap/src/assembly/assembly.xml index 7771a7e541b..0c29af9911b 100644 --- a/src/community/release/ext-colormap.xml +++ b/src/community/colormap/src/assembly/assembly.xml @@ -6,10 +6,10 @@ false - release/target/dependency + target - gs-colormap*.jar + ${artifactId}-${project.version}.jar diff --git a/src/community/release/ext-cov-json.xml b/src/community/cov-json/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-cov-json.xml rename to src/community/cov-json/src/assembly/assembly.xml index 0a08ad27a33..fb0b26c84e5 100644 --- a/src/community/release/ext-cov-json.xml +++ b/src/community/cov-json/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-cov-json*.jar diff --git a/src/community/release/ext-datadir-catalog-loader.xml b/src/community/datadir-catalog-loader/src/assembly/assembly.xml similarity index 51% rename from src/community/release/ext-datadir-catalog-loader.xml rename to src/community/datadir-catalog-loader/src/assembly/assembly.xml index 8c50d1e92c5..d0d71615ec9 100644 --- a/src/community/release/ext-datadir-catalog-loader.xml +++ b/src/community/datadir-catalog-loader/src/assembly/assembly.xml @@ -1,12 +1,19 @@ - dataidr-catalog-loader-plugin + datadir-catalog-loader-plugin zip false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-datadir-catalog-loader*.jar diff --git a/src/community/release/ext-dds.xml b/src/community/dds/src/assembly/assembly.xml similarity index 58% rename from src/community/release/ext-dds.xml rename to src/community/dds/src/assembly/assembly.xml index f38c4a77913..624e7759f59 100644 --- a/src/community/release/ext-dds.xml +++ b/src/community/dds/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency worldwind* diff --git a/src/community/release/ext-dyndimension.xml b/src/community/dyndimension/src/assembly/assembly.xml similarity index 57% rename from src/community/release/ext-dyndimension.xml rename to src/community/dyndimension/src/assembly/assembly.xml index 093329036b2..bfc8c20a8d8 100644 --- a/src/community/release/ext-dyndimension.xml +++ b/src/community/dyndimension/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-dyndimension*.jar diff --git a/src/community/release/ext-elasticsearch.xml b/src/community/elasticsearch/src/assembly/assembly.xml similarity index 83% rename from src/community/release/ext-elasticsearch.xml rename to src/community/elasticsearch/src/assembly/assembly.xml index dcea443ae3a..f4e95e33067 100644 --- a/src/community/release/ext-elasticsearch.xml +++ b/src/community/elasticsearch/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency commons-math3* diff --git a/src/community/release/ext-features-autopopulate.xml b/src/community/features-autopopulate/features-autopopulate-core/src/assembly/assembly.xml similarity index 58% rename from src/community/release/ext-features-autopopulate.xml rename to src/community/features-autopopulate/features-autopopulate-core/src/assembly/assembly.xml index 03d9b23a3be..a9e83ef5e1f 100644 --- a/src/community/release/ext-features-autopopulate.xml +++ b/src/community/features-autopopulate/features-autopopulate-core/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-features-autopopulate*.jar diff --git a/src/community/features-templating/features-templating-assembly/pom.xml b/src/community/features-templating/features-templating-assembly/pom.xml new file mode 100644 index 00000000000..646b1ecbd29 --- /dev/null +++ b/src/community/features-templating/features-templating-assembly/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + org.geoserver.community + gs-features-templating + 2.26-SNAPSHOT + + + org.geoserver.community + gs-features-templating-assembly + jar + Features Templating Assembly + Features templating zip package builder + + + + org.geoserver.community + gs-features-templating-core + ${project.version} + + + org.geoserver.community + gs-features-templating-ogcapi + ${project.version} + + + org.geoserver.community + gs-features-templating-ows + ${project.version} + + + org.geoserver.community + gs-features-templating-rest + ${project.version} + + + org.geoserver.community + gs-features-templating-web + ${project.version} + + + + diff --git a/src/community/release/ext-features-templating.xml b/src/community/features-templating/features-templating-assembly/src/assembly/assembly.xml similarity index 89% rename from src/community/release/ext-features-templating.xml rename to src/community/features-templating/features-templating-assembly/src/assembly/assembly.xml index ecb64962d56..198cccff997 100644 --- a/src/community/release/ext-features-templating.xml +++ b/src/community/features-templating/features-templating-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-features-templating*.jar diff --git a/src/community/features-templating/pom.xml b/src/community/features-templating/pom.xml index 482ae31aeb4..763acb73d31 100644 --- a/src/community/features-templating/pom.xml +++ b/src/community/features-templating/pom.xml @@ -33,6 +33,7 @@ features-templating-ogcapi features-templating-web features-templating-rest + features-templating-assembly diff --git a/src/community/flatgeobuf/pom.xml b/src/community/flatgeobuf/pom.xml index 55fb117eafa..e3a56f60974 100644 --- a/src/community/flatgeobuf/pom.xml +++ b/src/community/flatgeobuf/pom.xml @@ -29,5 +29,4 @@ ${gt.version} - diff --git a/src/community/release/ext-flatgeobuf.xml b/src/community/flatgeobuf/src/assembly/assembly.xml similarity index 67% rename from src/community/release/ext-flatgeobuf.xml rename to src/community/flatgeobuf/src/assembly/assembly.xml index 435725ee447..4dedf8251ad 100644 --- a/src/community/release/ext-flatgeobuf.xml +++ b/src/community/flatgeobuf/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-flatgeobuf*.jar diff --git a/src/community/gdal/gdal-wcs/pom.xml b/src/community/gdal/gdal-wcs/pom.xml index 9d42a5a8b69..f699ab64c76 100644 --- a/src/community/gdal/gdal-wcs/pom.xml +++ b/src/community/gdal/gdal-wcs/pom.xml @@ -50,5 +50,4 @@ test - diff --git a/src/community/release/ext-gdal-wcs.xml b/src/community/gdal/gdal-wcs/src/assembly/assembly.xml similarity index 59% rename from src/community/release/ext-gdal-wcs.xml rename to src/community/gdal/gdal-wcs/src/assembly/assembly.xml index f56068c9a0f..3768d94e3f7 100644 --- a/src/community/release/ext-gdal-wcs.xml +++ b/src/community/gdal/gdal-wcs/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-gdal-wcs-*.jar diff --git a/src/community/gdal/gdal-wps/pom.xml b/src/community/gdal/gdal-wps/pom.xml index 4f61ae92dc2..7e354320dcb 100644 --- a/src/community/gdal/gdal-wps/pom.xml +++ b/src/community/gdal/gdal-wps/pom.xml @@ -48,5 +48,4 @@ test - diff --git a/src/community/release/ext-gdal-wps.xml b/src/community/gdal/gdal-wps/src/assembly/assembly.xml similarity index 56% rename from src/community/release/ext-gdal-wps.xml rename to src/community/gdal/gdal-wps/src/assembly/assembly.xml index 8e69ee42580..54ed971833c 100644 --- a/src/community/release/ext-gdal-wps.xml +++ b/src/community/gdal/gdal-wps/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-gdal-wps-*.jar diff --git a/src/community/geopkg/pom.xml b/src/community/geopkg/pom.xml index a8dfbb16e59..61ab9c8f9c0 100644 --- a/src/community/geopkg/pom.xml +++ b/src/community/geopkg/pom.xml @@ -137,5 +137,4 @@ - diff --git a/src/community/release/ext-geopkg.xml b/src/community/geopkg/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-geopkg.xml rename to src/community/geopkg/src/assembly/assembly.xml index 2f39efdf073..ff71dbd565c 100644 --- a/src/community/release/ext-geopkg.xml +++ b/src/community/geopkg/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency jackson-databind* diff --git a/src/community/gpxppio/pom.xml b/src/community/gpxppio/pom.xml index befb318dd14..89350dfe2e4 100644 --- a/src/community/gpxppio/pom.xml +++ b/src/community/gpxppio/pom.xml @@ -16,6 +16,7 @@ gs-gpxppio jar GPX PPIO for WPS + org.geoserver.extension diff --git a/src/community/release/ext-gpx.xml b/src/community/gpxppio/src/assembly/assembly.xml similarity index 56% rename from src/community/release/ext-gpx.xml rename to src/community/gpxppio/src/assembly/assembly.xml index 326218815cb..00b48c619be 100644 --- a/src/community/release/ext-gpx.xml +++ b/src/community/gpxppio/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-gpxppio*.jar diff --git a/src/community/release/ext-graticule.xml b/src/community/graticule/src/assembly/assembly.xml similarity index 64% rename from src/community/release/ext-graticule.xml rename to src/community/graticule/src/assembly/assembly.xml index daf8ebd7108..7154a87451c 100644 --- a/src/community/release/ext-graticule.xml +++ b/src/community/graticule/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-graticule-*.jar @@ -15,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/gsr/pom.xml b/src/community/gsr/pom.xml index fa47ef7e24d..b4a10621418 100644 --- a/src/community/gsr/pom.xml +++ b/src/community/gsr/pom.xml @@ -96,5 +96,4 @@ test - diff --git a/src/community/release/ext-gsr.xml b/src/community/gsr/src/assembly/assembly.xml similarity index 71% rename from src/community/release/ext-gsr.xml rename to src/community/gsr/src/assembly/assembly.xml index 5cf62cd438c..c400345ce58 100644 --- a/src/community/release/ext-gsr.xml +++ b/src/community/gsr/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-gsr*.jar diff --git a/src/community/release/ext-gwc-azure-blob.xml b/src/community/gwc-azure-blob/src/assembly/assembly.xml similarity index 75% rename from src/community/release/ext-gwc-azure-blob.xml rename to src/community/gwc-azure-blob/src/assembly/assembly.xml index 9259d0a6571..f8ce5d0a4cf 100644 --- a/src/community/release/ext-gwc-azure-blob.xml +++ b/src/community/gwc-azure-blob/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency *azure-*.jar diff --git a/src/community/gwc-distributed/pom.xml b/src/community/gwc-distributed/pom.xml index 302128a1444..27185476dcb 100644 --- a/src/community/gwc-distributed/pom.xml +++ b/src/community/gwc-distributed/pom.xml @@ -11,6 +11,7 @@ GWC Distributed Caching Plugin http://maven.apache.org + UTF-8 diff --git a/src/community/release/ext-gwc-distributed.xml b/src/community/gwc-distributed/src/assembly/assembly.xml similarity index 63% rename from src/community/release/ext-gwc-distributed.xml rename to src/community/gwc-distributed/src/assembly/assembly.xml index 19ecb8340a1..7e00aac3b8d 100644 --- a/src/community/release/ext-gwc-distributed.xml +++ b/src/community/gwc-distributed/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gwc-distributed-*.jar diff --git a/src/community/release/ext-gwc-mbtiles.xml b/src/community/gwc-mbtiles/src/assembly/assembly.xml similarity index 69% rename from src/community/release/ext-gwc-mbtiles.xml rename to src/community/gwc-mbtiles/src/assembly/assembly.xml index 0e481c146c7..acc1c410b39 100644 --- a/src/community/release/ext-gwc-mbtiles.xml +++ b/src/community/gwc-mbtiles/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-gwc-mbtiles-*.jar diff --git a/src/community/gwc-sqlite/pom.xml b/src/community/gwc-sqlite/pom.xml index 343751464e4..0c02503170c 100644 --- a/src/community/gwc-sqlite/pom.xml +++ b/src/community/gwc-sqlite/pom.xml @@ -10,6 +10,7 @@ gs-gwc-sqlite jar GeoWebCache SQLite + org.geoserver diff --git a/src/community/release/ext-gwc-sqlite.xml b/src/community/gwc-sqlite/src/assembly/assembly.xml similarity index 58% rename from src/community/release/ext-gwc-sqlite.xml rename to src/community/gwc-sqlite/src/assembly/assembly.xml index dda1555af87..89efe69e7f6 100644 --- a/src/community/release/ext-gwc-sqlite.xml +++ b/src/community/gwc-sqlite/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency *sqlite*.jar diff --git a/src/community/hz-cluster/pom.xml b/src/community/hz-cluster/pom.xml index 3b990ce2380..060881b2027 100644 --- a/src/community/hz-cluster/pom.xml +++ b/src/community/hz-cluster/pom.xml @@ -14,6 +14,7 @@ GeoServer Hazelcast Clustering Module + 4.0 4.0.3 diff --git a/src/community/release/ext-hz-cluster.xml b/src/community/hz-cluster/src/assembly/assembly.xml similarity index 61% rename from src/community/release/ext-hz-cluster.xml rename to src/community/hz-cluster/src/assembly/assembly.xml index b99cf3866d1..cedddddd10d 100644 --- a/src/community/release/ext-hz-cluster.xml +++ b/src/community/hz-cluster/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-hz-cluster*.jar diff --git a/src/community/imagemap/pom.xml b/src/community/imagemap/pom.xml index 2866ac7b616..6a918227758 100644 --- a/src/community/imagemap/pom.xml +++ b/src/community/imagemap/pom.xml @@ -74,5 +74,4 @@ - diff --git a/src/community/release/ext-imagemap.xml b/src/community/imagemap/src/assembly/assembly.xml similarity index 60% rename from src/community/release/ext-imagemap.xml rename to src/community/imagemap/src/assembly/assembly.xml index 17d0b311c87..5f113cb289f 100644 --- a/src/community/release/ext-imagemap.xml +++ b/src/community/imagemap/src/assembly/assembly.xml @@ -6,14 +6,21 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-imagemap-*.jar - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/importer-jdbc/pom.xml b/src/community/importer-jdbc/pom.xml index 4ea12973466..0472e5284ed 100644 --- a/src/community/importer-jdbc/pom.xml +++ b/src/community/importer-jdbc/pom.xml @@ -80,5 +80,4 @@ - diff --git a/src/community/release/ext-importer-jdbc.xml b/src/community/importer-jdbc/src/assembly/assembly.xml similarity index 67% rename from src/community/release/ext-importer-jdbc.xml rename to src/community/importer-jdbc/src/assembly/assembly.xml index 2fb8bf599ff..f68ae27ee89 100644 --- a/src/community/release/ext-importer-jdbc.xml +++ b/src/community/importer-jdbc/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-importer-jdbc-*.jar diff --git a/src/community/jdbc-metrics/pom.xml b/src/community/jdbc-metrics/pom.xml index 8c88214288a..c90a33ee360 100644 --- a/src/community/jdbc-metrics/pom.xml +++ b/src/community/jdbc-metrics/pom.xml @@ -64,5 +64,4 @@ test - diff --git a/src/community/release/ext-jdbc-metrics.xml b/src/community/jdbc-metrics/src/assembly/assembly.xml similarity index 55% rename from src/community/release/ext-jdbc-metrics.xml rename to src/community/jdbc-metrics/src/assembly/assembly.xml index d51b6a7c164..5729bc0a663 100644 --- a/src/community/release/ext-jdbc-metrics.xml +++ b/src/community/jdbc-metrics/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-jdbc-metrics*.jar diff --git a/src/community/jdbcconfig/pom.xml b/src/community/jdbcconfig/pom.xml index 15535d5249c..4b22177747c 100644 --- a/src/community/jdbcconfig/pom.xml +++ b/src/community/jdbcconfig/pom.xml @@ -12,6 +12,7 @@ GeoServer JDBC Catalog Manage GeoServer Catalog configuration in a database. + true true diff --git a/src/community/release/ext-jdbcconfig.xml b/src/community/jdbcconfig/src/assembly/assembly.xml similarity index 56% rename from src/community/release/ext-jdbcconfig.xml rename to src/community/jdbcconfig/src/assembly/assembly.xml index e29f7a25efe..341453e6af1 100644 --- a/src/community/release/ext-jdbcconfig.xml +++ b/src/community/jdbcconfig/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-jdbcconfig-*.jar diff --git a/src/community/jdbcstore/pom.xml b/src/community/jdbcstore/pom.xml index c767fa8f4b0..8df98ba3591 100644 --- a/src/community/jdbcstore/pom.xml +++ b/src/community/jdbcstore/pom.xml @@ -11,6 +11,7 @@ jar GeoServer JDBC Configuration Resource Store Store resources (icons, fonts, freemarker tempaltes and configuration files) in database alongside JDBC Store. + org.geoserver diff --git a/src/community/release/ext-jdbcstore.xml b/src/community/jdbcstore/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-jdbcstore.xml rename to src/community/jdbcstore/src/assembly/assembly.xml index a404418d617..d3f0c70e241 100644 --- a/src/community/release/ext-jdbcstore.xml +++ b/src/community/jdbcstore/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-jdbcstore-*.jar diff --git a/src/community/jms-cluster/activemqBroker/pom.xml b/src/community/jms-cluster/activemqBroker/pom.xml index f305cbca21f..453e7a2aa9d 100644 --- a/src/community/jms-cluster/activemqBroker/pom.xml +++ b/src/community/jms-cluster/activemqBroker/pom.xml @@ -18,6 +18,7 @@ 8.3-603.jdbc4 3.2.5.RELEASE + diff --git a/src/community/release/ext-activeMQ.xml b/src/community/jms-cluster/activemqBroker/src/assembly/assembly.xml similarity index 84% rename from src/community/release/ext-activeMQ.xml rename to src/community/jms-cluster/activemqBroker/src/assembly/assembly.xml index 154e65e6209..a4b65afa150 100644 --- a/src/community/release/ext-activeMQ.xml +++ b/src/community/jms-cluster/activemqBroker/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - jms-cluster/activemqBroker/target + target . activemqBroker-*.war diff --git a/src/community/jms-cluster/jms-geoserver/pom.xml b/src/community/jms-cluster/jms-geoserver/pom.xml index 6aad35818fc..1cfbee3886e 100644 --- a/src/community/jms-cluster/jms-geoserver/pom.xml +++ b/src/community/jms-cluster/jms-geoserver/pom.xml @@ -15,6 +15,7 @@ 5.15.16 + diff --git a/src/community/jms-cluster/jms-geoserver/src/assembly/assembly.xml b/src/community/jms-cluster/jms-geoserver/src/assembly/assembly.xml new file mode 100644 index 00000000000..0930fc4320f --- /dev/null +++ b/src/community/jms-cluster/jms-geoserver/src/assembly/assembly.xml @@ -0,0 +1,58 @@ + + + jms-cluster-plugin + + zip + + false + + + target/dependency + + + gs-jms*.jar + jms-api*.jar + xbean-spring*.jar + spring-jms*.jar + + + + + + + + ant*.jar + activemq*.jar + activemq-broker*.jar + activemq-kahadb-store*.jar + + + + + activemq-all.jar + proton-*.jar + bcpkix-*.jar + activemq-client*.jar + geronimo-*.jar + activemq-openwire-legacy*.jar + hawtbuf*.jar + hawtjni*.jar + hawtdispatch*.jar + activemq-spring*.jar + activemq-pool*.jar + activemq-protobuf*.jar + commons-pool2*.jar + + + + target + + + ${artifactId}-${project.version}.jar + + + + + \ No newline at end of file diff --git a/src/community/jms-cluster/pom.xml b/src/community/jms-cluster/pom.xml index 3fed797c736..d53cbdee7c9 100644 --- a/src/community/jms-cluster/pom.xml +++ b/src/community/jms-cluster/pom.xml @@ -12,6 +12,7 @@ pom GeoServer JMS based clustering modules + diff --git a/src/community/release/ext-jwt-headers.xml b/src/community/jwt-headers/gs-jwt-headers/src/assembly/assembly.xml similarity index 67% rename from src/community/release/ext-jwt-headers.xml rename to src/community/jwt-headers/gs-jwt-headers/src/assembly/assembly.xml index 3993774c5c3..3f0775167db 100644 --- a/src/community/release/ext-jwt-headers.xml +++ b/src/community/jwt-headers/gs-jwt-headers/src/assembly/assembly.xml @@ -5,13 +5,18 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency jwt-headers-util* - gs-jwt-headers* - nimbus-jose-jwt-9.37.3* json-path* guava* diff --git a/src/community/jwt-headers/pom.xml b/src/community/jwt-headers/pom.xml index beb0dc7c960..f7abe50c373 100644 --- a/src/community/jwt-headers/pom.xml +++ b/src/community/jwt-headers/pom.xml @@ -23,6 +23,7 @@ jwt-headers-util gs-jwt-headers + + + 4.0.0 + + org.geoserver + community + 2.26-SNAPSHOT + + org.geoserver.community + gs-mbtiles-store + jar + GeoServer mbtiles store Extension + + + + org.geotools + gt-mbtiles + ${gt.version} + + + + + + + src/test/resources + + + + diff --git a/src/community/release/ext-mbtiles-store.xml b/src/community/mbtiles-store/src/assembly/assembly.xml similarity index 70% rename from src/community/release/ext-mbtiles-store.xml rename to src/community/mbtiles-store/src/assembly/assembly.xml index 9902965c054..221001616a6 100644 --- a/src/community/release/ext-mbtiles-store.xml +++ b/src/community/mbtiles-store/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gt-mbtiles-*.jar diff --git a/src/community/mbtiles/pom.xml b/src/community/mbtiles/pom.xml index d85722c72ed..717552a41d2 100644 --- a/src/community/mbtiles/pom.xml +++ b/src/community/mbtiles/pom.xml @@ -123,5 +123,4 @@ - diff --git a/src/community/mbtiles/src/assembly/assembly.xml b/src/community/mbtiles/src/assembly/assembly.xml new file mode 100644 index 00000000000..4b70663ef69 --- /dev/null +++ b/src/community/mbtiles/src/assembly/assembly.xml @@ -0,0 +1,33 @@ + + + mbtiles-plugin + + zip + + false + + + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency + + + gt-mbtiles-*.jar + gs-mbtiles-*.jar + gs-geopkg-output*.jar + sqlite*.jar + jackson-core*.jar + jackson-annotation*.jar + jackson-databind*.jar + java-vector-tile*.jar + protobuf-java*.jar + + + + + \ No newline at end of file diff --git a/src/community/monitor-hibernate/pom.xml b/src/community/monitor-hibernate/pom.xml index c52043dfb7c..888a602717f 100644 --- a/src/community/monitor-hibernate/pom.xml +++ b/src/community/monitor-hibernate/pom.xml @@ -76,6 +76,7 @@ + **/HibernateMonitorDAOTest.* diff --git a/src/community/release/ext-monitor-hibernate.xml b/src/community/monitor-hibernate/src/assembly/assembly.xml similarity index 75% rename from src/community/release/ext-monitor-hibernate.xml rename to src/community/monitor-hibernate/src/assembly/assembly.xml index 9544209ded0..f9987c5b054 100644 --- a/src/community/release/ext-monitor-hibernate.xml +++ b/src/community/monitor-hibernate/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-monitor-hibernate-*.jar diff --git a/src/community/monitor-kafka/pom.xml b/src/community/monitor-kafka/pom.xml index c6b9fdfd0a8..abca61d3f79 100644 --- a/src/community/monitor-kafka/pom.xml +++ b/src/community/monitor-kafka/pom.xml @@ -13,6 +13,7 @@ Monitor Kafka Extension + 7.5.0 3.6.0 diff --git a/src/community/release/ext-monitor-kafka.xml b/src/community/monitor-kafka/src/assembly/assembly.xml similarity index 71% rename from src/community/release/ext-monitor-kafka.xml rename to src/community/monitor-kafka/src/assembly/assembly.xml index 594d4b754c8..cad857f91ad 100644 --- a/src/community/release/ext-monitor-kafka.xml +++ b/src/community/monitor-kafka/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-monitor-kafka-*.jar diff --git a/src/community/release/ext-ncwms.xml b/src/community/ncwms/src/assembly/assembly.xml similarity index 66% rename from src/community/release/ext-ncwms.xml rename to src/community/ncwms/src/assembly/assembly.xml index dd31b75de94..faccf5ab8e9 100644 --- a/src/community/release/ext-ncwms.xml +++ b/src/community/ncwms/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-colormap*.jar diff --git a/src/community/netcdf-ghrsst/pom.xml b/src/community/netcdf-ghrsst/pom.xml index 9878b4e3f14..82513c5ddc1 100644 --- a/src/community/netcdf-ghrsst/pom.xml +++ b/src/community/netcdf-ghrsst/pom.xml @@ -17,6 +17,7 @@ NetCDF GHRSST encoder + 5.5.3 diff --git a/src/community/release/ext-netcdf-ghrsst.xml b/src/community/netcdf-ghrsst/src/assembly/assembly.xml similarity index 59% rename from src/community/release/ext-netcdf-ghrsst.xml rename to src/community/netcdf-ghrsst/src/assembly/assembly.xml index 50a63d03c91..62eb044d7d2 100644 --- a/src/community/release/ext-netcdf-ghrsst.xml +++ b/src/community/netcdf-ghrsst/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-netcdf-ghrsst*.jar diff --git a/src/community/notification/pom.xml b/src/community/notification/pom.xml index c310bc3ac80..43085f44ea5 100644 --- a/src/community/notification/pom.xml +++ b/src/community/notification/pom.xml @@ -13,6 +13,7 @@ jar GeoServer notification event system http://maven.apache.org + org.geoserver @@ -82,5 +83,4 @@ commons-lang3 - diff --git a/src/community/release/ext-notification.xml b/src/community/notification/src/assembly/assembly.xml similarity index 83% rename from src/community/release/ext-notification.xml rename to src/community/notification/src/assembly/assembly.xml index 032c0a5c7ed..29177795f19 100644 --- a/src/community/release/ext-notification.xml +++ b/src/community/notification/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-notification* diff --git a/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml new file mode 100644 index 00000000000..6758b899d6a --- /dev/null +++ b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml @@ -0,0 +1,52 @@ + + + + 4.0.0 + + org.geoserver.community + gs-dggs + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-dggs-assembly + + + + org.geoserver.community + gs-dggs-core + ${project.version} + + + + org.geoserver.community + gs-ogcapi-dggs + ${project.version} + + + + org.geoserver.community + gs-web-dggs + ${project.version} + + + + org.geoserver.community + gs-dggs-clickhouse + ${project.version} + + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + + + diff --git a/src/community/release/ext-ogcapi-dggs.xml b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/src/assembly/assembly.xml similarity index 90% rename from src/community/release/ext-ogcapi-dggs.xml rename to src/community/ogcapi/dggs/ogcapi-dggs-assembly/src/assembly/assembly.xml index 7a6fdc10f75..583058681e2 100644 --- a/src/community/release/ext-ogcapi-dggs.xml +++ b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-core-*.jar @@ -30,7 +30,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/dggs/pom.xml b/src/community/ogcapi/dggs/pom.xml index 80aeb3d717d..89b55c48f0e 100644 --- a/src/community/ogcapi/dggs/pom.xml +++ b/src/community/ogcapi/dggs/pom.xml @@ -22,6 +22,7 @@ web-dggs dggs-clickhouse ogcapi-dggs + ogcapi-dggs-assembly diff --git a/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml b/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml new file mode 100644 index 00000000000..5290820d0a1 --- /dev/null +++ b/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-coverages-assembly + + + + org.geoserver.community + gs-ogcapi-coverages + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-coverages.xml b/src/community/ogcapi/ogcapi-coverages-assembly/src/assembly/assembly.xml similarity index 87% rename from src/community/release/ext-ogcapi-coverages.xml rename to src/community/ogcapi/ogcapi-coverages-assembly/src/assembly/assembly.xml index caf0b806e90..bc8566b077b 100644 --- a/src/community/release/ext-ogcapi-coverages.xml +++ b/src/community/ogcapi/ogcapi-coverages-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-coverages-*.jar @@ -22,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-coverages/pom.xml b/src/community/ogcapi/ogcapi-coverages/pom.xml index cc0ce064449..4f3fb83b6c1 100644 --- a/src/community/ogcapi/ogcapi-coverages/pom.xml +++ b/src/community/ogcapi/ogcapi-coverages/pom.xml @@ -73,5 +73,4 @@ test - diff --git a/src/community/ogcapi/ogcapi-features-assembly/pom.xml b/src/community/ogcapi/ogcapi-features-assembly/pom.xml new file mode 100644 index 00000000000..d9a3ca293d6 --- /dev/null +++ b/src/community/ogcapi/ogcapi-features-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-features-assembly + + + + org.geoserver.community + gs-ogcapi-features + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-features.xml b/src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml similarity index 87% rename from src/community/release/ext-ogcapi-features.xml rename to src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml index afd24e3fff0..db09589f05a 100644 --- a/src/community/release/ext-ogcapi-features.xml +++ b/src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-features-*.jar @@ -22,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-features/pom.xml b/src/community/ogcapi/ogcapi-features/pom.xml index 47649712d9e..e014e288acd 100644 --- a/src/community/ogcapi/ogcapi-features/pom.xml +++ b/src/community/ogcapi/ogcapi-features/pom.xml @@ -93,5 +93,4 @@ test - diff --git a/src/community/ogcapi/ogcapi-images-assembly/pom.xml b/src/community/ogcapi/ogcapi-images-assembly/pom.xml new file mode 100644 index 00000000000..9c59734b4cd --- /dev/null +++ b/src/community/ogcapi/ogcapi-images-assembly/pom.xml @@ -0,0 +1,36 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-images-assembly + + + + org.geoserver.community + gs-ogcapi-images + ${project.version} + + + org.geoserver.community + gs-ogcapi-changeset + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-images.xml b/src/community/ogcapi/ogcapi-images-assembly/src/assembly/assembly.xml similarity index 91% rename from src/community/release/ext-ogcapi-images.xml rename to src/community/ogcapi/ogcapi-images-assembly/src/assembly/assembly.xml index 388944af755..1a4472f85d1 100644 --- a/src/community/release/ext-ogcapi-images.xml +++ b/src/community/ogcapi/ogcapi-images-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency @@ -33,7 +33,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-images/pom.xml b/src/community/ogcapi/ogcapi-images/pom.xml index 626ea3bd479..cf7632f6e25 100644 --- a/src/community/ogcapi/ogcapi-images/pom.xml +++ b/src/community/ogcapi/ogcapi-images/pom.xml @@ -71,5 +71,4 @@ - diff --git a/src/community/ogcapi/ogcapi-maps-assembly/pom.xml b/src/community/ogcapi/ogcapi-maps-assembly/pom.xml new file mode 100644 index 00000000000..3d44d2c8d15 --- /dev/null +++ b/src/community/ogcapi/ogcapi-maps-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-maps-assembly + + + + org.geoserver.community + gs-ogcapi-maps + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-maps.xml b/src/community/ogcapi/ogcapi-maps-assembly/src/assembly/assembly.xml similarity index 87% rename from src/community/release/ext-ogcapi-maps.xml rename to src/community/ogcapi/ogcapi-maps-assembly/src/assembly/assembly.xml index fb394d690e7..f684f244476 100644 --- a/src/community/release/ext-ogcapi-maps.xml +++ b/src/community/ogcapi/ogcapi-maps-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-maps-*.jar @@ -22,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-maps/pom.xml b/src/community/ogcapi/ogcapi-maps/pom.xml index fd7ccc43e5d..75a5d122e3f 100644 --- a/src/community/ogcapi/ogcapi-maps/pom.xml +++ b/src/community/ogcapi/ogcapi-maps/pom.xml @@ -55,5 +55,4 @@ test - diff --git a/src/community/ogcapi/ogcapi-styles-assembly/pom.xml b/src/community/ogcapi/ogcapi-styles-assembly/pom.xml new file mode 100644 index 00000000000..8db36b2e51b --- /dev/null +++ b/src/community/ogcapi/ogcapi-styles-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-styles-assembly + + + + org.geoserver.community + gs-ogcapi-styles + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-styles.xml b/src/community/ogcapi/ogcapi-styles-assembly/src/assembly/assembly.xml similarity index 87% rename from src/community/release/ext-ogcapi-styles.xml rename to src/community/ogcapi/ogcapi-styles-assembly/src/assembly/assembly.xml index 5f21ef2e53a..6b06af0d0ce 100644 --- a/src/community/release/ext-ogcapi-styles.xml +++ b/src/community/ogcapi/ogcapi-styles-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-styles-*.jar @@ -22,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-styles/pom.xml b/src/community/ogcapi/ogcapi-styles/pom.xml index 46213545593..43b0d2ce0f6 100644 --- a/src/community/ogcapi/ogcapi-styles/pom.xml +++ b/src/community/ogcapi/ogcapi-styles/pom.xml @@ -97,5 +97,4 @@ test - diff --git a/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml b/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml new file mode 100644 index 00000000000..2f7e63e148f --- /dev/null +++ b/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-tiled-features-assembly + + + + org.geoserver.community + gs-ogcapi-tiled-features + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-tiled-features.xml b/src/community/ogcapi/ogcapi-tiled-features-assembly/src/assembly/assembly.xml similarity index 91% rename from src/community/release/ext-ogcapi-tiled-features.xml rename to src/community/ogcapi/ogcapi-tiled-features-assembly/src/assembly/assembly.xml index 64a584a6e2c..82da8f51d0f 100644 --- a/src/community/release/ext-ogcapi-tiled-features.xml +++ b/src/community/ogcapi/ogcapi-tiled-features-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-tiled-features-*.jar @@ -29,7 +29,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-tiled-features/pom.xml b/src/community/ogcapi/ogcapi-tiled-features/pom.xml index a33bd44c07e..8656f0fd031 100644 --- a/src/community/ogcapi/ogcapi-tiled-features/pom.xml +++ b/src/community/ogcapi/ogcapi-tiled-features/pom.xml @@ -79,5 +79,4 @@ test - diff --git a/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml b/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml new file mode 100644 index 00000000000..0c993c23d03 --- /dev/null +++ b/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml @@ -0,0 +1,31 @@ + + + + 4.0.0 + + org.geoserver.community + gs-ogcapi + 2.26-SNAPSHOT + + + org.geoserver.community + gs-ogcapi-tiles-assembly + + + + org.geoserver.community + gs-ogcapi-tiles + ${project.version} + + + org.geoserver.community + gs-web-ogcapi + ${project.version} + + + diff --git a/src/community/release/ext-ogcapi-tiles.xml b/src/community/ogcapi/ogcapi-tiles-assembly/src/assembly/assembly.xml similarity index 87% rename from src/community/release/ext-ogcapi-tiles.xml rename to src/community/ogcapi/ogcapi-tiles-assembly/src/assembly/assembly.xml index d753ed9b39c..ccd0f478724 100644 --- a/src/community/release/ext-ogcapi-tiles.xml +++ b/src/community/ogcapi/ogcapi-tiles-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-ogcapi-tiles-*.jar @@ -22,7 +22,7 @@ - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/community/ogcapi/ogcapi-tiles/pom.xml b/src/community/ogcapi/ogcapi-tiles/pom.xml index b033819bfde..6b1e337d520 100644 --- a/src/community/ogcapi/ogcapi-tiles/pom.xml +++ b/src/community/ogcapi/ogcapi-tiles/pom.xml @@ -103,5 +103,4 @@ test - diff --git a/src/community/ogcapi/pom.xml b/src/community/ogcapi/pom.xml index d862608b585..6935a24208f 100644 --- a/src/community/ogcapi/pom.xml +++ b/src/community/ogcapi/pom.xml @@ -20,14 +20,21 @@ ogcapi-core ogcapi-features + ogcapi-features-assembly ogcapi-maps + ogcapi-maps-assembly ogcapi-styles + ogcapi-styles-assembly ogcapi-tiles + ogcapi-tiles-assembly ogcapi-images + ogcapi-images-assembly ogcapi-changeset ogcapi-tiled-features + ogcapi-tiled-features-assembly dggs ogcapi-coverages + ogcapi-coverages-assembly web-ogcapi diff --git a/src/community/oseo/oseo-assembly/pom.xml b/src/community/oseo/oseo-assembly/pom.xml new file mode 100644 index 00000000000..66f52f92de1 --- /dev/null +++ b/src/community/oseo/oseo-assembly/pom.xml @@ -0,0 +1,40 @@ + + + + 4.0.0 + + + org.geoserver.community + gs-oseo + 2.26-SNAPSHOT + + + org.geoserver.community + gs-oseo-assembly + jar + OpenSearch for EO extension packaging + + + + org.geoserver.community + gs-oseo-core + ${gs.version} + + + org.geoserver.community + gs-oseo-service + ${gs.version} + + + org.geoserver.community + gs-oseo-rest + ${gs.version} + + + org.geoserver.community + gs-oseo-stac + ${gs.version} + + + + diff --git a/src/community/release/ext-opensearch-eo.xml b/src/community/oseo/oseo-assembly/src/assembly/assembly.xml similarity index 94% rename from src/community/release/ext-opensearch-eo.xml rename to src/community/oseo/oseo-assembly/src/assembly/assembly.xml index 06880aca6c7..54130c30bd1 100644 --- a/src/community/release/ext-opensearch-eo.xml +++ b/src/community/oseo/oseo-assembly/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gs-*oseo*.jar diff --git a/src/community/oseo/pom.xml b/src/community/oseo/pom.xml index 1dd198a4fda..06c24efc566 100644 --- a/src/community/oseo/pom.xml +++ b/src/community/oseo/pom.xml @@ -26,6 +26,7 @@ oseo-rest web-oseo oseo-integration-tests + oseo-assembly @@ -35,5 +36,4 @@ test - diff --git a/src/community/release/ext-pgraster.xml b/src/community/pgraster/src/assembly/assembly.xml similarity index 73% rename from src/community/release/ext-pgraster.xml rename to src/community/pgraster/src/assembly/assembly.xml index 84e1df8f75f..1928547bcab 100644 --- a/src/community/release/ext-pgraster.xml +++ b/src/community/pgraster/src/assembly/assembly.xml @@ -5,6 +5,13 @@ false + + target + + + ${artifactId}-${project.version}.jar + + release/extensions/pgraster @@ -13,7 +20,7 @@ - release/target/dependency + target/dependency ant*1.8.4.jar diff --git a/src/community/pom.xml b/src/community/pom.xml index 83df5a9ba4f..ffc3fadc467 100644 --- a/src/community/pom.xml +++ b/src/community/pom.xml @@ -28,83 +28,20 @@ - maven-assembly-plugin - 3.2.0 - - - release/ext-jdbcconfig.xml - release/ext-dds.xml - release/ext-colormap.xml - release/ext-mbtiles.xml - release/ext-mbtiles-store.xml - release/ext-geopkg.xml - release/ext-pgraster.xml - release/ext-dyndimension.xml - release/ext-flatgeobuf.xml - release/ext-spatialjson.xml - release/ext-webp.xml - release/ext-gpx.xml - release/ext-jms-cluster.xml - release/ext-hz-cluster.xml - release/ext-activeMQ.xml - release/ext-solr.xml - release/ext-elasticsearch.xml - release/ext-gwc-distributed.xml - release/ext-gwc-azure-blob.xml - release/ext-gdal-wcs.xml - release/ext-gdal-wps.xml - release/ext-wps-remote.xml - release/ext-jdbcstore.xml - release/ext-ncwms.xml - release/ext-gwc-sqlite.xml - release/ext-oauth2-google.xml - release/ext-oauth2-github.xml - release/ext-oauth2-geonode.xml - release/ext-oauth2-openid-connect.xml - release/ext-keycloak.xml - release/ext-backup-restore.xml - release/ext-notification.xml - release/ext-jdbc-metrics.xml - release/ext-opensearch-eo.xml - release/ext-taskmanager-core.xml - release/ext-taskmanager-s3.xml - release/ext-netcdf-ghrsst.xml - release/ext-cog.xml - release/ext-s3-geotiff.xml - release/ext-ogr-datastore.xml - release/ext-jwt-headers.xml - release/ext-ogcapi-coverages.xml - release/ext-ogcapi-dggs.xml - release/ext-ogcapi-features.xml - release/ext-ogcapi-images.xml - release/ext-ogcapi-maps.xml - release/ext-ogcapi-styles.xml - release/ext-ogcapi-tiled-features.xml - release/ext-ogcapi-tiles.xml - release/ext-importer-jdbc.xml - release/ext-features-autopopulate.xml - release/ext-features-templating.xml - release/ext-gsr.xml - release/ext-smart-data-loader.xml - release/ext-cov-json.xml - release/ext-mongodb-schemaless.xml - release/ext-web-service-auth.xml - release/ext-gwc-mbtiles.xml - release/ext-vsi.xml - release/ext-libdeflate.xml - release/ext-stac-datastore.xml - release/ext-vector-mosaic-datastore.xml - release/ext-proxy-base-ext.xml - release/ext-imagemap.xml - release/ext-xslt.xml - release/ext-datadir-catalog-loader.xml - release/ext-wps-longitudinal-profile.xml - release/ext-monitor-kafka.xml - release/ext-graticule.xml - release/ext-wfs-freemarker.xml - - geoserver-${project.version} - + org.commonjava.maven.plugins + directory-maven-plugin + + + directories + initialize + + highest-basedir + + + geoserverBaseDir + + + maven-jar-plugin @@ -200,6 +137,7 @@ jdbcconfig colormap mbtiles + mbtiles-store geopkg pgraster dyndimension @@ -212,7 +150,6 @@ solr elasticsearch wps-remote - release gwc-distributed jdbcstore gdal @@ -254,6 +191,7 @@ monitor-kafka graticule wfs-freemarker + stac-datastore @@ -293,6 +231,12 @@ mbtiles + + mbtiles-store + + mbtiles-store + + dyndimension @@ -329,20 +273,6 @@ rest-ext - - - - maven-assembly-plugin - 3.2.0 - - - - release/ext-rest-ext.xml - - - - - rest-ext @@ -362,20 +292,6 @@ rest-upload - - - - maven-assembly-plugin - 3.2.0 - - - - release/ext-rest-upload.xml - - - - - rest-upload @@ -436,12 +352,6 @@ gwc-azure-blob - - community-release-module - - release - - wps-remote @@ -568,36 +478,12 @@ monitor-hibernate - - - - maven-assembly-plugin - - - release/ext-monitor-hibernate.xml - - - - - monitor-hibernate monitor-kafka - - - - maven-assembly-plugin - - - release/ext-monitor-kafka.xml - - - - - monitor-kafka @@ -718,27 +604,133 @@ graticule + + graticule + + + + wfs-freemarker + + wfs-freemarker + + + + assembly + + + org.apache.maven.plugins + maven-antrun-plugin + + + check-assembly-file + initialize + + run + + + true + + + + + + + + + + + + + + maven-dependency-plugin + + + install + + copy-dependencies + + + ${skipAssembly} + + + + + + org.apache.maven.plugins maven-assembly-plugin + 3.2.0 + + + install + + single + + + - release/ext-graticule.xml + ${project.basedir}/src/assembly/assembly.xml + ${geoserverBaseDir}/community/target/release + ${skipAssembly} + geoserver-${project.version} + + + + maven-resources-plugin + + + copy-resources + process-resources + + copy-resources + + + ${project.build.directory}/html-template + + + ../release/src/markdown/html + true + + + + + + false + + + com.ruleoftech + markdown-page-generator-plugin + + + licenses + process-resources + + generate + + + ${project.basedir}/../../licenses + ${project.build.directory}/html/licenses + + + + false + + false + true + ${project.build.directory}/html-template/header.html + ${project.build.directory}/html-template/footer.html + TABLES,FENCED_CODE_BLOCKS,AUTOLINKS,FORCELISTITEMPARA + true + md,txt - - graticule - - - - wfs-freemarker - - wfs-freemarker - + diff --git a/src/community/proxy-base-ext/pom.xml b/src/community/proxy-base-ext/pom.xml index 7f2d9bab433..260943ec0bd 100644 --- a/src/community/proxy-base-ext/pom.xml +++ b/src/community/proxy-base-ext/pom.xml @@ -56,5 +56,4 @@ - diff --git a/src/community/release/ext-proxy-base-ext.xml b/src/community/proxy-base-ext/src/assembly/assembly.xml similarity index 58% rename from src/community/release/ext-proxy-base-ext.xml rename to src/community/proxy-base-ext/src/assembly/assembly.xml index 1fed7592406..328ef95df83 100644 --- a/src/community/release/ext-proxy-base-ext.xml +++ b/src/community/proxy-base-ext/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-proxy-base-ext* diff --git a/src/community/release/README.md b/src/community/release/README.md deleted file mode 100644 index 67d762e30e9..00000000000 --- a/src/community/release/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Community Release - -This module depends on all the community modules that are available for public testing and feedback. -Maven will order it near the end of the maven multi-module build. - -## Assembly definition and processing - -This module contains (but does not run) the assembly descriptors (used by ``src/community/pom.xml``) -used package up the the community modules into ``zip`` downloads for the nightly build server. - -Each assembly descriptor packages the information that has been staged into `community/target`: - -* ``target/dependency`` -* ``target/html`` -* ``target/lhtml/licenses`` - -To build locally use use assembly:single target, with `-N` to avoid subdirectories. - -```bash -cd src/community -mvn clean install -PcommunityRelease -mvn assembly:single -nsu -N -``` - -## Markdown processing - -The module processes markdown files into ``html`` for including release bundles: - -- ``/licenses/`` -- ``/LICENSE.md`` - -## Jetty - -The standalone jetty environment for our binary release download: - -* ``jetty/`` - -## Installer - -Windows installer NSIS environment: - -* ``installer/`` diff --git a/src/community/release/ext-jms-cluster.xml b/src/community/release/ext-jms-cluster.xml deleted file mode 100644 index 8cbdc05c7f3..00000000000 --- a/src/community/release/ext-jms-cluster.xml +++ /dev/null @@ -1,49 +0,0 @@ - - jms-cluster-plugin - - zip - - false - - - release/target/dependency - - - gs-jms*.jar - jms-api*.jar - xbean-spring*.jar - spring-jms*.jar - - - - - - - - ant*.jar - activemq*.jar - activemq-broker*.jar - activemq-kahadb-store*.jar - - - - - activemq-all.jar - proton-*.jar - bcpkix-*.jar - activemq-client*.jar - geronimo-*.jar - activemq-openwire-legacy*.jar - hawtbuf*.jar - hawtjni*.jar - hawtdispatch*.jar - activemq-spring*.jar - activemq-pool*.jar - activemq-protobuf*.jar - commons-pool2*.jar - - - - diff --git a/src/community/release/ext-mbtiles.xml b/src/community/release/ext-mbtiles.xml deleted file mode 100644 index 77c7ab534a1..00000000000 --- a/src/community/release/ext-mbtiles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - mbtiles-plugin - - zip - - false - - - release/target/dependency - - - gt-mbtiles-*.jar - gs-mbtiles-*.jar - gs-geopkg-output*.jar - sqlite*.jar - jackson-core*.jar - jackson-annotation*.jar - jackson-databind*.jar - java-vector-tile*.jar - protobuf-java*.jar - - - - diff --git a/src/community/release/pom.xml b/src/community/release/pom.xml deleted file mode 100644 index 35270b82560..00000000000 --- a/src/community/release/pom.xml +++ /dev/null @@ -1,597 +0,0 @@ - - - - 4.0.0 - - org.geoserver - community - 2.26-SNAPSHOT - - org.geoserver.community - gs-release - jar - GeoServer Community Release Module - - yyyy - ${maven.build.timestamp} - - - - org.geoserver.community - gs-gpxppio - ${project.version} - - - org.geoserver.community - gs-jdbcconfig - ${project.version} - - - org.geoserver.community - gs-dds - ${project.version} - - - org.geoserver.community - gs-colormap - ${project.version} - - - org.geoserver.community - gs-ncwms - ${project.version} - - - org.geoserver.community - gs-geopkg - ${project.version} - - - org.geoserver.community - gs-mbtiles - ${project.version} - - - org.geoserver.community - gs-dyndimension - ${project.version} - - - org.geoserver.community - gs-flatgeobuf - ${project.version} - - - org.geoserver.community - gs-spatialjson - ${project.version} - - - org.geoserver.community - gs-webp - ${project.version} - - - org.geoserver.community - gs-pgraster - ${project.version} - - - org.geoserver.community - gs-jms-geoserver - ${project.version} - - - org.geoserver.community - gs-jms-commons - ${project.version} - - - org.geoserver.community - gs-hz-cluster - ${project.version} - - - org.geoserver.community - gs-web-solr - ${project.version} - - - org.geoserver.community - gs-web-elasticsearch - ${project.version} - - - org.geoserver.community - gs-gwc-distributed - ${project.version} - - - org.geoserver.community - gs-gwc-azure-blob - ${project.version} - - - org.geoserver.community - gs-gwc-mbtiles - ${project.version} - - - org.geoserver.community - gs-gdal-wcs - ${project.version} - - - org.geoserver.community - gs-gdal-wps - ${project.version} - - - org.geoserver.community - gs-wps-remote - ${project.version} - - - org.geoserver.community - gs-jdbcstore - ${project.version} - - - org.geoserver.community - gs-gwc-sqlite - ${project.version} - - - org.geoserver.community.backuprestore - gs-backup-restore-core - ${project.version} - - - org.geoserver.community.backuprestore - gs-backup-restore-rest - ${project.version} - - - org.geoserver.community.backuprestore - gs-backup-restore-extension - ${project.version} - - - org.geoserver.community.backuprestore - gs-backup-restore-web - ${project.version} - - - org.geoserver.community - gs-sec-oauth2-google - ${project.version} - - - org.geoserver.community - gs-sec-oauth2-github - ${project.version} - - - - org.geoserver.community.jwt-headers - gs-jwt-headers - ${project.version} - - - org.geoserver.community.jwt-headers - jwt-headers-util - ${project.version} - - - - org.geoserver.community - gs-sec-oauth2-geonode - ${project.version} - - - org.geoserver.community.security - gs-sec-oauth2-openid-connect-core - ${project.version} - - - org.geoserver.community.security - gs-sec-oauth2-openid-connect-web - ${project.version} - - - org.geoserver.community - gs-sec-keycloak - ${project.version} - - - org.geoserver.community - gs-notification-common - ${project.version} - - - org.geoserver.community - gs-notification-geonode - ${project.version} - - - org.geoserver.community - gs-jdbc-metrics - ${project.version} - - - org.geoserver.community - gs-oseo-core - ${project.version} - - - org.geoserver.community - gs-web-oseo - ${project.version} - - - org.geoserver.community - gs-oseo-rest - ${project.version} - - - org.geoserver.community - gs-oseo-stac - ${project.version} - - - org.geoserver.community - gs-netcdf-ghrsst - ${project.version} - - - org.geoserver.community - gs-s3-geotiff - ${project.version} - - - org.geoserver.community - gs-taskmanager-core - ${project.version} - - - org.geoserver.community - gs-taskmanager-s3 - ${project.version} - - - org.geoserver.community - gs-web-ogr - ${project.version} - - - org.geoserver.community - gs-ogcapi-features - ${project.version} - - - org.geoserver.community - gs-ogcapi-maps - ${project.version} - - - org.geoserver.community - gs-ogcapi-styles - ${project.version} - - - org.geoserver.community - gs-ogcapi-tiles - ${project.version} - - - org.geoserver.community - gs-ogcapi-images - ${project.version} - - - org.geoserver.community - gs-ogcapi-changeset - ${project.version} - - - org.geoserver.community - gs-ogcapi-tiled-features - ${project.version} - - - org.geoserver.community - gs-ogcapi-dggs - ${project.version} - - - org.geoserver.community - gs-web-ogcapi - ${project.version} - - - org.geoserver.community - gs-web-dggs - ${project.version} - - - org.geoserver.community - gs-dggs-clickhouse - ${project.version} - - - org.geoserver.community - gs-ogcapi-coverages - ${project.version} - - - org.geoserver.community - gs-importer-jdbc - ${project.version} - - - org.geoserver.community - gs-features-autopopulate-core - ${project.version} - - - org.geoserver.community - gs-features-templating-core - ${project.version} - - - org.geoserver.community - gs-features-templating-ows - ${project.version} - - - org.geoserver.community - gs-features-templating-ogcapi - ${project.version} - - - org.geoserver.community - gs-features-templating-web - ${project.version} - - - org.geoserver.community - gs-features-templating-rest - ${project.version} - - - org.geoserver.community - gs-gsr - ${project.version} - - - org.geoserver.community - gs-cog - ${project.version} - - - org.geoserver.community - gs-smart-data-loader - ${project.version} - - - org.geoserver.community - gs-cov-json - ${project.version} - - - org.geoserver.community - gs-mongodb-schemaless - ${project.version} - - - org.geoserver.community - gs-schemaless-core - ${project.version} - - - org.geoserver.community - gs-web-service-auth - ${project.version} - - - org.geoserver.community - gs-vsi - ${project.version} - - - org.geoserver.community - gs-libdeflate - ${project.version} - - - org.geotools - gt-stac-store - ${gt.version} - - - org.geotools - gt-vector-mosaic - ${gt.version} - - - org.geoserver.community - gs-vector-mosaic - ${project.version} - - - org.geoserver.community - gs-proxy-base-ext - ${project.version} - - - org.geoserver - gs-imagemap - ${project.version} - - - org.geoserver - gs-xslt - ${project.version} - - - org.geoserver.community - gs-datadir-catalog-loader - ${project.version} - - - org.geoserver.community - gs-wps-longitudinal-profile - ${project.version} - - - org.geoserver.community - gs-monitor-kafka - ${project.version} - - - org.geoserver.community - gs-graticule - ${project.version} - - - org.geoserver.community - gs-wfs-freemarker - ${project.version} - - - - - - - maven-resources-plugin - - - copy-resources - process-resources - - copy-resources - - - ${project.build.directory}/html-template - - - ../../release/src/markdown/html - true - - - - - - - - com.ruleoftech - markdown-page-generator-plugin - - - licenses - process-resources - - generate - - - ${project.basedir}/../../../licenses - ${project.build.directory}/html/licenses - - - - - false - true - ${project.build.directory}/html-template/header.html - ${project.build.directory}/html-template/footer.html - TABLES,FENCED_CODE_BLOCKS,AUTOLINKS,FORCELISTITEMPARA - true - md,txt - - - - maven-dependency-plugin - - - install - - copy-dependencies - - - - - - maven-antrun-plugin - - - install - - run - - - - - - - - - - - - - - - - - - - rest-ext - - - rest-ext - - - - - org.geoserver.community - gs-rest-ext - ${project.version} - - - - - monitor-hibernate - - - org.geoserver.community - gs-monitor-hibernate - ${project.version} - - - - - monitor-kafka - - - org.geoserver.community - gs-monitor-kafka - ${project.version} - - - - - rest-upload - - - org.geoserver.community - gs-rest-upload - ${project.version} - - - - - diff --git a/src/community/rest-ext/pom.xml b/src/community/rest-ext/pom.xml index 9d1047f0d49..3a01db10659 100644 --- a/src/community/rest-ext/pom.xml +++ b/src/community/rest-ext/pom.xml @@ -14,6 +14,7 @@ REST plugin community module http://maven.apache.org + UTF-8 diff --git a/src/community/release/ext-rest-ext.xml b/src/community/rest-ext/src/assembly/assembly.xml similarity index 59% rename from src/community/release/ext-rest-ext.xml rename to src/community/rest-ext/src/assembly/assembly.xml index e080a5433ec..8929fa6dd9d 100644 --- a/src/community/release/ext-rest-ext.xml +++ b/src/community/rest-ext/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-rest-ext*.jar diff --git a/src/community/rest-upload/pom.xml b/src/community/rest-upload/pom.xml index b78f9757057..4004f02b8dc 100644 --- a/src/community/rest-upload/pom.xml +++ b/src/community/rest-upload/pom.xml @@ -48,4 +48,6 @@ + + diff --git a/src/community/release/ext-rest-upload.xml b/src/community/rest-upload/src/assembly/assembly.xml similarity index 67% rename from src/community/release/ext-rest-upload.xml rename to src/community/rest-upload/src/assembly/assembly.xml index b024aa3ee57..aae0ca7650b 100644 --- a/src/community/release/ext-rest-upload.xml +++ b/src/community/rest-upload/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency *rest-upload* diff --git a/src/community/s3-geotiff/pom.xml b/src/community/s3-geotiff/pom.xml index e5a3d329658..0449f29f587 100644 --- a/src/community/s3-geotiff/pom.xml +++ b/src/community/s3-geotiff/pom.xml @@ -22,5 +22,4 @@ gs-web-core - diff --git a/src/community/release/ext-s3-geotiff.xml b/src/community/s3-geotiff/src/assembly/assembly.xml similarity index 69% rename from src/community/release/ext-s3-geotiff.xml rename to src/community/s3-geotiff/src/assembly/assembly.xml index 3723b14e77c..0ea76cb5921 100644 --- a/src/community/release/ext-s3-geotiff.xml +++ b/src/community/s3-geotiff/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency *s3-geotiff*.jar diff --git a/src/community/release/ext-saml.xml b/src/community/saml/src/assembly/assembly.xml similarity index 77% rename from src/community/release/ext-saml.xml rename to src/community/saml/src/assembly/assembly.xml index c4a4b56f74b..96b34fb0322 100644 --- a/src/community/release/ext-saml.xml +++ b/src/community/saml/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency bcprov-jdk15-1.46.jar diff --git a/src/community/schemaless-features/mongodb-schemaless/pom.xml b/src/community/schemaless-features/mongodb-schemaless/pom.xml index 89071d5c94b..a2569eb0563 100644 --- a/src/community/schemaless-features/mongodb-schemaless/pom.xml +++ b/src/community/schemaless-features/mongodb-schemaless/pom.xml @@ -77,5 +77,4 @@ - diff --git a/src/community/release/ext-mongodb-schemaless.xml b/src/community/schemaless-features/mongodb-schemaless/src/assembly/assembly.xml similarity index 68% rename from src/community/release/ext-mongodb-schemaless.xml rename to src/community/schemaless-features/mongodb-schemaless/src/assembly/assembly.xml index c1c56aa6fd6..e8a43d83123 100644 --- a/src/community/release/ext-mongodb-schemaless.xml +++ b/src/community/schemaless-features/mongodb-schemaless/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-schemaless-*.jar diff --git a/src/community/release/ext-keycloak.xml b/src/community/security/keycloak/src/assembly/assembly.xml similarity index 76% rename from src/community/release/ext-keycloak.xml rename to src/community/security/keycloak/src/assembly/assembly.xml index 7bd60629e90..9465569be03 100644 --- a/src/community/release/ext-keycloak.xml +++ b/src/community/security/keycloak/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-sec-keycloak* diff --git a/src/community/release/ext-oauth2-geonode.xml b/src/community/security/oauth2-geonode/src/assembly/assembly.xml similarity index 76% rename from src/community/release/ext-oauth2-geonode.xml rename to src/community/security/oauth2-geonode/src/assembly/assembly.xml index 1eccd4ad52f..f712297eb9a 100644 --- a/src/community/release/ext-oauth2-geonode.xml +++ b/src/community/security/oauth2-geonode/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-sec-oauth2-core* diff --git a/src/community/release/ext-oauth2-github.xml b/src/community/security/oauth2-github/src/assembly/assembly.xml similarity index 76% rename from src/community/release/ext-oauth2-github.xml rename to src/community/security/oauth2-github/src/assembly/assembly.xml index 2951c74f0d1..8581869187d 100644 --- a/src/community/release/ext-oauth2-github.xml +++ b/src/community/security/oauth2-github/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-sec-oauth2-core* diff --git a/src/community/release/ext-oauth2-google.xml b/src/community/security/oauth2-google/src/assembly/assembly.xml similarity index 76% rename from src/community/release/ext-oauth2-google.xml rename to src/community/security/oauth2-google/src/assembly/assembly.xml index 344ef8edc68..ada03707f63 100644 --- a/src/community/release/ext-oauth2-google.xml +++ b/src/community/security/oauth2-google/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-sec-oauth2-core* diff --git a/src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/pom.xml b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/pom.xml new file mode 100644 index 00000000000..b71e5e13d72 --- /dev/null +++ b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/pom.xml @@ -0,0 +1,38 @@ + + + + + 4.0.0 + + + org.geoserver.community.security + gs-sec-oauth2-openid-connect + 2.26-SNAPSHOT + + + gs-sec-oauth2-openid-connect-assembly + jar + GeoServer OAuth2 Connect Security - OpenId Connect zip assembly + + + + + org.geoserver.community.security + gs-sec-oauth2-openid-connect-core + ${project.version} + + + + org.geoserver.community.security + gs-sec-oauth2-openid-connect-web + ${project.version} + + + + + diff --git a/src/community/release/ext-oauth2-openid-connect.xml b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/src/assembly/assembly.xml similarity index 84% rename from src/community/release/ext-oauth2-openid-connect.xml rename to src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/src/assembly/assembly.xml index f068efb694e..d84132e1805 100644 --- a/src/community/release/ext-oauth2-openid-connect.xml +++ b/src/community/security/oauth2-openid-connect/oauth2-openid-connect-assembly/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-sec-oauth2-core* diff --git a/src/community/security/oauth2-openid-connect/pom.xml b/src/community/security/oauth2-openid-connect/pom.xml index 70c23a3ac3d..af0e7a260f5 100644 --- a/src/community/security/oauth2-openid-connect/pom.xml +++ b/src/community/security/oauth2-openid-connect/pom.xml @@ -23,6 +23,7 @@ oauth2-openid-connect-core oauth2-openid-connect-web + oauth2-openid-connect-assembly diff --git a/src/community/smart-data-loader/pom.xml b/src/community/smart-data-loader/pom.xml index bea8342a807..96d356035b9 100644 --- a/src/community/smart-data-loader/pom.xml +++ b/src/community/smart-data-loader/pom.xml @@ -101,5 +101,4 @@ test - diff --git a/src/community/release/ext-smart-data-loader.xml b/src/community/smart-data-loader/src/assembly/assembly.xml similarity index 57% rename from src/community/release/ext-smart-data-loader.xml rename to src/community/smart-data-loader/src/assembly/assembly.xml index 7fdf5ae3fde..7410cd90e97 100644 --- a/src/community/release/ext-smart-data-loader.xml +++ b/src/community/smart-data-loader/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-smart-data-loader*.jar diff --git a/src/community/solr/pom.xml b/src/community/solr/pom.xml index f8774eaf489..cbd1e9b69fb 100644 --- a/src/community/solr/pom.xml +++ b/src/community/solr/pom.xml @@ -46,5 +46,4 @@ test - diff --git a/src/community/release/ext-solr.xml b/src/community/solr/src/assembly/assembly.xml similarity index 67% rename from src/community/release/ext-solr.xml rename to src/community/solr/src/assembly/assembly.xml index b43c3279133..7101fc34779 100644 --- a/src/community/release/ext-solr.xml +++ b/src/community/solr/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency *solr* diff --git a/src/community/spatialjson/pom.xml b/src/community/spatialjson/pom.xml index bff9fa9365a..16bc7d87198 100644 --- a/src/community/spatialjson/pom.xml +++ b/src/community/spatialjson/pom.xml @@ -33,5 +33,4 @@ guava - diff --git a/src/community/release/ext-spatialjson.xml b/src/community/spatialjson/src/assembly/assembly.xml similarity index 59% rename from src/community/release/ext-spatialjson.xml rename to src/community/spatialjson/src/assembly/assembly.xml index cd0066f4a89..43a3c9944ec 100644 --- a/src/community/release/ext-spatialjson.xml +++ b/src/community/spatialjson/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-spatialjson*.jar diff --git a/src/community/stac-datastore/pom.xml b/src/community/stac-datastore/pom.xml new file mode 100644 index 00000000000..286029316ed --- /dev/null +++ b/src/community/stac-datastore/pom.xml @@ -0,0 +1,30 @@ + + + + 4.0.0 + + org.geoserver + community + 2.26-SNAPSHOT + + org.geoserver.community + gs-stac-datastore + jar + STAC datastore + + + yyyy + ${maven.build.timestamp} + + + + org.geotools + gt-stac-store + ${gt.version} + + + diff --git a/src/community/release/ext-stac-datastore.xml b/src/community/stac-datastore/src/assembly/assembly.xml similarity index 88% rename from src/community/release/ext-stac-datastore.xml rename to src/community/stac-datastore/src/assembly/assembly.xml index faca58cbe60..dd26eb46461 100644 --- a/src/community/release/ext-stac-datastore.xml +++ b/src/community/stac-datastore/src/assembly/assembly.xml @@ -6,7 +6,7 @@ false - release/target/dependency + target/dependency gt-stac-store*.jar diff --git a/src/community/taskmanager/core/pom.xml b/src/community/taskmanager/core/pom.xml index d058dacc167..1aab2a91334 100644 --- a/src/community/taskmanager/core/pom.xml +++ b/src/community/taskmanager/core/pom.xml @@ -236,5 +236,4 @@ - diff --git a/src/community/release/ext-taskmanager-core.xml b/src/community/taskmanager/core/src/assembly/assembly.xml similarity index 72% rename from src/community/release/ext-taskmanager-core.xml rename to src/community/taskmanager/core/src/assembly/assembly.xml index 0f26139e27e..66e7754ed8f 100644 --- a/src/community/release/ext-taskmanager-core.xml +++ b/src/community/taskmanager/core/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-taskmanager-core*.jar diff --git a/src/community/taskmanager/s3/pom.xml b/src/community/taskmanager/s3/pom.xml index d234676c22e..2e048df4714 100644 --- a/src/community/taskmanager/s3/pom.xml +++ b/src/community/taskmanager/s3/pom.xml @@ -57,5 +57,4 @@ - diff --git a/src/community/release/ext-taskmanager-s3.xml b/src/community/taskmanager/s3/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-taskmanager-s3.xml rename to src/community/taskmanager/s3/src/assembly/assembly.xml index 09af209ba95..a959da8ffe0 100644 --- a/src/community/release/ext-taskmanager-s3.xml +++ b/src/community/taskmanager/s3/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-taskmanager-s3*.jar diff --git a/src/community/vector-mosaic/pom.xml b/src/community/vector-mosaic/pom.xml index 1559a180c44..3a7d9c5260f 100644 --- a/src/community/vector-mosaic/pom.xml +++ b/src/community/vector-mosaic/pom.xml @@ -29,5 +29,4 @@ gs-web-core - diff --git a/src/community/release/ext-vector-mosaic-datastore.xml b/src/community/vector-mosaic/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-vector-mosaic-datastore.xml rename to src/community/vector-mosaic/src/assembly/assembly.xml index dae4c451be7..601e72937b7 100644 --- a/src/community/release/ext-vector-mosaic-datastore.xml +++ b/src/community/vector-mosaic/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gt-vector-mosaic*.jar diff --git a/src/community/vsi/pom.xml b/src/community/vsi/pom.xml index bee204b61d0..fab8fe07cf5 100644 --- a/src/community/vsi/pom.xml +++ b/src/community/vsi/pom.xml @@ -22,5 +22,4 @@ gs-web-core - diff --git a/src/community/release/ext-vsi.xml b/src/community/vsi/src/assembly/assembly.xml similarity index 55% rename from src/community/release/ext-vsi.xml rename to src/community/vsi/src/assembly/assembly.xml index b8875b56dca..02154fa40bf 100644 --- a/src/community/release/ext-vsi.xml +++ b/src/community/vsi/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency *vsi*.jar diff --git a/src/community/web-ogr/pom.xml b/src/community/web-ogr/pom.xml index 21983006611..613f339ae38 100644 --- a/src/community/web-ogr/pom.xml +++ b/src/community/web-ogr/pom.xml @@ -10,6 +10,7 @@ gs-web-ogr jar OGR datastore panel + org.geoserver.web diff --git a/src/community/release/ext-ogr-datastore.xml b/src/community/web-ogr/src/assembly/assembly.xml similarity index 65% rename from src/community/release/ext-ogr-datastore.xml rename to src/community/web-ogr/src/assembly/assembly.xml index ce3645b8a7b..8620ab3e67b 100644 --- a/src/community/release/ext-ogr-datastore.xml +++ b/src/community/web-ogr/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-web-ogr*.jar diff --git a/src/community/web-service-auth/pom.xml b/src/community/web-service-auth/pom.xml index 79e84e4945f..422b28d9feb 100644 --- a/src/community/web-service-auth/pom.xml +++ b/src/community/web-service-auth/pom.xml @@ -11,6 +11,7 @@ 2.26-SNAPSHOT jar Web Service Authentication Provider + org.geoserver.web diff --git a/src/community/release/ext-web-service-auth.xml b/src/community/web-service-auth/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-web-service-auth.xml rename to src/community/web-service-auth/src/assembly/assembly.xml index 2d06cfeb206..4c311d953e1 100644 --- a/src/community/release/ext-web-service-auth.xml +++ b/src/community/web-service-auth/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-web-service-auth*.jar diff --git a/src/community/webp/pom.xml b/src/community/webp/pom.xml index 884ac51546d..a0da82741d7 100644 --- a/src/community/webp/pom.xml +++ b/src/community/webp/pom.xml @@ -34,5 +34,4 @@ 0.2.2 - diff --git a/src/community/release/ext-webp.xml b/src/community/webp/src/assembly/assembly.xml similarity index 62% rename from src/community/release/ext-webp.xml rename to src/community/webp/src/assembly/assembly.xml index b5ebe9e7ef1..fc151a4fb08 100644 --- a/src/community/release/ext-webp.xml +++ b/src/community/webp/src/assembly/assembly.xml @@ -5,8 +5,15 @@ false + + target + + + ${artifactId}-${project.version}.jar + + - release/target/dependency + target/dependency gs-webp*.jar diff --git a/src/community/release/ext-wfs-freemarker.xml b/src/community/wfs-freemarker/src/assembly/assembly.xml similarity index 57% rename from src/community/release/ext-wfs-freemarker.xml rename to src/community/wfs-freemarker/src/assembly/assembly.xml index c2a11d780a5..dc8747cc539 100644 --- a/src/community/release/ext-wfs-freemarker.xml +++ b/src/community/wfs-freemarker/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-wfs-freemarker*.jar diff --git a/src/community/release/ext-wps-longitudinal-profile.xml b/src/community/wps-longitudinal-profile/src/assembly/assembly.xml similarity index 57% rename from src/community/release/ext-wps-longitudinal-profile.xml rename to src/community/wps-longitudinal-profile/src/assembly/assembly.xml index 5b2d34cccfa..3d702d9c315 100644 --- a/src/community/release/ext-wps-longitudinal-profile.xml +++ b/src/community/wps-longitudinal-profile/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-wps-longitudinal-profile*.jar diff --git a/src/community/wps-remote/pom.xml b/src/community/wps-remote/pom.xml index 152c4a1fac4..136a6de29ce 100644 --- a/src/community/wps-remote/pom.xml +++ b/src/community/wps-remote/pom.xml @@ -16,6 +16,7 @@ Web Processing Service - Remote processes invocation + 4.0.5 0.7 diff --git a/src/community/release/ext-wps-remote.xml b/src/community/wps-remote/src/assembly/assembly.xml similarity index 85% rename from src/community/release/ext-wps-remote.xml rename to src/community/wps-remote/src/assembly/assembly.xml index c11894b79e3..530683c75a2 100644 --- a/src/community/release/ext-wps-remote.xml +++ b/src/community/wps-remote/src/assembly/assembly.xml @@ -6,7 +6,14 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-wps-remote*.jar diff --git a/src/community/release/ext-xslt.xml b/src/community/xslt/src/assembly/assembly.xml similarity index 60% rename from src/community/release/ext-xslt.xml rename to src/community/xslt/src/assembly/assembly.xml index da93638978a..ce349dd2c8f 100644 --- a/src/community/release/ext-xslt.xml +++ b/src/community/xslt/src/assembly/assembly.xml @@ -6,14 +6,21 @@ false - release/target/dependency + target + + + ${artifactId}-${project.version}.jar + + + + target/dependency gs-xslt* - release/target/html/licenses + ${geoserverBaseDir}/community/target/html/licenses GPL.html diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLConstants.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLConstants.java index 5dcfb3386b9..b89279f0a44 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLConstants.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLConstants.java @@ -69,9 +69,15 @@ public final class MapMLConstants { /** DIMENSION */ public static final String DIMENSION = "dimension"; + /** DEFAULT MIME TYPE */ + public static final String MIME = "mime"; + /** MAPML_DIMENSION */ public static final String MAPML_DIMENSION = MAPML_PREFIX + DIMENSION; + /** MAPML_DIMENSION */ + public static final String MAPML_MIME = MAPML_PREFIX + MIME; + /** SHARD_LIST */ public static final String SHARD_LIST = "shardList"; diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java index b1fbe07b539..587c27b7674 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLDocumentBuilder.java @@ -108,6 +108,8 @@ public class MapMLDocumentBuilder { public static final String MINIMUM_WIDTH_HEIGHT = "1"; private static final int BYTES_PER_PIXEL_TRANSPARENT = 4; private static final int BYTES_PER_KILOBYTE = 1024; + public static final String DEFAULT_MIME_TYPE = "image/png"; + private final WMS wms; private final GeoServer geoServer; @@ -129,7 +131,7 @@ public class MapMLDocumentBuilder { private String defaultStyle; private String layerTitle; - private String imageFormat; + private String imageFormat = DEFAULT_MIME_TYPE; private String baseUrl; private String baseUrlPattern; private Boolean enableSharding; @@ -326,7 +328,7 @@ public void initialize() throws ServiceException { projType = mapMLLayerMetadata.getProjType(); layerTitle = layerTitlesCommaDelimited; layerMeta = mapMLLayerMetadata.getLayerMeta(); - imageFormat = (String) format.orElse("image/png"); + imageFormat = (String) format.orElse(mapMLLayerMetadata.getDefaultMimeType()); baseUrl = ResponseUtils.baseURL(request); baseUrlPattern = baseUrl; // handle shard config @@ -402,6 +404,7 @@ private MapMLLayerMetadata layersToOneMapMLLayerMetadata(List layers) mapMLLayerMetadata.setQueryable(layersToQueryable(layers)); mapMLLayerMetadata.setLayerLabel(layersToLabel(layers)); mapMLLayerMetadata.setProjType(projType); + mapMLLayerMetadata.setDefaultMimeType(imageFormat); return mapMLLayerMetadata; } @@ -541,6 +544,7 @@ private MapMLLayerMetadata layerToMapMLLayerMetadata(RawLayer layer, String styl String styleName = style != null ? style : ""; String cqlFilter = null; boolean tileLayerExists = false; + String defaultMimeType = DEFAULT_MIME_TYPE; if (isLayerGroup) { layerGroupInfo = (LayerGroupInfo) layer.getPublishedInfo(); if (layerGroupInfo == null) { @@ -558,6 +562,10 @@ private MapMLLayerMetadata layerToMapMLLayerMetadata(RawLayer layer, String styl queryable = !layerGroupInfo.isQueryDisabled(); layerName = layerGroupInfo.getName(); layerTitle = getTitle(layerGroupInfo, layerName); + defaultMimeType = + Optional.ofNullable(layerGroupInfo.getMetadata().get(MapMLConstants.MAPML_MIME)) + .orElse(DEFAULT_MIME_TYPE) + .toString(); } else { layerInfo = (LayerInfo) layer.getPublishedInfo(); resourceInfo = layerInfo.getResource(); @@ -573,6 +581,10 @@ private MapMLLayerMetadata layerToMapMLLayerMetadata(RawLayer layer, String styl layerTitle = getTitle(layerInfo, layerName); // set the actual style name from the layer info if (style == null) styleName = layerInfo.getDefaultStyle().getName(); + defaultMimeType = + Optional.ofNullable(resourceInfo.getMetadata().get(MapMLConstants.MAPML_MIME)) + .orElse(DEFAULT_MIME_TYPE) + .toString(); } ProjType projType = parseProjType(); cqlFilter = cql != null ? cql : ""; @@ -600,7 +612,8 @@ private MapMLLayerMetadata layerToMapMLLayerMetadata(RawLayer layer, String styl tileLayerExists, useTiles, useFeatures, - cqlFilter); + cqlFilter, + defaultMimeType); } /** @@ -1792,7 +1805,7 @@ private String buildGetMap( String formatOptions = MapMLConstants.MAPML_WMS_MIME_TYPE_OPTION + ":" - + escapeHtml4((String) format.orElse("image/png")); + + escapeHtml4((String) format.orElse(imageFormat)); kvp.put("format_options", formatOptions); kvp.put("SERVICE", "WMS"); kvp.put("REQUEST", "GetMap"); @@ -1938,6 +1951,7 @@ static class MapMLLayerMetadata { private ReferencedEnvelope bbbox; private String layerLabel; + private String defaultMimeType; /** * get if the layer uses features @@ -1974,6 +1988,7 @@ public void setUseFeatures(boolean useFeatures) { * @param styleName String * @param tileLayerExists boolean * @param useTiles boolean + * @param defaultMimeType String */ public MapMLLayerMetadata( LayerInfo layerInfo, @@ -1991,7 +2006,8 @@ public MapMLLayerMetadata( boolean tileLayerExists, boolean useTiles, boolean useFeatures, - String cqFilter) { + String cqFilter, + String defaultMimeType) { this.layerInfo = layerInfo; this.bbox = bbox; this.isLayerGroup = isLayerGroup; @@ -2008,6 +2024,7 @@ public MapMLLayerMetadata( this.useTiles = useTiles; this.useFeatures = useFeatures; this.cqlFilter = cqFilter; + this.defaultMimeType = defaultMimeType; } /** Constructor */ @@ -2366,5 +2383,23 @@ public String getCqlFilter() { public void setCqlFilter(String cqlFilter) { this.cqlFilter = cqlFilter; } + + /** + * get the default mime type + * + * @return String + */ + public String getDefaultMimeType() { + return defaultMimeType; + } + + /** + * set the default mime type + * + * @param defaultMimeType String + */ + public void setDefaultMimeType(String defaultMimeType) { + this.defaultMimeType = defaultMimeType; + } } } diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.html b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.html index d64afbdb28f..2f0426d5dc6 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.html +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.html @@ -135,6 +135,21 @@

+
  • +
    + + Default Mimetype + +
      +
    • + + +
    • +
    +
    +
  • diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.java index b18725c2320..f7e9101040d 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerConfigurationPanel.java @@ -4,6 +4,8 @@ */ package org.geoserver.mapml; +import static org.geoserver.mapml.MapMLConstants.MAPML_USE_TILES; + import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -12,6 +14,10 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.ListMultipleChoice; @@ -32,11 +38,16 @@ import org.geoserver.catalog.PublishedType; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.ResourcePool; +import org.geoserver.gwc.GWC; +import org.geoserver.gwc.layer.GeoServerTileLayer; +import org.geoserver.gwc.layer.GeoServerTileLayerInfo; import org.geoserver.web.GeoServerApplication; import org.geoserver.web.publish.PublishedConfigurationPanel; import org.geoserver.web.util.MapModel; import org.geoserver.web.wicket.ParamResourceModel; +import org.geoserver.wms.WMS; import org.geotools.util.logging.Logging; +import org.geowebcache.layer.TileLayer; /** * Resource configuration panel for MapML @@ -48,8 +59,16 @@ public class MapMLLayerConfigurationPanel extends PublishedConfigurationPanel featureCaptionAttributes; + private static final String MIME_PATTERN = "png|jpeg"; + + public static final Pattern mimePattern = + Pattern.compile(MIME_PATTERN, Pattern.CASE_INSENSITIVE); + + DropDownChoice mime; + /** * Adds MapML configuration panel * @@ -80,6 +99,15 @@ public MapMLLayerConfigurationPanel(final String panelId, final IModel(model, MapMLConstants.RESOURCE_METADATA), MapMLConstants.MAPML_USE_TILES); CheckBox useTiles = new CheckBox(MapMLConstants.USE_TILES, useTilesModel); + useTiles.add( + new OnChangeAjaxBehavior() { + @Override + protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) { + ajaxRequestTarget.add(mime); + boolean useTilesChecked = useTiles.getConvertedInput(); + mime.setChoices(getAvailableMimeTypes(model.getObject(), useTilesChecked)); + } + }); add(useTiles); // add the checkbox to select features or not @@ -93,6 +121,15 @@ public MapMLLayerConfigurationPanel(final String panelId, final IModel mimeModel = + new MapModel<>( + new PropertyModel(model, MapMLConstants.RESOURCE_METADATA), + MapMLConstants.MAPML_MIME); + boolean useTilesFromModel = + Boolean.TRUE.equals( + model.getObject() + .getResource() + .getMetadata() + .get(MAPML_USE_TILES, Boolean.class)); + mime = + new DropDownChoice<>( + MapMLConstants.MIME, + mimeModel, + getAvailableMimeTypes(model.getObject(), useTilesFromModel)); + mime.setOutputMarkupId(true); + mime.setNullValid(false); + // if we are using features, we don't use a mime type + if (useFeaturesModel.getObject() != null) { + String useFeaturesString = String.valueOf(useFeaturesModel.getObject()); + boolean useFeaturesBoolean = Boolean.parseBoolean(useFeaturesString); + mime.setEnabled(!useFeaturesBoolean); + } + add(mime); + featureCaptionAttributes = new ListMultipleChoice<>( MapMLConstants.FEATURE_CAPTION_ATTRIBUTES, @@ -147,6 +209,46 @@ public MapMLLayerConfigurationPanel(final String panelId, final IModel getAvailableMimeTypes(PublishedInfo layer, boolean useTiles) { + List mimeTypes = new ArrayList<>(); + if (useTiles) { + GWC gwc = GWC.get(); + if (gwc != null) { + try { + TileLayer tileLayer = gwc.getTileLayerByName(layer.prefixedName()); + // if the useTiles flag is set and the cache is enabled we get cache mime types + if (tileLayer instanceof GeoServerTileLayer && tileLayer.isEnabled()) { + GeoServerTileLayer geoServerTileLayer = (GeoServerTileLayer) tileLayer; + GeoServerTileLayerInfo info = geoServerTileLayer.getInfo(); + mimeTypes.addAll( + info.getMimeFormats().stream() + .filter(mimeType -> mimePattern.matcher(mimeType).find()) + .collect(Collectors.toList())); + return mimeTypes; + } + } catch (IllegalArgumentException e) { + LOGGER.fine("No tile layer found for " + layer.prefixedName()); + } + } + } + // if the useTiles flag is not set or the tile cache is not enabled we get WMS mime types + WMS wms = WMS.get(); + if (wms != null) { + mimeTypes.addAll( + wms.getAllowedMapFormatNames().stream() + .filter(mimeType -> mimePattern.matcher(mimeType).find()) + .collect(Collectors.toList())); + } + + return mimeTypes; + } + /** * @param layer a LayerInfo for the layer * @return a list of strings of dimension names from the layer info diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.html b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.html index 8cb1dcd4375..1ab2d05c414 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.html +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.html @@ -58,8 +58,24 @@

    MapML Settings +
  • +
    + + Default Mimetype + +
      +
    • + + +
    • +
    +
    +
  • - + \ No newline at end of file diff --git a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.java b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.java index ec4f8605be6..597f9db008c 100644 --- a/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.java +++ b/src/extension/mapml/src/main/java/org/geoserver/mapml/MapMLLayerGroupConfigurationPanel.java @@ -5,7 +5,14 @@ package org.geoserver.mapml; +import static org.geoserver.mapml.MapMLConstants.MAPML_USE_TILES; +import static org.geoserver.mapml.MapMLLayerConfigurationPanel.getAvailableMimeTypes; + +import java.util.logging.Logger; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.form.CheckBox; +import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; @@ -13,6 +20,7 @@ import org.geoserver.catalog.MetadataMap; import org.geoserver.web.publish.PublishedConfigurationPanel; import org.geoserver.web.util.MapModel; +import org.geotools.util.logging.Logging; /** * LayerGroup configuration panel for MapML @@ -20,8 +28,12 @@ * @author prushforth */ public class MapMLLayerGroupConfigurationPanel extends PublishedConfigurationPanel { + static final Logger LOGGER = Logging.getLogger(MapMLLayerGroupConfigurationPanel.class); private static final long serialVersionUID = 1L; + public static final String METADATA = "metadata"; + + DropDownChoice mime; /** * Adds MapML configuration panel @@ -35,41 +47,64 @@ public MapMLLayerGroupConfigurationPanel( MapModel licenseTitleModel = new MapModel<>( - new PropertyModel(model, "metadata"), "mapml.licenseTitle"); + new PropertyModel(model, METADATA), "mapml.licenseTitle"); TextField licenseTitle = new TextField<>("licenseTitle", licenseTitleModel); add(licenseTitle); MapModel licenseLinkModel = new MapModel<>( - new PropertyModel(model, "metadata"), "mapml.licenseLink"); + new PropertyModel(model, METADATA), "mapml.licenseLink"); TextField licenseLink = new TextField<>("licenseLink", licenseLinkModel); add(licenseLink); // add the checkbox to select tiled or not MapModel useTilesModel = - new MapModel<>(new PropertyModel(model, "metadata"), "mapml.useTiles"); + new MapModel<>(new PropertyModel(model, METADATA), "mapml.useTiles"); CheckBox useTiles = new CheckBox("useTiles", useTilesModel); + useTiles.add( + new OnChangeAjaxBehavior() { + @Override + protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) { + ajaxRequestTarget.add(mime); + boolean useTilesChecked = useTiles.getConvertedInput(); + mime.setChoices(getAvailableMimeTypes(model.getObject(), useTilesChecked)); + } + }); add(useTiles); // add the checkbox to enable sharding or not MapModel enableShardingModel = new MapModel<>( - new PropertyModel(model, "metadata"), "mapml.enableSharding"); + new PropertyModel(model, METADATA), "mapml.enableSharding"); CheckBox enableSharding = new CheckBox("enableSharding", enableShardingModel); add(enableSharding); MapModel shardListModel = - new MapModel<>( - new PropertyModel(model, "metadata"), "mapml.shardList"); + new MapModel<>(new PropertyModel(model, METADATA), "mapml.shardList"); TextField shardList = new TextField<>("shardList", shardListModel); add(shardList); MapModel shardServerPatternModel = new MapModel<>( - new PropertyModel(model, "metadata"), + new PropertyModel(model, METADATA), "mapml.shardServerPattern"); TextField shardServerPattern = new TextField<>("shardServerPattern", shardServerPatternModel); add(shardServerPattern); + + MapModel mimeModel = + new MapModel<>( + new PropertyModel(model, METADATA), MapMLConstants.MAPML_MIME); + boolean useTilesFromModel = + Boolean.TRUE.equals( + model.getObject().getMetadata().get(MAPML_USE_TILES, Boolean.class)); + mime = + new DropDownChoice<>( + MapMLConstants.MIME, + mimeModel, + getAvailableMimeTypes(model.getObject(), useTilesFromModel)); + mime.setOutputMarkupId(true); + mime.setNullValid(false); + add(mime); } } diff --git a/src/extension/mapml/src/main/resources/GeoServerApplication.properties b/src/extension/mapml/src/main/resources/GeoServerApplication.properties index c21f7f0571f..7b4e6bd30b9 100644 --- a/src/extension/mapml/src/main/resources/GeoServerApplication.properties +++ b/src/extension/mapml/src/main/resources/GeoServerApplication.properties @@ -22,7 +22,9 @@ MapMLLayerConfigurationPanel.mapmlEnableSharding=Enable Sharding MapMLLayerConfigurationPanel.mapmlShardList=Shard List (comma separated) MapMLLayerConfigurationPanel.mapmlShardServerPattern=Shard Server Pattern (include {s} as shard placeholder) MapMLLayerConfigurationPanel.mapmlDimensionSection=Dimension Config +MapMLLayerConfigurationPanel.mapmlDefaultMimeSection=Default Mime Type Config MapMLLayerConfigurationPanel.mapmlDimension=Dimension +MapMLLayerConfigurationPanel.mapmlDefaultMime=Default Mime Type MapMLLayerConfigurationPanel.dimension.nullValid=None MapMLLayerConfigurationPanel.mapmlFeatureCaptionSection=Attributes to <featurecaption> mapping MapMLLayerConfigurationPanel.mapmlFeatureCaption=List of attributes @@ -39,6 +41,8 @@ MapMLLayerGroupConfigurationPanel.mapmlShardSection=Sharding Config MapMLLayerGroupConfigurationPanel.mapmlEnableSharding=Enable Sharding MapMLLayerGroupConfigurationPanel.mapmlShardList=Shard List (comma separated) MapMLLayerGroupConfigurationPanel.mapmlShardServerPattern=Shard Server Pattern (include {s} as shard placeholder) +MapMLLayerGroupConfigurationPanel.mapmlDefaultMimeSection=Default Mime Type Config +MapMLLayerGroupConfigurationPanel.mapmlDefaultMime=Default Mime Type MapMLAdminPanel.title=MapML Settings MapMLAdminPanel.mapml=MapML Settings MapMLAdminPanel.multiextent=Represent multi-layer requests as multiple elements diff --git a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLLayerConfigurationPanelTest.java b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLLayerConfigurationPanelTest.java index 2e3c7587a32..29664016919 100644 --- a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLLayerConfigurationPanelTest.java +++ b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLLayerConfigurationPanelTest.java @@ -4,13 +4,19 @@ */ package org.geoserver.mapml; +import static org.geoserver.data.test.MockData.BASIC_POLYGONS; import static org.geoserver.data.test.MockData.PONDS; +import static org.geoserver.mapml.MapMLConstants.MAPML_USE_TILES; import static org.geoserver.web.GeoServerWicketTestSupport.tester; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.HashMap; import java.util.Map; import javax.xml.namespace.QName; +import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.ListMultipleChoice; import org.apache.wicket.model.Model; @@ -18,14 +24,19 @@ import org.geoserver.catalog.LayerInfo; import org.geoserver.data.test.MockData; import org.geoserver.data.test.SystemTestData; +import org.geoserver.gwc.GWC; +import org.geoserver.gwc.layer.GeoServerTileLayer; import org.geoserver.web.ComponentBuilder; import org.geoserver.web.FormTestPage; import org.geoserver.web.GeoServerWicketTestSupport; +import org.geowebcache.layer.TileLayer; +import org.hamcrest.Matchers; import org.junit.Test; /** @author prushforth */ public class MapMLLayerConfigurationPanelTest extends GeoServerWicketTestSupport { static QName MOSAIC = new QName(MockData.SF_URI, "mosaic", MockData.SF_PREFIX); + GeoServerTileLayer tileLayer; @Override protected void setUpTestData(SystemTestData testData) throws Exception { @@ -42,6 +53,7 @@ protected void onSetUp(SystemTestData testData) throws Exception { testData.addRasterLayer( MOSAIC, "raster-filter-test.zip", null, props, SystemTestData.class, getCatalog()); + testData.addVectorLayer(BASIC_POLYGONS, getCatalog()); } @Test @@ -58,6 +70,9 @@ public void testMapMLPanel() { tester.assertComponent("form", Form.class); // check that the attributes dropdown is available tester.assertComponent("form:panel:featurecaptionattributes", ListMultipleChoice.class); + tester.assertComponent("form:panel:mime", DropDownChoice.class); + // check that the mime type pick list is available as expected with vector data + tester.assertEnabled("form:panel:mime"); // check that the "useFeatures" checkbox is enabled as expected with vector data tester.assertEnabled("form:panel:useFeatures"); FormTester ft = tester.newFormTester("form"); @@ -118,6 +133,7 @@ public void testMapMLPanelWithRasterData() { tester.assertComponent("form", Form.class); // check that the "attributes" (works with raster dimensions) dropdown is available tester.assertComponent("form:panel:featurecaptionattributes", ListMultipleChoice.class); + tester.assertComponent("form:panel:mime", DropDownChoice.class); // check that the "useFeatures" checkbox is disabled as expected with raster data tester.assertDisabled("form:panel:useFeatures"); FormTester ft = tester.newFormTester("form"); @@ -162,4 +178,70 @@ public void testMapMLPanelWithRasterData() { // tester.assertModelValue("form:panel:featurecaptionattributes", "[BLUE_BAND]"); tester.assertModelValue("form:panel:featureCaptionTemplate", "This is the ${BLUE_BAND}"); } + + @SuppressWarnings("unchecked") + @Test + public void testMapMLMime() { + // get a test layer and instantiate the model + final LayerInfo layer = getCatalog().getLayerByName(MockData.PONDS.getLocalPart()); + layer.getResource().getMetadata().put(MapMLConstants.MAPML_USE_FEATURES, true); + Model model = new Model<>(layer); + + FormTestPage page = + new FormTestPage( + (ComponentBuilder) id -> new MapMLLayerConfigurationPanel(id, model)); + // let's start the page and check that the components are correctly instantiated + tester.startPage(page); + + tester.assertComponent("form:panel:mime", DropDownChoice.class); + // check that the mime type pick list is disabled when mapML useFeatures is enabled + tester.assertDisabled("form:panel:mime"); + + // check that the "mime" checkbox is disabled as expected when mapML useFeatures is enabled + tester.assertDisabled("form:panel:mime"); + layer.getResource().getMetadata().put(MapMLConstants.MAPML_USE_FEATURES, false); + Model model2 = new Model<>(layer); + page = + new FormTestPage( + (ComponentBuilder) id -> new MapMLLayerConfigurationPanel(id, model2)); + // let's start the page and check that the components are correctly instantiated + tester.startPage(page); + // check that the "mime" checkbox is enabled as expected when mapML useFeatures is disabled + tester.assertEnabled("form:panel:mime"); + DropDownChoice dropDownChoice = + (DropDownChoice) tester.getComponentFromLastRenderedPage("form:panel:mime"); + assertThat( + dropDownChoice.getChoices(), + Matchers.containsInAnyOrder( + "image/png; mode=8bit", + "image/vnd.jpeg-png", + "image/jpeg", + "image/vnd.jpeg-png8", + "image/png", + "image/png8")); + GWC mediator = GWC.get(); + + final String layerName = getLayerId(BASIC_POLYGONS); + LayerInfo layerInfo = getCatalog().getLayerByName(layerName); + assertNotNull(layerInfo); + layerInfo.getResource().getMetadata().put(MapMLConstants.MAPML_USE_FEATURES, false); + layerInfo.getResource().getMetadata().put(MAPML_USE_TILES, true); + + TileLayer tileLayer = mediator.getTileLayerByName(layerName); + assertNotNull(tileLayer); + assertTrue(tileLayer.isEnabled()); + + Model modelTile = new Model<>(layerInfo); + + FormTestPage pageTile = + new FormTestPage( + (ComponentBuilder) id -> new MapMLLayerConfigurationPanel(id, modelTile)); + // let's start the page and check that the components are correctly instantiated + tester.startPage(pageTile); + DropDownChoice dropDownChoiceTile = + (DropDownChoice) tester.getComponentFromLastRenderedPage("form:panel:mime"); + assertThat( + dropDownChoiceTile.getChoices(), + Matchers.containsInAnyOrder("image/jpeg", "image/png")); + } } diff --git a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLTestSupport.java b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLTestSupport.java index 2c97813a430..a94a253cb8f 100644 --- a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLTestSupport.java +++ b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLTestSupport.java @@ -183,7 +183,9 @@ protected MockHttpServletRequest toHttpRequest() throws Exception { String formatOptions = isFeature() ? MapMLConstants.MAPML_FEATURE_FO + ":true" - : MapMLConstants.MAPML_WMS_MIME_TYPE_OPTION + ":image/png"; + : getFormat() != null + ? MapMLConstants.MAPML_WMS_MIME_TYPE_OPTION + ":image/png" + : ""; if (getKvp() != null) { path = "wms"; httpRequest = createRequest(path, getKvp()); diff --git a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLWMSTest.java b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLWMSTest.java index 10139b7b986..7441741f979 100644 --- a/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLWMSTest.java +++ b/src/extension/mapml/src/test/java/org/geoserver/mapml/MapMLWMSTest.java @@ -357,6 +357,63 @@ public void testMapMLMaxImageWidthHeight() throws Exception { response.getContentAsString().contains("ServiceException")); } + @Test + public void testMapMLDefaultMimeType() throws Exception { + GeoServer geoServer = getGeoServer(); + WMSInfo wms = geoServer.getService(WMSInfo.class); + wms.getMetadata().put(MapMLDocumentBuilder.MAPML_MULTILAYER_AS_MULTIEXTENT, Boolean.TRUE); + geoServer.save(wms); + Catalog cat = getCatalog(); + LayerInfo li = cat.getLayerByName(MockData.POLYGONS.getLocalPart()); + li.getResource().getMetadata().put(MAPML_USE_FEATURES, false); + li.getResource().getMetadata().put(MAPML_USE_TILES, false); + li.getResource().getMetadata().put(MapMLConstants.MAPML_MIME, "img/jpeg"); + LayerInfo li2 = cat.getLayerByName(MockData.LINES.getLocalPart()); + li2.getResource().getMetadata().put(MAPML_USE_FEATURES, false); + li2.getResource().getMetadata().put(MAPML_USE_TILES, false); + cat.save(li); + cat.save(li2); + Mapml mapmlExtent = + new MapMLWMSRequest() + .name(MockData.POLYGONS.getLocalPart()) + .srs("EPSG:3857") + .getAsMapML(); + + List extentLinks = + getTypeFromInputOrDataListOrLink( + mapmlExtent.getBody().getExtents().get(0).getInputOrDatalistOrLink(), + Link.class); + List imageLinksForSingle = getLinkByRelType(extentLinks, RelType.IMAGE); + assertTrue( + "Image link tref should contain img/jpeg format despite no format passed into request", + imageLinksForSingle.get(0).getTref().contains("format=img/jpeg")); + Mapml mapmlExtentWithTwo = + new MapMLWMSRequest() + .name( + MockData.POLYGONS.getLocalPart() + + "," + + MockData.LINES.getLocalPart()) + .srs("EPSG:3857") + .getAsMapML(); + List extentLinksOne = + getTypeFromInputOrDataListOrLink( + mapmlExtentWithTwo.getBody().getExtents().get(0).getInputOrDatalistOrLink(), + Link.class); + List imageLinksOne = getLinkByRelType(extentLinksOne, RelType.IMAGE); + assertTrue( + "Image link tref should contain img/jpeg format despite no format passed into request", + imageLinksOne.get(0).getTref().contains("format=img/jpeg")); + List extentLinksTwo = + getTypeFromInputOrDataListOrLink( + mapmlExtentWithTwo.getBody().getExtents().get(1).getInputOrDatalistOrLink(), + Link.class); + List imageLinksTwo = getLinkByRelType(extentLinksTwo, RelType.IMAGE); + assertTrue( + "Image link tref should contain img/jpeg format despite no format passed into request " + + "and no default set in metadata because first requested layer has default set", + imageLinksTwo.get(0).getTref().contains("format=img/jpeg")); + } + @Test public void testMapMLUseFeaturesLinks() throws Exception { GeoServer geoServer = getGeoServer(); diff --git a/src/extension/netcdf-out/src/main/java/org/geoserver/wcs/responses/DefaultNetCDFEncoder.java b/src/extension/netcdf-out/src/main/java/org/geoserver/wcs/responses/DefaultNetCDFEncoder.java index 6865fe05fdc..8ff0048060f 100644 --- a/src/extension/netcdf-out/src/main/java/org/geoserver/wcs/responses/DefaultNetCDFEncoder.java +++ b/src/extension/netcdf-out/src/main/java/org/geoserver/wcs/responses/DefaultNetCDFEncoder.java @@ -153,7 +153,7 @@ protected void initializeVariables() { } if (inputUoM != null && hasDefinedUoM) { try { - Unit outputUoM = NetCDFUnitFormat.parse(variableUoM); + Unit outputUoM = NetCDFUnitFormat.getInstance().parse(variableUoM); if (outputUoM != null && !inputUoM.equals(outputUoM)) { if (!inputUoM.isCompatible(outputUoM)) { if (LOGGER.isLoggable(Level.WARNING)) { diff --git a/src/extension/netcdf/src/main/java/org/geoserver/netcdf/NetCDFUnitsConfigurator.java b/src/extension/netcdf/src/main/java/org/geoserver/netcdf/NetCDFUnitsConfigurator.java index 7616ff55ab2..285caed024e 100644 --- a/src/extension/netcdf/src/main/java/org/geoserver/netcdf/NetCDFUnitsConfigurator.java +++ b/src/extension/netcdf/src/main/java/org/geoserver/netcdf/NetCDFUnitsConfigurator.java @@ -40,7 +40,7 @@ private void configure() { LinkedHashMap aliases = getMapResource(NETCDF_UNIT_ALIASES, NetCDFUnitFormat.NETCDF_UNIT_ALIASES); if (aliases != null) { - NetCDFUnitFormat.setAliases(aliases); + NetCDFUnitFormat.getInstance().setAliases(aliases); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to load NetCDF unit aliases", e); @@ -51,7 +51,7 @@ private void configure() { getMapResource( NETCDF_UNIT_REPLACEMENTS, NetCDFUnitFormat.NETCDF_UNIT_REPLACEMENTS); if (replacements != null) { - NetCDFUnitFormat.setReplacements(replacements); + NetCDFUnitFormat.getInstance().setReplacements(replacements); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to load NetCDF unit replacements", e); diff --git a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.html b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.html index f4f4d2467e5..4c0f95025c1 100644 --- a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.html +++ b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.html @@ -2,11 +2,14 @@
    -
    + + +
    • - - + + +
    diff --git a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.java b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.java index 735f6e85cfd..71b60a74faa 100644 --- a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.java +++ b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilder.java @@ -6,6 +6,7 @@ package org.geoserver.wps.web; import java.io.ByteArrayOutputStream; +import java.io.Serializable; import java.util.Collections; import java.util.logging.Level; import javax.servlet.http.HttpServletRequest; @@ -13,14 +14,20 @@ import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptContentHeaderItem; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.geoserver.ows.URLMangler.URLType; import org.geoserver.ows.util.ResponseUtils; +import org.geoserver.web.GeoServerApplication; import org.geoserver.web.GeoServerBasePage; import org.geoserver.web.demo.DemoRequest; import org.geoserver.web.demo.DemoRequestResponse; +import org.geoserver.web.demo.DemoRequestsPage; import org.geoserver.web.demo.PlainCodePage; /** @@ -44,6 +51,8 @@ public class WPSRequestBuilder extends GeoServerBasePage { ModalWindow responseWindow; WPSRequestBuilderPanel builder; + TextField xml; + public WPSRequestBuilder(PageParameters parameters) { this(parameters.get(PARAM_NAME).toOptionalString()); } @@ -57,6 +66,13 @@ public WPSRequestBuilder(String procName) { Form form = new Form("form"); add(form); + var model = new Model<>(new WPSRequestModel()); + form.setDefaultModel(model); + + xml = new TextField<>("xml", new PropertyModel<>(model, "xml")); + xml.setOutputMarkupId(true); + form.add(xml); + // the actual request builder component ExecuteRequest execRequest = new ExecuteRequest(); if (procName != null) execRequest.processName = procName; @@ -97,14 +113,49 @@ public WPSRequestBuilder(String procName) { return new DemoRequestResponse(new Model<>(request)); }); + form.add( + new AjaxSubmitLink("setXml") { + + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + try { + var xmlText = getRequestXML(); + xml.setModelObject(xmlText); + target.add(xml); + } catch (Exception e) { + error(e.getMessage()); + addFeedbackPanels(target); + } + target.appendJavaScript("executeWPS()"); + } + + @Override + protected void onError(AjaxRequestTarget target, Form form) { + addFeedbackPanels(target); + } + }); + form.add( new AjaxSubmitLink("execute") { @SuppressWarnings("unchecked") @Override protected void onSubmit(AjaxRequestTarget target, Form form) { - responseWindow.setDefaultModel(new Model(getRequestXML())); - responseWindow.show(target); + HttpServletRequest http = GeoServerApplication.get().servletRequest(); + + String url = + ResponseUtils.buildURL( + ResponseUtils.baseURL(http), + "ows", + Collections.singletonMap("strict", "true"), + URLType.SERVICE); + var xml = getRequestXML(); + + PageParameters parameters = new PageParameters(); + parameters.add("url", url); + parameters.add("xml", xml); + + getRequestCycle().setResponsePage(DemoRequestsPage.class, parameters); } @Override @@ -150,4 +201,23 @@ String getRequestXML() { } return out.toString(); } + + @Override + public void renderHead(IHeaderResponse response) { + response.render( + JavaScriptContentHeaderItem.forScript( + DemoRequestsPage.demoRequestsJavascript, null)); + } + + public class WPSRequestModel implements Serializable { + public String xml; + + public String getXml() { + return xml; + } + + public void setXml(String xml) { + this.xml = xml; + } + } } diff --git a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.html b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.html index 23977cf58c5..f3eb0bf4952 100644 --- a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.html +++ b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.html @@ -44,18 +44,18 @@ authentication
    • - +
      • - +
      • - +
    • diff --git a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.java b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.java index bd7cf3258c7..3100fbbd969 100644 --- a/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.java +++ b/src/extension/wps/web-wps/src/main/java/org/geoserver/wps/web/WPSRequestBuilderPanel.java @@ -225,9 +225,12 @@ protected void populateItem(ListItem item) { protected void onClick(AjaxRequestTarget target, Form form) { processChoice.processInput(); if (execute.processName != null) { - responseWindow.setDefaultModel( - new Model<>(getDescribeXML(execute.processName))); - responseWindow.show(target); + + var xmlText = getDescribeXML(execute.processName); + var xml = (TextField) form.get("xml"); + xml.setModelObject(xmlText); + target.add(xml); + target.appendJavaScript("executeWPS()"); } } }; diff --git a/src/extension/wps/web-wps/src/main/resources/GeoServerApplication.properties b/src/extension/wps/web-wps/src/main/resources/GeoServerApplication.properties index aad7bc8fd68..a7ae29b1eef 100644 --- a/src/extension/wps/web-wps/src/main/resources/GeoServerApplication.properties +++ b/src/extension/wps/web-wps/src/main/resources/GeoServerApplication.properties @@ -82,7 +82,8 @@ ProcessSelectionPage.edit=Edit... WPSRequestBuilder.title=WPS request builder WPSRequestBuilder.description=Step by step WPS request builder. WPSRequestBuilder.shortDescription=Step by step WPS request builder -WPSRequestBuilder.execute=Execute process +WPSRequestBuilder.execute=Execute process in New Page +WPSRequestBuilder.requestBuilder=Execute in Demo Requests WPSRequestBuilder.showXML=Generate XML from process inputs/outputs WPSRequestBuilderPanel.describe=WPS DescribeProcess diff --git a/src/extension/wps/web-wps/src/test/java/org/geoserver/wps/web/WPSRequestBuilderTest.java b/src/extension/wps/web-wps/src/test/java/org/geoserver/wps/web/WPSRequestBuilderTest.java index f5ec7c772f1..ff79f4c3e39 100644 --- a/src/extension/wps/web-wps/src/test/java/org/geoserver/wps/web/WPSRequestBuilderTest.java +++ b/src/extension/wps/web-wps/src/test/java/org/geoserver/wps/web/WPSRequestBuilderTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; @@ -22,6 +23,8 @@ import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.tester.FormTester; import org.geoserver.web.GeoServerWicketTestSupport; +import org.geoserver.web.demo.DemoRequest; +import org.geoserver.web.demo.DemoRequestsPage; import org.geoserver.wps.ProcessGroupInfo; import org.geoserver.wps.WPSInfo; import org.geoserver.wps.process.GeoServerProcessors; @@ -103,14 +106,27 @@ public void testFirstProcessWorkflow() throws Exception { "requestBuilder:inputContainer:inputs:0:paramValue:editor:textarea", "POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))"); form.submit(); + tester.clickLink("form:execute", true); - // print(tester.getLastRenderedPage(), true, true); + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + + assertEquals("http://localhost/context/ows?strict=true", model.getRequestUrl()); + assertTrue(model.getRequestBody().contains("wps:Execute")); + assertEquals(DemoRequestsPage.class, tester.getLastRenderedPage().getClass()); + assertEquals(2, tester.getLastRenderedPage().getPageParameters().getAllNamed().size()); + assertEquals( + "http://localhost/context/ows?strict=true", + tester.getLastRenderedPage().getPageParameters().get("url").toString()); assertTrue( - tester.getComponentFromLastRenderedPage("responseWindow") - .getDefaultModelObjectAsString() - .contains("wps:Execute")); + (tester.getLastRenderedPage() + .getPageParameters() + .get("xml") + .toString() + .contains("wps:Execute"))); + + // print(tester.getLastRenderedPage(), true, true); // unfortunately the wicket tester does not allow us to get work with the popup window // contents, diff --git a/src/main/src/main/java/org/geoserver/ows/CiteComplianceHack.java b/src/main/src/main/java/org/geoserver/ows/CiteComplianceHack.java index 31560d16669..54bfdb89cb4 100644 --- a/src/main/src/main/java/org/geoserver/ows/CiteComplianceHack.java +++ b/src/main/src/main/java/org/geoserver/ows/CiteComplianceHack.java @@ -62,6 +62,7 @@ private String findService( // set request / response req.setHttpRequest(request); req.setHttpResponse(response); + Dispatcher.initRequestContext(req); // find the service try { @@ -71,8 +72,7 @@ private String findService( Level.FINE, "Exception while looking for the 'Service' from the request", ex1); // load from the context try { - UriComponentsBuilder builder = - UriComponentsBuilder.fromUriString(request.getServletPath()); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(req.path); if (builder != null && builder.build() != null && builder.build().getPath() != null) { diff --git a/src/ows/src/main/java/org/geoserver/ows/ClientStreamAbortedException.java b/src/ows/src/main/java/org/geoserver/ows/ClientStreamAbortedException.java index 893d160757a..a32284fbe4c 100644 --- a/src/ows/src/main/java/org/geoserver/ows/ClientStreamAbortedException.java +++ b/src/ows/src/main/java/org/geoserver/ows/ClientStreamAbortedException.java @@ -4,7 +4,9 @@ */ package org.geoserver.ows; +import com.google.common.base.Throwables; import java.io.IOException; +import java.io.UncheckedIOException; /** * An IOException that means a {@link @@ -39,4 +41,20 @@ public ClientStreamAbortedException(Throwable cause) { super(); initCause(cause); } + + /** + * @throws UncheckedIOException if the causal chain of {@code exception} contains a {@code + * ClientStreamAbortedException}, with it as the cause, letting the {@link Dispatcher} abort + * the current request gracefully. + */ + public static void rethrowUncheked(Exception exception) { + Throwables.getCausalChain(exception).stream() + .filter(ClientStreamAbortedException.class::isInstance) + .map(ClientStreamAbortedException.class::cast) + .findFirst() + .ifPresent( + cause -> { + throw new java.io.UncheckedIOException(cause); + }); + } } diff --git a/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java b/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java index bbdb380c233..2b788f1b940 100644 --- a/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java +++ b/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java @@ -385,6 +385,30 @@ Request init(Request request) throws ServiceException, IOException { request.getInput().reset(); } } + initRequestContext(request); + + return fireInitCallback(request); + } + + /** + * Initializes the request context by parsing the request path into two components: the + * 'context' and the 'path'. The 'context' is the part of the URI before the last '/' and the + * 'path' is the part after the last '/'. + * + *

      This method processes the given {@link Request} object to extract and set the context and + * path based on the HTTP request URI. Leading and trailing slashes are stripped from the + * request path before the context and path are determined. + * + * @param request the {@link Request} object whose context and path need to be initialized. + * @throws NullPointerException if the {@link Request} or its HTTP request is null. + *

      +     * Example:
      +     * If the request URI is "/app/resource/item", then:
      +     * - context: "app/resource"
      +     * - path: "item"
      +     * 
      + */ + public static void initRequestContext(Request request) { // parse the request path into two components. (1) the 'path' which // is the string after the last '/', and the 'context' which is the // string before the last '/' @@ -414,8 +438,6 @@ Request init(Request request) throws ServiceException, IOException { request.setContext(context); request.setPath(path); - - return fireInitCallback(request); } private boolean isForm(String contentType) { diff --git a/src/pom.xml b/src/pom.xml index eb73cf81846..026156e68f1 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -987,6 +987,12 @@ ${log4j.version} + + javax.measure + unit-api + 2.2 + + org.springframework @@ -1749,6 +1755,11 @@ maven-war-plugin 3.4.0 + + org.commonjava.maven.plugins + directory-maven-plugin + 1.0 + @@ -2084,7 +2095,6 @@ org.commonjava.maven.plugins directory-maven-plugin - 0.3.1 directories diff --git a/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10CapsTransformer.java b/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10CapsTransformer.java index f2c7b0a1d4d..8a6f08024b9 100644 --- a/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10CapsTransformer.java +++ b/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10CapsTransformer.java @@ -32,6 +32,7 @@ import org.geoserver.config.GeoServer; import org.geoserver.config.ResourceErrorHandling; import org.geoserver.config.SettingsInfo; +import org.geoserver.ows.ClientStreamAbortedException; import org.geoserver.ows.URLMangler.URLType; import org.geoserver.wcs.WCSInfo; import org.geotools.coverage.grid.io.GridCoverage2DReader; @@ -573,6 +574,8 @@ private void handleContentMetadata(boolean allSections) { handleCoverageOfferingBrief(cvInfo); commit(); } catch (Exception e) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(e); if (skipMisconfigured) { reset(); LOGGER.log( diff --git a/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10DescribeCoverageTransformer.java b/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10DescribeCoverageTransformer.java index d8e0d420f85..dc2884f38e9 100644 --- a/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10DescribeCoverageTransformer.java +++ b/src/wcs1_0/src/main/java/org/geoserver/wcs/response/Wcs10DescribeCoverageTransformer.java @@ -36,6 +36,7 @@ import org.geoserver.catalog.ResourcePool; import org.geoserver.catalog.util.ReaderDimensionsAccessor; import org.geoserver.config.ResourceErrorHandling; +import org.geoserver.ows.ClientStreamAbortedException; import org.geoserver.ows.URLMangler.URLType; import org.geoserver.wcs.WCSInfo; import org.geotools.api.coverage.grid.GridEnvelope; @@ -190,6 +191,8 @@ public void encode(Object o) throws IllegalArgumentException { handleCoverageOffering(coverage); commit(); } catch (Exception e) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(e); if (skipMisconfiguredThisTime) { reset(); } else { diff --git a/src/wcs1_1/src/main/java/org/geoserver/wcs/response/WCSCapsTransformer.java b/src/wcs1_1/src/main/java/org/geoserver/wcs/response/WCSCapsTransformer.java index 5ad873ced9d..06a9bd56454 100644 --- a/src/wcs1_1/src/main/java/org/geoserver/wcs/response/WCSCapsTransformer.java +++ b/src/wcs1_1/src/main/java/org/geoserver/wcs/response/WCSCapsTransformer.java @@ -28,6 +28,7 @@ import org.geoserver.config.GeoServer; import org.geoserver.config.ResourceErrorHandling; import org.geoserver.config.SettingsInfo; +import org.geoserver.ows.ClientStreamAbortedException; import org.geoserver.ows.URLMangler.URLType; import org.geoserver.wcs.WCSInfo; import org.geotools.geometry.jts.ReferencedEnvelope; @@ -408,6 +409,8 @@ protected void handleContents() { handleCoverageSummary(cv); commit(); } catch (Exception e) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(e); if (skipMisconfigured) { reset(); LOGGER.log( diff --git a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequest.java b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequest.java index 68b79e42a06..afd1b1c4fe8 100644 --- a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequest.java +++ b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequest.java @@ -8,7 +8,7 @@ import java.io.Serializable; /** - * Holds on the properties used as arguments for the TestWfsPost servlet + * Holds on the properties used as arguments for the Demo Request * * @author Gabriel Roldan (TOPP) * @version $Id$ @@ -30,6 +30,9 @@ public class DemoRequest implements Serializable { private String password; + private boolean prettyXML = true; + private boolean openNewWindow = false; + public DemoRequest(final String demoDir) { this.demoDir = demoDir; } @@ -77,4 +80,20 @@ public void setRequestBody(String requestBody) { public String getDemoDir() { return demoDir; } + + public boolean isPrettyXML() { + return prettyXML; + } + + public void setPrettyXML(boolean prettyXML) { + this.prettyXML = prettyXML; + } + + public boolean isOpenNewWindow() { + return openNewWindow; + } + + public void setOpenNewWindow(boolean openNewWindow) { + this.openNewWindow = openNewWindow; + } } diff --git a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.html b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.html index 57164390b7d..edf43cbf39b 100644 --- a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.html +++ b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.html @@ -1,6 +1,6 @@ -
      + diff --git a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.java b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.java index d6553575866..118662606ab 100644 --- a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.java +++ b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestResponse.java @@ -14,11 +14,9 @@ import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.geoserver.web.GeoServerBasePage; -import org.vfny.geoserver.wfs.servlets.TestWfsPost; /** - * An intermediate page used to submit a demo request to the {@link TestWfsPost /TestWfsPost} - * servlet. + * An intermediate page used to submit a demo request. * *

      This page does not extend {@link GeoServerBasePage} since its just an intermediate form to * submit to the servlet. @@ -30,9 +28,8 @@ public class DemoRequestResponse extends WebPage { /** - * Fills out the form to be submitted to {@code TestWfsPost} with the properties from the {@code - * DemoRequestModel} provided, and auto-submit the form on page load so the results get loaded - * in the page body. + * Fills out the form to be submitted with the properties from the {@code DemoRequestModel} + * provided, and auto-submit the form on page load so the results get loaded in the page body. * * @param model the demo request parameters holder, as a model for {@link DemoRequest} */ @@ -68,9 +65,7 @@ protected void onDetach() { form.add(passwordField); - // override the action property of the form to submit to the TestWfsPost - // servlet - form.add(AttributeModifier.replace("action", "../../TestWfsPost")); + form.add(AttributeModifier.replace("action", "")); // Set the same markup is as in the html page so wicket does not // generates diff --git a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.html b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.html index 3b03eb49564..ae752af1bed 100644 --- a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.html +++ b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.html @@ -3,7 +3,11 @@ <wicket:message key="page.title">Demo Request</wicket:message> + + + + @@ -27,6 +31,10 @@ + + + + + + + +
      URL:
      Pretty XML:
      Body: @@ -43,16 +51,38 @@
      -
      - Submit -
      +
      +
      + Submit +
      + + +
      openNewWindow:
      -

      + + + openNewWindow: + +
      +
      + + result: + + +
      +
      + diff --git a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.java b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.java index fb501056e4c..ebb8334b819 100644 --- a/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.java +++ b/src/web/demo/src/main/java/org/geoserver/web/demo/DemoRequestsPage.java @@ -5,6 +5,8 @@ */ package org.geoserver.web.demo; +import com.google.common.base.Charsets; +import com.google.common.io.CharStreams; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -15,14 +17,12 @@ import java.util.logging.Logger; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; -import org.apache.wicket.Component; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.attributes.AjaxCallListener; -import org.apache.wicket.ajax.attributes.AjaxRequestAttributes; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; -import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; -import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.JavaScriptContentHeaderItem; +import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; @@ -31,6 +31,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.geoserver.config.GeoServer; import org.geoserver.ows.util.ResponseUtils; import org.geoserver.platform.GeoServerExtensions; @@ -53,7 +54,36 @@ public class DemoRequestsPage extends GeoServerBasePage { private static final Logger LOGGER = Logging.getLogger("org.geoserver.web.demo"); - final Resource demoDir; + /** + * Javascript required by the Demo Request page to do the client-side requests. This is shared + * among other modules (cf WCS Request Builder, and WPS Request Builder). + * + *

      See static block, below. + */ + public static String demoRequestsJavascript; + + static { + try { + var demo_request_js = + CharStreams.toString( + new InputStreamReader( + DemoRequestsPage.class.getResourceAsStream( + "/org/geoserver/web/demo/demo-requests.js"), + Charsets.UTF_8)); + var xml_pretty_print_js = + CharStreams.toString( + new InputStreamReader( + DemoRequestsPage.class.getResourceAsStream( + "/org/geoserver/web/demo/xml-pretty-print.js"), + Charsets.UTF_8)); + var js = demo_request_js + "\n" + xml_pretty_print_js; + demoRequestsJavascript = js; + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "error occurred reading demoRequestsJavascript", e); + } + } + + Resource demoDir; private TextField urlTextField; @@ -63,7 +93,30 @@ public class DemoRequestsPage extends GeoServerBasePage { private PasswordTextField password; - public DemoRequestsPage() { + private CheckBox prettyXML; + private CheckBox openNewPage; + + public DemoRequestsPage(PageParameters parameters) { + super(parameters); + setup(); + if (parameters != null) { + if (parameters.get("xml") != null) { + ((DemoRequest) this.getDefaultModel().getObject()) + .setRequestBody(parameters.get("xml").toString()); + } + if (parameters.get("url") != null) { + ((DemoRequest) this.getDefaultModel().getObject()) + .setRequestUrl(parameters.get("url").toString()); + } + } + } + + @Override + public void renderHead(IHeaderResponse response) { + response.render(JavaScriptContentHeaderItem.forScript(demoRequestsJavascript, null)); + } + + public void setup() { try { GeoServerResourceLoader loader = this.getGeoServer().getCatalog().getResourceLoader(); demoDir = Resources.serializable(loader.get("demo")); @@ -77,6 +130,10 @@ public DemoRequestsPage() { setUpDemoRequestsForm(demoDir); } + public DemoRequestsPage() { + setup(); + } + /** Package visible constructor aimed to help in setting up unit tests for this class */ DemoRequestsPage(final Resource demoDir) { this.demoDir = Resources.serializable(demoDir); @@ -85,6 +142,20 @@ public DemoRequestsPage() { setUpDemoRequestsForm(demoDir); } + DemoRequestsPage(final Resource demoDir, PageParameters parameters) { + this(demoDir); + if (parameters != null) { + if (parameters.get("xml") != null) { + ((DemoRequest) this.getDefaultModel().getObject()) + .setRequestBody(parameters.get("xml").toString()); + } + if (parameters.get("url") != null) { + ((DemoRequest) this.getDefaultModel().getObject()) + .setRequestUrl(parameters.get("url").toString()); + } + } + } + /** * Loads the contents of the demo request file named {@code reqFileName} and located in the demo * directory. @@ -221,44 +292,15 @@ protected void onError(AjaxRequestTarget target) { password = new PasswordTextField("password", new PropertyModel<>(requestModel, "password")); password.setRequired(false); + password.setResetPassword(false); demoRequestsForm.add(password); - final ModalWindow responseWindow = new ModalWindow("responseWindow"); - add(responseWindow); + prettyXML = new CheckBox("prettyXML", new PropertyModel<>(requestModel, "prettyXML")); + demoRequestsForm.add(prettyXML); - // responseWindow.setPageMapName("demoResponse"); - responseWindow.setCookieName("demoResponse"); - - responseWindow.setPageCreator( - (ModalWindow.PageCreator) () -> new DemoRequestResponse(requestModel)); - - demoRequestsForm.add( - new AjaxSubmitLink("submit", demoRequestsForm) { - @Override - public void onSubmit(AjaxRequestTarget target, Form testWfsPostForm) { - responseWindow.show(target); - } - - @Override - protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { - super.updateAjaxAttributes(attributes); - // we need to force EditArea to update the textarea contents (which it - // hides) - // before submitting the form, otherwise the contents won't be the ones the - // user - // edited - attributes - .getAjaxCallListeners() - .add( - new AjaxCallListener() { - @Override - public CharSequence getBeforeHandler( - Component component) { - return "document.getElementById('requestBody').value = document.gsEditors.requestBody.getValue();"; - } - }); - } - }); + openNewPage = + new CheckBox("openNewWindow", new PropertyModel<>(requestModel, "openNewWindow")); + demoRequestsForm.add(openNewPage); } private List getDemoList(final Resource demoDir) { diff --git a/src/web/demo/src/main/resources/GeoServerApplication.properties b/src/web/demo/src/main/resources/GeoServerApplication.properties index 4a4539b39d0..8d0debc968b 100644 --- a/src/web/demo/src/main/resources/GeoServerApplication.properties +++ b/src/web/demo/src/main/resources/GeoServerApplication.properties @@ -1,16 +1,21 @@ DemoRequestResponse.loading=Loading............ DemoRequestsPage.title=Demo requests -DemoRequestsPage.description=Example requests for GeoServer (using the TestServlet). Select a request from \ +DemoRequestsPage.description=Example requests for GeoServer. Select a request from \ the drop down list, and then hit 'Change'. This will display the request url (and body if an xml request). \ -Hit submit to send the request to GeoServer. -DemoRequestsPage.shortDescription=Example requests for GeoServer (using the TestServlet). +Press one of the buttons to send the request to GeoServer. +DemoRequestsPage.shortDescription=Example requests for GeoServer. DemoRequestsPage.body=Body DemoRequestsPage.password=Password DemoRequestsPage.request=Request DemoRequestsPage.url=URL DemoRequestsPage.userName=User Name -DemoRequestsPage.submit=Submit +DemoRequestsPage.submit=Show Result +DemoRequestsPage.submitNewWindow=Show Result in New Page +DemoRequestsPage.prettyXml=Pretty Print XML +DemoRequestsPage.openNewWindow=Show Result in New Page +DemoRequestsPage.headers=Response Headers +DemoRequestsPage.result=Response Body MapPreviewPage.layerPreview=Layer Preview MapPreviewPage.description=List of all layers configured in GeoServer and provides previews in various formats for each. diff --git a/src/web/demo/src/main/resources/GeoServerApplication_zh.properties b/src/web/demo/src/main/resources/GeoServerApplication_zh.properties index fec1625f5a0..60f58169e3c 100644 --- a/src/web/demo/src/main/resources/GeoServerApplication_zh.properties +++ b/src/web/demo/src/main/resources/GeoServerApplication_zh.properties @@ -1,10 +1,10 @@ DemoRequestResponse.loading=Loading............ DemoRequestsPage.title=Demo requests -DemoRequestsPage.description=Example requests for GeoServer (using the TestServlet). Select a request from \ +DemoRequestsPage.description=Example requests for GeoServer. Select a request from \ the drop down list, and then hit 'Change'. This will display the request url (and body if an xml request). \ Hit submit to send the request to GeoServer. -DemoRequestsPage.shortDescription=Example requests for GeoServer (using the TestServlet). +DemoRequestsPage.shortDescription=Example requests for GeoServer. DemoRequestsPage.body=Body DemoRequestsPage.password=Password DemoRequestsPage.request=Request diff --git a/src/web/demo/src/main/resources/org/geoserver/web/demo/demo-requests.js b/src/web/demo/src/main/resources/org/geoserver/web/demo/demo-requests.js new file mode 100644 index 00000000000..3c697d66d91 --- /dev/null +++ b/src/web/demo/src/main/resources/org/geoserver/web/demo/demo-requests.js @@ -0,0 +1,255 @@ +/* (c) 2024 Open Source Geospatial Foundation - all rights reserved + * This code is licensed under the GPL 2.0 license, available at the root + * application directory. + */ + + +//when the user presses the "submit" button, make sure GET/POST request +function submitRequest() { + var url = document.getElementById("requestUrl").value.trim(); + //you cannot directly access the CodeMirror value in JS. If you + // try, you will get the original (on page load) value, not what + // the user might have modified. + var xml = document.gsEditors.requestBody.getValue().trim(); + + var username = document.getElementsByName("username")[0].value; + var password = document.getElementsByName("password")[0].value; + + if (url =="") { + alert("Please enter a URL!"); + return; //nothing to do - no url + } + try{ + var _url = new URL(url); + } + catch(e) { + alert("URL is is not valid!") + return; + } + + if (document.getElementById("openNewWindow").checked) { + openInNewWindow(url, xml, username, password); + } + else { + makeRequest(url, xml, username, password); + } +} + +function openInNewWindow(url,xml,user,pass) { + url = addAuth(url, user,pass); + if (xml && xml.trim() != "") { + return openInNewWindowPost(url,xml); + } + return openInNewWindowGet(url); +} + +//open new window with GET +// (just set the browser lcoation); +function openInNewWindowGet(url) { + window.location.href = url; +} + +//creates new URL by adding user/pass +//ie. http://user:pass@localhost:8080/geoserver/... +function addAuth(url, user,pass) { + if (!user || !pass || (user == "") || (pass=="")) + return url; + var _url = new URL(url); + if (!_url.host || _url.host =="") + return url; + _url.username = user; + _url.password = pass; + return _url.toString(); +} + +function openInNewWindowPost(url,xml,user,pass) { + let formElement = document.createElement("form"); + formElement.setAttribute("id", "formElement"); + formElement.setAttribute("action", url); + formElement.setAttribute("method", "POST"); + formElement.setAttribute("enctype", "text/plain"); + formElement.style.display = "none"; + + //HACK. + // we break the XML into two piece, based on the first "=" + // xml1 = before the "=", xml2 = everthing after the "=" + // when submitting, browser will create: + // name=value in the post body. + // in our case, name=xml1 and value=xml2 + // this will re-build the xml in the body. + var firstEquals = xml.indexOf("="); + var xml1, xml2; + if (firstEquals != -1) { + xml1 = xml.substring(0, xml.indexOf("=")) + xml2 = xml.substring( xml.indexOf("=")+1); + } + else { + //no "=" in + window.alert("XML must have '=' somewhere in the text. Please add an '='."); + return; + } + + var xmlInput = document.createElement("input"); + xmlInput.setAttribute("type", "text"); + xmlInput.setAttribute("name", xml1); + xmlInput.setAttribute("value", xml2); + + formElement.append(xmlInput) + + var bodyElement = document.getElementsByTagName("body")[0]; + var oldElement = document.getElementById("formElement"); + if (oldElement) { + bodyElement.removeChild(oldElement); + } + bodyElement.append(formElement) + formElement.submit(); +} + + +//Make the actual XMLHttpRequest GET/POST Request +function makeRequest(url,xml,username,password) { + // show spinner + document.getElementById("ajaxFeedback").style.display = "block"; + + let xhr = new XMLHttpRequest(); + var verb = "GET"; + if (xml && xml !== "") { + verb = "POST"; + } + xhr.open(verb, url, true,username,password); + xhr.setRequestHeader( "Content-Type", "application/xml"); + xhr.responseType = 'arraybuffer'; + + xhr.onreadystatechange = function () { + //4 = complete + if (this.readyState == 4) { + document.getElementById("ajaxFeedback").style.display = "none" + handleResponse(this); + } + } + // Sending our request + if (xml && xml !== "") { + xhr.send(xml); + } + else { + xhr.send(); + } +} + +function displayHeaders(xhrResponse) { + var responseDiv = document.getElementById("responseHeadersDiv"); + + //remove old content from the responseDiv + while(responseDiv.firstChild){ + responseDiv.removeChild(responseDiv.firstChild); + } + let preElement = document.createElement("pre"); + preElement.innerHTML = xhrResponse.getAllResponseHeaders(); + responseDiv.append(preElement); +} + +//given a complete response from the server, display it +// error (turn border to red, process as normal) +// case 1 - image (convert to base64 Image representation and display) +// case 2 - other (XML - display the XML - might be pretty printed) +function handleResponse(xhrResponse) { + var contentType = xhrResponse.getResponseHeader("Content-Type"); + var status = xhrResponse.status; + + //decode binary -> text + var enc = new TextDecoder("utf-8"); + var text = enc.decode(xhrResponse.response); + + if (contentType.startsWith("image") && text.startsWith("")) { + //this is actually a service exception that is tagged as an image + contentType = "text/xml"; + } + displayHeaders(xhrResponse); + + //error status + if (status > 400) { + document.getElementById("responseDiv").style.borderColor = 'red'; + } + else { + document.getElementById("responseDiv").style.borderColor = 'black'; + } + //its an image - convert to Base64 representation and display in an tag + if (contentType.startsWith("image")) { + //var base64Image = btoa(String.fromCharCode.apply(null, new Uint8Array(xhrResponse.response))); + var base64Image = arrayBufferToBase64(xhrResponse.response); + + var responseDiv = document.getElementById("responseDiv"); + //remove old content from the responseDiv + while(responseDiv.firstChild){ + responseDiv.removeChild(responseDiv.firstChild); + } + + //create the and use the base64 image data + let imgElement = document.createElement("img"); + imgElement.src = "data:"+contentType+";base64, "+base64Image; + responseDiv.append(imgElement); + } + else { + //its probably XML - process it for display in a

      ...
      + var responseDiv = document.getElementById("responseDiv"); + //remove old content from the responseDiv + while(responseDiv.firstChild){ + responseDiv.removeChild(responseDiv.firstChild); + } + + //pretty print XML if its checked + if (document.getElementById("prettyXML").checked) { + const options = {indent: 2, newline: '\n'} + text = prettifyXml(text, options); + } + + //replace HTML/XML characters for display (and security) + text=text.replaceAll("<","<"); + text=text.replaceAll(">",">"); + + //create the
       element and imbed inside the 
      + let preElement = document.createElement("pre"); + preElement.style.whiteSpace ="pre-wrap"; + preElement.innerHTML = text; + responseDiv.append(preElement); + } +} + +function arrayBufferToBase64(buffer) { + let binary = ''; + const bytes = new Uint8Array(buffer); + for (let i = 0; i < bytes.byteLength; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +} + +function getBaseURL() { + return window.location.href.substring(0, window.location.href.indexOf("web/wicket")); +} + +function getOWSUrl() { + return getBaseURL() + "ows?strict=true"; +} + + +function getCoverage() { + var url =getOWSUrl(); + var xml = document.getElementById("xml").value; + var user =''; + var pass= ''; + openInNewWindow(url,xml,user,pass); +} + +function executeWPS() { + var url =getOWSUrl(); + var xml = document.getElementById("xml").value; + var user =''; + var pass= ''; + if (document.getElementById('authenticate').checked) { + user =document.getElementById('WPSusername').value; + pass =document.getElementById('WPSpassword').value; + } + openInNewWindow(url,xml,user,pass); +} + diff --git a/src/web/demo/src/main/resources/org/geoserver/web/demo/xml-pretty-print.js b/src/web/demo/src/main/resources/org/geoserver/web/demo/xml-pretty-print.js new file mode 100644 index 00000000000..f3617853484 --- /dev/null +++ b/src/web/demo/src/main/resources/org/geoserver/web/demo/xml-pretty-print.js @@ -0,0 +1,66 @@ +// https://www.npmjs.com/package/prettify-xml +// +// The MIT License (MIT) +// Copyright (c) 2016 Jonathan Werner +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +var stringTimesN = function stringTimesN(n, char) { + return Array(n + 1).join(char); +}; + +// Adapted from https://gist.github.com/sente/1083506 +function prettifyXml(xmlInput) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var _options$indent = options.indent, + indentOption = _options$indent === undefined ? 2 : _options$indent, + _options$newline = options.newline, + newlineOption = _options$newline === undefined ? _os.EOL : _options$newline; + + var indentString = stringTimesN(indentOption, ' '); + + var formatted = ''; + var regex = /(>)(<)(\/*)/g; + var xml = xmlInput.replace(regex, '$1' + newlineOption + '$2$3'); + var pad = 0; + xml.split(/\r?\n/).forEach(function (l) { + var line = l.trim(); + + var indent = 0; + if (line.match(/.+<\/\w[^>]*>$/)) { + indent = 0; + } else if (line.match(/^<\/\w/)) { + // Somehow istanbul doesn't see the else case as covered, although it is. Skip it. + /* istanbul ignore else */ + if (pad !== 0) { + pad -= 1; + } + } else if (line.match(/^<\w([^>]*[^\/])?>.*$/)) { + indent = 1; + } else { + indent = 0; + } + + var padding = stringTimesN(pad, indentString); + formatted += padding + line + newlineOption; // eslint-disable-line prefer-template + pad += indent; + }); + + return formatted.trim(); +} \ No newline at end of file diff --git a/src/web/demo/src/test/java/org/geoserver/web/demo/DemoRequestsPageTest.java b/src/web/demo/src/test/java/org/geoserver/web/demo/DemoRequestsPageTest.java index 4cf99f0fb4b..b0f919ff74a 100644 --- a/src/web/demo/src/test/java/org/geoserver/web/demo/DemoRequestsPageTest.java +++ b/src/web/demo/src/test/java/org/geoserver/web/demo/DemoRequestsPageTest.java @@ -6,21 +6,17 @@ package org.geoserver.web.demo; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.Arrays; import java.util.List; -import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; -import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.markup.html.form.TextField; -import org.apache.wicket.model.IModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.tester.FormTester; import org.geoserver.config.GeoServerInfo; import org.geoserver.platform.resource.Files; @@ -58,136 +54,121 @@ public void testStructure() { "demoRequestsForm:body:editorContainer:editorParent:editor", TextArea.class); tester.assertComponent("demoRequestsForm:username", TextField.class); tester.assertComponent("demoRequestsForm:password", PasswordTextField.class); - tester.assertComponent("demoRequestsForm:submit", AjaxSubmitLink.class); - - tester.assertComponent("responseWindow", ModalWindow.class); } @Test - public void testDemoListLoaded() { - // print(tester.getLastRenderedPage(), true, true); + public void testPrettyXML() { + final FormTester requestFormTester = tester.newFormTester("demoRequestsForm"); - /* - * Expected choices are the file names in the demo requests dir - * (/src/test/resources/test-data/demo-requests in this case) - */ - final List expectedList = - Arrays.asList(new String[] {"WFS_getFeature-1.1.xml", "WMS_describeLayer.url"}); + requestFormTester.select("demoRequestsList", 0); + tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - DropDownChoice dropDown = - (DropDownChoice) - tester.getComponentFromLastRenderedPage( - "demoRequestsForm:demoRequestsList"); - List choices = dropDown.getChoices(); - assertEquals(expectedList, choices); + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals(true, model.isPrettyXML()); + + requestFormTester.setValue("prettyXML", false); + + tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); + + model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals(false, model.isPrettyXML()); } @Test - public void testUrlLinkUnmodified() { - // print(tester.getLastRenderedPage(), true, true); - + public void testOpenNewPage() { final FormTester requestFormTester = tester.newFormTester("demoRequestsForm"); - final String requestName = "WMS_describeLayer.url"; - requestFormTester.select("demoRequestsList", 1); - - /* - * There's an AjaxFormSubmitBehavior attached to onchange so force it - */ + requestFormTester.select("demoRequestsList", 0); tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - tester.assertModelValue("demoRequestsForm:demoRequestsList", requestName); + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals(false, model.isOpenNewWindow()); - final boolean isAjax = true; - tester.clickLink("demoRequestsForm:submit", isAjax); + requestFormTester.setValue("openNewWindow", true); - tester.assertVisible("responseWindow"); + tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - IModel model = tester.getLastRenderedPage().getDefaultModel(); - assertTrue(model.getObject() instanceof DemoRequest); - DemoRequest req = (DemoRequest) model.getObject(); + model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals(true, model.isOpenNewWindow()); + } + + @Test + public void testPageParams() { + PageParameters parameters = new PageParameters(); + parameters.add("url", "myurl"); + parameters.add("xml", "myxml"); - assertEquals(Files.asResource(demoDir).path(), req.getDemoDir()); - String requestFileName = req.getRequestFileName(); - String requestUrl = req.getRequestUrl(); - String requestBody = req.getRequestBody(); + tester.startPage(new DemoRequestsPage(Files.asResource(demoDir), parameters)); + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); - assertEquals(requestName, requestFileName); - assertNotNull(requestUrl); - assertNull(requestBody); + assertEquals("myurl", model.getRequestUrl()); + assertEquals("myxml", model.getRequestBody()); } @Test - public void testUrlLinkSelected() { - // print(tester.getLastRenderedPage(), true, true); - + public void testAuth() { final FormTester requestFormTester = tester.newFormTester("demoRequestsForm"); - final String requestName = "WMS_describeLayer.url"; + requestFormTester.setValue("username", "UserName"); + requestFormTester.setValue("password", "PassWord"); - requestFormTester.select("demoRequestsList", 1); - - /* - * There's an AjaxFormSubmitBehavior attached to onchange so force it - */ + requestFormTester.select("demoRequestsList", 0); tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - tester.assertModelValue("demoRequestsForm:demoRequestsList", requestName); - - final boolean isAjax = true; - tester.clickLink("demoRequestsForm:submit", isAjax); - - tester.assertVisible("responseWindow"); + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals("UserName", model.getUserName()); + assertEquals("PassWord", model.getPassword()); - IModel model = tester.getLastRenderedPage().getDefaultModel(); - assertTrue(model.getObject() instanceof DemoRequest); - DemoRequest req = (DemoRequest) model.getObject(); + requestFormTester.setValue("username", "UserName2"); + requestFormTester.setValue("password", "PassWord2"); - assertEquals(Files.asResource(demoDir).path(), req.getDemoDir()); - String requestFileName = req.getRequestFileName(); - String requestUrl = req.getRequestUrl(); - String requestBody = req.getRequestBody(); + tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - assertEquals(requestName, requestFileName); - assertNotNull(requestUrl); - assertNull(requestBody); + model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); + assertEquals("UserName2", model.getUserName()); + assertEquals("PassWord2", model.getPassword()); } @Test - public void testUrlLinkModified() { - // print(tester.getLastRenderedPage(), true, true); - + public void testDropDownChanged() { final FormTester requestFormTester = tester.newFormTester("demoRequestsForm"); - - final String requestName = "WMS_describeLayer.url"; - - requestFormTester.select("demoRequestsList", 1); - - /* - * There's an AjaxFormSubmitBehavior attached to onchange so force it - */ + requestFormTester.select("demoRequestsList", 0); tester.executeAjaxEvent("demoRequestsForm:demoRequestsList", "change"); - tester.assertModelValue("demoRequestsForm:demoRequestsList", requestName); - - final String modifiedUrl = "http://modified/url"; + var model = (DemoRequest) tester.getLastRenderedPage().getDefaultModel().getObject(); - TextField url = (TextField) tester.getComponentFromLastRenderedPage("demoRequestsForm:url"); - url.setModelValue(new String[] {modifiedUrl}); + assertEquals("WFS_getFeature-1.1.xml", model.getRequestFileName()); + assertEquals("http://localhost/context/wfs", model.getRequestUrl()); + assertTrue(model.getRequestBody().startsWith(" - - - - + dispatcher dispatcher - wfsTestServlet diff --git a/src/wfs/src/main/java/org/geoserver/wfs/CapabilitiesTransformer.java b/src/wfs/src/main/java/org/geoserver/wfs/CapabilitiesTransformer.java index ba25138ea3e..87ad4792472 100644 --- a/src/wfs/src/main/java/org/geoserver/wfs/CapabilitiesTransformer.java +++ b/src/wfs/src/main/java/org/geoserver/wfs/CapabilitiesTransformer.java @@ -36,6 +36,7 @@ import org.geoserver.config.GeoServer; import org.geoserver.config.ResourceErrorHandling; import org.geoserver.data.InternationalContentHelper; +import org.geoserver.ows.ClientStreamAbortedException; import org.geoserver.ows.Dispatcher; import org.geoserver.ows.Request; import org.geoserver.ows.URLMangler.URLType; @@ -812,6 +813,8 @@ protected void handleFeatureTypes() { handleFeatureType(ftype); commit(); } catch (RuntimeException e) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(e); if (skipMisconfigured) { reset(); LOGGER.log( @@ -1721,6 +1724,8 @@ protected void featureTypes(boolean crs, String namespace) { featureType(featureType, crs); commit(); } catch (RuntimeException ex) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(ex); if (skipMisconfigured) { reset(); LOGGER.log( diff --git a/src/wfs/src/main/java/org/geoserver/wfs/DescribeFeatureType.java b/src/wfs/src/main/java/org/geoserver/wfs/DescribeFeatureType.java index 17416482495..b0729161f3e 100644 --- a/src/wfs/src/main/java/org/geoserver/wfs/DescribeFeatureType.java +++ b/src/wfs/src/main/java/org/geoserver/wfs/DescribeFeatureType.java @@ -16,6 +16,7 @@ import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.NamespaceInfo; import org.geoserver.config.ResourceErrorHandling; +import org.geoserver.ows.ClientStreamAbortedException; import org.geoserver.platform.ServiceException; import org.geoserver.wfs.request.DescribeFeatureTypeRequest; import org.geotools.util.logging.Logging; @@ -114,6 +115,8 @@ public FeatureTypeInfo[] run(DescribeFeatureTypeRequest request) throws WFSExcep ftInfo.getFeatureType(); // check that we can get a connection to this ftype requested.add(ftInfo); } catch (IOException ioe) { + // abort processing if the user closed the connection + ClientStreamAbortedException.rethrowUncheked(ioe); if (skipMisconfigured) { LOGGER.log( Level.WARNING, diff --git a/src/wfs/src/main/java/org/vfny/geoserver/wfs/servlets/TestWfsPost.java b/src/wfs/src/main/java/org/vfny/geoserver/wfs/servlets/TestWfsPost.java deleted file mode 100644 index 9d16f075842..00000000000 --- a/src/wfs/src/main/java/org/vfny/geoserver/wfs/servlets/TestWfsPost.java +++ /dev/null @@ -1,370 +0,0 @@ -/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved - * (c) 2001 - 2013 OpenPlans - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - */ -package org.vfny.geoserver.wfs.servlets; - -import com.google.common.annotations.VisibleForTesting; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLDecoder; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.text.StringEscapeUtils; -import org.geoserver.config.GeoServer; -import org.geoserver.ows.util.ResponseUtils; -import org.geoserver.platform.GeoServerExtensions; -import org.geotools.util.logging.Logging; - -/** - * Simple tester for WFS post requests. Can be called two ways. If called with no parameters, it - * displays the form, otherwise it displays the result page. - * - * @author Doug Cates: Moxi Media Inc. - * @version 1.0 - */ -public class TestWfsPost extends HttpServlet { - - /** - * The path at which TestWfsPost is exposed. Used to find the full location of GeoServer without - * doing complex and error prone string building - */ - static final String TEST_WFS_POST_PATH = "/TestWfsPost"; - - static final Logger LOGGER = Logging.getLogger(TestWfsPost.class); - - /** Initializes the servlet. */ - @Override - public void init(ServletConfig config) throws ServletException { - super.init(config); - } - - /** Destroys the servlet. */ - @Override - public void destroy() {} - - /** - * Handles the HTTP GET method. - * - * @param request servlet request - * @param response servlet response - */ - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** - * Handles the HTTP POST method. - * - * @param request servlet request - * @param response servlet response - */ - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - processRequest(request, response); - } - - /** Returns a short description of the servlet. */ - @Override - public String getServletInfo() { - return "Tests a WFS post request using a form entry."; - } - - /** - * Processes requests for both HTTP GET and POST methods. - * - * @param request servlet request - * @param response servlet response - */ - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - String requestString = request.getParameter("body"); - String urlString = request.getParameter("url"); - boolean doGet = (requestString == null) || requestString.trim().equals(""); - - if ((urlString == null)) { - @SuppressWarnings("PMD.CloseResource") // managed by the servlet - PrintWriter out = response.getWriter(); - StringBuffer urlInfo = request.getRequestURL(); - - if (urlInfo.indexOf("?") != -1) { - urlInfo.delete(urlInfo.indexOf("?"), urlInfo.length()); - } - - String geoserverUrl = - urlInfo.substring(0, urlInfo.indexOf("/", 8)) + request.getContextPath(); - response.setContentType("text/html"); - out.println(""); - out.println(""); - out.println(""); - out.println("TestWfsPost"); - out.println(""); - out.println(""); - out.println(""); - out.print("
      "); - out.println( - ""); - out.println(""); - out.println(""); - out.print("\n"); - out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println("
      URL:
      Request:
      "); - out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println(""); - out.println("
      "); - out.println("
      "); - out.println(""); - out.println(""); - out.close(); - } else { - response.setContentType("application/xml"); - - PrintWriter xmlOut = null; - try { // NOPMD - worried try-with-resource could close the connection - URL u = new URL(urlString); - validateURL(request, urlString, getProxyBaseURL()); - java.net.HttpURLConnection acon = (java.net.HttpURLConnection) u.openConnection(); - acon.setAllowUserInteraction(false); - - if (!doGet) { - // System.out.println("set to post"); - acon.setRequestMethod("POST"); - acon.setRequestProperty("Content-Type", "application/xml"); - } else { - // System.out.println("set to get"); - acon.setRequestMethod("GET"); - } - - acon.setDoOutput(true); - acon.setDoInput(true); - acon.setUseCaches(false); - - String username = request.getParameter("username"); - - if ((username != null) && !username.trim().equals("")) { - String password = request.getParameter("password"); - String up = username + ":" + password; - byte[] encoded = Base64.encodeBase64(up.getBytes()); - String authHeader = "Basic " + new String(encoded); - acon.setRequestProperty("Authorization", authHeader); - } - - if (!doGet) { - xmlOut = - new PrintWriter( - new BufferedWriter( - new OutputStreamWriter(acon.getOutputStream()))); - xmlOut = new java.io.PrintWriter(acon.getOutputStream()); - - xmlOut.write(requestString); - xmlOut.flush(); - } - - // Above 400 they're all error codes, see: - // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html - if (acon.getResponseCode() >= 400) { - // Construct the full response before writing, so that we don't throw an - // exception partway through. - StringBuilder responseContent = new StringBuilder(); - responseContent.append("\n"); - responseContent.append("\n"); - responseContent.append("HTTP response: "); - responseContent.append(acon.getResponseCode()); - responseContent.append("\n"); - if (acon.getResponseMessage() != null) { - responseContent.append( - URLDecoder.decode(acon.getResponseMessage(), "UTF-8")); - } - responseContent.append("\n"); - - @SuppressWarnings("PMD.CloseResource") // managed by the servlet - PrintWriter out = response.getWriter(); - out.print(responseContent.toString()); - } else { - // xmlIn = new BufferedReader(new InputStreamReader( - // acon.getInputStream())); - // String line; - - // System.out.println("got encoding from acon: " - // + acon.getContentType()); - response.setContentType(acon.getContentType()); - response.setHeader( - "Content-disposition", acon.getHeaderField("Content-disposition")); - - @SuppressWarnings("PMD.CloseResource") // managed by the servlet - OutputStream output = response.getOutputStream(); - int c; - try (InputStream in = acon.getInputStream()) { - while ((c = in.read()) != -1) output.write(c); - } - } - - // while ((line = xmlIn.readLine()) != null) { - // out.print(line); - // } - } catch (Exception e) { - LOGGER.log(Level.FINE, "Failure dealing with the request", e); - @SuppressWarnings("PMD.CloseResource") // managed by the servlet - PrintWriter out = response.getWriter(); - out.print(errorResponse(e)); - } finally { - try { - if (xmlOut != null) { - xmlOut.close(); - } - } catch (Exception e2) { - LOGGER.log(Level.FINE, "Internal failure dealing with the request", e2); - @SuppressWarnings("PMD.CloseResource") // managed by the servlet - PrintWriter out = response.getWriter(); - out.print(errorResponse(e2)); - } - } - } - } - - public String errorResponse(Exception e) { - StringBuilder responseContent = new StringBuilder(); - responseContent.append("\n"); - responseContent.append("\n"); - responseContent.append(ResponseUtils.encodeXML(e.toString())); - responseContent.append("\n"); - - return responseContent.toString(); - } - - String getProxyBaseURL() { - if (GeoServerExtensions.getProperty("PROXY_BASE_URL") != null) { - return GeoServerExtensions.getProperty("PROXY_BASE_URL"); - } - GeoServer geoServer = getGeoServer(); - if (geoServer != null) { - return geoServer.getGlobal().getSettings().getProxyBaseUrl(); - } - return null; - } - - @VisibleForTesting - protected GeoServer getGeoServer() { - return (GeoServer) GeoServerExtensions.bean("geoServer"); - } - - /** - * Validates the destination URL parameter sent to the TestWfsPost to execute, to verify it is - * valid, and the request is actually coming from geoserver. - * - *

      Two cases are checked, depending on whether or not GeoServer's Proxy Base URL is set. - * - *

      If the Proxy Base URL is set, the host of the url parameter should match that of the Proxy - * Base URL (since the HTTP request is coming from inside GeoServer, while the url parameter is - * external) - * - *

      Otherwise, the host of the url parameter should match that of the HTTP request. - * - *

      In both cases, the path of the request url should be that of the TestWfsPost servlet - * endpoint. - * - * @param request The HTTP request sent from Wicket to the TestWfsPost servlet - * @param urlString The url that the TestWfsPost servlet is being asked to send an OWS request - * to. - * @param proxyBase The proxy base URL of GeoServer - * @throws IllegalArgumentException - If the arguments are malformed or otherwise invalid - * @throws IllegalStateException - If something else is wrong - */ - void validateURL(HttpServletRequest request, String urlString, String proxyBase) { - URL url; - URL requestUrl; - - try { - url = new URL(urlString); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("Invalid url requested; not a URL: " + urlString, e); - } - String requestString = request.getRequestURL().toString(); - requestString = requestString.substring(0, requestString.lastIndexOf(TEST_WFS_POST_PATH)); - try { - requestUrl = new URL(requestString); - } catch (MalformedURLException e) { - throw new IllegalStateException("Invalid request url; not a URL: " + requestString, e); - } - - // this should not happen, but let's not make it an open proxy if it does - if (!request.getServletPath().equals(TEST_WFS_POST_PATH)) { - throw new IllegalStateException( - "Unepected, the TestWfsPost was accessed by a path not ending with TestWfsPost: " - + requestString); - } - if (null != requestUrl.getQuery()) { - throw new IllegalStateException( - "Unepected, the TestWfsPost was accessed by a path not ending with TestWfsPost: " - + requestString); - } - if (!request.getContextPath().equals(this.getServletContext().getContextPath())) { - throw new IllegalStateException( - "Unepected, the TestWfsPost was accessed by a path from a different servlet context: " - + requestString); - } - if (!url.getProtocol().equalsIgnoreCase("http") - && !url.getProtocol().equalsIgnoreCase("https")) { - throw new IllegalArgumentException( - "Invalid url requested; not an HTTP or HTTPS URL: " + urlString); - } else { - for (String path : url.getPath().split("/")) { - if (path.equals("..") || ResponseUtils.urlDecode(path).equals("..")) { - throw new IllegalArgumentException( - "Invalid url requested; illegal sequence '..' in URL: " + urlString); - } - } - } - - String baseUrlString = requestString; - URL baseUrl = requestUrl; - if (proxyBase != null) { - try { - baseUrlString = proxyBase; - baseUrl = new URL(proxyBase); - } catch (MalformedURLException e) { - throw new IllegalArgumentException( - "Invalid Proxy Base URL; not a URL: " + proxyBase, e); - } - } - String urlPath = url.getPath(); - urlPath += urlPath.endsWith("/") ? "" : "/"; - String baseUrlPath = baseUrl.getPath(); - baseUrlPath += baseUrlPath.endsWith("/") ? "" : "/"; - if (!url.getProtocol().equals(baseUrl.getProtocol()) - || !url.getHost().equals(baseUrl.getHost()) - || url.getPort() != baseUrl.getPort() - || !urlPath.startsWith(baseUrlPath)) { - throw new IllegalArgumentException( - "Invalid url requested, the demo requests should be hitting: " + baseUrlString); - } - } -} diff --git a/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostOnlineIntegrationTest.java b/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostOnlineIntegrationTest.java deleted file mode 100644 index a88c82d9c22..00000000000 --- a/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostOnlineIntegrationTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* (c) 2018 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - */ -package org.vfny.geoserver.wfs.servlets; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import javax.servlet.ServletException; -import org.apache.commons.codec.binary.Base64; -import org.junit.Assume; -import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; - -/** - * Tests the functionality of the {@link TestWfsPost} servlet on a running geoserver. - * - *

      This test assumes a running GeoServer on port 8080 with the release data dir. - * - * @author Torben Barsballe - */ -public class TestWfsPostOnlineIntegrationTest { - - public static final String WFS_REQUEST = - "\n" - + " \n" - + " \n" - + " \n" - + " \n" - + " \n" - + ""; - - protected MockHttpServletResponse doWfsPost() throws ServletException, IOException { - return doWfsPost(null, null); - } - - protected MockHttpServletResponse doWfsPost(String username, String password) - throws ServletException, IOException { - return doWfsPost(username, password, false); - } - - protected MockHttpServletResponse doWfsPost( - String username, String password, boolean useHttpBasicAuth) - throws ServletException, IOException { - TestWfsPost servlet = TestWfsPostTest.buildMockServlet(); - MockHttpServletRequest request = TestWfsPostTest.buildMockRequest(); - request.setParameter("url", "http://localhost:8080/geoserver/wfs"); - request.setParameter("body", WFS_REQUEST); - - if (username != null && password != null) { - if (useHttpBasicAuth) { - String up = username + ":" + password; - byte[] encoded = Base64.encodeBase64(up.getBytes()); - String authHeader = "Basic " + new String(encoded); - request.addHeader("Authorization", authHeader); - } else { - request.setParameter("username", username); - request.setParameter("password", password); - } - } - request.setMethod("GET"); - - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - - return response; - } - - private boolean isOnline() { - try { - URL u = new URL("http://localhost:8080/geoserver"); - HttpURLConnection huc = (HttpURLConnection) u.openConnection(); - huc.setRequestMethod("HEAD"); - huc.connect(); - return huc.getResponseCode() == 200; - } catch (IOException e) { - return false; - } - } - - @Test - public void testWfsPost() throws ServletException, IOException { - Assume.assumeTrue(isOnline()); - MockHttpServletResponse response = doWfsPost(); - - assertTrue(response.getContentAsString().contains("wfs:FeatureCollection")); - } - - @Test - public void testWfsPostAuthenticated() throws ServletException, IOException { - Assume.assumeTrue(isOnline()); - MockHttpServletResponse response = doWfsPost("admin", "geoserver"); - - assertTrue(response.getContentAsString().contains("wfs:FeatureCollection")); - } - - @Test - public void testWfsPostInvalidAuth() throws ServletException, IOException { - Assume.assumeTrue(isOnline()); - MockHttpServletResponse response = doWfsPost("admin", "badpassword"); - - assertFalse(response.getContentAsString().contains("wfs:FeatureCollection")); - assertTrue(response.getContentAsString().contains("HTTP response: 401")); - } - - @Test - public void testWfsPostNotForwardingHeader() throws IOException, ServletException { - Assume.assumeTrue(isOnline()); - // Use a header with bad credentials, expecting it will be ignored - MockHttpServletResponse response = doWfsPost("admin", "badpassword", true); - - assertFalse(response.getContentAsString().contains("HTTP response: 401")); - assertTrue(response.getContentAsString().contains("wfs:FeatureCollection")); - } -} diff --git a/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostTest.java b/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostTest.java deleted file mode 100644 index 417d432ce72..00000000000 --- a/src/wfs/src/test/java/org/vfny/geoserver/wfs/servlets/TestWfsPostTest.java +++ /dev/null @@ -1,340 +0,0 @@ -/* (c) 2016 Open Source Geospatial Foundation - all rights reserved - * This code is licensed under the GPL 2.0 license, available at the root - * application directory. - */ -package org.vfny.geoserver.wfs.servlets; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import javax.servlet.ServletException; -import org.geoserver.config.GeoServer; -import org.geoserver.config.GeoServerInfo; -import org.geoserver.config.SettingsInfo; -import org.geoserver.config.impl.GeoServerImpl; -import org.geoserver.config.impl.GeoServerInfoImpl; -import org.geoserver.config.impl.SettingsInfoImpl; -import org.geoserver.ows.util.ResponseUtils; -import org.junit.Test; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.mock.web.MockHttpServletResponse; -import org.springframework.mock.web.MockServletConfig; -import org.springframework.mock.web.MockServletContext; - -public class TestWfsPostTest { - - /** The proxy base url variable */ - static final String PROXY_BASE_URL = "PROXY_BASE_URL"; - - @Test - public void testEscapeXMLReservedChars() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.addHeader("Host", "localhost:8080"); - request.setQueryString(ResponseUtils.getQueryString("form_hf_0=&url=vjoce<>:garbage")); - request.setParameter("url", "vjoce<>:garbage"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - // System.out.println(response.getContentAsString()); - // check xml chars have been escaped - assertTrue( - response.getContentAsString() - .contains( - "java.net.MalformedURLException: no protocol: vjoce<>:garbage")); - } - - @Test - public void testDisallowNonHttpProtocols() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "file:///"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString("Invalid url requested; not an HTTP or HTTPS URL: file:///")); - } - - @Test - public void testDisallowPathTraversalUnescaped() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://localhost:8080/geoserver/.."); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested; illegal sequence '..' in URL: http://localhost:8080/geoserver/..")); - } - - @Test - public void testDisallowPathTraversalEscaped() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://localhost:8080/geoserver/%2E%2E"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested; illegal sequence '..' in URL: http://localhost:8080/geoserver/%2E%2E")); - } - - @Test - public void testDisallowOpenProxyWrongProtocol() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://localhost:8080/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: http://localhost:8080/geoserver")); - } - - @Test - public void testDisallowOpenProxyWrongHost() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://geoserver.org:8080/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: http://localhost:8080/geoserver")); - } - - @Test - public void testDisallowOpenProxyWrongPort() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://localhost/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: http://localhost:8080/geoserver")); - } - - @Test - public void testDisallowOpenProxyWrongPath() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://localhost:8080/foo"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: http://localhost:8080/geoserver")); - } - - @Test - public void testDisallowOpenProxyWithProxyBaseWrongProtocol() throws Exception { - TestWfsPost servlet = buildMockServlet("https://geoserver.org/geoserver"); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://geoserver.org/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: https://geoserver.org/geoserver")); - } - - @Test - public void testDisallowOpenProxyWithProxyBaseWrongHost() throws Exception { - TestWfsPost servlet = buildMockServlet("https://geoserver.org/geoserver"); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://localhost/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: https://geoserver.org/geoserver")); - } - - @Test - public void testDisallowOpenProxyWithProxyBaseWrongPort() throws Exception { - TestWfsPost servlet = buildMockServlet("https://geoserver.org/geoserver"); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://geoserver.org:1234/geoserver/wfs"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: https://geoserver.org/geoserver")); - } - - @Test - public void testDisallowOpenProxyWithProxyBaseWrongPath() throws Exception { - TestWfsPost servlet = buildMockServlet("https://geoserver.org/geoserver"); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "https://geoserver.org/foo"); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - assertThat( - response.getContentAsString(), - containsString( - "Invalid url requested, the demo requests should be hitting: https://geoserver.org/geoserver")); - } - - @Test - public void testDisallowOpenProxyWithSupersetNameWithProxyBase() throws Exception { - TestWfsPost servlet = buildMockServlet("http://geoserver.org"); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://geoserver.org.other"); - request.setMethod("GET"); - - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - // checking that request is disallowed - assertTrue( - response.getContentAsString() - .contains( - "Invalid url requested, the demo requests should be hitting: http://geoserver.org")); - } - - @Test - public void testValidateURL() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setParameter("url", "http://localhost:1234/internalApp"); - request.setMethod("GET"); - - try { - servlet.validateURL( - request, "http://localhost:1234/internalApp", "http://geoserver.org/geoserver"); - fail("Requests should be limited by proxyBaseURL"); - } catch (IllegalArgumentException expected) { - assertTrue( - expected.getMessage() - .contains( - "Invalid url requested, the demo requests should be hitting: http://geoserver.org/geoserver")); - } - } - - @Test - public void testGetProxyBaseURL() { - SettingsInfo settings = new SettingsInfoImpl(); - settings.setProxyBaseUrl("https://foo.com/geoserver"); - - GeoServerInfo info = new GeoServerInfoImpl(); - info.setSettings(settings); - - GeoServer gs = new GeoServerImpl(); - gs.setGlobal(info); - - TestWfsPost servlet = - new TestWfsPost() { - @Override - protected GeoServer getGeoServer() { - return gs; - } - }; - assertEquals("https://foo.com/geoserver", servlet.getProxyBaseURL()); - } - - @Test - // https://osgeo-org.atlassian.net/browse/GEOS-11385 - public void testGetProxyBaseURLfromEnv() { - SettingsInfo settings = new SettingsInfoImpl(); - settings.setProxyBaseUrl("https://foo.com/geoserver1"); - // Override the Proxy Base Url with the Environment variable - System.setProperty("PROXY_BASE_URL", "https://foo.com/geoserver2"); - - GeoServerInfo info = new GeoServerInfoImpl(); - info.setSettings(settings); - - GeoServer gs = new GeoServerImpl(); - gs.setGlobal(info); - - TestWfsPost servlet = - new TestWfsPost() { - @Override - protected GeoServer getGeoServer() { - return gs; - } - }; - assertEquals("https://foo.com/geoserver2", servlet.getProxyBaseURL()); - System.clearProperty("PROXY_BASE_URL"); - } - - @Test - public void testRemovedInlineJavaScript() throws Exception { - TestWfsPost servlet = buildMockServlet(); - MockHttpServletRequest request = buildMockRequest(); - request.setMethod("GET"); - MockHttpServletResponse response = new MockHttpServletResponse(); - servlet.service(request, response); - String result = response.getContentAsString(); - assertThat( - result, - containsString("")); - assertThat(result, not(containsString("