From a1f38d7742470e7706235bb3ac5a328a9558cece Mon Sep 17 00:00:00 2001 From: Joseph Miller Date: Fri, 6 Dec 2024 19:10:11 -0500 Subject: [PATCH 1/8] [GEOS-11632] OGCAPI tests are failing due to not reverting altered layers coverages revert changes is different --- .../ogcapi/v1/coverages/CollectionsTest.java | 17 +++++++++++++++++ .../ogcapi/v1/features/CollectionsTest.java | 7 +++++++ .../ogcapi/v1/maps/CollectionsTest.java | 6 ++++++ 3 files changed, 30 insertions(+) diff --git a/src/community/ogcapi/ogcapi-coverages/src/test/java/org/geoserver/ogcapi/v1/coverages/CollectionsTest.java b/src/community/ogcapi/ogcapi-coverages/src/test/java/org/geoserver/ogcapi/v1/coverages/CollectionsTest.java index d773efd057e..c8a82bc5ca2 100644 --- a/src/community/ogcapi/ogcapi-coverages/src/test/java/org/geoserver/ogcapi/v1/coverages/CollectionsTest.java +++ b/src/community/ogcapi/ogcapi-coverages/src/test/java/org/geoserver/ogcapi/v1/coverages/CollectionsTest.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue; import com.jayway.jsonpath.DocumentContext; +import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -29,8 +30,10 @@ import org.geoserver.ogcapi.APIDispatcher; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.wcs.WCSInfo; +import org.geotools.geometry.jts.ReferencedEnvelope; import org.hamcrest.Matchers; import org.jsoup.Jsoup; +import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; @@ -63,6 +66,20 @@ public void testSkipMisconfigured() throws Exception { assertEquals(expected - 1, (int) json2.read("collections.length()", Integer.class)); } + @Before + public void revertChanges() throws IOException { + CoverageInfo c = getCatalog().getCoverageByName("rs", "BlueMarble"); + ReferencedEnvelope blueMarbleExtent = + new ReferencedEnvelope( + 146.49999999999477, + 147.99999999999474, + -44.49999999999785, + -42.99999999999787, + c.getCRS()); + c.setLatLonBoundingBox(blueMarbleExtent); + getCatalog().save(c); + } + @SuppressWarnings("unchecked") // generics varargs creation by hamcrest private void testCollectionsJson(DocumentContext json) throws Exception { int expected = getCatalog().getCoverages().size(); diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java index 5e6bb3af3fa..efedeee7451 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java +++ b/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java @@ -15,6 +15,7 @@ import static org.junit.Assert.assertTrue; import com.jayway.jsonpath.DocumentContext; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -38,6 +39,7 @@ import org.geoserver.wfs.WFSInfo; import org.hamcrest.Matchers; import org.jsoup.Jsoup; +import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; @@ -64,6 +66,11 @@ protected void onSetUp(SystemTestData testData) throws Exception { getCatalog().save(basicPolygons); } + @Before + public void revertChanges() throws IOException { + revertLayer(MockData.BUILDINGS); + } + @Test public void testCollectionsJson() throws Exception { DocumentContext json = getAsJSONPath("ogc/features/v1/collections", 200); diff --git a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionsTest.java b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionsTest.java index c02e4c78c38..50edd7c0e21 100644 --- a/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionsTest.java +++ b/src/community/ogcapi/ogcapi-maps/src/test/java/org/geoserver/ogcapi/v1/maps/CollectionsTest.java @@ -8,6 +8,7 @@ import static org.junit.Assert.assertTrue; import com.jayway.jsonpath.DocumentContext; +import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; @@ -18,11 +19,16 @@ import org.geoserver.ogcapi.APIDispatcher; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.test.GeoServerSystemTestSupport; +import org.junit.Before; import org.junit.Test; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; public class CollectionsTest extends MapsTestSupport { + @Before + public void revertChanges() throws IOException { + revertLayer(MockData.BUILDINGS); + } @Test public void testCollectionsJsonDefault() throws Exception { From 36a2a84452bee1ca8964b3914e6fe3fd5b613f7b Mon Sep 17 00:00:00 2001 From: Joseph Miller Date: Thu, 5 Dec 2024 14:04:56 -0500 Subject: [PATCH 2/8] [GEOS-11630] REST API throws HTTP 500 When Security Metadata Has Null Attributes PR Changes Left out expansion of allowed REST HTTP methods --- .../security/RESTfulDefinitionSource.java | 5 +- .../GeoServerSecurityInterceptorFilter.java | 30 ++++--- ...RequestHeaderAuthenticationFilterTest.java | 79 ++++++++++++++++++- 3 files changed, 101 insertions(+), 13 deletions(-) diff --git a/src/main/src/main/java/org/geoserver/security/RESTfulDefinitionSource.java b/src/main/src/main/java/org/geoserver/security/RESTfulDefinitionSource.java index 47e4d7b1af9..c3a5871a078 100644 --- a/src/main/src/main/java/org/geoserver/security/RESTfulDefinitionSource.java +++ b/src/main/src/main/java/org/geoserver/security/RESTfulDefinitionSource.java @@ -29,10 +29,11 @@ public class RESTfulDefinitionSource implements FilterInvocationSecurityMetadata private static Logger log = Logging.getLogger(RESTfulDefinitionSource.class); - private static final String[] validMethodNames = {"GET", "PUT", "DELETE", "POST"}; + private static final String[] validMethodNames = {"GET", "PUT", "DELETE", "POST", "HEAD"}; /** Underlying SecurityMetedataSource object */ private RESTfulDefinitionSourceDelegateMap delegate = null; + /** rest access rules dao */ private RESTAccessRuleDAO dao; @@ -190,7 +191,7 @@ private void processPathList(String pathToRoleList) throws IllegalArgumentExcept throw new IllegalArgumentException( "The HTTP Method Name (" + s - + " does NOT equal a valid name (GET,PUT,POST,DELETE)"); + + " does NOT equal a valid name (GET,PUT,POST,DELETE,HEAD)"); } } } diff --git a/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityInterceptorFilter.java b/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityInterceptorFilter.java index 6c7a06639af..6a53573b713 100644 --- a/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityInterceptorFilter.java +++ b/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityInterceptorFilter.java @@ -10,6 +10,8 @@ import java.io.IOException; import java.util.Collection; +import java.util.Collections; +import java.util.Optional; import java.util.function.Supplier; import javax.servlet.http.HttpServletRequest; import org.geoserver.security.config.SecurityInterceptorFilterConfig; @@ -109,9 +111,10 @@ private AuthorizationDecision vote( @Override public AuthorizationDecision check( Supplier authentication, HttpServletRequest request) { - Collection attributes = metadata.getAttributes(request); - AuthorizationDecision vote = vote(authentication.get(), request, attributes); - return vote; + Collection attributes = + Optional.ofNullable(metadata.getAttributes(request)) + .orElse(Collections.emptySet()); + return vote(authentication.get(), request, attributes); } } @@ -159,9 +162,10 @@ private AuthorizationDecision vote( @Override public AuthorizationDecision check( Supplier authentication, HttpServletRequest request) { - Collection attributes = metadata.getAttributes(request); - AuthorizationDecision vote = vote(authentication.get(), request, attributes); - return vote; + Collection attributes = + Optional.ofNullable(metadata.getAttributes(request)) + .orElse(Collections.emptySet()); + return vote(authentication.get(), request, attributes); } } @@ -210,14 +214,12 @@ public AuthorizationDecision check( } } - @Override - public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOException { + public void initializeFromConfig( + SecurityNamedServiceConfig config, SecurityMetadataSource source) throws IOException { super.initializeFromConfig(config); SecurityInterceptorFilterConfig siConfig = (SecurityInterceptorFilterConfig) config; boolean allowIfAllAbstainDecisions = siConfig.isAllowIfAllAbstainDecisions(); - String sourceName = siConfig.getSecurityMetadataSource(); - SecurityMetadataSource source = (SecurityMetadataSource) bean(sourceName); AuthenticatedAuthorizationManager aam = new AuthenticatedAuthorizationManager(source); RoleAuthorizationManager ram = new RoleAuthorizationManager(source); @@ -227,4 +229,12 @@ public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOExc getNestedFilters().add(filter); } + + @Override + public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOException { + SecurityInterceptorFilterConfig siConfig = (SecurityInterceptorFilterConfig) config; + String sourceName = siConfig.getSecurityMetadataSource(); + SecurityMetadataSource source = (SecurityMetadataSource) bean(sourceName); + initializeFromConfig(config, source); + } } diff --git a/src/main/src/test/java/org/geoserver/security/filter/GeoServerRequestHeaderAuthenticationFilterTest.java b/src/main/src/test/java/org/geoserver/security/filter/GeoServerRequestHeaderAuthenticationFilterTest.java index 1acdde7ae07..6c5446f7cf4 100644 --- a/src/main/src/test/java/org/geoserver/security/filter/GeoServerRequestHeaderAuthenticationFilterTest.java +++ b/src/main/src/test/java/org/geoserver/security/filter/GeoServerRequestHeaderAuthenticationFilterTest.java @@ -6,16 +6,28 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import java.io.File; +import java.io.IOException; +import java.util.Collection; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.geoserver.config.GeoServerDataDirectory; import org.geoserver.security.GeoServerSecurityManager; import org.geoserver.security.config.PreAuthenticatedUserNameFilterConfig; +import org.geoserver.security.config.SecurityInterceptorFilterConfig; import org.junit.Test; import org.springframework.mock.web.MockFilterChain; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.access.SecurityMetadataSource; +import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextImpl; @@ -39,7 +51,10 @@ public void testAuthenticationViaPreAuthChanging() throws Exception { new GeoServerSecurityManager(new GeoServerDataDirectory(new File("/tmp")))); toTest.setRoleSource( PreAuthenticatedUserNameFilterConfig.PreAuthenticatedUserNameRoleSource.Header); - + SecurityInterceptorFilterConfig filterCfg = new SecurityInterceptorFilterConfig(); + filterCfg.setName("custom"); + filterCfg.setClassName(AuthCapturingFilter.class.getName()); + filterCfg.setSecurityMetadataSource("geoserverMetadataSource"); toTest.doFilter(request, response, filterChain); assertEquals( @@ -47,6 +62,68 @@ public void testAuthenticationViaPreAuthChanging() throws Exception { SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString()); } + static class AuthCapturingFilter extends GeoServerSecurityFilter + implements GeoServerAuthenticationFilter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + request.setAttribute("auth", auth); + chain.doFilter(request, response); + } + + @Override + public boolean applicableForHtml() { + return true; + } + + @Override + public boolean applicableForServices() { + return true; + } + } + + @Test + public void testAuthenticationWithNullAttributes() throws Exception { + MockHttpServletRequest request = new MockHttpServletRequest(); + HttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain filterChain = new MockFilterChain(); + GeoServerSecurityInterceptorFilter toTest2 = new GeoServerSecurityInterceptorFilter(); + toTest2.setSecurityManager( + new GeoServerSecurityManager(new GeoServerDataDirectory(new File("/tmp")))); + toTest2.setSecurityManager( + new GeoServerSecurityManager(new GeoServerDataDirectory(new File("/tmp")))); + SecurityInterceptorFilterConfig filterCfg = new SecurityInterceptorFilterConfig(); + filterCfg.setName("custom"); + filterCfg.setClassName(AuthCapturingFilter.class.getName()); + filterCfg.setSecurityMetadataSource("geoserverMetadataSource"); + SecurityMetadataSource metadataSource = + new SecurityMetadataSource() { + @Override + public Collection getAttributes(Object object) + throws IllegalArgumentException { + return null; + } + + @Override + public Collection getAllConfigAttributes() { + return null; + } + + @Override + public boolean supports(Class clazz) { + return false; + } + }; + toTest2.initializeFromConfig(filterCfg, metadataSource); + try { + toTest2.doFilter(request, response, filterChain); + fail("Expected AccessDeniedException because the attributes are empty"); + } catch (AccessDeniedException e) { + assertEquals("Access Denied", e.getMessage()); + } + } + @Test public void testAuthenticationViaPreAuthNoHeader() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); From 704f5bc45687fdd785487318c131df3286b74acd Mon Sep 17 00:00:00 2001 From: Gabriel Roldan Date: Mon, 9 Dec 2024 07:40:13 -0300 Subject: [PATCH 3/8] [GEOS-11627] OGCAPI FeatureService Extension (GSIP-230) (#8070) * [GEOS-11627] OGCAPI FeatureService Extension (GSIP-230) Promote `ogcapi-core` and `ogcapi-features` to extension * Update ogc-api features docs for extension status * Restore build after merge from main * Make the tests conformant with Windows OS --------- Co-authored-by: Andrea Aime --- .../community/ogc-api/features/index.rst | 28 ++++----- .../features-templating-ogcapi/pom.xml | 6 +- src/community/gsr/pom.xml | 2 +- .../ogcapi/dggs/ogcapi-dggs-assembly/pom.xml | 2 +- src/community/ogcapi/dggs/ogcapi-dggs/pom.xml | 6 +- src/community/ogcapi/dggs/web-dggs/pom.xml | 4 +- src/community/ogcapi/ogcapi-changeset/pom.xml | 2 +- .../ogcapi/ogcapi-coverages-assembly/pom.xml | 2 +- src/community/ogcapi/ogcapi-coverages/pom.xml | 4 +- .../ogcapi/ogcapi-features-assembly/pom.xml | 50 --------------- .../src/assembly/assembly.xml | 34 ----------- .../ogcapi/ogcapi-images-assembly/pom.xml | 2 +- src/community/ogcapi/ogcapi-images/pom.xml | 6 +- .../ogcapi/ogcapi-maps-assembly/pom.xml | 2 +- src/community/ogcapi/ogcapi-maps/pom.xml | 4 +- .../ogcapi/ogcapi-styles-assembly/pom.xml | 2 +- src/community/ogcapi/ogcapi-styles/pom.xml | 6 +- .../ogcapi-tiled-features-assembly/pom.xml | 2 +- .../ogcapi/ogcapi-tiled-features/pom.xml | 4 +- .../ogcapi/ogcapi-tiles-assembly/pom.xml | 2 +- src/community/ogcapi/ogcapi-tiles/pom.xml | 4 +- src/community/ogcapi/pom.xml | 5 -- src/community/ogcapi/web-coverages/pom.xml | 2 +- src/community/ogcapi/web-images/pom.xml | 2 +- src/community/ogcapi/web-maps/pom.xml | 2 +- src/community/ogcapi/web-styles/pom.xml | 2 +- src/community/ogcapi/web-tiles/pom.xml | 2 +- .../oseo/oseo-integration-tests/pom.xml | 2 +- src/community/oseo/oseo-stac/pom.xml | 4 +- src/community/pom.xml | 9 --- .../ogcapi/ogcapi-core/pom.xml | 4 +- .../org/geoserver/ogcapi/APIBBoxParser.java | 0 .../ogcapi/APIBodyMethodProcessor.java | 0 .../ogcapi/APIConfigurationSupport.java | 0 .../org/geoserver/ogcapi/APIConformance.java | 0 .../ogcapi/APIContentNegotiationManager.java | 0 .../org/geoserver/ogcapi/APIDispatcher.java | 0 .../org/geoserver/ogcapi/APIException.java | 0 .../geoserver/ogcapi/APIExceptionHandler.java | 0 .../org/geoserver/ogcapi/APIFilterParser.java | 0 .../org/geoserver/ogcapi/APIRequestInfo.java | 0 .../org/geoserver/ogcapi/APISearchQuery.java | 0 .../java/org/geoserver/ogcapi/APIService.java | 0 .../ogcapi/APIServiceFactoryBean.java | 0 .../ogcapi/AbstractAPIExceptionHandler.java | 0 .../ogcapi/AbstractCollectionDocument.java | 0 .../geoserver/ogcapi/AbstractDocument.java | 0 .../ogcapi/AbstractHTMLMessageConverter.java | 0 .../ogcapi/AbstractLandingPageDocument.java | 0 ...tractLandingPageDocumentNoConformance.java | 0 .../AbstractServiceHTMLMessageConverter.java | 0 .../ogcapi/AnnotatedHTMLMessageConverter.java | 0 .../org/geoserver/ogcapi/AttributeType.java | 0 .../ogcapi/ByteArrayMessageConverter.java | 0 .../geoserver/ogcapi/CollectionExtents.java | 0 .../geoserver/ogcapi/ConformanceClass.java | 0 .../geoserver/ogcapi/ConformanceDocument.java | 0 .../org/geoserver/ogcapi/ConformanceInfo.java | 0 .../geoserver/ogcapi/DateTimeConverter.java | 0 .../org/geoserver/ogcapi/DateTimeList.java | 0 .../ogcapi/DefaultAPIExceptionHandler.java | 0 .../geoserver/ogcapi/DefaultContentType.java | 0 .../geoserver/ogcapi/DocumentCallback.java | 0 .../ogcapi/FreemarkerTemplateSupport.java | 0 .../geoserver/ogcapi/FunctionsDocument.java | 0 .../geoserver/ogcapi/GeoServerOpenAPI.java | 0 .../ogcapi/HTMLExtensionCallback.java | 0 .../geoserver/ogcapi/HTMLResponseBody.java | 0 .../ogcapi/HttpHeaderLinksAppender.java | 0 .../InvalidParameterValueException.java | 0 .../ogcapi/JSONSchemaMessageConverter.java | 0 .../ogcapi/LandingPageSlashFilter.java | 0 .../main/java/org/geoserver/ogcapi/Link.java | 0 .../java/org/geoserver/ogcapi/LinkInfo.java | 0 .../geoserver/ogcapi/LinkInfoCallback.java | 0 .../geoserver/ogcapi/LinkInfoConverter.java | 0 .../org/geoserver/ogcapi/LinksBuilder.java | 0 .../ogcapi/LocalWorkspaceCallback.java | 0 .../ogcapi/LocalWorkspaceURLPathHelper.java | 0 .../MappingJackson2HttpMessageConverter.java | 0 .../MappingJackson2YAMLMessageConverter.java | 0 .../MessageConverterResponseAdapter.java | 0 .../geoserver/ogcapi/OGCAPIMediaTypes.java | 0 .../OGCAPIXStreamPersisterInitializer.java | 0 .../org/geoserver/ogcapi/OpenAPIBuilder.java | 0 .../org/geoserver/ogcapi/OpenAPICallback.java | 0 .../ogcapi/OpenAPIMessageConverter.java | 0 .../ogcapi/PaginationLinksBuilder.java | 0 .../geoserver/ogcapi/PropertiesParser.java | 0 .../java/org/geoserver/ogcapi/Queryables.java | 0 .../geoserver/ogcapi/QueryablesBuilder.java | 0 .../ogcapi/ResourceNotFoundException.java | 0 .../ogcapi/ResponseMessageConverter.java | 0 .../ogcapi/ReturnValueMethodParameter.java | 0 .../geoserver/ogcapi/SampleDataProvider.java | 0 .../org/geoserver/ogcapi/SortByConverter.java | 0 .../java/org/geoserver/ogcapi/Sortables.java | 0 .../org/geoserver/ogcapi/StyleDocument.java | 0 .../ogcapi/TimeExtentCalculator.java | 0 .../geoserver/ogcapi/impl/LinkInfoImpl.java | 0 .../main/resources/apicss/bootstrap.min.css | 0 .../src/main/resources/apicss/geoserver.css | 0 .../src/main/resources/apicss/img/logo.png | Bin .../src/main/resources/apicss/treeview.css | 0 .../src/main/resources/applicationContext.xml | 0 .../resources/org/geoserver/ogcapi/api.ftl | 0 .../org/geoserver/ogcapi/common-footer.ftl | 0 .../org/geoserver/ogcapi/common-header.ftl | 0 .../org/geoserver/ogcapi/conformance.ftl | 0 .../ogcapi/landingpage-conformance.ftl | 0 .../org/geoserver/ogcapi/queryables.ftl | 0 .../resources/swagger-ui/oauth2-redirect.html | 0 .../resources/swagger-ui/swagger-ui-bundle.js | 0 .../swagger-ui-standalone-preset.js | 0 .../main/resources/swagger-ui/swagger-ui.css | 0 .../main/resources/swagger-ui/swagger-ui.js | 0 .../main/resources/webresources/ogcapi/api.js | 0 .../resources/webresources/ogcapi/common.js | 0 .../geoserver/ogcapi/APIBBoxParserTest.java | 0 .../geoserver/ogcapi/APIRequestInfoTest.java | 0 .../ogcapi/ApiConfigurationSupportTest.java | 0 .../ogcapi/DateTimeConverterTest.java | 0 .../org/geoserver/ogcapi/HelloDocument.java | 0 .../ogcapi/HelloResponseMessageConverter.java | 0 .../org/geoserver/ogcapi/HelloService.java | 0 .../geoserver/ogcapi/HelloServiceTest.java | 4 +- .../HelloServiceTrailingSlashOffTest.java | 0 .../HelloServiceTrailingSlashOnTest.java | 0 .../java/org/geoserver/ogcapi/Message.java | 0 .../org/geoserver/ogcapi/MessageResponse.java | 0 .../geoserver/ogcapi/OGCApiTestSupport.java | 0 .../ogcapi/PaginationLinksBuilderTest.java | 0 .../QueryablesBuilderComplexFeaturesTest.java | 0 .../ogcapi/QueryablesBuilderTest.java | 0 .../ogcapi/TimeExtentCalculatorTest.java | 0 .../ogcapi/impl/LinkInfoImplTest.java | 0 .../geoserver/ogcapi/TimeElevation.properties | 0 .../ogcapi/TimeElevationEmpty.properties | 0 .../org/geoserver/ogcapi/message.ftl | 0 .../ogcapi/ogcapi-features/pom.xml | 8 +-- .../ogcapi/v1/features/CQL2Conformance.java | 0 .../v1/features/CollectionDocument.java | 0 .../v1/features/CollectionsDocument.java | 2 +- .../ogcapi/v1/features/ECQLConformance.java | 0 .../v1/features/FeatureConformance.java | 17 +++--- .../FeatureResponseMessageConverter.java | 0 .../ogcapi/v1/features/FeatureService.java | 6 +- ...ureServiceXStreamPersisterInitializer.java | 0 .../v1/features/FeaturesAPIBuilder.java | 0 .../v1/features/FeaturesExceptionHandler.java | 0 .../v1/features/FeaturesGetFeature.java | 0 .../v1/features/FeaturesLandingPage.java | 0 .../ogcapi/v1/features/FeaturesResponse.java | 0 .../features/FeaturesSampleDataProvider.java | 0 .../GetFeatureHTMLMessageConverter.java | 0 .../HttpHeaderContentCrsAppender.java | 0 .../v1/features/HttpHeaderLinksAppender.java | 0 .../v1/features/JSONFGFeaturesResponse.java | 0 .../v1/features/JSONFGSchemaBuilder.java | 0 .../features/RFCGeoJSONFeaturesResponse.java | 0 .../src/main/resources/applicationContext.xml | 0 .../ogcapi/v1/features/collection.ftl | 0 .../ogcapi/v1/features/collection_include.ftl | 0 .../ogcapi/v1/features/collections.ftl | 0 .../ogcapi/v1/features/functions.ftl | 0 .../features/getfeature-complex-content.ftl | 0 .../ogcapi/v1/features/getfeature-content.ftl | 0 .../ogcapi/v1/features/getfeature-empty.ftl | 0 .../ogcapi/v1/features/getfeature-footer.ftl | 0 .../ogcapi/v1/features/getfeature-header.ftl | 0 .../ogcapi/v1/features/landingPage.ftl | 0 .../geoserver/ogcapi/v1/features/openapi.yaml | 0 .../ogcapi/v1/features/schema/collection.json | 0 .../v1/features/schema/coordrefsys.json | 0 .../ogcapi/v1/features/schema/feature.json | 0 .../v1/features/schema/featuretype.json | 0 .../v1/features/schema/geometry-objects.json | 0 .../ogcapi/v1/features/schema/geometry.json | 0 .../ogcapi/v1/features/schema/link.json | 0 .../ogcapi/v1/features/schema/place.json | 0 .../ogcapi/v1/features/schema/time.json | 0 .../resources/webresources/ogcapi/features.js | 0 .../geoserver/ogcapi/v1/features/ApiTest.java | 0 .../CollectionDocumentBoundsTest.java | 0 .../ogcapi/v1/features/CollectionTest.java | 0 .../ogcapi/v1/features/CollectionsTest.java | 1 + .../v1/features/ComplexFeaturesTest.java | 0 .../ogcapi/v1/features/ConformanceTest.java | 0 .../v1/features/ExceptionHandlingTest.java | 0 .../ogcapi/v1/features/FeatureTest.java | 18 ++++++ .../v1/features/FeaturesTestSupport.java | 0 .../ogcapi/v1/features/FunctionsTest.java | 3 +- .../ogcapi/v1/features/JSONFGSchemaTest.java | 0 .../ogcapi/v1/features/LandingPageTest.java | 0 .../ogcapi/v1/features/QueryablesTest.java | 0 .../ogcapi/v1/features/functions-schema.yml | 0 .../ogcapi/v1/features/tiger_poi.properties | 0 .../v1/features/tiger_single_poi.properties | 0 src/extension/ogcapi/pom.xml | 36 +++++++++++ .../ogcapi/web-features/pom.xml | 8 +-- .../FeaturesServiceDescriptionProvider.java | 0 .../ogcapi/web/FeatureServiceAdminPanel.html | 0 .../ogcapi/web/FeatureServiceAdminPanel.java | 1 + .../ogcapi/web/ThreeStateAjaxCheckBox.java | 0 .../resources/GeoServerApplication.properties | 0 .../src/main/resources/applicationContext.xml | 0 .../ogcapi/web-ogcapi/pom.xml | 6 +- .../geoserver/web/ogcapi/LinkInfoEditor.html | 0 .../geoserver/web/ogcapi/LinkInfoEditor.java | 0 .../web/ogcapi/LinksMetadataMapModel.java | 0 .../web/ogcapi/OGCAPILayerConfig.html | 0 .../web/ogcapi/OGCAPILayerConfig.java | 0 .../web/ogcapi/OGCAPILinksSettingsPanel.html | 0 .../web/ogcapi/OGCAPILinksSettingsPanel.java | 0 .../OgcApiServiceDescriptionProvider.java | 0 .../resources/GeoServerApplication.properties | 0 .../src/main/resources/applicationContext.xml | 0 .../web/ogcapi/AbstractLinksEditorTest.java | 0 .../web/ogcapi/OGCLayerConfigTest.java | 0 .../web/ogcapi/OGCSettingsConfigTest.java | 0 .../OGCWorkspaceSettingsConfigTest.java | 0 .../OgcApiServiceDescriptionProviderTest.java | 0 .../web/ogcapi/provider/TestCaseInfo.java | 0 .../web/ogcapi/provider/TestCaseInfoImpl.java | 0 .../provider/TestCaseInfoXStreamLoader.java | 0 ...tCaseOgcApiServiceDescriptionProvider.java | 0 .../web/ogcapi/provider/TestCaseService.java | 0 .../src/test/resources/applicationContext.xml | 0 src/extension/pom.xml | 17 ++++++ src/pom.xml | 1 + src/release/ext-ogcapi-features.xml | 57 ++++++++++++++++++ src/release/pom.xml | 20 ++++++ src/web/app/pom.xml | 10 +-- 233 files changed, 239 insertions(+), 184 deletions(-) delete mode 100644 src/community/ogcapi/ogcapi-features-assembly/pom.xml delete mode 100644 src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml rename src/{community => extension}/ogcapi/ogcapi-core/pom.xml (98%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBBoxParser.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBodyMethodProcessor.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConfigurationSupport.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConformance.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIContentNegotiationManager.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIDispatcher.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIException.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIExceptionHandler.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIFilterParser.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIRequestInfo.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIService.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIServiceFactoryBean.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractAPIExceptionHandler.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractCollectionDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractHTMLMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocumentNoConformance.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractServiceHTMLMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AnnotatedHTMLMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AttributeType.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ByteArrayMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/CollectionExtents.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceClass.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceInfo.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeList.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultAPIExceptionHandler.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultContentType.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DocumentCallback.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FreemarkerTemplateSupport.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FunctionsDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/GeoServerOpenAPI.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLExtensionCallback.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLResponseBody.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HttpHeaderLinksAppender.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/InvalidParameterValueException.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/JSONSchemaMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LandingPageSlashFilter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Link.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfo.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoCallback.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinksBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceCallback.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceURLPathHelper.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2HttpMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2YAMLMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MessageConverterResponseAdapter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIMediaTypes.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIXStreamPersisterInitializer.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPICallback.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PaginationLinksBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PropertiesParser.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Queryables.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/QueryablesBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResourceNotFoundException.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResponseMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ReturnValueMethodParameter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SampleDataProvider.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Sortables.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/StyleDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/TimeExtentCalculator.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/impl/LinkInfoImpl.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/apicss/bootstrap.min.css (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/apicss/geoserver.css (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/apicss/img/logo.png (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/apicss/treeview.css (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/applicationContext.xml (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/api.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-footer.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-header.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/conformance.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/landingpage-conformance.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/queryables.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/swagger-ui/oauth2-redirect.html (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-bundle.js (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-standalone-preset.js (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.css (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.js (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/api.js (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/common.js (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIBBoxParserTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIRequestInfoTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/ApiConfigurationSupportTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/DateTimeConverterTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloResponseMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloService.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java (99%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOffTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOnTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/Message.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/MessageResponse.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/OGCApiTestSupport.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/PaginationLinksBuilderTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderComplexFeaturesTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/TimeExtentCalculatorTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/impl/LinkInfoImplTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevation.properties (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevationEmpty.properties (100%) rename src/{community => extension}/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/message.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/pom.xml (93%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CQL2Conformance.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionDocument.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java (99%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/ECQLConformance.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java (98%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureResponseMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java (98%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureServiceXStreamPersisterInitializer.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesAPIBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesExceptionHandler.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesGetFeature.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesLandingPage.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesResponse.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesSampleDataProvider.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/GetFeatureHTMLMessageConverter.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderContentCrsAppender.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderLinksAppender.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGFeaturesResponse.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaBuilder.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/RFCGeoJSONFeaturesResponse.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/applicationContext.xml (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection_include.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/functions.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-complex-content.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-content.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-empty.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-footer.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-header.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/landingPage.ftl (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/collection.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/coordrefsys.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/feature.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/featuretype.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry-objects.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/link.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/place.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/time.json (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/main/resources/webresources/ogcapi/features.js (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ApiTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionDocumentBoundsTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java (99%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ComplexFeaturesTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ConformanceTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ExceptionHandlingTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java (99%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeaturesTestSupport.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java (96%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/QueryablesTest.java (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/functions-schema.yml (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_poi.properties (100%) rename src/{community => extension}/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_single_poi.properties (100%) create mode 100644 src/extension/ogcapi/pom.xml rename src/{community => extension}/ogcapi/web-features/pom.xml (85%) rename src/{community => extension}/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesServiceDescriptionProvider.java (100%) rename src/{community => extension}/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.html (100%) rename src/{community => extension}/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java (99%) rename src/{community => extension}/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/ThreeStateAjaxCheckBox.java (100%) rename src/{community => extension}/ogcapi/web-features/src/main/resources/GeoServerApplication.properties (100%) rename src/{community => extension}/ogcapi/web-features/src/main/resources/applicationContext.xml (100%) rename src/{community => extension}/ogcapi/web-ogcapi/pom.xml (91%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.html (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinksMetadataMapModel.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.html (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.html (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProvider.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/resources/GeoServerApplication.properties (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/main/resources/applicationContext.xml (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/AbstractLinksEditorTest.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCLayerConfigTest.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCSettingsConfigTest.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCWorkspaceSettingsConfigTest.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProviderTest.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfo.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoImpl.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoXStreamLoader.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseOgcApiServiceDescriptionProvider.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseService.java (100%) rename src/{community => extension}/ogcapi/web-ogcapi/src/test/resources/applicationContext.xml (100%) create mode 100644 src/release/ext-ogcapi-features.xml diff --git a/doc/en/user/source/community/ogc-api/features/index.rst b/doc/en/user/source/community/ogc-api/features/index.rst index da801e31db8..638b4a6adc5 100644 --- a/doc/en/user/source/community/ogc-api/features/index.rst +++ b/doc/en/user/source/community/ogc-api/features/index.rst @@ -46,7 +46,7 @@ Features Implementation status Installing the GeoServer OGC API Features module ------------------------------------------------ -#. Download the OGC API nightly GeoServer community module from :download_community:`ogcapi-features`. +#. Download the OGC API Features zip from the latest release (or nightly build) from :download_extension:`ogcapi-features`. .. warning:: Verify that the version number in the filename corresponds to the version of GeoServer you are running (for example geoserver-|release|-ogcapi-features-plugin.zip above). @@ -70,7 +70,7 @@ Docker use of OGC API Features module docker run -it -p8080:8080 \\ --env INSTALL_EXTENSIONS=true \\ - --env COMMUNITY_EXTENSIONS="ogcapi-features" \\ + --env STABLE_EXTENSIONS="ogcapi-features" \\ docker.osgeo.org/geoserver:|version|.x #. The services are listed at http://localhost:8080/geoserver @@ -218,12 +218,12 @@ To override an OGC API Features template: #. Create a file in this location, using the GeoServer |release| examples below: - * :download:`ogc/features/v1/landingPage.ftl ` - * :download:`ogc/features/v1/collection.ftl ` - * :download:`ogc/features/v1/collection_include.ftl ` - * :download:`ogc/features/v1/collections.ftl ` - * :download:`ogc/features/v1/queryables.ftl ` - * :download:`ogc/features/v1/functions.ftl ` + * :download:`ogc/features/v1/landingPage.ftl ` + * :download:`ogc/features/v1/collection.ftl ` + * :download:`ogc/features/v1/collection_include.ftl ` + * :download:`ogc/features/v1/collections.ftl ` + * :download:`ogc/features/v1/queryables.ftl ` + * :download:`ogc/features/v1/functions.ftl ` The above built-in examples are for GeoServer |release|, please check for any changes when upgrading GeoServer. @@ -238,11 +238,11 @@ To override a template used to list features: #. Create a file in this location, using the GeoServer |release| examples below: - * :download:`ogc/features/getfeature-complex-content.ftl ` - * :download:`ogc/features/getfeature-content.ftl ` - * :download:`ogc/features/getfeature-empty.ftl ` - * :download:`ogc/features/getfeature-footer.ftl ` - * :download:`ogc/features/getfeature-header.ftl ` + * :download:`ogc/features/getfeature-complex-content.ftl ` + * :download:`ogc/features/getfeature-content.ftl ` + * :download:`ogc/features/getfeature-empty.ftl ` + * :download:`ogc/features/getfeature-footer.ftl ` + * :download:`ogc/features/getfeature-header.ftl ` The above built-in examples are for GeoServer |release|, please check for any changes when upgrading GeoServer. @@ -250,7 +250,7 @@ As an example customize how collections are listed: #. The file :file:`ogc/features/collections.ftl` lists published collection: - .. literalinclude:: /../../../../src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl + .. literalinclude:: /../../../../src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl #. Save file to :file:`GEOSERVER_DATA_DIR/workspace/templates/ogc/collections.ftl`, and rewrite as: diff --git a/src/community/features-templating/features-templating-ogcapi/pom.xml b/src/community/features-templating/features-templating-ogcapi/pom.xml index 305317c1e52..503ef58a511 100644 --- a/src/community/features-templating/features-templating-ogcapi/pom.xml +++ b/src/community/features-templating/features-templating-ogcapi/pom.xml @@ -34,7 +34,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} @@ -45,7 +45,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests @@ -66,7 +66,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} tests diff --git a/src/community/gsr/pom.xml b/src/community/gsr/pom.xml index 460383398ff..c69c203590d 100644 --- a/src/community/gsr/pom.xml +++ b/src/community/gsr/pom.xml @@ -27,7 +27,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} diff --git a/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml index fc1aba575f0..d4d6c793000 100644 --- a/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml +++ b/src/community/ogcapi/dggs/ogcapi-dggs-assembly/pom.xml @@ -42,7 +42,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml b/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml index f9a754fdaf3..650a1626ca5 100644 --- a/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml +++ b/src/community/ogcapi/dggs/ogcapi-dggs/pom.xml @@ -23,12 +23,12 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} @@ -58,7 +58,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/dggs/web-dggs/pom.xml b/src/community/ogcapi/dggs/web-dggs/pom.xml index 05e57218709..d25e7fe79a0 100644 --- a/src/community/ogcapi/dggs/web-dggs/pom.xml +++ b/src/community/ogcapi/dggs/web-dggs/pom.xml @@ -24,7 +24,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${gs.version} tests @@ -42,7 +42,7 @@ compile - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/ogcapi/ogcapi-changeset/pom.xml b/src/community/ogcapi/ogcapi-changeset/pom.xml index 6e1b0d67f6e..f3c2c210b2c 100644 --- a/src/community/ogcapi/ogcapi-changeset/pom.xml +++ b/src/community/ogcapi/ogcapi-changeset/pom.xml @@ -50,7 +50,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml b/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml index e3384dc0b9e..8f4f28b3506 100644 --- a/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-coverages-assembly/pom.xml @@ -23,7 +23,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-coverages/pom.xml b/src/community/ogcapi/ogcapi-coverages/pom.xml index ae2ade03fcd..6b0f6b10ac9 100644 --- a/src/community/ogcapi/ogcapi-coverages/pom.xml +++ b/src/community/ogcapi/ogcapi-coverages/pom.xml @@ -18,7 +18,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -65,7 +65,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-features-assembly/pom.xml b/src/community/ogcapi/ogcapi-features-assembly/pom.xml deleted file mode 100644 index b80753a5a85..00000000000 --- a/src/community/ogcapi/ogcapi-features-assembly/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - 4.0.0 - - org.geoserver.community - gs-ogcapi - 2.27-SNAPSHOT - - - org.geoserver.community - gs-ogcapi-features-assembly - - - - org.geoserver.community - gs-ogcapi-features - ${project.version} - - - org.geoserver.community - gs-web-ogcapi - ${project.version} - - - - org.geoserver.web - gs-web-core - ${gs.version} - - - - org.geoserver.community - gs-web-ogcapi - ${gs.version} - - - - org.geoserver.community - gs-web-features - ${gs.version} - - - - diff --git a/src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml b/src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml deleted file mode 100644 index 0ba92424e96..00000000000 --- a/src/community/ogcapi/ogcapi-features-assembly/src/assembly/assembly.xml +++ /dev/null @@ -1,34 +0,0 @@ - - ogcapi-features-plugin - - zip - - false - - - target/dependency - - - gs-ogcapi-features-*.jar - gs-ogcapi-core-*.jar - gs-web-core-*.jar - gs-web-ogcapi-*.jar - gs-web-features-*.jar - gt-cql2-*.jar - swagger-core-*.jar - jackson-dataformat-*.jar - jackson-module-jaxb*.jar - swagger-models-*.jar - snakeyaml-*.jar - validation-api*.jar - - - - ${geoserverBaseDir}/community/target/html/licenses - - - GPL.html - - - - diff --git a/src/community/ogcapi/ogcapi-images-assembly/pom.xml b/src/community/ogcapi/ogcapi-images-assembly/pom.xml index 22a1f6e993b..5a32ccdca41 100644 --- a/src/community/ogcapi/ogcapi-images-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-images-assembly/pom.xml @@ -28,7 +28,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-images/pom.xml b/src/community/ogcapi/ogcapi-images/pom.xml index 294bf6f77d6..af3cdfb7306 100644 --- a/src/community/ogcapi/ogcapi-images/pom.xml +++ b/src/community/ogcapi/ogcapi-images/pom.xml @@ -12,13 +12,13 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} @@ -56,7 +56,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-maps-assembly/pom.xml b/src/community/ogcapi/ogcapi-maps-assembly/pom.xml index f1fb35f2cf1..f53355c6a68 100644 --- a/src/community/ogcapi/ogcapi-maps-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-maps-assembly/pom.xml @@ -23,7 +23,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-maps/pom.xml b/src/community/ogcapi/ogcapi-maps/pom.xml index 1dae35707e3..34a7b4d9eaf 100644 --- a/src/community/ogcapi/ogcapi-maps/pom.xml +++ b/src/community/ogcapi/ogcapi-maps/pom.xml @@ -12,7 +12,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -48,7 +48,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-styles-assembly/pom.xml b/src/community/ogcapi/ogcapi-styles-assembly/pom.xml index 9aae316092b..e6bf50f331d 100644 --- a/src/community/ogcapi/ogcapi-styles-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-styles-assembly/pom.xml @@ -23,7 +23,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-styles/pom.xml b/src/community/ogcapi/ogcapi-styles/pom.xml index 1533e0610c0..b3dc20a1991 100644 --- a/src/community/ogcapi/ogcapi-styles/pom.xml +++ b/src/community/ogcapi/ogcapi-styles/pom.xml @@ -18,7 +18,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -77,14 +77,14 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests test - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} test diff --git a/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml b/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml index 0639b3f78a8..251cf9a2775 100644 --- a/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-tiled-features-assembly/pom.xml @@ -23,7 +23,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-tiled-features/pom.xml b/src/community/ogcapi/ogcapi-tiled-features/pom.xml index 9f8e2dedf44..9df9468f359 100644 --- a/src/community/ogcapi/ogcapi-tiled-features/pom.xml +++ b/src/community/ogcapi/ogcapi-tiled-features/pom.xml @@ -12,7 +12,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} @@ -71,7 +71,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml b/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml index b5d4bc3a64e..80c0d38f5c0 100644 --- a/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml +++ b/src/community/ogcapi/ogcapi-tiles-assembly/pom.xml @@ -23,7 +23,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} diff --git a/src/community/ogcapi/ogcapi-tiles/pom.xml b/src/community/ogcapi/ogcapi-tiles/pom.xml index b1b23a26817..ba44a825187 100644 --- a/src/community/ogcapi/ogcapi-tiles/pom.xml +++ b/src/community/ogcapi/ogcapi-tiles/pom.xml @@ -12,7 +12,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -89,7 +89,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/pom.xml b/src/community/ogcapi/pom.xml index 8ffbf358157..8b67ee6d0b8 100644 --- a/src/community/ogcapi/pom.xml +++ b/src/community/ogcapi/pom.xml @@ -18,9 +18,6 @@ pom - ogcapi-core - ogcapi-features - ogcapi-features-assembly ogcapi-maps ogcapi-maps-assembly ogcapi-styles @@ -35,10 +32,8 @@ dggs ogcapi-coverages ogcapi-coverages-assembly - web-ogcapi web-coverages - web-features web-images web-maps web-styles diff --git a/src/community/ogcapi/web-coverages/pom.xml b/src/community/ogcapi/web-coverages/pom.xml index a254873fcff..6c11fc2baf8 100644 --- a/src/community/ogcapi/web-coverages/pom.xml +++ b/src/community/ogcapi/web-coverages/pom.xml @@ -20,7 +20,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/ogcapi/web-images/pom.xml b/src/community/ogcapi/web-images/pom.xml index f57169edc7b..807e30443fd 100644 --- a/src/community/ogcapi/web-images/pom.xml +++ b/src/community/ogcapi/web-images/pom.xml @@ -21,7 +21,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/ogcapi/web-maps/pom.xml b/src/community/ogcapi/web-maps/pom.xml index 19e53084eb3..fc288738ba2 100644 --- a/src/community/ogcapi/web-maps/pom.xml +++ b/src/community/ogcapi/web-maps/pom.xml @@ -21,7 +21,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/ogcapi/web-styles/pom.xml b/src/community/ogcapi/web-styles/pom.xml index 19526ac38e4..06163875f91 100644 --- a/src/community/ogcapi/web-styles/pom.xml +++ b/src/community/ogcapi/web-styles/pom.xml @@ -21,7 +21,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/ogcapi/web-tiles/pom.xml b/src/community/ogcapi/web-tiles/pom.xml index 7ac76564bdc..b623c6c49e3 100644 --- a/src/community/ogcapi/web-tiles/pom.xml +++ b/src/community/ogcapi/web-tiles/pom.xml @@ -21,7 +21,7 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} diff --git a/src/community/oseo/oseo-integration-tests/pom.xml b/src/community/oseo/oseo-integration-tests/pom.xml index 0202ed31f57..04e92999068 100644 --- a/src/community/oseo/oseo-integration-tests/pom.xml +++ b/src/community/oseo/oseo-integration-tests/pom.xml @@ -55,7 +55,7 @@ tests - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${gs.version} tests diff --git a/src/community/oseo/oseo-stac/pom.xml b/src/community/oseo/oseo-stac/pom.xml index 38b00599b6b..99af160e296 100644 --- a/src/community/oseo/oseo-stac/pom.xml +++ b/src/community/oseo/oseo-stac/pom.xml @@ -17,7 +17,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${gs.version} @@ -65,7 +65,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${gs.version} tests diff --git a/src/community/pom.xml b/src/community/pom.xml index c7daa22b79a..95e7e85b463 100644 --- a/src/community/pom.xml +++ b/src/community/pom.xml @@ -484,15 +484,6 @@ ogcapi - - ogcapi-features - - ogcapi/ogcapi-core - ogcapi/ogcapi-features - ogcapi/web-ogcapi - ogcapi/web-features - - importer-jdbc diff --git a/src/community/ogcapi/ogcapi-core/pom.xml b/src/extension/ogcapi/ogcapi-core/pom.xml similarity index 98% rename from src/community/ogcapi/ogcapi-core/pom.xml rename to src/extension/ogcapi/ogcapi-core/pom.xml index d57df177b4f..a7c47b62dab 100644 --- a/src/community/ogcapi/ogcapi-core/pom.xml +++ b/src/extension/ogcapi/ogcapi-core/pom.xml @@ -8,12 +8,12 @@ 4.0.0 - org.geoserver.community + org.geoserver.extension gs-ogcapi 2.27-SNAPSHOT - org.geoserver.community + org.geoserver.extension gs-ogcapi-core diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBBoxParser.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBBoxParser.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBBoxParser.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBBoxParser.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBodyMethodProcessor.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBodyMethodProcessor.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBodyMethodProcessor.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIBodyMethodProcessor.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConfigurationSupport.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConfigurationSupport.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConfigurationSupport.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConfigurationSupport.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConformance.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConformance.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConformance.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIConformance.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIContentNegotiationManager.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIContentNegotiationManager.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIContentNegotiationManager.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIContentNegotiationManager.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIDispatcher.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIDispatcher.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIDispatcher.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIDispatcher.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIException.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIException.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIException.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIException.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIExceptionHandler.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIExceptionHandler.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIExceptionHandler.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIExceptionHandler.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIFilterParser.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIFilterParser.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIFilterParser.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIFilterParser.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIRequestInfo.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIRequestInfo.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIRequestInfo.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIRequestInfo.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APISearchQuery.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIService.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIService.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIService.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIService.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIServiceFactoryBean.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIServiceFactoryBean.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIServiceFactoryBean.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/APIServiceFactoryBean.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractAPIExceptionHandler.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractAPIExceptionHandler.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractAPIExceptionHandler.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractAPIExceptionHandler.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractCollectionDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractCollectionDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractCollectionDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractCollectionDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractHTMLMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractHTMLMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractHTMLMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractHTMLMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocumentNoConformance.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocumentNoConformance.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocumentNoConformance.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractLandingPageDocumentNoConformance.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractServiceHTMLMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractServiceHTMLMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractServiceHTMLMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AbstractServiceHTMLMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AnnotatedHTMLMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AnnotatedHTMLMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AnnotatedHTMLMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AnnotatedHTMLMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AttributeType.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AttributeType.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AttributeType.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/AttributeType.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ByteArrayMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ByteArrayMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ByteArrayMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ByteArrayMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/CollectionExtents.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/CollectionExtents.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/CollectionExtents.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/CollectionExtents.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceClass.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceClass.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceClass.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceClass.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceInfo.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceInfo.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceInfo.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ConformanceInfo.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeList.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeList.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeList.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DateTimeList.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultAPIExceptionHandler.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultAPIExceptionHandler.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultAPIExceptionHandler.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultAPIExceptionHandler.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultContentType.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultContentType.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultContentType.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DefaultContentType.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DocumentCallback.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DocumentCallback.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DocumentCallback.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/DocumentCallback.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FreemarkerTemplateSupport.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FreemarkerTemplateSupport.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FreemarkerTemplateSupport.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FreemarkerTemplateSupport.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FunctionsDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FunctionsDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FunctionsDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/FunctionsDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/GeoServerOpenAPI.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/GeoServerOpenAPI.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/GeoServerOpenAPI.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/GeoServerOpenAPI.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLExtensionCallback.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLExtensionCallback.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLExtensionCallback.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLExtensionCallback.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLResponseBody.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLResponseBody.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLResponseBody.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HTMLResponseBody.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HttpHeaderLinksAppender.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HttpHeaderLinksAppender.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HttpHeaderLinksAppender.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/HttpHeaderLinksAppender.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/InvalidParameterValueException.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/InvalidParameterValueException.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/InvalidParameterValueException.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/InvalidParameterValueException.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/JSONSchemaMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/JSONSchemaMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/JSONSchemaMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/JSONSchemaMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LandingPageSlashFilter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LandingPageSlashFilter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LandingPageSlashFilter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LandingPageSlashFilter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Link.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Link.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Link.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Link.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfo.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfo.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfo.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfo.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoCallback.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoCallback.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoCallback.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoCallback.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinkInfoConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinksBuilder.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinksBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinksBuilder.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LinksBuilder.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceCallback.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceCallback.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceCallback.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceCallback.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceURLPathHelper.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceURLPathHelper.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceURLPathHelper.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/LocalWorkspaceURLPathHelper.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2HttpMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2HttpMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2HttpMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2HttpMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2YAMLMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2YAMLMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2YAMLMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MappingJackson2YAMLMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MessageConverterResponseAdapter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MessageConverterResponseAdapter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MessageConverterResponseAdapter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/MessageConverterResponseAdapter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIMediaTypes.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIMediaTypes.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIMediaTypes.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIMediaTypes.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIXStreamPersisterInitializer.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIXStreamPersisterInitializer.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIXStreamPersisterInitializer.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OGCAPIXStreamPersisterInitializer.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIBuilder.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIBuilder.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIBuilder.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPICallback.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPICallback.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPICallback.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPICallback.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/OpenAPIMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PaginationLinksBuilder.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PaginationLinksBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PaginationLinksBuilder.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PaginationLinksBuilder.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PropertiesParser.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PropertiesParser.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PropertiesParser.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/PropertiesParser.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Queryables.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Queryables.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Queryables.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Queryables.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/QueryablesBuilder.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/QueryablesBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/QueryablesBuilder.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/QueryablesBuilder.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResourceNotFoundException.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResourceNotFoundException.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResourceNotFoundException.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResourceNotFoundException.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResponseMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResponseMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResponseMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ResponseMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ReturnValueMethodParameter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ReturnValueMethodParameter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ReturnValueMethodParameter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/ReturnValueMethodParameter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SampleDataProvider.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SampleDataProvider.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SampleDataProvider.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SampleDataProvider.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/SortByConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Sortables.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Sortables.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Sortables.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/Sortables.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/StyleDocument.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/StyleDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/StyleDocument.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/StyleDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/TimeExtentCalculator.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/TimeExtentCalculator.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/TimeExtentCalculator.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/TimeExtentCalculator.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/impl/LinkInfoImpl.java b/src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/impl/LinkInfoImpl.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/impl/LinkInfoImpl.java rename to src/extension/ogcapi/ogcapi-core/src/main/java/org/geoserver/ogcapi/impl/LinkInfoImpl.java diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/apicss/bootstrap.min.css b/src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/bootstrap.min.css similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/apicss/bootstrap.min.css rename to src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/bootstrap.min.css diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/apicss/geoserver.css b/src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/geoserver.css similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/apicss/geoserver.css rename to src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/geoserver.css diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/apicss/img/logo.png b/src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/img/logo.png similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/apicss/img/logo.png rename to src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/img/logo.png diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/apicss/treeview.css b/src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/treeview.css similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/apicss/treeview.css rename to src/extension/ogcapi/ogcapi-core/src/main/resources/apicss/treeview.css diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/applicationContext.xml b/src/extension/ogcapi/ogcapi-core/src/main/resources/applicationContext.xml similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/applicationContext.xml rename to src/extension/ogcapi/ogcapi-core/src/main/resources/applicationContext.xml diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/api.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/api.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/api.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/api.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-footer.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-footer.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-footer.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-footer.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-header.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-header.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-header.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/common-header.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/conformance.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/conformance.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/conformance.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/conformance.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/landingpage-conformance.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/landingpage-conformance.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/landingpage-conformance.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/landingpage-conformance.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/queryables.ftl b/src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/queryables.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/queryables.ftl rename to src/extension/ogcapi/ogcapi-core/src/main/resources/org/geoserver/ogcapi/queryables.ftl diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/oauth2-redirect.html b/src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/oauth2-redirect.html similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/oauth2-redirect.html rename to src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/oauth2-redirect.html diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-bundle.js b/src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-bundle.js similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-bundle.js rename to src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-bundle.js diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-standalone-preset.js b/src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-standalone-preset.js similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-standalone-preset.js rename to src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui-standalone-preset.js diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.css b/src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.css similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.css rename to src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.css diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.js b/src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.js similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.js rename to src/extension/ogcapi/ogcapi-core/src/main/resources/swagger-ui/swagger-ui.js diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/api.js b/src/extension/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/api.js similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/api.js rename to src/extension/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/api.js diff --git a/src/community/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/common.js b/src/extension/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/common.js similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/common.js rename to src/extension/ogcapi/ogcapi-core/src/main/resources/webresources/ogcapi/common.js diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIBBoxParserTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIBBoxParserTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIBBoxParserTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIBBoxParserTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIRequestInfoTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIRequestInfoTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIRequestInfoTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/APIRequestInfoTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/ApiConfigurationSupportTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/ApiConfigurationSupportTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/ApiConfigurationSupportTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/ApiConfigurationSupportTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/DateTimeConverterTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/DateTimeConverterTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/DateTimeConverterTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/DateTimeConverterTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloDocument.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloDocument.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloDocument.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloResponseMessageConverter.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloResponseMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloResponseMessageConverter.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloResponseMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloService.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloService.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloService.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloService.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java similarity index 99% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java index 2fbd980995e..4c0718aea31 100644 --- a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java +++ b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTest.java @@ -459,7 +459,9 @@ public void testDocumentHTML() throws Exception { + "

Capabilities URL

\n" + "\n" + ""; - assertEquals(expected, response.getContentAsString()); + // windows line endings are normalized to unix + String normalizedResponse = response.getContentAsString().replaceAll("\r\n", "\n"); + assertEquals(expected, normalizedResponse); } @Test diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOffTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOffTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOffTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOffTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOnTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOnTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOnTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/HelloServiceTrailingSlashOnTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/Message.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/Message.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/Message.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/Message.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/MessageResponse.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/MessageResponse.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/MessageResponse.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/MessageResponse.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/OGCApiTestSupport.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/OGCApiTestSupport.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/OGCApiTestSupport.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/OGCApiTestSupport.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/PaginationLinksBuilderTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/PaginationLinksBuilderTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/PaginationLinksBuilderTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/PaginationLinksBuilderTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderComplexFeaturesTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderComplexFeaturesTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderComplexFeaturesTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderComplexFeaturesTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/QueryablesBuilderTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/TimeExtentCalculatorTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/TimeExtentCalculatorTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/TimeExtentCalculatorTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/TimeExtentCalculatorTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/impl/LinkInfoImplTest.java b/src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/impl/LinkInfoImplTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/impl/LinkInfoImplTest.java rename to src/extension/ogcapi/ogcapi-core/src/test/java/org/geoserver/ogcapi/impl/LinkInfoImplTest.java diff --git a/src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevation.properties b/src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevation.properties similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevation.properties rename to src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevation.properties diff --git a/src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevationEmpty.properties b/src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevationEmpty.properties similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevationEmpty.properties rename to src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/TimeElevationEmpty.properties diff --git a/src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/message.ftl b/src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/message.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/message.ftl rename to src/extension/ogcapi/ogcapi-core/src/test/resources/org/geoserver/ogcapi/message.ftl diff --git a/src/community/ogcapi/ogcapi-features/pom.xml b/src/extension/ogcapi/ogcapi-features/pom.xml similarity index 93% rename from src/community/ogcapi/ogcapi-features/pom.xml rename to src/extension/ogcapi/ogcapi-features/pom.xml index 4c3326b4a98..8c3becb6170 100644 --- a/src/community/ogcapi/ogcapi-features/pom.xml +++ b/src/extension/ogcapi/ogcapi-features/pom.xml @@ -8,17 +8,17 @@ 4.0.0 - org.geoserver.community + org.geoserver.extension gs-ogcapi 2.27-SNAPSHOT - org.geoserver.community + org.geoserver.extension gs-ogcapi-features - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -65,7 +65,7 @@ test
- org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} tests diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CQL2Conformance.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CQL2Conformance.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CQL2Conformance.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CQL2Conformance.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionDocument.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionDocument.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionDocument.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionDocument.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java similarity index 99% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java index b31e08f846b..8098dad9de8 100644 --- a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java +++ b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/CollectionsDocument.java @@ -104,7 +104,7 @@ private CollectionDocument getCollectionDocument( List crs = FeatureService.getFeatureTypeCRS(featureType, Collections.singletonList("#/crs")); CollectionDocument collection = - new CollectionDocument(geoServer, featureType, crs, CollectionsDocument.this.crs); + new CollectionDocument(geoServer, featureType, crs, this.crs); for (Consumer collectionDecorator : collectionDecorators) { collectionDecorator.accept(collection); } diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/ECQLConformance.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/ECQLConformance.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/ECQLConformance.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/ECQLConformance.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java similarity index 98% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java index 6a715bce65a..d5a6f6c387c 100644 --- a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java +++ b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureConformance.java @@ -135,14 +135,14 @@ public List conformances(WFSInfo serviceInfo) { if (gml321(serviceInfo)) { conformance.add(FeatureConformance.GML321); } - if (gmlSF0(serviceInfo)) { - // not implemented - // conformance.add(FeatureConformance.GMLSF0); - } - if (gmlSF2(serviceInfo)) { - // not implemented - // conformance.add(FeatureConformance.GMLSF2); - } + // if (gmlSF0(serviceInfo)) { + // not implemented + // conformance.add(FeatureConformance.GMLSF0); + // } + // if (gmlSF2(serviceInfo)) { + // not implemented + // conformance.add(FeatureConformance.GMLSF2); + // } // draft functionality if (ids(serviceInfo)) { @@ -443,7 +443,6 @@ public boolean ids(WFSInfo serviceInfo) { */ public void setIDs(Boolean enabled) { ids = enabled; - ; } /** diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureResponseMessageConverter.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureResponseMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureResponseMessageConverter.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureResponseMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java similarity index 98% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java index 8941390eb82..f834c31ed79 100644 --- a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java +++ b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureService.java @@ -447,11 +447,11 @@ public FeaturesResponse items( ECQLConformance ecql = ECQLConformance.configuration(wfs); if (features.filter(wfs)) { - if (filterLanguage == APIFilterParser.ECQL_TEXT && !ecql.text(wfs)) { + if (APIFilterParser.ECQL_TEXT.equals(filterLanguage) && !ecql.text(wfs)) { ignoreFilterLanguage(APIFilterParser.ECQL_TEXT, ECQLConformance.ECQL_TEXT); - } else if (filterLanguage == APIFilterParser.CQL2_TEXT && !cql2.text(wfs)) { + } else if (APIFilterParser.CQL2_TEXT.equals(filterLanguage) && !cql2.text(wfs)) { ignoreFilterLanguage(APIFilterParser.CQL2_TEXT, CQL2Conformance.CQL2_TEXT); - } else if (filterLanguage == APIFilterParser.CQL2_JSON && !cql2.json(wfs)) { + } else if (APIFilterParser.CQL2_JSON.equals(filterLanguage) && !cql2.json(wfs)) { ignoreFilterLanguage(APIFilterParser.CQL2_TEXT, CQL2Conformance.CQL2_JSON); } else { Filter parsedFilter = filterParser.parse(filter, filterLanguage, filterCRS); diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureServiceXStreamPersisterInitializer.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureServiceXStreamPersisterInitializer.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureServiceXStreamPersisterInitializer.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeatureServiceXStreamPersisterInitializer.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesAPIBuilder.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesAPIBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesAPIBuilder.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesAPIBuilder.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesExceptionHandler.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesExceptionHandler.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesExceptionHandler.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesExceptionHandler.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesGetFeature.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesGetFeature.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesGetFeature.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesGetFeature.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesLandingPage.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesLandingPage.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesLandingPage.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesLandingPage.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesResponse.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesResponse.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesResponse.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesResponse.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesSampleDataProvider.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesSampleDataProvider.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesSampleDataProvider.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesSampleDataProvider.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/GetFeatureHTMLMessageConverter.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/GetFeatureHTMLMessageConverter.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/GetFeatureHTMLMessageConverter.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/GetFeatureHTMLMessageConverter.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderContentCrsAppender.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderContentCrsAppender.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderContentCrsAppender.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderContentCrsAppender.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderLinksAppender.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderLinksAppender.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderLinksAppender.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/HttpHeaderLinksAppender.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGFeaturesResponse.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGFeaturesResponse.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGFeaturesResponse.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGFeaturesResponse.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaBuilder.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaBuilder.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaBuilder.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaBuilder.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/RFCGeoJSONFeaturesResponse.java b/src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/RFCGeoJSONFeaturesResponse.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/RFCGeoJSONFeaturesResponse.java rename to src/extension/ogcapi/ogcapi-features/src/main/java/org/geoserver/ogcapi/v1/features/RFCGeoJSONFeaturesResponse.java diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/applicationContext.xml b/src/extension/ogcapi/ogcapi-features/src/main/resources/applicationContext.xml similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/applicationContext.xml rename to src/extension/ogcapi/ogcapi-features/src/main/resources/applicationContext.xml diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection_include.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection_include.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection_include.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collection_include.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/collections.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/functions.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/functions.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/functions.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/functions.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-complex-content.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-complex-content.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-complex-content.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-complex-content.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-content.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-content.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-content.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-content.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-empty.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-empty.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-empty.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-empty.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-footer.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-footer.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-footer.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-footer.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-header.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-header.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-header.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/getfeature-header.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/landingPage.ftl b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/landingPage.ftl similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/landingPage.ftl rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/landingPage.ftl diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/openapi.yaml diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/collection.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/collection.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/collection.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/collection.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/coordrefsys.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/coordrefsys.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/coordrefsys.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/coordrefsys.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/feature.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/feature.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/feature.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/feature.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/featuretype.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/featuretype.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/featuretype.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/featuretype.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry-objects.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry-objects.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry-objects.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry-objects.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/geometry.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/link.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/link.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/link.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/link.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/place.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/place.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/place.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/place.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/time.json b/src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/time.json similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/time.json rename to src/extension/ogcapi/ogcapi-features/src/main/resources/org/geoserver/ogcapi/v1/features/schema/time.json diff --git a/src/community/ogcapi/ogcapi-features/src/main/resources/webresources/ogcapi/features.js b/src/extension/ogcapi/ogcapi-features/src/main/resources/webresources/ogcapi/features.js similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/main/resources/webresources/ogcapi/features.js rename to src/extension/ogcapi/ogcapi-features/src/main/resources/webresources/ogcapi/features.js diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ApiTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ApiTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ApiTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ApiTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionDocumentBoundsTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionDocumentBoundsTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionDocumentBoundsTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionDocumentBoundsTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java similarity index 99% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java index efedeee7451..7b9aae57fce 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java +++ b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/CollectionsTest.java @@ -265,6 +265,7 @@ public void testCollectionsHTMLWithProxyBaseHeader() throws Exception { String encodedName = featureType.prefixedName().replace(":", "__"); assertNotNull(document.select("#html_" + encodedName + "_link")); assertEquals( + encodedName, "http://test-headers/geoserver/ogc/features/v1/collections/" + featureType.prefixedName() + "/items?f=text%2Fhtml&limit=50", diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ComplexFeaturesTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ComplexFeaturesTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ComplexFeaturesTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ComplexFeaturesTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ConformanceTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ConformanceTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ConformanceTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ConformanceTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ExceptionHandlingTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ExceptionHandlingTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ExceptionHandlingTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/ExceptionHandlingTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java similarity index 99% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java index a8db38681c7..2d53f113271 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java +++ b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeatureTest.java @@ -279,6 +279,12 @@ public void testCqlFilter() throws Exception { @Test public void testCql2JsonFilter() throws Exception { + // enable cql2-json + WFSInfo wfsInfo = getGeoServer().getService(WFSInfo.class); + CQL2Conformance cql2Conformance = CQL2Conformance.configuration(wfsInfo); + cql2Conformance.setJSON(true); + getGeoServer().save(wfsInfo); + String collectionName = getLayerId(MockData.PRIMITIVEGEOFEATURE); DocumentContext json = getAsJSONPath( @@ -312,6 +318,12 @@ public void testCqlSpatialFilter() throws Exception { @Test public void testCql2JsonSpatialFilter() throws Exception { + // enable cql2-json + WFSInfo wfsInfo = getGeoServer().getService(WFSInfo.class); + CQL2Conformance cql2Conformance = CQL2Conformance.configuration(wfsInfo); + cql2Conformance.setJSON(true); + getGeoServer().save(wfsInfo); + String collectionName = getLayerId(MockData.PRIMITIVEGEOFEATURE); DocumentContext json = getAsJSONPath( @@ -589,10 +601,16 @@ public void testIdsFilter() throws Exception { @Test public void testSearchCql2JsonFilter() throws Exception { + // enable search WFSInfo wfsInfo = getGeoServer().getService(WFSInfo.class); FeatureConformance featureServiceInfo = FeatureConformance.configuration(wfsInfo); featureServiceInfo.setSearch(true); // enable + // enable cql2-json + CQL2Conformance cql2Conformance = CQL2Conformance.configuration(wfsInfo); + cql2Conformance.setJSON(true); + getGeoServer().save(wfsInfo); + try { String collectionName = getLayerId(MockData.PRIMITIVEGEOFEATURE); String request = diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeaturesTestSupport.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeaturesTestSupport.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeaturesTestSupport.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FeaturesTestSupport.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java similarity index 96% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java index b3170ee5c6b..719a135c7cc 100644 --- a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java +++ b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/FunctionsTest.java @@ -65,8 +65,9 @@ public void testFunctionsHTML() throws Exception { MockHttpServletResponse response = getAsServletResponse("ogc/features/v1/functions?f=html"); assertEquals("text/html", response.getContentType()); // the table is hard to look up, so let's check the representation for a given function + String normalizedResponse = response.getContentAsString().replaceAll("\r\n", "\n"); assertThat( - response.getContentAsString(), + normalizedResponse, Matchers.containsString( "

Area

\n" + "
    \n" diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/JSONFGSchemaTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/LandingPageTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/QueryablesTest.java b/src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/QueryablesTest.java similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/QueryablesTest.java rename to src/extension/ogcapi/ogcapi-features/src/test/java/org/geoserver/ogcapi/v1/features/QueryablesTest.java diff --git a/src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/functions-schema.yml b/src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/functions-schema.yml similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/functions-schema.yml rename to src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/functions-schema.yml diff --git a/src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_poi.properties b/src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_poi.properties similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_poi.properties rename to src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_poi.properties diff --git a/src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_single_poi.properties b/src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_single_poi.properties similarity index 100% rename from src/community/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_single_poi.properties rename to src/extension/ogcapi/ogcapi-features/src/test/resources/org/geoserver/ogcapi/v1/features/tiger_single_poi.properties diff --git a/src/extension/ogcapi/pom.xml b/src/extension/ogcapi/pom.xml new file mode 100644 index 00000000000..f798ee81fc2 --- /dev/null +++ b/src/extension/ogcapi/pom.xml @@ -0,0 +1,36 @@ + + + + 4.0.0 + + org.geoserver + extension + 2.27-SNAPSHOT + + + org.geoserver.extension + gs-ogcapi + pom + + + ogcapi-core + ogcapi-features + web-ogcapi + web-features + + + + + com.jayway.jsonpath + json-path + test + + + + + diff --git a/src/community/ogcapi/web-features/pom.xml b/src/extension/ogcapi/web-features/pom.xml similarity index 85% rename from src/community/ogcapi/web-features/pom.xml rename to src/extension/ogcapi/web-features/pom.xml index e10a62f4644..1834ef17ffe 100644 --- a/src/community/ogcapi/web-features/pom.xml +++ b/src/extension/ogcapi/web-features/pom.xml @@ -2,12 +2,12 @@ 4.0.0 - org.geoserver.community + org.geoserver.extension gs-ogcapi 2.27-SNAPSHOT - org.geoserver.community + org.geoserver.extension gs-web-features jar OGC API features web module @@ -21,13 +21,13 @@ - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${gs.version} - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${gs.version} diff --git a/src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesServiceDescriptionProvider.java b/src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesServiceDescriptionProvider.java similarity index 100% rename from src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesServiceDescriptionProvider.java rename to src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/v1/features/FeaturesServiceDescriptionProvider.java diff --git a/src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.html b/src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.html similarity index 100% rename from src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.html rename to src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.html diff --git a/src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java b/src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java similarity index 99% rename from src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java rename to src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java index 683cf7f9c62..e9b6adbf71b 100644 --- a/src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java +++ b/src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/FeatureServiceAdminPanel.java @@ -71,6 +71,7 @@ static CQL2Conformance cql2(IModel info) { return null; } + @Override public void onMainFormSubmit() { WFSInfo wfsInfo = (WFSInfo) getDefaultModel().getObject(); FeatureConformance features = FeatureConformance.configuration(wfsInfo); diff --git a/src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/ThreeStateAjaxCheckBox.java b/src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/ThreeStateAjaxCheckBox.java similarity index 100% rename from src/community/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/ThreeStateAjaxCheckBox.java rename to src/extension/ogcapi/web-features/src/main/java/org/geoserver/ogcapi/web/ThreeStateAjaxCheckBox.java diff --git a/src/community/ogcapi/web-features/src/main/resources/GeoServerApplication.properties b/src/extension/ogcapi/web-features/src/main/resources/GeoServerApplication.properties similarity index 100% rename from src/community/ogcapi/web-features/src/main/resources/GeoServerApplication.properties rename to src/extension/ogcapi/web-features/src/main/resources/GeoServerApplication.properties diff --git a/src/community/ogcapi/web-features/src/main/resources/applicationContext.xml b/src/extension/ogcapi/web-features/src/main/resources/applicationContext.xml similarity index 100% rename from src/community/ogcapi/web-features/src/main/resources/applicationContext.xml rename to src/extension/ogcapi/web-features/src/main/resources/applicationContext.xml diff --git a/src/community/ogcapi/web-ogcapi/pom.xml b/src/extension/ogcapi/web-ogcapi/pom.xml similarity index 91% rename from src/community/ogcapi/web-ogcapi/pom.xml rename to src/extension/ogcapi/web-ogcapi/pom.xml index 294bf404e73..b1071e94222 100644 --- a/src/community/ogcapi/web-ogcapi/pom.xml +++ b/src/extension/ogcapi/web-ogcapi/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - org.geoserver.community + org.geoserver.extension gs-ogcapi 2.27-SNAPSHOT @@ -13,7 +13,7 @@ - org.geoserver.community + org.geoserver.extension gs-ogcapi-core ${project.version} @@ -37,7 +37,7 @@ test - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} test diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.html b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.html similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.html rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.html diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.java b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.java rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinkInfoEditor.java diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinksMetadataMapModel.java b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinksMetadataMapModel.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinksMetadataMapModel.java rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/LinksMetadataMapModel.java diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.html b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.html similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.html rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.html diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.java b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.java rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILayerConfig.java diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.html b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.html similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.html rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.html diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.java b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.java rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OGCAPILinksSettingsPanel.java diff --git a/src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProvider.java b/src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProvider.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProvider.java rename to src/extension/ogcapi/web-ogcapi/src/main/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProvider.java diff --git a/src/community/ogcapi/web-ogcapi/src/main/resources/GeoServerApplication.properties b/src/extension/ogcapi/web-ogcapi/src/main/resources/GeoServerApplication.properties similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/resources/GeoServerApplication.properties rename to src/extension/ogcapi/web-ogcapi/src/main/resources/GeoServerApplication.properties diff --git a/src/community/ogcapi/web-ogcapi/src/main/resources/applicationContext.xml b/src/extension/ogcapi/web-ogcapi/src/main/resources/applicationContext.xml similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/main/resources/applicationContext.xml rename to src/extension/ogcapi/web-ogcapi/src/main/resources/applicationContext.xml diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/AbstractLinksEditorTest.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/AbstractLinksEditorTest.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/AbstractLinksEditorTest.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/AbstractLinksEditorTest.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCLayerConfigTest.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCLayerConfigTest.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCLayerConfigTest.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCLayerConfigTest.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCSettingsConfigTest.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCSettingsConfigTest.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCSettingsConfigTest.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCSettingsConfigTest.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCWorkspaceSettingsConfigTest.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCWorkspaceSettingsConfigTest.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCWorkspaceSettingsConfigTest.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OGCWorkspaceSettingsConfigTest.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProviderTest.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProviderTest.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProviderTest.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/OgcApiServiceDescriptionProviderTest.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfo.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfo.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfo.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfo.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoImpl.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoImpl.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoImpl.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoImpl.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoXStreamLoader.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoXStreamLoader.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoXStreamLoader.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseInfoXStreamLoader.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseOgcApiServiceDescriptionProvider.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseOgcApiServiceDescriptionProvider.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseOgcApiServiceDescriptionProvider.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseOgcApiServiceDescriptionProvider.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseService.java b/src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseService.java similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseService.java rename to src/extension/ogcapi/web-ogcapi/src/test/java/org/geoserver/web/ogcapi/provider/TestCaseService.java diff --git a/src/community/ogcapi/web-ogcapi/src/test/resources/applicationContext.xml b/src/extension/ogcapi/web-ogcapi/src/test/resources/applicationContext.xml similarity index 100% rename from src/community/ogcapi/web-ogcapi/src/test/resources/applicationContext.xml rename to src/extension/ogcapi/web-ogcapi/src/test/resources/applicationContext.xml diff --git a/src/extension/pom.xml b/src/extension/pom.xml index 6cb5fb6bc7b..2e71e6618c0 100644 --- a/src/extension/pom.xml +++ b/src/extension/pom.xml @@ -400,6 +400,21 @@ rat + + ogcapi + + ogcapi + + + + ogcapi-features + + ogcapi/ogcapi-core + ogcapi/ogcapi-features + ogcapi/web-ogcapi + ogcapi/web-features + + @@ -450,6 +465,7 @@ geopkg-output metadata rat + ogcapi @@ -502,6 +518,7 @@ geopkg-output metadata rat + ogcapi diff --git a/src/pom.xml b/src/pom.xml index 4653f48db6d..ce6b4c3c532 100644 --- a/src/pom.xml +++ b/src/pom.xml @@ -2133,6 +2133,7 @@ release/ext-wps.xml release/ext-ysld.xml release/ext-rat.xml + release/ext-ogcapi-features.xml ${project.build.directory}/release diff --git a/src/release/ext-ogcapi-features.xml b/src/release/ext-ogcapi-features.xml new file mode 100644 index 00000000000..8fd0dd8e4d0 --- /dev/null +++ b/src/release/ext-ogcapi-features.xml @@ -0,0 +1,57 @@ + + ogcapi-features-plugin + + zip + + false + + + release/target/dependency + + + jackson-dataformat-cbor-* + jackson-dataformat-xml-* + + + gs-ogcapi-features-*.jar + gs-ogcapi-core-*.jar + gs-web-ogcapi-*.jar + gs-web-features-*.jar + gt-cql2-*.jar + swagger-core-*.jar + jackson-dataformat-*.jar + jackson-module-jaxb*.jar + swagger-models-*.jar + snakeyaml-*.jar + validation-api*.jar + + + + release/target/html/licenses + licenses + + LGPL.html + GEOTOOLS_NOTICE.html + GPL.html + NOTICE.html + + + + + + release/extensions/README.md + + README.txt + + + release/target/html/extensions/LICENSE.html + + LICENSE.html + + + release/target/html/extensions/README.html + + README.html + + + diff --git a/src/release/pom.xml b/src/release/pom.xml index 3c0bd88807c..323b4285657 100644 --- a/src/release/pom.xml +++ b/src/release/pom.xml @@ -408,6 +408,26 @@ gs-rat ${project.version} + + org.geoserver.extension + gs-ogcapi-core + ${project.version} + + + org.geoserver.extension + gs-web-ogcapi + ${project.version} + + + org.geoserver.extension + gs-ogcapi-features + ${project.version} + + + org.geoserver.extension + gs-web-features + ${project.version} + diff --git a/src/web/app/pom.xml b/src/web/app/pom.xml index fc5de7ea844..96f14f776fa 100644 --- a/src/web/app/pom.xml +++ b/src/web/app/pom.xml @@ -1542,7 +1542,7 @@ ogcapi - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} @@ -1597,7 +1597,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-ogcapi ${project.version} @@ -1608,7 +1608,7 @@ ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-features ${project.version} @@ -1639,12 +1639,12 @@ ogcapi-features - org.geoserver.community + org.geoserver.extension gs-ogcapi-features ${project.version} - org.geoserver.community + org.geoserver.extension gs-web-features ${project.version} From 6218a5e95648383ac354c820569e30b4fcb2e0e9 Mon Sep 17 00:00:00 2001 From: Alessio Fabiani Date: Mon, 9 Dec 2024 12:07:22 +0100 Subject: [PATCH 4/8] GEOS-11625: Add "Challenge Anonymous Sessions" Option to AuthKey Filter (#8066) * AuthKey Filter checking for Anon session too * AuthKey Filter Stateless Anonym Challenge option * AuthKey Filter Stateless Anonym Challenge option * Documentation * Explicit imports * QA checks * QA checks * Cleanup the Security Context in order to try making the Windows build tests more stable * Workaround github windows build * Update doc/en/user/source/extensions/authkey/index.rst Co-authored-by: Andrea Aime * Update doc/en/user/source/extensions/authkey/index.rst Co-authored-by: Andrea Aime * Update doc/en/user/source/extensions/authkey/index.rst Co-authored-by: Andrea Aime * Update doc/en/user/source/extensions/authkey/index.rst Co-authored-by: Andrea Aime * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments * Improving tests according to the Review comments --------- Co-authored-by: Andrea Aime --- .../authkey/images/001_stateless.png | Bin 0 -> 17642 bytes .../user/source/extensions/authkey/index.rst | 25 ++ .../AbstractAuthenticationKeyMapper.java | 112 ++++++- .../AuthenticationKeyFilterConfig.java | 12 + ...uthenticationKeyFilterConfigValidator.java | 4 +- .../security/AuthenticationKeyMapper.java | 10 + .../GeoServerAuthenticationKeyFilter.java | 30 +- .../PropertyAuthenticationKeyMapper.java | 24 +- .../UserPropertyAuthenticationKeyMapper.java | 25 +- .../WebServiceAuthenticationKeyMapper.java | 25 +- .../web/AuthenticationKeyFilterPanel.html | 4 + .../web/AuthenticationKeyFilterPanel.java | 2 + .../resources/GeoServerApplication.properties | 5 + .../security/AuthKeyAuthenticationTest.java | 279 ++++++++++++++++-- .../org/geoserver/security/FakeMapper.java | 7 +- .../filter/GeoServerSecurityFilter.java | 11 +- 16 files changed, 508 insertions(+), 67 deletions(-) create mode 100644 doc/en/user/source/extensions/authkey/images/001_stateless.png diff --git a/doc/en/user/source/extensions/authkey/images/001_stateless.png b/doc/en/user/source/extensions/authkey/images/001_stateless.png new file mode 100644 index 0000000000000000000000000000000000000000..3702d949e922942bf04e3850b32cb8a7cba67cee GIT binary patch literal 17642 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 R_*Wz#C3!Wu;^(IC{}%!Y?Z*HB literal 0 HcmV?d00001 diff --git a/doc/en/user/source/extensions/authkey/index.rst b/doc/en/user/source/extensions/authkey/index.rst index 6af791e93df..e7b34c1622c 100644 --- a/doc/en/user/source/extensions/authkey/index.rst +++ b/doc/en/user/source/extensions/authkey/index.rst @@ -237,6 +237,31 @@ After configuring the filter it is necessary to put this filter on the authentic saves the current configuration and triggers a synchronize. If users are added/removed from the backing user/group service, the synchronize logic should be triggered. +Challenge Anonymous Session +--------------------------- + +"Challenge Anonymous Sessions" is designed to enforce stricter authorization and stateless behavior. + +When enabled, the filter ignores any existing session or SecurityContext principal (e.g., anonymous or previously authenticated sessions created by other filters) and always authenticates the user linked to the provided authkey. This ensures that the authkey is validated independently for every request, regardless of the current session state. + +This feature is particularly useful for deployments that require stateless authentication or need to ensure that requests are processed strictly based on the authkey query parameter. By default, this option is disabled. + +**Internal User Cache** + +To enhance performance in stateless mode, the AuthKey filter can use an internal user cache. The cache prevents unnecessary backend authentication requests for the same authkey by storing the user information locally for a configurable period. + +The cache offers the following benefits: + +1. Reduces backend service load for frequently used authkeys. + +2. Allows administrators to configure the cache's expiration policy to balance performance and data freshness. + +Both the "Challenge Anonymous Sessions" option and the internal user cache settings can be configured through the filter's settings panel in GeoServer. For step-by-step instructions and examples, refer to the screenshots below. + + .. figure:: images/001_stateless.png + :align: center + + Enabling Mappers' Auto-Synchronization -------------------------------------- diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/AbstractAuthenticationKeyMapper.java b/src/extension/authkey/src/main/java/org/geoserver/security/AbstractAuthenticationKeyMapper.java index e3cefc71e09..6f2667a187d 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/AbstractAuthenticationKeyMapper.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/AbstractAuthenticationKeyMapper.java @@ -11,7 +11,12 @@ import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import org.geoserver.security.impl.GeoServerUser; import org.geoserver.security.validation.FilterConfigException; import org.springframework.util.StringUtils; @@ -32,9 +37,20 @@ public abstract class AbstractAuthenticationKeyMapper implements AuthenticationK private Map parameters = new HashMap<>(); + // Cache map with expiration tracking + private final ConcurrentHashMap userCache = new ConcurrentHashMap<>(); + + // Default TTL for cache entries (in seconds) + private long cacheTtlSeconds = 300; // Default: 5 minutes + + // Executor for cleaning up expired cache entries + private final ScheduledExecutorService cacheCleanupExecutor = + Executors.newSingleThreadScheduledExecutor(); + public AbstractAuthenticationKeyMapper() { super(); fillDefaultParameters(); + startCacheCleanupTask(); } @Override @@ -71,20 +87,23 @@ protected GeoServerUserGroupService getUserGroupService() throws IOException { GeoServerUserGroupService service = getSecurityManager().loadUserGroupService(getUserGroupServiceName()); if (service == null) { - throw new IOException("Unkown user/group service: " + getUserGroupServiceName()); + throw new IOException("Unknown user/group service: " + getUserGroupServiceName()); } return service; } protected void checkProperties() throws IOException { - if (StringUtils.hasLength(getUserGroupServiceName()) == false) { + if (!StringUtils.hasLength(getUserGroupServiceName())) { throw new IOException("User/Group Service Name is unset"); } if (getSecurityManager() == null) { throw new IOException("Security manager is unset"); } + this.checkPropertiesInternal(); } + protected abstract void checkPropertiesInternal() throws IOException; + protected String createAuthKey() { return UUID.randomUUID().toString(); } @@ -104,6 +123,15 @@ public Set getAvailableParameters() { public void configureMapper(Map parameters) { this.parameters = parameters; fillDefaultParameters(); + + // Configure cache TTL if specified + if (parameters.containsKey("cacheTtlSeconds")) { + try { + cacheTtlSeconds = Long.parseLong(parameters.get("cacheTtlSeconds")); + } catch (NumberFormatException e) { + LOGGER.warning("Invalid cacheTtlSeconds value. Using default."); + } + } } /** Fills parameters with default values (if defined by the mapper. */ @@ -116,7 +144,7 @@ private void fillDefaultParameters() { } /** - * Gets the default value for the given parameter. Default implementation always returns an + * Gets the default value for the given parameter. The Default implementation always returns an * empty string. */ protected String getDefaultParamValue(String paramName) { @@ -148,4 +176,82 @@ public String getAuthenticationFilterName() { public void setAuthenticationFilterName(String authenticationFilterName) { this.authenticationFilterName = authenticationFilterName; } + + @Override + public GeoServerUser getUser(String key) throws IOException { + checkProperties(); + + // Check if the user is already in the cache and not expired + CacheEntry entry = userCache.get(key); + if (entry != null && !entry.isExpired()) { + return entry.getUser(); + } + + // Proceed to call the web service if user not in the cache or expired + GeoServerUser user = this.getUserInternal(key); + if (key != null && user != null) { + // Cache the user for future requests + userCache.put( + key, new CacheEntry(user, System.currentTimeMillis() + cacheTtlSeconds * 1000)); + } + return user; + } + + protected abstract GeoServerUser getUserInternal(String key) throws IOException; + + /** Clears the cache entries, forcing a reset. */ + public void resetUserCache() { + userCache.clear(); + } + + /** + * Sets the cache TTL in seconds. + * + * @param ttlSeconds TTL in seconds + */ + @Override + public void setCacheTtlSeconds(long ttlSeconds) { + this.cacheTtlSeconds = ttlSeconds; + } + + /** Returns the current cache TTL in seconds. */ + @Override + public long getCacheTtlSeconds() { + return cacheTtlSeconds; + } + + /** Starts a periodic task to clean up expired cache entries. */ + private void startCacheCleanupTask() { + cacheCleanupExecutor.scheduleAtFixedRate( + () -> { + userCache.entrySet().removeIf(entry -> entry.getValue().isExpired()); + }, + cacheTtlSeconds, + cacheTtlSeconds, + TimeUnit.SECONDS); + } + + /** Shuts down the cache cleanup executor. */ + public void shutdown() { + cacheCleanupExecutor.shutdownNow(); + } + + /** Inner class to represent a cache entry with a TTL. */ + private static class CacheEntry { + private final GeoServerUser user; + private final long expiryTime; + + CacheEntry(GeoServerUser user, long expiryTime) { + this.user = user; + this.expiryTime = expiryTime; + } + + public GeoServerUser getUser() { + return user; + } + + public boolean isExpired() { + return System.currentTimeMillis() > expiryTime; + } + } } diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfig.java b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfig.java index 3f27e7fcd75..7002d94c10c 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfig.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfig.java @@ -37,6 +37,8 @@ public class AuthenticationKeyFilterConfig extends SecurityFilterConfig private boolean allowMapperKeysAutoSync = false; + private boolean allowChallengeAnonymousSessions = false; + @Override public boolean providesAuthenticationEntryPoint() { return true; @@ -93,6 +95,16 @@ public void setAllowMapperKeysAutoSync(boolean allowMapperKeysAutoSync) { this.allowMapperKeysAutoSync = allowMapperKeysAutoSync; } + /** @return true if the stateless mode is enabled */ + public boolean isAllowChallengeAnonymousSessions() { + return allowChallengeAnonymousSessions; + } + + /** @param allowChallengeAnonymousSessions true if the stateless mode is enabled */ + public void setAllowChallengeAnonymousSessions(boolean allowChallengeAnonymousSessions) { + this.allowChallengeAnonymousSessions = allowChallengeAnonymousSessions; + } + @Override public SecurityConfig clone(boolean allowEnvParametrization) { AuthenticationKeyFilterConfig target = diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfigValidator.java b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfigValidator.java index b6595e5924f..5e3241ac39e 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfigValidator.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyFilterConfigValidator.java @@ -36,11 +36,11 @@ public void validateFilterConfig(AuthenticationKeyFilterConfig config) checkExistingUGService(config.getUserGroupServiceName()); - if (isNotEmpty(config.getAuthKeyParamName()) == false) { + if (!isNotEmpty(config.getAuthKeyParamName())) { throw createFilterException( AuthenticationKeyFilterConfigException.AUTH_KEY_PARAM_NAME_REQUIRED); } - if (isNotEmpty(config.getAuthKeyMapperName()) == false) { + if (!isNotEmpty(config.getAuthKeyMapperName())) { throw createFilterException( AuthenticationKeyFilterConfigException.AUTH_KEY_MAPPER_NAME_REQUIRED); } diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyMapper.java b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyMapper.java index 26f0e7ca8ae..3b58a1bd030 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyMapper.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/AuthenticationKeyMapper.java @@ -65,4 +65,14 @@ public interface AuthenticationKeyMapper extends BeanNameAware { * Set the belonging Auth Filter Name in order to allow the Mapper accessing the auth cache * */ public void setAuthenticationFilterName(String authenticationFilterName); + + /** + * Sets the cache TTL in seconds. + * + * @param ttlSeconds TTL in seconds + */ + public void setCacheTtlSeconds(long ttlSeconds); + + /** Returns the current cache TTL in seconds. */ + public long getCacheTtlSeconds(); } diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/GeoServerAuthenticationKeyFilter.java b/src/extension/authkey/src/main/java/org/geoserver/security/GeoServerAuthenticationKeyFilter.java index 8d01b50874f..c686a625b6d 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/GeoServerAuthenticationKeyFilter.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/GeoServerAuthenticationKeyFilter.java @@ -24,6 +24,7 @@ import org.geoserver.security.filter.GeoServerSecurityFilter; import org.geoserver.security.impl.GeoServerRole; import org.geoserver.security.impl.GeoServerUser; +import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; @@ -34,7 +35,7 @@ /** * Filter extending {@link GeoServerSecurityFilter}. * - *

    The encoded user name is passed as an URL parameter named {@link #authKeyParamName}. + *

    The encoded user name is passed as a URL parameter named {@link #authKeyParamName}. * *

    The real user name is retrieved by querying an {@link AuthenticationKeyMapper} object stored * in {@link #authKeyMapperName} @@ -52,6 +53,8 @@ public class GeoServerAuthenticationKeyFilter extends GeoServerSecurityFilter private String userGroupServiceName; + private boolean allowChallengeAnonymousSessions; + protected AuthenticationEntryPoint aep; @Override @@ -68,26 +71,27 @@ public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOExc mapper.setUserGroupServiceName(userGroupServiceName); mapper.setSecurityManager(getSecurityManager()); mapper.configureMapper(authConfig.getMapperParameters()); + allowChallengeAnonymousSessions = authConfig.isAllowChallengeAnonymousSessions(); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - // String authKey = getAuthKey((HttpServletRequest) request); - // if (authKey==null) { // nothing to do - // chain.doFilter(request, response); - // return; - // } - - String cacheKey = authenticateFromCache(this, (HttpServletRequest) request); + String cacheKey = + authenticateFromCache( + this, (HttpServletRequest) request, allowChallengeAnonymousSessions); - if (SecurityContextHolder.getContext().getAuthentication() == null) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (allowChallengeAnonymousSessions + || authentication == null + || authentication instanceof AnonymousAuthenticationToken) { doAuthenticate((HttpServletRequest) request, (HttpServletResponse) response, cacheKey); - Authentication postAuthentication = SecurityContextHolder.getContext().getAuthentication(); - if (postAuthentication != null && cacheKey != null) { + if (postAuthentication != null + && !(postAuthentication instanceof AnonymousAuthenticationToken) + && cacheKey != null) { if (cacheAuthentication(postAuthentication, (HttpServletRequest) request)) { getSecurityManager() .getAuthenticationCache() @@ -151,7 +155,7 @@ protected void doAuthenticate( for (GrantedAuthority auth : user.getAuthorities()) { roles.add((GeoServerRole) auth); } - if (roles.contains(GeoServerRole.AUTHENTICATED_ROLE) == false) + if (!roles.contains(GeoServerRole.AUTHENTICATED_ROLE)) roles.add(GeoServerRole.AUTHENTICATED_ROLE); KeyAuthenticationToken result = @@ -162,7 +166,7 @@ protected void doAuthenticate( public String getAuthKey(HttpServletRequest req) { String authKey = getAuthKeyParamValue(req); - if (StringUtils.hasLength(authKey) == false) return null; + if (!StringUtils.hasLength(authKey)) return null; return authKey; } diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/PropertyAuthenticationKeyMapper.java b/src/extension/authkey/src/main/java/org/geoserver/security/PropertyAuthenticationKeyMapper.java index 22a3cd46300..28c5740e796 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/PropertyAuthenticationKeyMapper.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/PropertyAuthenticationKeyMapper.java @@ -10,9 +10,12 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.Set; import org.apache.commons.io.FileUtils; import org.geoserver.platform.resource.Files; import org.geoserver.security.impl.GeoServerUser; @@ -47,9 +50,12 @@ public boolean supportsReadOnlyUserGroupService() { } @Override - public synchronized GeoServerUser getUser(String key) throws IOException { - checkProperties(); + public Set getAvailableParameters() { + return new HashSet<>(List.of("cacheTtlSeconds")); + } + @Override + public synchronized GeoServerUser getUserInternal(String key) throws IOException { if (authKeyProps == null) { synchronize(); } @@ -58,7 +64,7 @@ public synchronized GeoServerUser getUser(String key) throws IOException { authKeyProps = fileWatcher.getProperties(); String userName = authKeyProps.getProperty(key); - if (StringUtils.hasLength(userName) == false) { + if (!StringUtils.hasLength(userName)) { LOGGER.warning("Cannot find user for auth key: " + key); return null; } @@ -74,7 +80,7 @@ public synchronized GeoServerUser getUser(String key) throws IOException { return null; } - if (theUser.isEnabled() == false) { + if (!theUser.isEnabled()) { LOGGER.info( "Found user " + theUser.getUsername() @@ -88,9 +94,7 @@ public synchronized GeoServerUser getUser(String key) throws IOException { } @Override - protected void checkProperties() throws IOException { - super.checkProperties(); - } + protected void checkPropertiesInternal() throws IOException {} @Override public synchronized int synchronize() throws IOException { @@ -103,15 +107,17 @@ public synchronized int synchronize() throws IOException { new File(getSecurityManager().userGroup().dir(), getUserGroupServiceName()); backupFile = new File(backupFile, AUTHKEYS_FILE + ".backup"); - // check if the previous synchronize failed + // check if the previous synchronizing failed if (backupFile.exists()) throw new IOException( "The file: " + backupFile.getCanonicalPath() + " has to be removed first"); + // Clear the local cache + resetUserCache(); authKeyProps = new Properties(); Properties oldProps = new Properties(); - // check if property file exists and reload + // check if a property file exists and reload if (propFile.exists()) { FileUtils.copyFile(propFile, backupFile); try (FileInputStream inputFile = new FileInputStream(backupFile)) { diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/UserPropertyAuthenticationKeyMapper.java b/src/extension/authkey/src/main/java/org/geoserver/security/UserPropertyAuthenticationKeyMapper.java index 52c80394170..0e86fd41916 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/UserPropertyAuthenticationKeyMapper.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/UserPropertyAuthenticationKeyMapper.java @@ -6,6 +6,9 @@ package org.geoserver.security; import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.SortedSet; import org.geoserver.security.impl.GeoServerUser; import org.geoserver.security.validation.PasswordPolicyException; @@ -25,9 +28,8 @@ public void setUserPropertyName(String userPropertyName) { } @Override - protected void checkProperties() throws IOException { - super.checkProperties(); - if (StringUtils.hasLength(getUserPropertyName()) == false) { + protected void checkPropertiesInternal() throws IOException { + if (!StringUtils.hasLength(getUserPropertyName())) { throw new IOException("User property name is unset"); } } @@ -38,15 +40,18 @@ public boolean supportsReadOnlyUserGroupService() { } @Override - public GeoServerUser getUser(String key) throws IOException { - checkProperties(); + public Set getAvailableParameters() { + return new HashSet<>(List.of("cacheTtlSeconds")); + } + @Override + public GeoServerUser getUserInternal(String key) throws IOException { SortedSet set = getUserGroupService().getUsersHavingPropertyValue(getUserPropertyName(), key); if (set.isEmpty()) return null; if (set.size() > 1) { - StringBuffer buff = new StringBuffer(); + StringBuilder buff = new StringBuilder(); for (GeoServerUser user : set) { buff.append(user.getUsername()).append(","); } @@ -59,7 +64,7 @@ public GeoServerUser getUser(String key) throws IOException { } GeoServerUser user = set.first(); - if (user.isEnabled() == false) { + if (!user.isEnabled()) { LOGGER.info( "Found user " + user.getUsername() @@ -75,15 +80,17 @@ public GeoServerUser getUser(String key) throws IOException { public synchronized int synchronize() throws IOException { checkProperties(); GeoServerUserGroupService service = getUserGroupService(); - if (service.canCreateStore() == false) + if (!service.canCreateStore()) throw new IOException("Cannot synchronize a read only user group service"); + // Clear the local cache + resetUserCache(); int counter = 0; GeoServerUserGroupStore store = service.createStore(); store.load(); for (GeoServerUser user : store.getUsers()) { String value = user.getProperties().getProperty(getUserPropertyName()); - if (StringUtils.hasLength(value) == false) { + if (!StringUtils.hasLength(value)) { user.getProperties().put(getUserPropertyName(), createAuthKey()); try { store.updateUser(user); diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/WebServiceAuthenticationKeyMapper.java b/src/extension/authkey/src/main/java/org/geoserver/security/WebServiceAuthenticationKeyMapper.java index c016b3c3909..d063e32b6fe 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/WebServiceAuthenticationKeyMapper.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/WebServiceAuthenticationKeyMapper.java @@ -54,7 +54,7 @@ public class WebServiceAuthenticationKeyMapper extends AbstractAuthenticationKey // web service url (must contain the {key} placeholder for the authkey parameter) private String webServiceUrl; - // regular expression, used to extract the user name from the webservice response + // regular expression, used to extract the username from the webservice response private String searchUser; // compiled regex @@ -122,15 +122,13 @@ public void setWebServiceUrl(String webServiceUrl) { this.webServiceUrl = webServiceUrl; } - /** - * Returns the regular expression used to extract the user name from the webservice response. - */ + /** Returns the regular expression used to extract the username from the webservice response. */ public String getSearchUser() { return searchUser; } /** - * Sets the regular expression used to extract the user name from the webservice response. + * Sets the regular expression used to extract the username from the webservice response. * * @param searchUser search user */ @@ -145,9 +143,8 @@ public void setHttpClient(HTTPClient httpClient) { } @Override - protected void checkProperties() throws IOException { - super.checkProperties(); - if (StringUtils.hasLength(webServiceUrl) == false) { + protected void checkPropertiesInternal() throws IOException { + if (!StringUtils.hasLength(webServiceUrl)) { throw new IOException("Web service url is unset"); } if (StringUtils.hasLength(searchUser)) { @@ -165,8 +162,7 @@ public boolean supportsReadOnlyUserGroupService() { } @Override - public GeoServerUser getUser(String key) throws IOException { - checkProperties(); + protected GeoServerUser getUserInternal(String key) throws IOException { final String responseBody = callWebService(key); if (responseBody == null) { LOGGER.log( @@ -289,7 +285,12 @@ public void configureMapper(Map mapperParams) { @Override public Set getAvailableParameters() { return new HashSet<>( - Arrays.asList("webServiceUrl", "searchUser", "connectTimeout", "readTimeout")); + Arrays.asList( + "webServiceUrl", + "searchUser", + "connectTimeout", + "readTimeout", + "cacheTtlSeconds")); } @Override @@ -346,6 +347,8 @@ public void validateParameter(String paramName, String value) throws FilterConfi public synchronized int synchronize() throws IOException { // synchronization purges the cached keys for the current WebService Mapper getSecurityManager().getAuthenticationCache().removeAll(getAuthenticationFilterName()); + // Clear the local cache + resetUserCache(); return 0; } } diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.html b/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.html index 432dcce205d..8135f4016d2 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.html +++ b/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.html @@ -36,6 +36,10 @@

  • + + +
  • +
  • diff --git a/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.java b/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.java index 0988e918574..18bfe6813bd 100644 --- a/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.java +++ b/src/extension/authkey/src/main/java/org/geoserver/security/web/AuthenticationKeyFilterPanel.java @@ -62,6 +62,8 @@ public AuthenticationKeyFilterPanel(String id, IModel parameters = model.getObject().getMapperParameters(); final ParamsPanel paramsPanel = createParamsPanel( diff --git a/src/extension/authkey/src/main/resources/GeoServerApplication.properties b/src/extension/authkey/src/main/resources/GeoServerApplication.properties index 246e512fbdd..7bbad1784f3 100644 --- a/src/extension/authkey/src/main/resources/GeoServerApplication.properties +++ b/src/extension/authkey/src/main/resources/GeoServerApplication.properties @@ -14,6 +14,7 @@ AuthenticationKeyFilterPanel.propertyMapper=Property file AuthenticationKeyFilterPanel.userPropertyMapper=User property AuthenticationKeyFilterPanel.webServiceMapper=Web Service AuthenticationKeyFilterPanel.allowMapperKeysAutoSync=Allow mapper keys auto sync +AuthenticationKeyFilterPanel.allowChallengeAnonymousSessions=Challenge anonymous sessions AuthenticationKeyFilterPanel.authKeyParameters=Authentication key authentication AuthenticationKeyFilterPanel.authKeyParametersHelp.title=Authentication key authentication @@ -33,6 +34,10 @@ AuthenticationKeyFilterPanel.webServiceMapper.searchUser=Web Service Response Us AuthenticationKeyFilterPanel.webServiceMapper.webServiceUrl=Web Service URL, with key placeholder AuthenticationKeyFilterPanel.fakeMapper=fakeMapper +AuthenticationKeyFilterPanel.propertyMapper.cacheTtlSeconds=Internal User Cache TTL Seconds +AuthenticationKeyFilterPanel.webServiceMapper.cacheTtlSeconds=Internal User Cache TTL Seconds +AuthenticationKeyFilterPanel.userPropertyMapper.cacheTtlSeconds=Internal User Cache TTL Seconds + # user group services org.geoserver.security.WebServiceBodyResponseUserGroupService.name=AuthKEY WebService Body Response org.geoserver.security.WebServiceBodyResponseUserGroupService.title=AuthKEY WebService Body Response UserGroup Service diff --git a/src/extension/authkey/src/test/java/org/geoserver/security/AuthKeyAuthenticationTest.java b/src/extension/authkey/src/test/java/org/geoserver/security/AuthKeyAuthenticationTest.java index 79fbafd1153..19ef6db1db4 100644 --- a/src/extension/authkey/src/test/java/org/geoserver/security/AuthKeyAuthenticationTest.java +++ b/src/extension/authkey/src/test/java/org/geoserver/security/AuthKeyAuthenticationTest.java @@ -19,6 +19,7 @@ import java.io.InputStream; import java.net.URL; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; @@ -39,7 +40,10 @@ import org.springframework.mock.web.MockFilterChain; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -265,10 +269,10 @@ public void testMapperParamsFilterConfigValidation() throws Exception { } @Test - public void testFileBasedWithSession() throws Exception { + public void testFileBasedWithSessionEnabled() throws Exception { String authKeyUrlParam = "myAuthKey"; - String filterName = "testAuthKeyFilter1"; + String filterName = "testAuthKeyFilter1Enabled"; AuthenticationKeyFilterConfig config = new AuthenticationKeyFilterConfig(); config.setClassName(GeoServerAuthenticationKeyFilter.class.getName()); @@ -277,6 +281,10 @@ public void testFileBasedWithSession() throws Exception { config.setAuthKeyParamName(authKeyUrlParam); config.setAuthKeyMapperName("propertyMapper"); + // Let's make sure the internal user cache is disabled + Map mapperParams = new HashMap<>(); + mapperParams.put("cacheTtlSeconds", "0"); + config.setMapperParameters(mapperParams); getSecurityManager().saveFilter(config); GeoServerAuthenticationKeyFilter filter = @@ -290,11 +298,14 @@ public void testFileBasedWithSession() throws Exception { modifyChain(pattern, false, true, null); SecurityContextHolder.getContext().setAuthentication(null); + getSecurityManager().getAuthenticationCache().removeAll(); // Test entry point MockHttpServletRequest request = createRequest("/foo/bar"); MockHttpServletResponse response = new MockHttpServletResponse(); MockFilterChain chain = new MockFilterChain(); + // Force to reload the property file + mapper.synchronize(); getProxy().doFilter(request, response, chain); assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); @@ -337,15 +348,67 @@ public void testFileBasedWithSession() throws Exception { request.setQueryString(authKeyUrlParam + "=abc"); request.addParameter(authKeyUrlParam, "abc"); + // Force to reload the property file + mapper.synchronize(); getProxy().doFilter(request, response, chain); assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); assertNull(SecurityContextHolder.getContext().getAuthentication()); + } + + @Test + public void testFileBasedWithSessionDisabled() throws Exception { + + String authKeyUrlParam = "myAuthKey"; + String filterName = "testAuthKeyFilter1Disabled"; + + AuthenticationKeyFilterConfig config = new AuthenticationKeyFilterConfig(); + config.setClassName(GeoServerAuthenticationKeyFilter.class.getName()); + config.setName(filterName); + config.setUserGroupServiceName("ug1"); + config.setAuthKeyParamName(authKeyUrlParam); + config.setAuthKeyMapperName("propertyMapper"); + + // Let's make sure the internal user cache is disabled + Map mapperParams = new HashMap<>(); + mapperParams.put("cacheTtlSeconds", "0"); + config.setMapperParameters(mapperParams); + getSecurityManager().saveFilter(config); + + GeoServerAuthenticationKeyFilter filter = + (GeoServerAuthenticationKeyFilter) getSecurityManager().loadFilter(filterName); + + PropertyAuthenticationKeyMapper mapper = + (PropertyAuthenticationKeyMapper) filter.getMapper(); + mapper.synchronize(); + + prepareFilterChain(pattern, filterName); + modifyChain(pattern, false, true, null); + + SecurityContextHolder.getContext().setAuthentication(null); + getSecurityManager().getAuthenticationCache().removeAll(); + + // Test entry point + MockHttpServletRequest request = createRequest("/foo/bar"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + // Force to reload the property file + mapper.synchronize(); + + // test success + String authKey = null; + for (Entry entry : mapper.authKeyProps.entrySet()) { + if (testUserName.equals(entry.getValue())) { + authKey = (String) entry.getKey(); + break; + } + } // check disabled user username = testUserName; password = username; updateUser("ug1", username, false); + request = createRequest("/foo/bar"); response = new MockHttpServletResponse(); chain = new MockFilterChain(); @@ -353,11 +416,15 @@ public void testFileBasedWithSession() throws Exception { request.setQueryString(authKeyUrlParam + "=" + authKey); request.addParameter(authKeyUrlParam, authKey); getProxy().doFilter(request, response, chain); - assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); - assertNull(SecurityContextHolder.getContext().getAuthentication()); + updateUser("ug1", username, true); + // Force to reload the property file + mapper.synchronize(); + + SecurityContextHolder.clearContext(); + getSecurityManager().getAuthenticationCache().removeAll(); insertAnonymousFilter(); request = createRequest("foo/bar"); @@ -370,10 +437,10 @@ public void testFileBasedWithSession() throws Exception { } @Test - public void testUserPropertyWithCache() throws Exception { + public void testUserPropertyWithCacheEnabled() throws Exception { String authKeyUrlParam = "myAuthKey"; - String filterName = "testAuthKeyFilter2"; + String filterName = "testAuthKeyFilter2Enabled"; AuthenticationKeyFilterConfig config = new AuthenticationKeyFilterConfig(); config.setClassName(GeoServerAuthenticationKeyFilter.class.getName()); @@ -382,6 +449,10 @@ public void testUserPropertyWithCache() throws Exception { config.setAuthKeyParamName(authKeyUrlParam); config.setAuthKeyMapperName("userPropertyMapper"); + // Let's make sure the internal user cache is disabled + Map mapperParams = new HashMap<>(); + mapperParams.put("cacheTtlSeconds", "0"); + config.setMapperParameters(mapperParams); getSecurityManager().saveFilter(config); GeoServerAuthenticationKeyFilter filter = @@ -389,12 +460,14 @@ public void testUserPropertyWithCache() throws Exception { UserPropertyAuthenticationKeyMapper mapper = (UserPropertyAuthenticationKeyMapper) filter.getMapper(); + // Force to reload the property file mapper.synchronize(); prepareFilterChain(pattern, filterName); modifyChain(pattern, false, false, null); SecurityContextHolder.getContext().setAuthentication(null); + getSecurityManager().getAuthenticationCache().removeAll(); // Test entry point MockHttpServletRequest request = createRequest("/foo/bar"); @@ -409,6 +482,10 @@ public void testUserPropertyWithCache() throws Exception { getSecurityManager() .loadUserGroupService("ug1") .loadUserByUsername(testUserName); + // Force to reload the property file + mapper.synchronize(); + // Make sure the cache is cleared + mapper.resetUserCache(); String authKey = user.getProperties().getProperty(mapper.getUserPropertyName()); assertNotNull(authKey); @@ -417,15 +494,15 @@ public void testUserPropertyWithCache() throws Exception { chain = new MockFilterChain(); request.setQueryString(authKeyUrlParam + "=" + authKey); request.addParameter(authKeyUrlParam, authKey); - getProxy().doFilter(request, response, chain); - assertNotEquals(response.getStatus(), MockHttpServletResponse.SC_MOVED_TEMPORARILY); + // Force to reload the property file + mapper.synchronize(); - Authentication auth = - getSecurityManager().getAuthenticationCache().get(filterName, authKey); - assertNotNull(auth); + SecurityContextHolder.clearContext(); + getSecurityManager().getAuthenticationCache().removeAll(); + + getProxy().doFilter(request, response, chain); + assertNotEquals(MockHttpServletResponse.SC_MOVED_TEMPORARILY, response.getStatus()); assertNull(request.getSession(false)); - checkForAuthenticatedRole(auth); - assertEquals(testUserName, auth.getPrincipal()); // check unknown user username = "unknown"; @@ -438,18 +515,68 @@ public void testUserPropertyWithCache() throws Exception { request.addParameter(authKeyUrlParam, "abc"); getProxy().doFilter(request, response, chain); assertEquals(HttpServletResponse.SC_FORBIDDEN, response.getStatus()); - assertNull(SecurityContextHolder.getContext().getAuthentication()); + } + + @Test + public void testUserPropertyWithCacheDisabled() throws Exception { + + String authKeyUrlParam = "myAuthKey"; + String filterName = "testAuthKeyFilter2Disabled"; + + AuthenticationKeyFilterConfig config = new AuthenticationKeyFilterConfig(); + config.setClassName(GeoServerAuthenticationKeyFilter.class.getName()); + config.setName(filterName); + config.setUserGroupServiceName("ug1"); + config.setAuthKeyParamName(authKeyUrlParam); + config.setAuthKeyMapperName("userPropertyMapper"); + + // Let's make sure the internal user cache is disabled + Map mapperParams = new HashMap<>(); + mapperParams.put("cacheTtlSeconds", "0"); + config.setMapperParameters(mapperParams); + getSecurityManager().saveFilter(config); + GeoServerAuthenticationKeyFilter filter = + (GeoServerAuthenticationKeyFilter) getSecurityManager().loadFilter(filterName); + + UserPropertyAuthenticationKeyMapper mapper = + (UserPropertyAuthenticationKeyMapper) filter.getMapper(); + // Force to reload the property file + mapper.synchronize(); + + prepareFilterChain(pattern, filterName); + modifyChain(pattern, false, false, null); + + SecurityContextHolder.getContext().setAuthentication(null); getSecurityManager().getAuthenticationCache().removeAll(); // check disabled user username = testUserName; password = username; updateUser("ug1", username, false); - request = createRequest("/foo/bar"); - response = new MockHttpServletResponse(); - chain = new MockFilterChain(); + + // Force to reload the property file + mapper.synchronize(); + // Make sure the cache is cleared + mapper.resetUserCache(); + + // test success + GeoServerUser user = + (GeoServerUser) + getSecurityManager() + .loadUserGroupService("ug1") + .loadUserByUsername(testUserName); + + String authKey = user.getProperties().getProperty(mapper.getUserPropertyName()); + assertNotNull(authKey); + + SecurityContextHolder.clearContext(); + getSecurityManager().getAuthenticationCache().removeAll(); + + MockHttpServletRequest request = createRequest("/foo/bar"); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); request.setQueryString(authKeyUrlParam + "=" + authKey); request.addParameter(authKeyUrlParam, authKey); @@ -689,6 +816,11 @@ public void testAuthKeyMapperSynchronize() throws Exception { ugstore.updateUser(u2); ugstore.store(); + // Force cache expiration + propMapper.resetUserCache(); + userpropMapper.resetUserCache(); + + // Ensure the users are not present anymore assertNull(propMapper.getUser(user2KeyA)); assertNull(userpropMapper.getUser(user2KeyB)); } @@ -770,10 +902,123 @@ public void testWebServiceAuthKeyBodyResponseNoRoleMatchingRegex() throws Except assertTrue(user.getAuthorities().contains(new GeoServerRole("ROLE_ANONYMOUS"))); } + @Test + public void testAllowChallengeAnonymousSessionsBehavior() throws Exception { + String authKeyUrlParam = "myAuthKey"; + String filterName = "testAllowChallengeAnonymousSessionsBehavior"; + + // Configure the filter + AuthenticationKeyFilterConfig config = new AuthenticationKeyFilterConfig(); + config.setClassName(GeoServerAuthenticationKeyFilter.class.getName()); + config.setName(filterName); + config.setUserGroupServiceName("ug1"); + config.setAuthKeyParamName(authKeyUrlParam); + config.setAuthKeyMapperName("userPropertyMapper"); + + // Save initial filter configuration with allowChallengeAnonymousSessions = true + config.setAllowChallengeAnonymousSessions(true); + + // Let's make sure the internal user cache is disabled + Map mapperParams = new HashMap<>(); + mapperParams.put("cacheTtlSeconds", "0"); + config.setMapperParameters(mapperParams); + getSecurityManager().saveFilter(config); + + GeoServerAuthenticationKeyFilter filter = + (GeoServerAuthenticationKeyFilter) getSecurityManager().loadFilter(filterName); + + // Configure the mapper to return a user for a specific auth key + UserPropertyAuthenticationKeyMapper mapper = + (UserPropertyAuthenticationKeyMapper) filter.getMapper(); + mapper.synchronize(); + + // Prepare the filter chain + prepareFilterChain(pattern, filterName); + modifyChain(pattern, false, false, null); + + // test success + GeoServerUser user = + (GeoServerUser) + getSecurityManager() + .loadUserGroupService("ug1") + .loadUserByUsername(testUserName); + // Make sure the cache is cleared + mapper.resetUserCache(); + String authKey = user.getProperties().getProperty(mapper.getUserPropertyName()); + assertNotNull(authKey); + + // Test when allowChallengeAnonymousSessions = true (always use authKey for authentication) + MockHttpServletRequest request = createRequest("/foo/bar"); + request.setQueryString(authKeyUrlParam + "=" + authKey); + request.addParameter(authKeyUrlParam, authKey); + MockHttpServletResponse response = new MockHttpServletResponse(); + MockFilterChain chain = new MockFilterChain(); + + // Set a valid existing authentication in the SecurityContext + List authorities = List.of(new SimpleGrantedAuthority("ROLE_ANONYMOUS")); + SecurityContextHolder.getContext() + .setAuthentication( + new AnonymousAuthenticationToken("test", "anonymous", authorities)); + + // Perform the request + getProxy().doFilter(request, response, chain); + + // Verify that the filter ignored the existing authentication and retrieved the user using + // authKey + Authentication resultAuth = + getSecurityManager().getAuthenticationCache().get(filterName, authKey); + resultAuth = + resultAuth != null + ? resultAuth + : SecurityContextHolder.getContext().getAuthentication(); + if (resultAuth != null) { + assertEquals( + "user1", + resultAuth.getPrincipal()); // Assuming "user1" is returned by the mapper + + // Reconfigure the filter with allowChallengeAnonymousSessions = false + config.setAllowChallengeAnonymousSessions(false); + getSecurityManager().saveFilter(config); + + filter = (GeoServerAuthenticationKeyFilter) getSecurityManager().loadFilter(filterName); + + // Simulate another request + request = createRequest("/foo/bar"); + request.setQueryString(authKeyUrlParam + "=" + authKey); + request.addParameter(authKeyUrlParam, authKey); + response = new MockHttpServletResponse(); + chain = new MockFilterChain(); + + // Set an existing valid authentication in the SecurityContext + getSecurityManager().getAuthenticationCache().removeAll(); + SecurityContextHolder.getContext() + .setAuthentication( + new AnonymousAuthenticationToken("test", "validUser", authorities)); + + // Perform the request + getProxy().doFilter(request, response, chain); + + // Verify that the filter used the existing authentication and did not retrieve the user + // using authKey + resultAuth = getSecurityManager().getAuthenticationCache().get(filterName, authKey); + resultAuth = + resultAuth != null + ? resultAuth + : SecurityContextHolder.getContext().getAuthentication(); + assertNotNull(resultAuth); + assertEquals("user1", resultAuth.getPrincipal()); + } + } + private void loadPropFile(File authKeyFile, Properties props) throws FileNotFoundException, IOException { try (FileInputStream propFile = new FileInputStream(authKeyFile)) { props.load(propFile); } } + + @Override + protected GeoServerSecurityManager getSecurityManager() { + return getProxy().securityManager; + } } diff --git a/src/extension/authkey/src/test/java/org/geoserver/security/FakeMapper.java b/src/extension/authkey/src/test/java/org/geoserver/security/FakeMapper.java index de665562720..dd5477b4015 100644 --- a/src/extension/authkey/src/test/java/org/geoserver/security/FakeMapper.java +++ b/src/extension/authkey/src/test/java/org/geoserver/security/FakeMapper.java @@ -18,7 +18,7 @@ public class FakeMapper extends AbstractAuthenticationKeyMapper { @Override - public GeoServerUser getUser(String key) throws IOException { + public GeoServerUser getUserInternal(String key) throws IOException { return new GeoServerUser("fakeuser"); } @@ -36,8 +36,11 @@ public String getMapperParameter(String parameter) { return super.getMapperConfiguration().get(parameter); } + @Override + protected void checkPropertiesInternal() throws IOException {} + @Override public Set getAvailableParameters() { - return new HashSet<>(Arrays.asList("param1", "param2")); + return new HashSet<>(Arrays.asList("param1", "param2", "cacheTtlSeconds")); } } diff --git a/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityFilter.java b/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityFilter.java index 8c2c3c80047..9e027d4db50 100644 --- a/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityFilter.java +++ b/src/main/src/main/java/org/geoserver/security/filter/GeoServerSecurityFilter.java @@ -14,6 +14,7 @@ import org.geoserver.security.config.SecurityManagerConfig; import org.geoserver.security.impl.AbstractGeoServerSecurityService; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; @@ -70,10 +71,18 @@ public void destroy() {} */ protected String authenticateFromCache( AuthenticationCachingFilter filter, HttpServletRequest request) { + return authenticateFromCache(filter, request, false); + } + + protected String authenticateFromCache( + AuthenticationCachingFilter filter, HttpServletRequest request, boolean force) { Authentication authFromCache = null; String cacheKey = null; - if (SecurityContextHolder.getContext().getAuthentication() == null) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (force + || authentication == null + || authentication instanceof AnonymousAuthenticationToken) { cacheKey = filter.getCacheKey(request); if (cacheKey != null) { authFromCache = From fd9febf3af8b4aa9409d9ddd5a18be6707c81b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roar=20Br=C3=A6nden?= Date: Mon, 9 Dec 2024 12:31:10 +0100 Subject: [PATCH 5/8] [GEOS-11564] WPS calls to internal WFS will handle requests with version=2.0.0 (#7953) * [GEOS-11564] WPS calls to internal WFS will handle requests with version=2.0.0 * Use code for axis flipping for wfs 2.0 --- .../executor/InternalWFSInputProvider.java | 48 +++++-- .../wps/ppio/ProcessParameterIO.java | 1 + .../java/org/geoserver/wps/ppio/WFSPPIO.java | 24 +++- .../geoserver/wps/xml/WPSConfiguration.java | 6 +- .../geoserver/wps/ExecuteInternalWFSTest.java | 132 ++++++++++++++++++ .../wps/xml/v1_0_0/WpsXmlReaderTest.java | 49 ++++++- .../wfs/xml/v2_0/WFSConfiguration.java | 2 +- .../wfs/xml/v2_0/WFSParserDelegate.java | 19 +++ 8 files changed, 262 insertions(+), 19 deletions(-) create mode 100644 src/extension/wps/wps-core/src/test/java/org/geoserver/wps/ExecuteInternalWFSTest.java create mode 100644 src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSParserDelegate.java diff --git a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/executor/InternalWFSInputProvider.java b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/executor/InternalWFSInputProvider.java index 27e7ef75764..dd3d36db050 100644 --- a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/executor/InternalWFSInputProvider.java +++ b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/executor/InternalWFSInputProvider.java @@ -4,11 +4,11 @@ */ package org.geoserver.wps.executor; -import net.opengis.wfs.GetFeatureType; import net.opengis.wps10.InputReferenceType; import net.opengis.wps10.InputType; import net.opengis.wps10.MethodType; import org.geoserver.wfs.WebFeatureService; +import org.geoserver.wfs.WebFeatureService20; import org.geoserver.wfs.kvp.GetFeatureKvpRequestReader; import org.geoserver.wfs.request.FeatureCollectionResponse; import org.geoserver.wps.ppio.ComplexPPIO; @@ -33,20 +33,48 @@ public InternalWFSInputProvider( @Override protected Object getValueInternal(ProgressListener listener) throws Exception { - WebFeatureService wfs = (WebFeatureService) context.getBean("wfsServiceTarget"); - GetFeatureType gft = null; + Object gft = null; InputReferenceType ref = input.getReference(); + if (ref.getMethod() == MethodType.POST_LITERAL) { - gft = (GetFeatureType) ref.getBody(); + gft = ref.getBody(); } else { - GetFeatureKvpRequestReader reader = - (GetFeatureKvpRequestReader) context.getBean("getFeatureKvpReader"); - gft = (GetFeatureType) kvpParse(ref.getHref(), reader); + String version = getVersion(ref.getHref()); + GetFeatureKvpRequestReader reader; + if ("2.0.0".equals(version)) { + reader = (GetFeatureKvpRequestReader) context.getBean("getFeature20KvpReader"); + } else { + reader = (GetFeatureKvpRequestReader) context.getBean("getFeatureKvpReader"); + } + gft = kvpParse(ref.getHref(), reader); } - FeatureCollectionResponse featureCollectionType = wfs.getFeature(gft); - // this will also deal with axis order issues - return ((ComplexPPIO) ppio).decode(featureCollectionType.getAdaptee()); + if (gft instanceof net.opengis.wfs.GetFeatureType) { + WebFeatureService wfs = (WebFeatureService) context.getBean("wfsServiceTarget"); + + FeatureCollectionResponse featureCollectionType = + wfs.getFeature((net.opengis.wfs.GetFeatureType) gft); + // this will also deal with axis order issues + return ((ComplexPPIO) ppio).decode(featureCollectionType.getAdaptee()); + } else if (gft instanceof net.opengis.wfs20.GetFeatureType) { + WebFeatureService20 wfs = (WebFeatureService20) context.getBean("wfsService20Target"); + + FeatureCollectionResponse featureCollectionType = + wfs.getFeature((net.opengis.wfs20.GetFeatureType) gft); + // this will also deal with axis order issues + return ((ComplexPPIO) ppio).decode(featureCollectionType.getAdaptee()); + } else { + + if (gft == null) { + throw new UnsupportedOperationException("We didn't get a valid GetFeatureType."); + } + throw new UnsupportedOperationException( + "We can't handle the inner WFS request. Provided GetFeatureType is of class " + + gft.getClass().getCanonicalName() + + "\nContent: [" + + gft + + "]\n"); + } } @Override diff --git a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/ProcessParameterIO.java b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/ProcessParameterIO.java index f11fdafac52..3c38552f381 100644 --- a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/ProcessParameterIO.java +++ b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/ProcessParameterIO.java @@ -93,6 +93,7 @@ public enum PPIODirection { defaults.add(new WFSPPIO.WFS11()); defaults.add(new WFSPPIO.WFS10Alternate()); defaults.add(new WFSPPIO.WFS11Alternate()); + defaults.add(new WFSPPIO.WFS20()); // CRS defaults.add(new CoordinateReferenceSystemPPIO()); diff --git a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/WFSPPIO.java b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/WFSPPIO.java index 718eb87b943..a6a6719e9ef 100644 --- a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/WFSPPIO.java +++ b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/ppio/WFSPPIO.java @@ -93,9 +93,18 @@ public Object decode(Object input) throws Exception { input = p.parse(new StringReader((String) input)); } + SimpleFeatureCollection fc; // cast and handle the axis flipping - FeatureCollectionType fct = (FeatureCollectionType) input; - SimpleFeatureCollection fc = (SimpleFeatureCollection) fct.getFeature().get(0); + if (input instanceof net.opengis.wfs.FeatureCollectionType) { + net.opengis.wfs.FeatureCollectionType fct = + (net.opengis.wfs.FeatureCollectionType) input; + fc = (SimpleFeatureCollection) fct.getFeature().get(0); + } else { + // WFS 2.0.0 + net.opengis.wfs20.FeatureCollectionType fct = + (net.opengis.wfs20.FeatureCollectionType) input; + fc = (SimpleFeatureCollection) fct.getMember().get(0); + } // Axis flipping issue, we should determine if the collection needs flipping if (fc.getSchema().getGeometryDescriptor() != null) { CoordinateReferenceSystem crs = getCollectionCRS(fc); @@ -120,7 +129,6 @@ public Object decode(Object input) throws Exception { } } } - return eliminateFeatureBounds(fc); } @@ -258,4 +266,14 @@ public WFS11Alternate() { org.geoserver.wfs.xml.v1_1_0.WFS.FEATURECOLLECTION); } } + + public static class WFS20 extends WFSPPIO { + + public WFS20() { + super( + new org.geoserver.wfs.xml.v2_0.WFSConfiguration(), + "text/xml", + org.geotools.wfs.v2_0.WFS.FeatureCollection); + } + } } diff --git a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/xml/WPSConfiguration.java b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/xml/WPSConfiguration.java index e593bd36635..6fb182f5f0f 100644 --- a/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/xml/WPSConfiguration.java +++ b/src/extension/wps/wps-core/src/main/java/org/geoserver/wps/xml/WPSConfiguration.java @@ -13,7 +13,6 @@ import org.geoserver.platform.GeoServerExtensions; import org.geoserver.wfs.CatalogNamespaceSupport; import org.geoserver.wfs.xml.v1_0_0.GetFeatureTypeBinding; -import org.geotools.wfs.WFSParserDelegate; import org.geotools.wfs.v1_0.WFS; import org.geotools.wfs.v1_1.WFSConfiguration; import org.geotools.wfs.v2_0.bindings.CopyingHandler; @@ -50,7 +49,8 @@ protected void configureContext(MutablePicoContainer container) { // replace WFSParserDelegate from GeoTools with a new one using GeoServer // GetFeatureTypeBinding, // able to parse viewParams attribute and enable usage of SQL views - Object wfs = container.getComponentInstanceOfType(WFSParserDelegate.class); + + Object wfs = container.getComponentInstanceOfType(org.geotools.wfs.WFSParserDelegate.class); container.unregisterComponentByInstance(wfs); // XSDParserDelegate with CatalogNamespaceSupport container.registerComponentInstance( @@ -66,6 +66,8 @@ protected void configureBindings(MutablePicoContainer container) { }, new CatalogNamespaceSupport( GeoServerExtensions.bean(LocalWorkspaceCatalog.class)))); + + container.registerComponentInstance(new org.geoserver.wfs.xml.v2_0.WFSParserDelegate()); container.registerComponentImplementation(ComplexDataHandler.class); } diff --git a/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/ExecuteInternalWFSTest.java b/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/ExecuteInternalWFSTest.java new file mode 100644 index 00000000000..f9aefea5622 --- /dev/null +++ b/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/ExecuteInternalWFSTest.java @@ -0,0 +1,132 @@ +/* (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. + */ +package org.geoserver.wps; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletResponse; + +/** + * Test WPS execute call's with internal references to WFS. + * + * @author Roar Brænden + */ +public class ExecuteInternalWFSTest extends WPSTestSupport { + + private static final String WFS10_SchemaURI = "http://www.opengis.net/wfs"; + + private static final String WFS20_SchemaURI = "http://www.opengis.net/wfs/2.0"; + + @Test + public void testGetVersion10() throws Exception { + mockXmlPostRequest(xml("GET", "1.0")); + } + + @Test + public void testPostVersion10() throws Exception { + mockXmlPostRequest(xml("POST", "1.0")); + } + + @Test + public void testPostVersion20() throws Exception { + mockXmlPostRequest(xml("POST", "2.0")); + } + + @Test + public void testGetVersion20() throws Exception { + mockXmlPostRequest(xml("GET", "2.0")); + } + + private void mockXmlPostRequest(String xml) throws Exception { + MockHttpServletResponse response = postAsServletResponse(root(), xml); + double area = Double.parseDouble(response.getContentAsString()); + + Assert.assertEquals(2.195E-6, area, 1E-9); + } + + /** Create Reference-element of the WPS call */ + private String xml(String method, String version) { + + String wfsReq = null; + String wfsUrl = "http://geoserver/wfs"; + + if ("POST".equals(method) && "1.0".equals(version)) { + wfsReq = + "\n" + + " \n" + + " \n" + + "\n"; + } else if ("GET".equals(method) && "1.0".equals(version)) { + wfsUrl += + "?service=WFS&version=1.0.0&request=GetFeature&outputFormat=GML2&typeName=cite:Lakes"; + } else if ("POST".equals(method) && "2.0".equals(version)) { + + wfsReq = + "\n" + + " \n" + + " \n" + + "\n"; + } else if ("GET".equals(method) && "2.0".equals(version)) { + wfsUrl += + "?service=WFS&version=2.0.0&request=GetFeature&outputFormat=GML2&typeNames=cite:Lakes"; + } + + String featuresReference; + + if (wfsReq != null) { + featuresReference = + " \n" + + " \n" + + wfsReq + + " \n" + + " \n"; + } else { + featuresReference = + " \n"; + } + + return "\n" + + "\n" + + " geo:area\n" + + " \n" + + " \n" + + " geom\n" + + " \n" + + " \n" + + " \n" + + " vec:CollectGeometries\n" + + " \n" + + " \n" + + " features\n" + + featuresReference + + " \n" + + " \n" + + " \n" + + " \n" + + " result\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " result\n" + + " \n" + + " \n" + + "\n"; + } +} diff --git a/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/xml/v1_0_0/WpsXmlReaderTest.java b/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/xml/v1_0_0/WpsXmlReaderTest.java index 2e6165e6363..91975c51977 100644 --- a/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/xml/v1_0_0/WpsXmlReaderTest.java +++ b/src/extension/wps/wps-core/src/test/java/org/geoserver/wps/xml/v1_0_0/WpsXmlReaderTest.java @@ -11,7 +11,6 @@ import java.io.StringReader; import java.util.Map; -import net.opengis.wfs.GetFeatureType; import net.opengis.wps10.ExecuteType; import net.opengis.wps10.InputType; import org.geoserver.wps.WPSTestSupport; @@ -59,12 +58,56 @@ public void testWpsExecuteWithGetFeatureAndViewParams() throws Exception { InputType features = (InputType) request.getDataInputs().eContents().get(0); assertNotNull(features.getReference()); assertNotNull(features.getReference().getBody()); - assertTrue(features.getReference().getBody() instanceof GetFeatureType); - GetFeatureType getFeature = (GetFeatureType) features.getReference().getBody(); + assertTrue(features.getReference().getBody() instanceof net.opengis.wfs.GetFeatureType); + net.opengis.wfs.GetFeatureType getFeature = + (net.opengis.wfs.GetFeatureType) features.getReference().getBody(); assertFalse(getFeature.getViewParams().isEmpty()); Map viewParams = (Map) getFeature.getViewParams().get(0); assertEquals(2, viewParams.keySet().size()); assertEquals("b", viewParams.get("A")); assertEquals("d", viewParams.get("C")); } + + @Test + public void testWpsExecuteWithGetFeature_2_0_0() throws Exception { + String xml = + "\n" + + "\n" + + " gs:Bounds\n" + + " \n" + + " \n" + + " features\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " bounds\n" + + " \n" + + " \n" + + ""; + + WpsXmlReader reader = + new WpsXmlReader( + "Execute", + "1.0.0", + new WPSConfiguration(), + new org.geoserver.util.EntityResolverProvider(this.getGeoServer())); + Object parsed = reader.read(null, new StringReader(xml), null); + assertTrue(parsed instanceof ExecuteType); + + ExecuteType request = (ExecuteType) parsed; + assertFalse(request.getDataInputs().eContents().isEmpty()); + InputType features = (InputType) request.getDataInputs().eContents().get(0); + assertNotNull(features.getReference()); + assertNotNull(features.getReference().getBody()); + assertTrue(features.getReference().getBody() instanceof net.opengis.wfs20.GetFeatureType); + } } diff --git a/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSConfiguration.java b/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSConfiguration.java index d0670c1b0e5..d05ddcf379d 100644 --- a/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSConfiguration.java +++ b/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSConfiguration.java @@ -14,7 +14,7 @@ /** Extend GeoTools WFSConfiguration to provide a custom binding class for GetFeatureType */ public class WFSConfiguration extends org.geotools.wfs.v2_0.WFSConfiguration { - WFSConfiguration() { + public WFSConfiguration() { // OGC and OWS add two extra GML configurations in the mix, make sure to configure them // all with a geomtetry factory supporting curves CurvedGeometryFactory gf = new CurvedGeometryFactory(Double.MAX_VALUE); diff --git a/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSParserDelegate.java b/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSParserDelegate.java new file mode 100644 index 00000000000..cdb1adfac2f --- /dev/null +++ b/src/wfs/src/main/java/org/geoserver/wfs/xml/v2_0/WFSParserDelegate.java @@ -0,0 +1,19 @@ +/* (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. + */ +package org.geoserver.wfs.xml.v2_0; + +import org.geotools.xsd.XSDParserDelegate; + +/** + * Parser delegate for the WFS 2.0 schema. + * + * @author Roar Brænden + */ +public class WFSParserDelegate extends XSDParserDelegate { + + public WFSParserDelegate() { + super(new WFSConfiguration()); + } +} From 26ed5955b7e78fb993b0949fb1a6791af5356eee Mon Sep 17 00:00:00 2001 From: Tiago <75946028+tiago-s-vieira-alb@users.noreply.github.com> Date: Mon, 9 Dec 2024 13:08:14 +0000 Subject: [PATCH 6/8] [GEOS-11607] KML WMS GetMap is performing a heavy database load query --- .../kml/decorator/LookAtDecoratorFactory.java | 10 +++++++++- .../test/java/org/geoserver/kml/KMLTest.java | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/kml/src/main/java/org/geoserver/kml/decorator/LookAtDecoratorFactory.java b/src/kml/src/main/java/org/geoserver/kml/decorator/LookAtDecoratorFactory.java index 8bbd66d9e0a..8aaac920a83 100644 --- a/src/kml/src/main/java/org/geoserver/kml/decorator/LookAtDecoratorFactory.java +++ b/src/kml/src/main/java/org/geoserver/kml/decorator/LookAtDecoratorFactory.java @@ -14,6 +14,8 @@ import org.geoserver.kml.KmlEncodingContext; import org.geoserver.kml.utils.LookAtOptions; import org.geoserver.wms.WMSInfo; +import org.geotools.map.FeatureLayer; +import org.geotools.map.Layer; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; @@ -61,7 +63,13 @@ class LayerLookAtDecorator implements KmlDecorator { @Override public Feature decorate(Feature feature, KmlEncodingContext context) { - Envelope bounds = context.getCurrentLayer().getBounds(); + Layer currentLayer = context.getCurrentLayer(); + Envelope bounds; + if (currentLayer instanceof FeatureLayer) { + bounds = context.getCurrentFeatureCollection().getBounds(); + } else { + bounds = currentLayer.getBounds(); + } LookAt lookAt = buildLookAt(bounds, context.getLookAtOptions(), false); feature.setAbstractView(lookAt); diff --git a/src/kml/src/test/java/org/geoserver/kml/KMLTest.java b/src/kml/src/test/java/org/geoserver/kml/KMLTest.java index 57eb62035ed..56abb9cd2bc 100644 --- a/src/kml/src/test/java/org/geoserver/kml/KMLTest.java +++ b/src/kml/src/test/java/org/geoserver/kml/KMLTest.java @@ -365,6 +365,23 @@ public void testBasicVector() throws Exception { doc); } + @Test + public void testLayerLookAt() throws Exception { + Document doc = + getAsDOM( + "wms?request=getmap&service=wms&version=1.1.1" + + "&format=" + + KMLMapOutputFormat.MIME_TYPE + + "&layers=" + + getLayerId(MockData.BASIC_POLYGONS) + + "&styles=&height=1024&width=1024&bbox=-1.5,2,1.5,4&srs=EPSG:4326"); + + assertXpathEvaluatesTo( + "-0.004885780703602904", "//kml:Folder/kml:LookAt/kml:longitude", doc); + assertXpathEvaluatesTo("4.00243024094668", "//kml:Folder/kml:LookAt/kml:latitude", doc); + assertXpathEvaluatesTo("777088.7971299331", "//kml:Folder/kml:LookAt/kml:altitude", doc); + } + @Test public void testNoAttributes() throws Exception { Document doc = From 03125b382caf437259fe78710557f68ca14f2c7d Mon Sep 17 00:00:00 2001 From: Wouter Goedhart Date: Wed, 16 Oct 2024 22:43:55 +0200 Subject: [PATCH 7/8] Splt geopkg output into separate packages for geoserver cloud support --- src/community/geopkg/pom.xml | 12 ++- src/community/mbtiles/pom.xml | 12 ++- src/extension/geopkg-output/core/pom.xml | 69 +++++++++++++ .../core/src/main/java/applicationContext.xml | 23 +++++ .../java/org/geoserver/geopkg/GeoPkg.java | 0 .../GeoPkgDataStoreFactoryInitializer.java | 0 ...GeoPkgDataStoreFactoryInitializerTest.java | 0 .../resources/org/GPKG_LOGGING.properties | 0 src/extension/geopkg-output/pom.xml | 84 ++-------------- src/extension/geopkg-output/wfs/pom.xml | 86 +++++++++++++++++ .../wfs/src/main/java/applicationContext.xml | 23 +++++ .../wfs/GeoPackageGetFeatureOutputFormat.java | 0 .../resources/GeoServerApplication.properties | 5 - .../GeoServerApplication_es.properties | 5 - .../GeoServerApplication_fr.properties | 5 - .../GeoServerApplication_ko.properties | 5 - .../GeoServerApplication_pl.properties | 5 - .../GeoServerApplication_ro.properties | 5 - .../GeoServerApplication_ru.properties | 5 - .../GeoServerApplication_tr.properties | 5 - .../GeoServerApplication_zh.properties | 5 - .../GeoPackageGetFeatureOutputFormatTest.java | 0 .../resources/org/GPKG_LOGGING.properties | 35 +++++++ src/extension/geopkg-output/wms/pom.xml | 91 ++++++++++++++++++ .../src/main/java/applicationContext.xml | 22 ++--- .../wms/GeoPackageGetMapOutputFormat.java | 0 .../AbstractTilesGetMapOutputFormat.java | 0 .../org/geoserver/tiles/FileBackedRawMap.java | 0 .../tiles/FileBackedRawMapResponse.java | 0 .../resources/GeoServerApplication.properties | 4 + .../GeoServerApplication_es.properties | 4 + .../GeoServerApplication_fr.properties | 4 + .../GeoServerApplication_ko.properties | 4 + .../GeoServerApplication_pl.properties | 4 + .../GeoServerApplication_ro.properties | 4 + .../GeoServerApplication_ru.properties | 4 + .../GeoServerApplication_tr.properties | 4 + .../GeoServerApplication_zh.properties | 4 + .../GeoPackageGetMapOutputFormatTest.java | 0 .../geopkg/GeoPackageMimeTypeTest.java | 0 .../resources/org/GPKG_LOGGING.properties | 35 +++++++ .../org/geoserver/geopkg/toplefttile.png | Bin src/release/pom.xml | 12 ++- src/web/app/pom.xml | 12 ++- 44 files changed, 455 insertions(+), 142 deletions(-) create mode 100644 src/extension/geopkg-output/core/pom.xml create mode 100644 src/extension/geopkg-output/core/src/main/java/applicationContext.xml rename src/extension/geopkg-output/{ => core}/src/main/java/org/geoserver/geopkg/GeoPkg.java (100%) rename src/extension/geopkg-output/{ => core}/src/main/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializer.java (100%) rename src/extension/geopkg-output/{ => core}/src/test/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializerTest.java (100%) rename src/extension/geopkg-output/{ => core}/src/test/resources/org/GPKG_LOGGING.properties (100%) create mode 100644 src/extension/geopkg-output/wfs/pom.xml create mode 100644 src/extension/geopkg-output/wfs/src/main/java/applicationContext.xml rename src/extension/geopkg-output/{ => wfs}/src/main/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormat.java (100%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_es.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_fr.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_ko.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_pl.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_ro.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_ru.properties (60%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_tr.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/main/resources/GeoServerApplication_zh.properties (58%) rename src/extension/geopkg-output/{ => wfs}/src/test/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormatTest.java (100%) create mode 100644 src/extension/geopkg-output/wfs/src/test/resources/org/GPKG_LOGGING.properties create mode 100644 src/extension/geopkg-output/wms/pom.xml rename src/extension/geopkg-output/{ => wms}/src/main/java/applicationContext.xml (61%) rename src/extension/geopkg-output/{ => wms}/src/main/java/org/geoserver/geopkg/wms/GeoPackageGetMapOutputFormat.java (100%) rename src/extension/geopkg-output/{ => wms}/src/main/java/org/geoserver/tiles/AbstractTilesGetMapOutputFormat.java (100%) rename src/extension/geopkg-output/{ => wms}/src/main/java/org/geoserver/tiles/FileBackedRawMap.java (100%) rename src/extension/geopkg-output/{ => wms}/src/main/java/org/geoserver/tiles/FileBackedRawMapResponse.java (100%) create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_es.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_fr.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ko.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_pl.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ro.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ru.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_tr.properties create mode 100644 src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_zh.properties rename src/extension/geopkg-output/{ => wms}/src/test/java/org/geoserver/geopkg/GeoPackageGetMapOutputFormatTest.java (100%) rename src/extension/geopkg-output/{ => wms}/src/test/java/org/geoserver/geopkg/GeoPackageMimeTypeTest.java (100%) create mode 100644 src/extension/geopkg-output/wms/src/test/resources/org/GPKG_LOGGING.properties rename src/extension/geopkg-output/{ => wms}/src/test/resources/org/geoserver/geopkg/toplefttile.png (100%) diff --git a/src/community/geopkg/pom.xml b/src/community/geopkg/pom.xml index 216cc7e3b7d..c5c4f8f8260 100644 --- a/src/community/geopkg/pom.xml +++ b/src/community/geopkg/pom.xml @@ -44,7 +44,17 @@ org.geoserver.extension - gs-geopkg-output + gs-geopkg-output-core + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wms + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wfs ${project.version} diff --git a/src/community/mbtiles/pom.xml b/src/community/mbtiles/pom.xml index 2b261e4fdbe..04ee09ef40e 100644 --- a/src/community/mbtiles/pom.xml +++ b/src/community/mbtiles/pom.xml @@ -34,7 +34,17 @@ org.geoserver.extension - gs-geopkg-output + gs-geopkg-output-core + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wms + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wfs ${project.version} diff --git a/src/extension/geopkg-output/core/pom.xml b/src/extension/geopkg-output/core/pom.xml new file mode 100644 index 00000000000..1c0fadb0ade --- /dev/null +++ b/src/extension/geopkg-output/core/pom.xml @@ -0,0 +1,69 @@ + + + + 4.0.0 + + + org.geoserver.extension + gs-geopkg-output + 2.27-SNAPSHOT + + + org.geoserver.extension + gs-geopkg-output-core + jar + GeoPackage Core output + + + + org.geoserver + gs-main + ${project.version} + + + org.geotools + gt-geopkg + + + org.geoserver + gs-main + ${project.version} + tests + test + + + org.easymock + easymock + test + + + org.geoserver.web + gs-web-core + ${project.version} + tests + test + + + org.geoserver.web + gs-web-demo + ${project.version} + test + + + org.junit.jupiter + junit-jupiter + test + + + + + + src/test/resources + + + + diff --git a/src/extension/geopkg-output/core/src/main/java/applicationContext.xml b/src/extension/geopkg-output/core/src/main/java/applicationContext.xml new file mode 100644 index 00000000000..1febd9e8dd2 --- /dev/null +++ b/src/extension/geopkg-output/core/src/main/java/applicationContext.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/GeoPkg.java b/src/extension/geopkg-output/core/src/main/java/org/geoserver/geopkg/GeoPkg.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/GeoPkg.java rename to src/extension/geopkg-output/core/src/main/java/org/geoserver/geopkg/GeoPkg.java diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializer.java b/src/extension/geopkg-output/core/src/main/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializer.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializer.java rename to src/extension/geopkg-output/core/src/main/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializer.java diff --git a/src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializerTest.java b/src/extension/geopkg-output/core/src/test/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializerTest.java similarity index 100% rename from src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializerTest.java rename to src/extension/geopkg-output/core/src/test/java/org/geoserver/geopkg/GeoPkgDataStoreFactoryInitializerTest.java diff --git a/src/extension/geopkg-output/src/test/resources/org/GPKG_LOGGING.properties b/src/extension/geopkg-output/core/src/test/resources/org/GPKG_LOGGING.properties similarity index 100% rename from src/extension/geopkg-output/src/test/resources/org/GPKG_LOGGING.properties rename to src/extension/geopkg-output/core/src/test/resources/org/GPKG_LOGGING.properties diff --git a/src/extension/geopkg-output/pom.xml b/src/extension/geopkg-output/pom.xml index 7be7adcf220..f5cb15927f8 100644 --- a/src/extension/geopkg-output/pom.xml +++ b/src/extension/geopkg-output/pom.xml @@ -15,84 +15,12 @@ org.geoserver.extension gs-geopkg-output - jar + pom GeoPackage output - - - org.geoserver - gs-main - ${project.version} - - - org.geoserver - gs-wms - ${project.version} - - - org.geoserver - gs-wfs - ${project.version} - - - org.geoserver - gs-gwc - ${project.version} - - - org.geotools - gt-geopkg - - - org.geoserver - gs-main - ${project.version} - tests - test - - - org.geoserver - gs-wms - ${project.version} - tests - test - - - org.geoserver - gs-wfs - ${project.version} - tests - test - - - org.easymock - easymock - test - - - org.geoserver.web - gs-web-core - ${project.version} - tests - test - - - org.geoserver.web - gs-web-demo - ${project.version} - test - - - org.junit.jupiter - junit-jupiter - test - - - - - - src/test/resources - - - + + core + wms + wfs + diff --git a/src/extension/geopkg-output/wfs/pom.xml b/src/extension/geopkg-output/wfs/pom.xml new file mode 100644 index 00000000000..f91e47ef7ff --- /dev/null +++ b/src/extension/geopkg-output/wfs/pom.xml @@ -0,0 +1,86 @@ + + + + 4.0.0 + + + org.geoserver.extension + gs-geopkg-output + 2.27-SNAPSHOT + + + org.geoserver.extension + gs-geopkg-output-wfs + jar + GeoPackage WFS output + + + + org.geoserver + gs-main + ${project.version} + + + org.geoserver + gs-wfs + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-core + ${project.version} + + + org.geotools + gt-geopkg + + + org.geoserver + gs-main + ${project.version} + tests + test + + + org.geoserver + gs-wfs + ${project.version} + tests + test + + + org.easymock + easymock + test + + + org.geoserver.web + gs-web-core + ${project.version} + tests + test + + + org.geoserver.web + gs-web-demo + ${project.version} + test + + + org.junit.jupiter + junit-jupiter + test + + + + + + src/test/resources + + + + diff --git a/src/extension/geopkg-output/wfs/src/main/java/applicationContext.xml b/src/extension/geopkg-output/wfs/src/main/java/applicationContext.xml new file mode 100644 index 00000000000..f4658a328b1 --- /dev/null +++ b/src/extension/geopkg-output/wfs/src/main/java/applicationContext.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormat.java b/src/extension/geopkg-output/wfs/src/main/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormat.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormat.java rename to src/extension/geopkg-output/wfs/src/main/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormat.java diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication.properties index d7906824b9e..31a2ea76d54 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPackage -format.wms.application/geopackage+sqlite3=GeoPackage -format.wms.gpkg=GeoPackage - # Well known WFS formats format.wfs.application/x-gpkg=GeoPackage format.wfs.application/geopackage+sqlite3=GeoPackage diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_es.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_es.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_es.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_es.properties index 5accf0dc93c..0d72d91d896 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_es.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_es.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=Geopaquete -format.wms.application/geopackage+sqlite3=Geopaquete -format.wms.gpkg=Geopaquete - # Well known WFS formats format.wfs.application/x-gpkg=Geopaquete format.wfs.application/geopackage+sqlite3=Geopaquete diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_fr.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_fr.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_fr.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_fr.properties index b4f2aed2786..891f2ec1a93 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_fr.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_fr.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPackage -format.wms.application/geopackage+sqlite3=GeoPackage -format.wms.gpkg=GeoPackage - # Well known WFS formats format.wfs.application/x-gpkg=GeoPackage format.wfs.application/geopackage+sqlite3=GeoPackage diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ko.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ko.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_ko.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ko.properties index b4f2aed2786..891f2ec1a93 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ko.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ko.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPackage -format.wms.application/geopackage+sqlite3=GeoPackage -format.wms.gpkg=GeoPackage - # Well known WFS formats format.wfs.application/x-gpkg=GeoPackage format.wfs.application/geopackage+sqlite3=GeoPackage diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_pl.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_pl.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_pl.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_pl.properties index dee111d83e8..cda48d1c5b7 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_pl.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_pl.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPakiet -format.wms.application/geopackage+sqlite3=GeoPakiet -format.wms.gpkg=GeoPakiet - # Well known WFS formats format.wfs.application/x-gpkg=GeoPakiet format.wfs.application/geopackage+sqlite3=GeoPakiet diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ro.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ro.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_ro.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ro.properties index b4f2aed2786..891f2ec1a93 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ro.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ro.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPackage -format.wms.application/geopackage+sqlite3=GeoPackage -format.wms.gpkg=GeoPackage - # Well known WFS formats format.wfs.application/x-gpkg=GeoPackage format.wfs.application/geopackage+sqlite3=GeoPackage diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ru.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ru.properties similarity index 60% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_ru.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ru.properties index df42a259088..ccbf80bcc72 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_ru.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_ru.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 -format.wms.application/geopackage+sqlite3=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 -format.wms.gpkg=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 - # Well known WFS formats format.wfs.application/x-gpkg=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 format.wfs.application/geopackage+sqlite3=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_tr.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_tr.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_tr.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_tr.properties index cf0a5694017..7f85d10ea57 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_tr.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_tr.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPaket -format.wms.application/geopackage+sqlite3=GeoPaket -format.wms.gpkg=GeoPaket - # Well known WFS formats format.wfs.application/x-gpkg=GeoPaket format.wfs.application/geopackage+sqlite3=GeoPaket diff --git a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_zh.properties b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_zh.properties similarity index 58% rename from src/extension/geopkg-output/src/main/resources/GeoServerApplication_zh.properties rename to src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_zh.properties index b4f2aed2786..891f2ec1a93 100644 --- a/src/extension/geopkg-output/src/main/resources/GeoServerApplication_zh.properties +++ b/src/extension/geopkg-output/wfs/src/main/resources/GeoServerApplication_zh.properties @@ -1,8 +1,3 @@ -# Well known WMS formats -format.wms.application/x-gpkg=GeoPackage -format.wms.application/geopackage+sqlite3=GeoPackage -format.wms.gpkg=GeoPackage - # Well known WFS formats format.wfs.application/x-gpkg=GeoPackage format.wfs.application/geopackage+sqlite3=GeoPackage diff --git a/src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormatTest.java b/src/extension/geopkg-output/wfs/src/test/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormatTest.java similarity index 100% rename from src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormatTest.java rename to src/extension/geopkg-output/wfs/src/test/java/org/geoserver/geopkg/wfs/GeoPackageGetFeatureOutputFormatTest.java diff --git a/src/extension/geopkg-output/wfs/src/test/resources/org/GPKG_LOGGING.properties b/src/extension/geopkg-output/wfs/src/test/resources/org/GPKG_LOGGING.properties new file mode 100644 index 00000000000..28c1fdd7066 --- /dev/null +++ b/src/extension/geopkg-output/wfs/src/test/resources/org/GPKG_LOGGING.properties @@ -0,0 +1,35 @@ +## This log4j configuration file needs to stay here, and is used as the default logging setup +## during data_dir upgrades and in case the chosen logging config isn't available. +## +## As GeoTools uses java.util.logging logging instead of log4j, GeoServer makes +## the following mappings to adjust the log4j levels specified in this file to +## the GeoTools logging system: +## +## Log4J Level java.util.logging Level +## -------------------------------------------- +## ALL FINEST +## TRACE FINER +## DEBUG FINE (includes CONFIG) +## INFO INFO +## WARN/ERROR WARNING +## FATAL SEVERE +## OFF OFF + +log4j.rootLogger=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM HH:mm:ss} %p [%c{2}] - %m%n + +log4j.category.log4j=FATAL + +log4j.category.org.geotools=ERROR +log4j.category.org.geotools.factory=ERROR +log4j.category.org.geoserver=ERROR +log4j.category.org.vfny.geoserver=ERROR + +log4j.category.org.springframework=ERROR + +log4j.category.org.geowebcache=ERROR + +log4j.category.org.geoserver.tiles=INFO \ No newline at end of file diff --git a/src/extension/geopkg-output/wms/pom.xml b/src/extension/geopkg-output/wms/pom.xml new file mode 100644 index 00000000000..5694d3406d0 --- /dev/null +++ b/src/extension/geopkg-output/wms/pom.xml @@ -0,0 +1,91 @@ + + + + 4.0.0 + + + org.geoserver.extension + gs-geopkg-output + 2.27-SNAPSHOT + + + org.geoserver.extension + gs-geopkg-output-wms + jar + GeoPackage WMS output + + + + org.geoserver + gs-main + ${project.version} + + + org.geoserver + gs-wms + ${project.version} + + + org.geoserver + gs-gwc + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-core + ${project.version} + + + org.geotools + gt-geopkg + + + org.geoserver + gs-main + ${project.version} + tests + test + + + org.geoserver + gs-wms + ${project.version} + tests + test + + + org.easymock + easymock + test + + + org.geoserver.web + gs-web-core + ${project.version} + tests + test + + + org.geoserver.web + gs-web-demo + ${project.version} + test + + + org.junit.jupiter + junit-jupiter + test + + + + + + src/test/resources + + + + diff --git a/src/extension/geopkg-output/src/main/java/applicationContext.xml b/src/extension/geopkg-output/wms/src/main/java/applicationContext.xml similarity index 61% rename from src/extension/geopkg-output/src/main/java/applicationContext.xml rename to src/extension/geopkg-output/wms/src/main/java/applicationContext.xml index 8efce4e27e5..3fc507207a6 100644 --- a/src/extension/geopkg-output/src/main/java/applicationContext.xml +++ b/src/extension/geopkg-output/wms/src/main/java/applicationContext.xml @@ -7,29 +7,21 @@ + + + - - - - - - - - - - - - - - - + + + diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/wms/GeoPackageGetMapOutputFormat.java b/src/extension/geopkg-output/wms/src/main/java/org/geoserver/geopkg/wms/GeoPackageGetMapOutputFormat.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/geopkg/wms/GeoPackageGetMapOutputFormat.java rename to src/extension/geopkg-output/wms/src/main/java/org/geoserver/geopkg/wms/GeoPackageGetMapOutputFormat.java diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/tiles/AbstractTilesGetMapOutputFormat.java b/src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/AbstractTilesGetMapOutputFormat.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/tiles/AbstractTilesGetMapOutputFormat.java rename to src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/AbstractTilesGetMapOutputFormat.java diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/tiles/FileBackedRawMap.java b/src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/FileBackedRawMap.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/tiles/FileBackedRawMap.java rename to src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/FileBackedRawMap.java diff --git a/src/extension/geopkg-output/src/main/java/org/geoserver/tiles/FileBackedRawMapResponse.java b/src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/FileBackedRawMapResponse.java similarity index 100% rename from src/extension/geopkg-output/src/main/java/org/geoserver/tiles/FileBackedRawMapResponse.java rename to src/extension/geopkg-output/wms/src/main/java/org/geoserver/tiles/FileBackedRawMapResponse.java diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication.properties new file mode 100644 index 00000000000..cffeae37bd9 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPackage +format.wms.application/geopackage+sqlite3=GeoPackage +format.wms.gpkg=GeoPackage diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_es.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_es.properties new file mode 100644 index 00000000000..90e5aab9976 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_es.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=Geopaquete +format.wms.application/geopackage+sqlite3=Geopaquete +format.wms.gpkg=Geopaquete diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_fr.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_fr.properties new file mode 100644 index 00000000000..cffeae37bd9 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_fr.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPackage +format.wms.application/geopackage+sqlite3=GeoPackage +format.wms.gpkg=GeoPackage diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ko.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ko.properties new file mode 100644 index 00000000000..cffeae37bd9 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ko.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPackage +format.wms.application/geopackage+sqlite3=GeoPackage +format.wms.gpkg=GeoPackage diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_pl.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_pl.properties new file mode 100644 index 00000000000..65740ac0bb4 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_pl.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPakiet +format.wms.application/geopackage+sqlite3=GeoPakiet +format.wms.gpkg=GeoPakiet diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ro.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ro.properties new file mode 100644 index 00000000000..cffeae37bd9 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ro.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPackage +format.wms.application/geopackage+sqlite3=GeoPackage +format.wms.gpkg=GeoPackage diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ru.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ru.properties new file mode 100644 index 00000000000..2972bf5c335 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_ru.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 +format.wms.application/geopackage+sqlite3=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 +format.wms.gpkg=\u0413\u0435\u043e\u043f\u0430\u043a\u0435\u0442 diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_tr.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_tr.properties new file mode 100644 index 00000000000..86357f71796 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_tr.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPaket +format.wms.application/geopackage+sqlite3=GeoPaket +format.wms.gpkg=GeoPaket diff --git a/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_zh.properties b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_zh.properties new file mode 100644 index 00000000000..cffeae37bd9 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/main/resources/GeoServerApplication_zh.properties @@ -0,0 +1,4 @@ +# Well known WMS formats +format.wms.application/x-gpkg=GeoPackage +format.wms.application/geopackage+sqlite3=GeoPackage +format.wms.gpkg=GeoPackage diff --git a/src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPackageGetMapOutputFormatTest.java b/src/extension/geopkg-output/wms/src/test/java/org/geoserver/geopkg/GeoPackageGetMapOutputFormatTest.java similarity index 100% rename from src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPackageGetMapOutputFormatTest.java rename to src/extension/geopkg-output/wms/src/test/java/org/geoserver/geopkg/GeoPackageGetMapOutputFormatTest.java diff --git a/src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPackageMimeTypeTest.java b/src/extension/geopkg-output/wms/src/test/java/org/geoserver/geopkg/GeoPackageMimeTypeTest.java similarity index 100% rename from src/extension/geopkg-output/src/test/java/org/geoserver/geopkg/GeoPackageMimeTypeTest.java rename to src/extension/geopkg-output/wms/src/test/java/org/geoserver/geopkg/GeoPackageMimeTypeTest.java diff --git a/src/extension/geopkg-output/wms/src/test/resources/org/GPKG_LOGGING.properties b/src/extension/geopkg-output/wms/src/test/resources/org/GPKG_LOGGING.properties new file mode 100644 index 00000000000..28c1fdd7066 --- /dev/null +++ b/src/extension/geopkg-output/wms/src/test/resources/org/GPKG_LOGGING.properties @@ -0,0 +1,35 @@ +## This log4j configuration file needs to stay here, and is used as the default logging setup +## during data_dir upgrades and in case the chosen logging config isn't available. +## +## As GeoTools uses java.util.logging logging instead of log4j, GeoServer makes +## the following mappings to adjust the log4j levels specified in this file to +## the GeoTools logging system: +## +## Log4J Level java.util.logging Level +## -------------------------------------------- +## ALL FINEST +## TRACE FINER +## DEBUG FINE (includes CONFIG) +## INFO INFO +## WARN/ERROR WARNING +## FATAL SEVERE +## OFF OFF + +log4j.rootLogger=INFO, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM HH:mm:ss} %p [%c{2}] - %m%n + +log4j.category.log4j=FATAL + +log4j.category.org.geotools=ERROR +log4j.category.org.geotools.factory=ERROR +log4j.category.org.geoserver=ERROR +log4j.category.org.vfny.geoserver=ERROR + +log4j.category.org.springframework=ERROR + +log4j.category.org.geowebcache=ERROR + +log4j.category.org.geoserver.tiles=INFO \ No newline at end of file diff --git a/src/extension/geopkg-output/src/test/resources/org/geoserver/geopkg/toplefttile.png b/src/extension/geopkg-output/wms/src/test/resources/org/geoserver/geopkg/toplefttile.png similarity index 100% rename from src/extension/geopkg-output/src/test/resources/org/geoserver/geopkg/toplefttile.png rename to src/extension/geopkg-output/wms/src/test/resources/org/geoserver/geopkg/toplefttile.png diff --git a/src/release/pom.xml b/src/release/pom.xml index 323b4285657..a9138b2dbee 100644 --- a/src/release/pom.xml +++ b/src/release/pom.xml @@ -155,7 +155,17 @@ org.geoserver.extension - gs-geopkg-output + gs-geopkg-output-core + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wms + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wfs ${project.version} diff --git a/src/web/app/pom.xml b/src/web/app/pom.xml index 96f14f776fa..4f9d0bc99ff 100644 --- a/src/web/app/pom.xml +++ b/src/web/app/pom.xml @@ -1496,7 +1496,17 @@ org.geoserver.extension - gs-geopkg-output + gs-geopkg-output-core + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wms + ${project.version} + + + org.geoserver.extension + gs-geopkg-output-wfs ${project.version} From a51f5ed07dd375929c615465a900c942159fa1d6 Mon Sep 17 00:00:00 2001 From: Fernando Mino Date: Thu, 14 Nov 2024 21:49:19 -0500 Subject: [PATCH 8/8] [GEOS-11612] Add proxy base url use headers system property support --- .../source/configuration/globalsettings.rst | 6 ++- .../source/configuration/properties/index.rst | 6 +++ .../geoserver/ows/ProxifyingURLMangler.java | 11 +++++ .../org/vfny/geoserver/util/Requests.java | 1 + .../org/geoserver/ows/URLManglersTest.java | 42 +++++++++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/doc/en/user/source/configuration/globalsettings.rst b/doc/en/user/source/configuration/globalsettings.rst index 75ef7679be3..06ae5657f20 100644 --- a/doc/en/user/source/configuration/globalsettings.rst +++ b/doc/en/user/source/configuration/globalsettings.rst @@ -46,7 +46,11 @@ Once activated the environment parametrization Proxy Base URL can be parameters Use headers for Proxy URL ''''''''''''''''''''''''' -Checking this box allows a by-request modification of the proxy URL using templates (templates based on HTTP proxy headers). +Checking this box allows a by-request modification of the proxy URL using templates (templates based on HTTP proxy headers). This setting may also be managed using the ``PROXY_BASE_URL_HEADERS`` boolean system property or environment variable defined by a System Administrator: setting it to true will enable the headers variables usage for proxy base URL on all workspaces, overriding any GeoServer datadir configuration. + +.. code-block::bash + + -DPROXY_BASE_URL_HEADERS=true The supported proxy headers are: diff --git a/doc/en/user/source/configuration/properties/index.rst b/doc/en/user/source/configuration/properties/index.rst index 4c0ec64f8fe..f6198c948cb 100644 --- a/doc/en/user/source/configuration/properties/index.rst +++ b/doc/en/user/source/configuration/properties/index.rst @@ -209,6 +209,12 @@ GeoServer Property Reference - x - x - x + * - PROXY_BASE_URL_HEADER + + Enables PROXY_BASE_URL to use headers variables if set to true, overriding GeoServer datadir settings. Default false. + - x + - x + - x * - org.geoserver.service.disabled Default comma separated list of disabled services. diff --git a/src/main/src/main/java/org/geoserver/ows/ProxifyingURLMangler.java b/src/main/src/main/java/org/geoserver/ows/ProxifyingURLMangler.java index 36c755282c0..a0affa2f2ab 100644 --- a/src/main/src/main/java/org/geoserver/ows/ProxifyingURLMangler.java +++ b/src/main/src/main/java/org/geoserver/ows/ProxifyingURLMangler.java @@ -105,6 +105,7 @@ public void mangleURL( } private boolean resolveDoMangleHeaders() { + if (isUseHeadersSystemPropertyEnabled()) return true; Boolean wsAwareFlag = geoServer.getSettings().isUseHeadersProxyURL(); Boolean resultFlag = wsAwareFlag != null @@ -114,6 +115,16 @@ private boolean resolveDoMangleHeaders() { return false; } + /** + * Check if the PROXY_BASE_URL_HEADERS system property is set to use headers for proxying. + * + * @return true if the system property is set to use headers for proxying + */ + private boolean isUseHeadersSystemPropertyEnabled() { + String useHeadersProxyURL = GeoServerExtensions.getProperty(Requests.PROXY_HEADER_PARAM); + return useHeadersProxyURL != null && "true".equalsIgnoreCase(useHeadersProxyURL.trim()); + } + /** * Resolve parameters values in the provided String if GeoServer parametrization is activated. */ diff --git a/src/main/src/main/java/org/vfny/geoserver/util/Requests.java b/src/main/src/main/java/org/vfny/geoserver/util/Requests.java index 7377a73367d..da4947b3771 100644 --- a/src/main/src/main/java/org/vfny/geoserver/util/Requests.java +++ b/src/main/src/main/java/org/vfny/geoserver/util/Requests.java @@ -49,6 +49,7 @@ public final class Requests { ( See GEOS-598 for more information */ public static final String PROXY_PARAM = "PROXY_BASE_URL"; + public static final String PROXY_HEADER_PARAM = "PROXY_BASE_URL_HEADERS"; /** * Appends a context path to a base url. diff --git a/src/main/src/test/java/org/geoserver/ows/URLManglersTest.java b/src/main/src/test/java/org/geoserver/ows/URLManglersTest.java index 470b8a2369b..00586f0a1df 100644 --- a/src/main/src/test/java/org/geoserver/ows/URLManglersTest.java +++ b/src/main/src/test/java/org/geoserver/ows/URLManglersTest.java @@ -11,10 +11,12 @@ import java.io.File; import java.util.Collections; import java.util.HashMap; +import java.util.Map; import org.apache.commons.io.FileUtils; import org.geoserver.config.GeoServerInfo; import org.geoserver.data.test.SystemTestData; import org.geoserver.ows.URLMangler.URLType; +import org.geoserver.ows.util.CaseInsensitiveMap; import org.geoserver.platform.GeoServerEnvironment; import org.geoserver.test.GeoServerSystemTestSupport; import org.geoserver.test.SystemTest; @@ -108,4 +110,44 @@ public void testProxyBaseParametrized() { url = buildURL(BASEURL, "test", null, URLType.SERVICE); assertEquals("${X-Forwarded-Proto}://${X-Forwarded-Host}/http://custom.host/test", url); } + + @Test + public void testProxyBaseUrlSystemProperty() { + System.setProperty( + "PROXY_BASE_URL", "${X-Forwarded-Proto}://${X-Forwarded-Host}/${proxy.custom}"); + System.setProperty("PROXY_BASE_URL_HEADERS", "true"); + try { + GeoServerEnvironment.reloadAllowEnvParametrization(); + Map headers = new CaseInsensitiveMap<>(new HashMap<>()); + headers.put("X-Forwarded-Proto", "https"); + headers.put("X-Forwarded-Host", "www.altavista.com"); + HTTPHeadersCollector.HEADERS.set(headers); + String url = buildURL(BASEURL, "test", null, URLType.SERVICE); + assertEquals("https://www.altavista.com/http://custom.host/test", url); + } finally { + System.clearProperty("PROXY_BASE_URL"); + System.clearProperty("PROXY_BASE_URL_HEADERS"); + GeoServerEnvironment.reloadAllowEnvParametrization(); + } + } + + @Test + public void testProxyBaseUrlSystemPropertyDisabled() { + System.setProperty( + "PROXY_BASE_URL", "${X-Forwarded-Proto}://${X-Forwarded-Host}/${proxy.custom}"); + System.setProperty("PROXY_BASE_URL_HEADERS", "false"); + try { + GeoServerEnvironment.reloadAllowEnvParametrization(); + Map headers = new CaseInsensitiveMap<>(new HashMap<>()); + headers.put("X-Forwarded-Proto", "https"); + headers.put("X-Forwarded-Host", "www.altavista.com"); + HTTPHeadersCollector.HEADERS.set(headers); + String url = buildURL(BASEURL, "test", null, URLType.SERVICE); + assertEquals("${X-Forwarded-Proto}://${X-Forwarded-Host}/http://custom.host/test", url); + } finally { + System.clearProperty("PROXY_BASE_URL"); + System.clearProperty("PROXY_BASE_URL_HEADERS"); + GeoServerEnvironment.reloadAllowEnvParametrization(); + } + } }