From be841789fc0d48b42aae4d8743a71f5506544306 Mon Sep 17 00:00:00 2001 From: Gang Li Date: Thu, 11 Jan 2024 18:17:25 +0800 Subject: [PATCH 1/8] Add new API to get all store keys --- .../controller/StatsController.java | 23 +++++++++++++ .../jaxrs/version/StatsHandler.java | 32 +++++++++++++++++++ .../repository/jaxrs/StatsHandlerTest.java | 10 ++++++ 3 files changed, 65 insertions(+) diff --git a/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java b/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java index 54b8301..c044250 100644 --- a/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java +++ b/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java @@ -28,7 +28,10 @@ import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; @@ -85,4 +88,24 @@ public EndpointViewListing getEndpointsListing( final String baseUri, final JaxR return new EndpointViewListing( points ); } + public Map> getAllStoreKeys() + throws IndyWorkflowException + { + final List stores; + try + { + final Map> result = new HashMap<>(); + stores = new ArrayList<>( dataManager.getAllArtifactStores() ); + List items = stores.stream().map( s-> s.getKey().toString() ).collect( Collectors.toList() ); + result.put("items", items); + return result; + } + catch ( final IndyDataException e ) + { + throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(), + "Failed to retrieve all store keys: {}", e, e.getMessage() ); + } + + } + } diff --git a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java index 44c1fac..78eaaef 100644 --- a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java +++ b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java @@ -37,7 +37,10 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -132,4 +135,33 @@ public Response getAllEndpoints( @Context final UriInfo uriInfo ) return response; } + @Operation( + summary = "Retrieve a listing of the artifact stores keys available on the system." ) + @APIResponse( responseCode = "200", + content = @Content( schema = @Schema( implementation = EndpointViewListing.class ) ), + description = "The artifact store keys listing" ) + @Path( "/all-storekeys" ) + @GET + @Produces( APPLICATION_JSON ) + public Response getAllStoreKeys( @Context final UriInfo uriInfo ) + { + Response response; + try + { + + Map> result = statsController.getAllStoreKeys(); + + response = responseHelper.formatOkResponseWithJsonEntity( result ); + + logger.debug( "\n\n\n\n\n\n{} Sent all-keys:\n\n{}\n\n\n\n\n\n\n", new Date(), result ); + } + catch ( final IndyWorkflowException e ) + { + logger.error( String.format( "Failed to retrieve store keys listing: %s", responseHelper.formatEntity( e ) ), + e ); + response = responseHelper.formatResponse( e ); + } + return response; + } + } diff --git a/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java b/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java index 8301f92..26496fa 100644 --- a/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java +++ b/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java @@ -63,4 +63,14 @@ public void testGetAllEndpoints() .body( "size()", is( 1 ) ) .body( "items.size()", greaterThan( 1 ) ); } + + @Test + public void testGetAllStoreKeys() + { + given().get( "/api/stats/all-storekeys" ) + .then() + .statusCode( OK.getStatusCode() ) + .body( "size()", is( 1 ) ) + .body( "items.size()", greaterThan( 1 ) ); + } } From 4099174f6a90d05dbe048fc5baf6a3b2a9038e4a Mon Sep 17 00:00:00 2001 From: Gang Li Date: Thu, 11 Jan 2024 18:30:17 +0800 Subject: [PATCH 2/8] Fix a API doc Schema issue --- .../indy/service/repository/jaxrs/version/StatsHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java index 78eaaef..59ccaea 100644 --- a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java +++ b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java @@ -138,7 +138,7 @@ public Response getAllEndpoints( @Context final UriInfo uriInfo ) @Operation( summary = "Retrieve a listing of the artifact stores keys available on the system." ) @APIResponse( responseCode = "200", - content = @Content( schema = @Schema( implementation = EndpointViewListing.class ) ), + content = @Content( schema = @Schema( implementation = Map.class ) ), description = "The artifact store keys listing" ) @Path( "/all-storekeys" ) @GET From 61677be50b3980c55b5c231db60225905e2fdaad Mon Sep 17 00:00:00 2001 From: Gang Li Date: Fri, 12 Jan 2024 22:33:24 +0800 Subject: [PATCH 3/8] Add new query APIs * Move endpoints from stats to query resource * Add package type parameter to endpoints API * Add storekeys API with package type parameter --- .../controller/QueryController.java | 77 ++++++++++++++++++- .../controller/StatsController.java | 66 ---------------- .../jaxrs/RepositoryQueryResources.java | 66 ++++++++++++++++ .../jaxrs/version/StatsHandler.java | 72 ----------------- .../jaxrs/RepositoryQueryResourcesTest.java | 40 ++++++++++ .../repository/jaxrs/StatsHandlerTest.java | 19 ----- 6 files changed, 182 insertions(+), 158 deletions(-) diff --git a/src/main/java/org/commonjava/indy/service/repository/controller/QueryController.java b/src/main/java/org/commonjava/indy/service/repository/controller/QueryController.java index 5c2c5bb..62d24f4 100644 --- a/src/main/java/org/commonjava/indy/service/repository/controller/QueryController.java +++ b/src/main/java/org/commonjava/indy/service/repository/controller/QueryController.java @@ -26,6 +26,9 @@ import org.commonjava.indy.service.repository.model.RemoteRepository; import org.commonjava.indy.service.repository.model.StoreKey; import org.commonjava.indy.service.repository.model.StoreType; +import org.commonjava.indy.service.repository.model.dto.EndpointView; +import org.commonjava.indy.service.repository.model.dto.EndpointViewListing; +import org.commonjava.indy.service.repository.util.JaxRsUriFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,8 +37,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -82,7 +87,7 @@ public List getAllArtifactStores( final String packageType, final // when packageType and type are all unique value, use storeManager.getArtifactStoresByPkgAndType to improve performance stores = storeManager.getArtifactStoresByPkgAndType( packageType, typeList.get( 0 ) ); } - else if ( !isValidPackageType( packageType ) && typeList.size() == 0 ) + else if ( !isValidPackageType( packageType ) && typeList.isEmpty() ) { stores = storeManager.getAllArtifactStores(); } @@ -251,6 +256,76 @@ public Boolean isStoreDataEmpty() return storeManager.isEmpty(); } + public EndpointViewListing getEndpointsListing( final String pkgType, final String baseUri, + final JaxRsUriFormatter uriFormatter ) + throws IndyWorkflowException + { + List stores; + try + { + stores = new ArrayList<>( storeManager.getAllArtifactStores() ); + if ( StringUtils.isNotBlank( pkgType ) && !"all".equals( pkgType ) && isValidPackageType( pkgType ) ) + { + stores = stores.stream() + .filter( s -> pkgType.equals( s.getPackageType() ) ) + .collect( Collectors.toList() ); + } + } + catch ( final IndyDataException e ) + { + throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(), + "Failed to retrieve all endpoints: {}", e, e.getMessage() ); + } + + final List points = new ArrayList<>(); + for ( final ArtifactStore store : stores ) + { + final StoreKey key = store.getKey(); + final String resourceUri = uriFormatter.formatAbsolutePathTo( baseUri, "content", key.getPackageType(), + key.getType().singularEndpointName(), + key.getName() ); + + final EndpointView point = new EndpointView( store, resourceUri ); + if ( !points.contains( point ) ) + { + points.add( point ); + } + } + + return new EndpointViewListing( points ); + } + + public Map> getStoreKeysByPackageType( final String pkgType ) + throws IndyWorkflowException + { + final List stores; + + try + { + final Map> result = new HashMap<>(); + stores = new ArrayList<>( storeManager.getAllArtifactStores() ); + List items; + if ( StringUtils.isNotBlank( pkgType ) && !"all".equals( pkgType ) && isValidPackageType( pkgType ) ) + { + items = stores.stream() + .filter( s -> pkgType.equals( s.getPackageType() ) ) + .map( s -> s.getKey().toString() ) + .collect( Collectors.toList() ); + } + else + { + items = stores.stream().map( s -> s.getKey().toString() ).collect( Collectors.toList() ); + } + result.put( "items", items ); + return result; + } + catch ( final IndyDataException e ) + { + throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(), + "Failed to retrieve all store keys: {}", e, e.getMessage() ); + } + } + private StoreKey validateStoreKey( final String storeKey ) throws IndyWorkflowException { diff --git a/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java b/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java index c044250..97e3d56 100644 --- a/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java +++ b/src/main/java/org/commonjava/indy/service/repository/controller/StatsController.java @@ -16,24 +16,10 @@ package org.commonjava.indy.service.repository.controller; import org.commonjava.indy.service.repository.data.StoreDataManager; -import org.commonjava.indy.service.repository.exception.IndyDataException; -import org.commonjava.indy.service.repository.exception.IndyWorkflowException; -import org.commonjava.indy.service.repository.model.ArtifactStore; -import org.commonjava.indy.service.repository.model.StoreKey; -import org.commonjava.indy.service.repository.model.dto.EndpointView; -import org.commonjava.indy.service.repository.model.dto.EndpointViewListing; import org.commonjava.indy.service.repository.model.version.Versioning; -import org.commonjava.indy.service.repository.util.JaxRsUriFormatter; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR; @ApplicationScoped public class StatsController @@ -56,56 +42,4 @@ public Versioning getVersionInfo() return versioning; } - public EndpointViewListing getEndpointsListing( final String baseUri, final JaxRsUriFormatter uriFormatter ) - throws IndyWorkflowException - { - final List stores; - try - { - stores = new ArrayList<>( dataManager.getAllArtifactStores() ); - } - catch ( final IndyDataException e ) - { - throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(), - "Failed to retrieve all endpoints: {}", e, e.getMessage() ); - } - - final List points = new ArrayList<>(); - for ( final ArtifactStore store : stores ) - { - final StoreKey key = store.getKey(); - final String resourceUri = uriFormatter.formatAbsolutePathTo( baseUri, "content", key.getPackageType(), - key.getType().singularEndpointName(), - key.getName() ); - - final EndpointView point = new EndpointView( store, resourceUri ); - if ( !points.contains( point ) ) - { - points.add( point ); - } - } - - return new EndpointViewListing( points ); - } - - public Map> getAllStoreKeys() - throws IndyWorkflowException - { - final List stores; - try - { - final Map> result = new HashMap<>(); - stores = new ArrayList<>( dataManager.getAllArtifactStores() ); - List items = stores.stream().map( s-> s.getKey().toString() ).collect( Collectors.toList() ); - result.put("items", items); - return result; - } - catch ( final IndyDataException e ) - { - throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(), - "Failed to retrieve all store keys: {}", e, e.getMessage() ); - } - - } - } diff --git a/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResources.java b/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResources.java index d47bffd..56bd1df 100644 --- a/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResources.java +++ b/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResources.java @@ -19,8 +19,10 @@ import org.commonjava.indy.service.repository.controller.QueryController; import org.commonjava.indy.service.repository.exception.IndyWorkflowException; import org.commonjava.indy.service.repository.model.ArtifactStore; +import org.commonjava.indy.service.repository.model.dto.EndpointViewListing; import org.commonjava.indy.service.repository.model.dto.SimpleBooleanResultDTO; import org.commonjava.indy.service.repository.model.dto.StoreListingDTO; +import org.commonjava.indy.service.repository.util.JaxRsUriFormatter; import org.commonjava.indy.service.repository.util.UrlUtils; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; @@ -40,13 +42,18 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import java.util.Date; import java.util.List; +import java.util.Map; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; import static javax.ws.rs.core.Response.Status.NOT_FOUND; import static javax.ws.rs.core.Response.ok; +import static org.commonjava.indy.service.repository.util.Constants.API_PREFIX; import static org.eclipse.microprofile.openapi.annotations.enums.ParameterIn.QUERY; @Tag( name = "Store Querying APIs", description = "Resource for querying artifact store definitions" ) @@ -63,6 +70,9 @@ public class RepositoryQueryResources @Inject QueryController queryController; + @Inject + JaxRsUriFormatter uriFormatter; + public RepositoryQueryResources() { logger.info( "\n\n\n\nStarted Store Querying resources\n\n\n\n" ); @@ -295,6 +305,62 @@ public Response getStoreEmpty() return responseHelper.formatOkResponseWithJsonEntity( dto ); } + @Operation( + summary = "Retrieve a listing of the artifact stores available on the system. This is especially useful for setting up a network of Indy instances that reference one another" ) + @APIResponse( responseCode = "200", + content = @Content( schema = @Schema( implementation = EndpointViewListing.class ) ), + description = "The artifact store listing" ) + @Path( "/endpoints/{packageType}" ) + @GET + @Produces( APPLICATION_JSON ) + public Response getEndpoints( @PathParam( "packageType" ) final String pkgType, @Context final UriInfo uriInfo ) + { + Response response; + try + { + final String baseUri = uriInfo.getBaseUriBuilder().path( API_PREFIX ).build().toString(); + + final EndpointViewListing listing = queryController.getEndpointsListing( pkgType, baseUri, uriFormatter ); + response = responseHelper.formatOkResponseWithJsonEntity( listing ); + + logger.info( "\n\n\n\n\n\n{} Sent all-endpoints:\n\n{}\n\n\n\n\n\n\n", new Date(), listing ); + } + catch ( final IndyWorkflowException e ) + { + logger.error( String.format( "Failed to retrieve endpoint listing: %s", responseHelper.formatEntity( e ) ), + e ); + response = responseHelper.formatResponse( e ); + } + return response; + } + + @Operation( summary = "Retrieve a listing of the artifact stores keys available on the system." ) + @APIResponse( responseCode = "200", content = @Content( schema = @Schema( implementation = Map.class ) ), + description = "The artifact store keys listing" ) + @Path( "/storekeys/{packageType}" ) + @GET + @Produces( APPLICATION_JSON ) + public Response getStoreKeys( @PathParam( "packageType" ) final String pkgType, @Context final UriInfo uriInfo ) + { + Response response; + try + { + + Map> result = queryController.getStoreKeysByPackageType( pkgType ); + + response = responseHelper.formatOkResponseWithJsonEntity( result ); + + logger.debug( "\n\n\n\n\n\n{} Sent store keys:\n\n{}\n\n\n\n\n\n\n", new Date(), result ); + } + catch ( final IndyWorkflowException e ) + { + logger.error( String.format( "Failed to retrieve store keys listing by type %s: %s", pkgType, + responseHelper.formatEntity( e ) ), e ); + response = responseHelper.formatResponse( e ); + } + return response; + } + @SuppressWarnings( { "unchecked", "rawtypes" } ) private Response generateStoreListingResponse( ArtifactStoreListSupplier supplier ) { diff --git a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java index 59ccaea..c24da93 100644 --- a/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java +++ b/src/main/java/org/commonjava/indy/service/repository/jaxrs/version/StatsHandler.java @@ -16,11 +16,8 @@ package org.commonjava.indy.service.repository.jaxrs.version; import org.commonjava.indy.service.repository.controller.StatsController; -import org.commonjava.indy.service.repository.exception.IndyWorkflowException; import org.commonjava.indy.service.repository.jaxrs.ResponseHelper; -import org.commonjava.indy.service.repository.model.dto.EndpointViewListing; import org.commonjava.indy.service.repository.model.version.Versioning; -import org.commonjava.indy.service.repository.util.JaxRsUriFormatter; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.media.Content; import org.eclipse.microprofile.openapi.annotations.media.Schema; @@ -33,14 +30,7 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -49,7 +39,6 @@ import static javax.ws.rs.core.Response.ok; import static org.commonjava.indy.service.repository.model.PackageTypes.getPackageTypeDescriptorMap; import static org.commonjava.indy.service.repository.model.PackageTypes.getPackageTypes; -import static org.commonjava.indy.service.repository.util.Constants.API_PREFIX; @Tag( name = "Generic Infrastructure Queries (UI Support)", description = "Various read-only operations for retrieving information about the system." ) @@ -64,9 +53,6 @@ public class StatsHandler @Inject ResponseHelper responseHelper; - @Inject - JaxRsUriFormatter uriFormatter; - @Operation( summary = "Retrieve versioning information about this APP instance" ) @APIResponse( responseCode = "200", content = @Content( schema = @Schema( implementation = Versioning.class ) ), description = "The version info of the APIs" ) @@ -106,62 +92,4 @@ public Response getPackageTypeNames() return ok( new TreeSet<>( getPackageTypes() ) ).build(); } - @Operation( - summary = "Retrieve a listing of the artifact stores available on the system. This is especially useful for setting up a network of Indy instances that reference one another" ) - @APIResponse( responseCode = "200", - content = @Content( schema = @Schema( implementation = EndpointViewListing.class ) ), - description = "The artifact store listing" ) - @Path( "/all-endpoints" ) - @GET - @Produces( APPLICATION_JSON ) - public Response getAllEndpoints( @Context final UriInfo uriInfo ) - { - Response response; - try - { - final String baseUri = uriInfo.getBaseUriBuilder().path( API_PREFIX ).build().toString(); - - final EndpointViewListing listing = statsController.getEndpointsListing( baseUri, uriFormatter ); - response = responseHelper.formatOkResponseWithJsonEntity( listing ); - - logger.info( "\n\n\n\n\n\n{} Sent all-endpoints:\n\n{}\n\n\n\n\n\n\n", new Date(), listing ); - } - catch ( final IndyWorkflowException e ) - { - logger.error( String.format( "Failed to retrieve endpoint listing: %s", responseHelper.formatEntity( e ) ), - e ); - response = responseHelper.formatResponse( e ); - } - return response; - } - - @Operation( - summary = "Retrieve a listing of the artifact stores keys available on the system." ) - @APIResponse( responseCode = "200", - content = @Content( schema = @Schema( implementation = Map.class ) ), - description = "The artifact store keys listing" ) - @Path( "/all-storekeys" ) - @GET - @Produces( APPLICATION_JSON ) - public Response getAllStoreKeys( @Context final UriInfo uriInfo ) - { - Response response; - try - { - - Map> result = statsController.getAllStoreKeys(); - - response = responseHelper.formatOkResponseWithJsonEntity( result ); - - logger.debug( "\n\n\n\n\n\n{} Sent all-keys:\n\n{}\n\n\n\n\n\n\n", new Date(), result ); - } - catch ( final IndyWorkflowException e ) - { - logger.error( String.format( "Failed to retrieve store keys listing: %s", responseHelper.formatEntity( e ) ), - e ); - response = responseHelper.formatResponse( e ); - } - return response; - } - } diff --git a/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResourcesTest.java b/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResourcesTest.java index cb1bac4..0d5bf62 100644 --- a/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResourcesTest.java +++ b/src/test/java/org/commonjava/indy/service/repository/jaxrs/RepositoryQueryResourcesTest.java @@ -56,4 +56,44 @@ public void testGetAllByDefaultPackageTypes() } + @Test + public void testGetAllEndpoints() + { + given().get( normalize( BASE_QUERY_PATH, "endpoints/all" ) ) + .then() + .statusCode( OK.getStatusCode() ) + .body( "size()", is( 1 ) ) + .body( "items.size()", greaterThan( 1 ) ); + } + + @Test + public void testGetMavenEndpoints() + { + given().get( normalize( BASE_QUERY_PATH, "endpoints/maven" ) ) + .then() + .statusCode( OK.getStatusCode() ) + .body( "size()", is( 1 ) ) + .body( "items.size()", greaterThan( 1 ) ); + } + + @Test + public void testGetAllStoreKeys() + { + given().get( normalize( BASE_QUERY_PATH, "storekeys/all" ) ) + .then() + .statusCode( OK.getStatusCode() ) + .body( "size()", is( 1 ) ) + .body( "items.size()", greaterThan( 1 ) ); + } + + @Test + public void testGetMavenStoreKeys() + { + given().get( normalize( BASE_QUERY_PATH, "endpoints/maven" ) ) + .then() + .statusCode( OK.getStatusCode() ) + .body( "size()", is( 1 ) ) + .body( "items.size()", greaterThan( 1 ) ); + } + } diff --git a/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java b/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java index 26496fa..bbf0c9a 100644 --- a/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java +++ b/src/test/java/org/commonjava/indy/service/repository/jaxrs/StatsHandlerTest.java @@ -54,23 +54,4 @@ public void testGetPackageTypeMap() .body( containsString( "maven" ) ); } - @Test - public void testGetAllEndpoints() - { - given().get( "/api/stats/all-endpoints" ) - .then() - .statusCode( OK.getStatusCode() ) - .body( "size()", is( 1 ) ) - .body( "items.size()", greaterThan( 1 ) ); - } - - @Test - public void testGetAllStoreKeys() - { - given().get( "/api/stats/all-storekeys" ) - .then() - .statusCode( OK.getStatusCode() ) - .body( "size()", is( 1 ) ) - .body( "items.size()", greaterThan( 1 ) ); - } } From 1719a7f70908d8ddc0a1952a77de208312f68441 Mon Sep 17 00:00:00 2001 From: Gang Li Date: Fri, 2 Feb 2024 19:22:46 +0800 Subject: [PATCH 4/8] Update indy-model to 1.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 50de801..5c9586c 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ https://github.com/Commonjava/indy-repository-service 1.1.1 - 1.5-SNAPSHOT + 1.5 1.1 3.11.3 From 3df39f0e2cb8fdef8024cc6fdcdebb7fd24956e3 Mon Sep 17 00:00:00 2001 From: Rui Han Date: Tue, 20 Feb 2024 15:42:59 +0800 Subject: [PATCH 5/8] Update license headers (#137) --- .github/workflows/merge-build.yml | 2 +- .github/workflows/pr-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/merge-build.yml b/.github/workflows/merge-build.yml index bf3cae1..45307e5 100644 --- a/.github/workflows/merge-build.yml +++ b/.github/workflows/merge-build.yml @@ -1,5 +1,5 @@ # -# Copyright (C) 2023 Red Hat, Inc. (https://github.com/Commonjava/indy-ui-service) +# Copyright (C) 2022-2023 Red Hat, Inc. (https://github.com/Commonjava/indy-repository-service) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index fd9daaa..0f5b864 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -1,5 +1,5 @@ # -# Copyright (C) 2023 Red Hat, Inc. (https://github.com/Commonjava/indy-ui-service) +# Copyright (C) 2022-2023 Red Hat, Inc. (https://github.com/Commonjava/indy-repository-service) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 744639961c84a2eb70040cdef088437ec4e48df5 Mon Sep 17 00:00:00 2001 From: commonjava-bot Date: Tue, 20 Feb 2024 07:49:50 +0000 Subject: [PATCH 6/8] [maven-release-plugin] prepare release indy-repository-service-1.0.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5c9586c..3043c51 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 4.0.0 org.commonjava.indy.service indy-repository-service - 1.0.4-SNAPSHOT + 1.0.4 Indy :: Service :: Repository https://github.com/Commonjava/indy-repository-service Indy Repository Service @@ -35,7 +35,7 @@ scm:git:https://github.com/commonjava/indy-repository-service scm:git:https://github.com/commonjava/indy-repository-service http://github.com/Commonjava/indy-repository-service - HEAD + indy-repository-service-1.0.4 From 0930579fb6e73df75b9c712e49bcc976f6a2914f Mon Sep 17 00:00:00 2001 From: commonjava-bot Date: Tue, 20 Feb 2024 07:49:52 +0000 Subject: [PATCH 7/8] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 3043c51..811a0d2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ 4.0.0 org.commonjava.indy.service indy-repository-service - 1.0.4 + 1.0.5-SNAPSHOT Indy :: Service :: Repository https://github.com/Commonjava/indy-repository-service Indy Repository Service @@ -35,7 +35,7 @@ scm:git:https://github.com/commonjava/indy-repository-service scm:git:https://github.com/commonjava/indy-repository-service http://github.com/Commonjava/indy-repository-service - indy-repository-service-1.0.4 + HEAD From 28c45ffde5a20c344879b38c42f1d59ecd402e20 Mon Sep 17 00:00:00 2001 From: Gang Li Date: Mon, 26 Feb 2024 21:34:20 +0800 Subject: [PATCH 8/8] Fix a bug of importing the repo zip file --- pom.xml | 15 ++++-- .../controller/MaintenanceController.java | 47 +++++++++++-------- .../jaxrs/RepositoryMaintenanceResources.java | 11 ++--- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 811a0d2..f7f2b39 100644 --- a/pom.xml +++ b/pom.xml @@ -274,6 +274,16 @@ commons-lang3 3.12.0 + + org.apache.commons + commons-compress + 1.26.0 + + + commons-io + commons-io + 2.15.1 + com.datastax.cassandra cassandra-driver-core @@ -289,11 +299,6 @@ httpclient 4.5.13 - - commons-io - commons-io - 2.11.0 - org.codehaus.plexus plexus-interpolation diff --git a/src/main/java/org/commonjava/indy/service/repository/controller/MaintenanceController.java b/src/main/java/org/commonjava/indy/service/repository/controller/MaintenanceController.java index fba5c44..9cbc6d3 100644 --- a/src/main/java/org/commonjava/indy/service/repository/controller/MaintenanceController.java +++ b/src/main/java/org/commonjava/indy/service/repository/controller/MaintenanceController.java @@ -17,6 +17,9 @@ import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +import org.apache.commons.compress.archivers.zip.ZipFile; +import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.commonjava.event.common.EventMetadata; import org.commonjava.indy.service.repository.audit.ChangeSummary; @@ -32,17 +35,18 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import static java.util.Map.of; @@ -96,35 +100,40 @@ public File getRepoBundle() public Map> importRepoBundle( final InputStream zipStream ) throws IOException { + File tempRepoZip = createTempFile(); + logger.info( "Saving repo file to {}", tempRepoZip.getPath() ); + try (zipStream) + { + try (OutputStream out = new FileOutputStream( tempRepoZip )) + { + IOUtils.copy( zipStream, out ); + } + } + final List skipped = new ArrayList<>(); final List failed = new ArrayList<>(); final Map payload = new HashMap<>(); - logger.info( "Start extracting repos definitions from bundle!" ); - try (ZipInputStream zip = new ZipInputStream( zipStream )) + + try (ZipFile zipFile = ZipFile.builder().setFile( tempRepoZip ).get()) { - if ( zip.available() > 0 ) + Enumeration entries = zipFile.getEntries(); + while ( entries.hasMoreElements() ) { - ZipEntry entry = zip.getNextEntry(); - while ( entry != null ) + ZipArchiveEntry entry = entries.nextElement(); + if ( !entry.isDirectory() ) { - if ( !entry.isDirectory() ) + try (InputStream in = zipFile.getInputStream( entry )) { - logger.debug( "Processing {}", entry.getName() ); - byte[] buffer = new byte[2048]; - final StringBuilder builder = new StringBuilder(); - while ( zip.read( buffer ) > 0 ) - { - builder.append( new String( buffer, Charset.defaultCharset() ) ); - buffer = new byte[2048]; - } - - payload.put( entry.getName(), builder.toString().trim() ); - + payload.put( entry.getName(), IOUtils.toString( in, Charset.defaultCharset() ) ); } - entry = zip.getNextEntry(); } } } + finally + { + FileUtils.deleteQuietly( tempRepoZip ); + } + logger.info( "Repos definitions extraction from bundle finished.\n\n" ); logger.info( "Start importing repos definitions to data store." ); for ( Map.Entry entry : payload.entrySet() ) diff --git a/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryMaintenanceResources.java b/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryMaintenanceResources.java index f41f6c0..d9fd172 100644 --- a/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryMaintenanceResources.java +++ b/src/main/java/org/commonjava/indy/service/repository/jaxrs/RepositoryMaintenanceResources.java @@ -23,7 +23,6 @@ import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; import org.eclipse.microprofile.openapi.annotations.tags.Tag; -import org.jboss.resteasy.spi.HttpRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,10 +36,11 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.List; import java.util.Map; @@ -49,7 +49,6 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.Response.Status.BAD_REQUEST; import static javax.ws.rs.core.Response.Status.FORBIDDEN; -import static javax.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED; import static javax.ws.rs.core.Response.Status.NOT_FOUND; import static javax.ws.rs.core.Response.ok; import static org.apache.commons.lang3.StringUtils.isBlank; @@ -100,13 +99,13 @@ public Response getRepoBundle() @APIResponse( responseCode = "200", description = "All repository definitions which are imported successfully." ) @POST @Path( "/import" ) - @Consumes( MEDIATYPE_APPLICATION_ZIP ) + @Consumes( MediaType.MULTIPART_FORM_DATA ) @Produces( APPLICATION_JSON ) - public Response importRepoBundle( @Context final HttpRequest request ) + public Response importRepoBundle( InputStream input ) { try { - Map> results = maintController.importRepoBundle( request.getInputStream() ); + Map> results = maintController.importRepoBundle( input ); return ok( results ).build(); } catch ( IOException e )