diff --git a/addons/koji/jaxrs/src/main/java/org/commonjava/indy/koji/bind/jaxrs/KojiRepairResource.java b/addons/koji/jaxrs/src/main/java/org/commonjava/indy/koji/bind/jaxrs/KojiRepairResource.java index 128df56295..3cd28967aa 100644 --- a/addons/koji/jaxrs/src/main/java/org/commonjava/indy/koji/bind/jaxrs/KojiRepairResource.java +++ b/addons/koji/jaxrs/src/main/java/org/commonjava/indy/koji/bind/jaxrs/KojiRepairResource.java @@ -46,6 +46,7 @@ import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; +import static org.commonjava.indy.bind.jaxrs.util.JaxRsUriFormatter.getBaseUrlByStoreKey; import static org.commonjava.indy.bind.jaxrs.util.ResponseUtils.throwError; import static org.commonjava.indy.koji.model.IndyKojiConstants.ALL_MASKS; import static org.commonjava.indy.koji.model.IndyKojiConstants.MASK; @@ -86,15 +87,8 @@ public KojiRepairResult repairVolumes( final KojiRepairRequest request, final @C { try { - PackageTypeDescriptor packageTypeDescriptor = - PackageTypes.getPackageTypeDescriptor( request.getSource().getPackageType() ); - String user = securityManager.getUser( securityContext, servletRequest ); - final String baseUrl = uriInfo.getBaseUriBuilder() - .path( packageTypeDescriptor.getContentRestBasePath() ) - .build( request.getSource().getType().singularEndpointName(), - request.getSource().getName() ) - .toString(); + final String baseUrl = getBaseUrlByStoreKey( uriInfo, request.getSource() ); return repairManager.repairVol( request, user, baseUrl ); } catch ( KojiRepairException | KojiClientException e ) diff --git a/addons/promote/common/src/main/data/promote/rules/parsable-pom.groovy b/addons/promote/common/src/main/data/promote/rules/parsable-pom.groovy index caa5cedd3e..f88c8adf11 100644 --- a/addons/promote/common/src/main/data/promote/rules/parsable-pom.groovy +++ b/addons/promote/common/src/main/data/promote/rules/parsable-pom.groovy @@ -11,7 +11,7 @@ class ParsablePom implements ValidationRule { def errors = Collections.synchronizedList(new ArrayList()); def tools = request.getTools() def logger = LoggerFactory.getLogger(ValidationRule.class) - logger.info("Parsing POMs in:\n {}.", request.getSourcePaths().join("\n ")) + logger.info("Parsing POMs in:\n {}", request.getSourcePaths().join("\n ")) tools.paralleledEach(request.getSourcePaths(), { it -> if (it.endsWith(".pom")) { diff --git a/addons/promote/common/src/main/java/org/commonjava/indy/promote/validate/PromotionValidator.java b/addons/promote/common/src/main/java/org/commonjava/indy/promote/validate/PromotionValidator.java index 1e46925023..7cc7110b07 100644 --- a/addons/promote/common/src/main/java/org/commonjava/indy/promote/validate/PromotionValidator.java +++ b/addons/promote/common/src/main/java/org/commonjava/indy/promote/validate/PromotionValidator.java @@ -335,6 +335,8 @@ private ArtifactStore getRequestStore( PromoteRequest promoteRequest, String bas { final ArtifactStore store; final Logger logger = LoggerFactory.getLogger( getClass() ); + logger.info( "Promotion baseUrl: {} ", baseUrl ); + if ( needTempRepo( promoteRequest ) ) { logger.info( "Promotion temporary repo is needed for {}, points to {} ", promoteRequest.getSource(), diff --git a/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/AbstractValidationRuleTest.java b/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/AbstractValidationRuleTest.java index 36973863c6..d63d848332 100644 --- a/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/AbstractValidationRuleTest.java +++ b/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/AbstractValidationRuleTest.java @@ -155,7 +155,7 @@ protected ValidationRuleSet getRuleSet() { ValidationRuleSet ruleSet = new ValidationRuleSet(); ruleSet.setName( "test" ); - ruleSet.setStoreKeyPattern( new StoreKey( group, TARGET_NAME ).toString() ); + ruleSet.setStoreKeyPattern( "maven:[^:]+:" + TARGET_NAME ); ruleSet.setRuleNames( Collections.singletonList( getRuleScriptFile() ) ); return ruleSet; diff --git a/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/ParsablePomRuleByPathTest.java b/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/ParsablePomRuleByPathTest.java new file mode 100644 index 0000000000..075a7790e5 --- /dev/null +++ b/addons/promote/ftests/src/main/java/org/commonjava/indy/promote/ftest/rule/ParsablePomRuleByPathTest.java @@ -0,0 +1,93 @@ +/** + * Copyright (C) 2011-2018 Red Hat, Inc. (https://github.com/Commonjava/indy) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.commonjava.indy.promote.ftest.rule; + +import org.commonjava.indy.ftest.core.category.EventDependent; +import org.commonjava.indy.model.core.HostedRepository; +import org.commonjava.indy.promote.model.PathsPromoteRequest; +import org.commonjava.indy.promote.model.PathsPromoteResult; +import org.commonjava.indy.promote.model.ValidationResult; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ParsablePomRuleByPathTest + extends AbstractValidationRuleTest +{ + + private static final String RULE = "parsable-pom.groovy"; + + @Test + @Category( EventDependent.class ) + public void run() throws Exception + { + String invalid = "org/foo/invalid/1/invalid-1.pom"; + String valid = "org/foo/valid/1/valid-1.pom"; + + deploy( invalid, "This is not parsable" ); + deploy( valid, "\n4.0.0org.foo" + + "valid1" ); + + waitForEventPropagation(); + + PathsPromoteRequest request = new PathsPromoteRequest( source.getKey(), target.getKey() ); + request.setPaths( new HashSet( Arrays.asList( invalid, valid )) ); + + PathsPromoteResult result = module.promoteByPath( request ); + assertThat( result, notNullValue() ); + + ValidationResult validations = result.getValidations(); + assertThat( validations, notNullValue() ); + + Map validatorErrors = validations.getValidatorErrors(); + assertThat( validatorErrors, notNullValue() ); + + System.out.println( validatorErrors ); + + String errors = validatorErrors.get( RULE ); + assertThat( errors, notNullValue() ); + + System.out.println( validatorErrors ); + assertThat( errors.contains( valid ), equalTo( false ) ); + assertThat( errors.contains( invalid ), equalTo( true ) ); + } + + public ParsablePomRuleByPathTest() + { + super( HostedRepository.class ); + } + + @Override + protected String getRuleScriptFile() + { + return RULE; + } + + @Override + protected String getRuleScriptContent() throws IOException + { + String path = "promote/rules/" + RULE; + return readTestResource( path ); + } +} diff --git a/addons/promote/jaxrs/src/main/java/org/commonjava/indy/promote/bind/jaxrs/PromoteResource.java b/addons/promote/jaxrs/src/main/java/org/commonjava/indy/promote/bind/jaxrs/PromoteResource.java index 9ed41627df..1502fa6db7 100644 --- a/addons/promote/jaxrs/src/main/java/org/commonjava/indy/promote/bind/jaxrs/PromoteResource.java +++ b/addons/promote/jaxrs/src/main/java/org/commonjava/indy/promote/bind/jaxrs/PromoteResource.java @@ -15,6 +15,7 @@ */ package org.commonjava.indy.promote.bind.jaxrs; +import static org.commonjava.indy.bind.jaxrs.util.JaxRsUriFormatter.getBaseUrlByStoreKey; import static org.commonjava.indy.util.ApplicationContent.application_json; import com.fasterxml.jackson.databind.ObjectMapper; @@ -26,8 +27,6 @@ import org.commonjava.indy.IndyWorkflowException; import org.commonjava.indy.bind.jaxrs.IndyResources; import org.commonjava.indy.bind.jaxrs.SecurityManager; -import org.commonjava.indy.model.core.PackageTypeDescriptor; -import org.commonjava.indy.model.core.PackageTypes; import org.commonjava.indy.promote.data.PromotionException; import org.commonjava.indy.promote.data.PromotionManager; import org.commonjava.indy.promote.model.GroupPromoteRequest; @@ -87,18 +86,12 @@ public GroupPromoteResult promoteToGroup( final GroupPromoteRequest request, final @Context SecurityContext securityContext, final @Context UriInfo uriInfo) { - Response response = null; + Response response; try { - PackageTypeDescriptor packageTypeDescriptor = - PackageTypes.getPackageTypeDescriptor( request.getSource().getPackageType() ); - String user = securityManager.getUser( securityContext, servletRequest ); - final String baseUrl = uriInfo.getBaseUriBuilder() - .path( packageTypeDescriptor.getContentRestBasePath() ) - .build( request.getSource().getType().singularEndpointName(), - request.getSource().getName() ) - .toString(); + final String baseUrl = getBaseUrlByStoreKey( uriInfo, request.getSource() ); + return manager.promoteToGroup( request, user, baseUrl ); } catch ( PromotionException | IndyWorkflowException e ) @@ -148,8 +141,8 @@ public GroupPromoteResult rollbackGroupPromote( final GroupPromoteResult result, @Consumes( ApplicationContent.application_json ) public Response promotePaths( final @Context HttpServletRequest request, final @Context UriInfo uriInfo ) { - PathsPromoteRequest req = null; - Response response = null; + PathsPromoteRequest req; + Response response; try { final String json = IOUtils.toString( request.getInputStream() ); @@ -159,27 +152,16 @@ public Response promotePaths( final @Context HttpServletRequest request, final @ catch ( final IOException e ) { response = formatResponse( e, "Failed to read DTO from request body." ); - } - - if ( response != null ) - { return response; } try { - PackageTypeDescriptor packageTypeDescriptor = - PackageTypes.getPackageTypeDescriptor( req.getSource().getPackageType() ); - - final String baseUrl = uriInfo.getBaseUriBuilder() - .path( packageTypeDescriptor.getContentRestBasePath() ) - .build( req.getSource().getType().singularEndpointName(), - req.getSource().getName() ) - .toString(); + final String baseUrl = getBaseUrlByStoreKey( uriInfo, req.getSource() ); final PathsPromoteResult result = manager.promotePaths( req, baseUrl ); - // TODO: Amend response status code based on presence of error? This would have consequences for client API... response = formatOkResponseWithJsonEntity( result, mapper ); + logger.info( "Send promotion result:\n{}", response.getEntity() ); } catch ( PromotionException | IndyWorkflowException e ) { @@ -201,8 +183,8 @@ public Response promotePaths( final @Context HttpServletRequest request, final @ @Consumes( ApplicationContent.application_json ) public Response resumePaths( @Context final HttpServletRequest request, final @Context UriInfo uriInfo ) { - PathsPromoteResult result = null; - Response response = null; + PathsPromoteResult result; + Response response; try { result = mapper.readValue( request.getInputStream(), PathsPromoteResult.class ); @@ -210,30 +192,17 @@ public Response resumePaths( @Context final HttpServletRequest request, final @C catch ( final IOException e ) { response = formatResponse( e, "Failed to read DTO from request body." ); - } - - if ( response != null ) - { return response; } try { PathsPromoteRequest req = result.getRequest(); - - PackageTypeDescriptor packageTypeDescriptor = - PackageTypes.getPackageTypeDescriptor( req.getSource().getPackageType() ); - - final String baseUrl = uriInfo.getBaseUriBuilder() - .path( packageTypeDescriptor.getContentRestBasePath() ) - .build( req.getSource().getType().singularEndpointName(), - req.getSource().getName() ) - .toString(); + final String baseUrl = getBaseUrlByStoreKey( uriInfo, req.getSource() ); result = manager.resumePathsPromote( result, baseUrl ); - - // TODO: Amend response status code based on presence of error? This would have consequences for client API... response = formatOkResponseWithJsonEntity( result, mapper ); + logger.info( "Send promotion result:\n{}", response.getEntity() ); } catch ( PromotionException | IndyWorkflowException e ) { @@ -255,8 +224,8 @@ public Response resumePaths( @Context final HttpServletRequest request, final @C @Consumes( ApplicationContent.application_json ) public Response rollbackPaths( @Context final HttpServletRequest request, @Context final UriInfo uriInfo ) { - PathsPromoteResult result = null; - Response response = null; + PathsPromoteResult result; + Response response; try { result = mapper.readValue( request.getInputStream(), PathsPromoteResult.class ); @@ -264,18 +233,12 @@ public Response rollbackPaths( @Context final HttpServletRequest request, @Conte catch ( final IOException e ) { response = formatResponse( e, "Failed to read DTO from request body." ); - } - - if ( response != null ) - { return response; } try { result = manager.rollbackPathsPromote( result ); - - // TODO: Amend response status code based on presence of error? This would have consequences for client API... response = formatOkResponseWithJsonEntity( result, mapper ); } catch ( PromotionException | IndyWorkflowException e ) diff --git a/subsys/jaxrs/src/main/java/org/commonjava/indy/bind/jaxrs/util/JaxRsUriFormatter.java b/subsys/jaxrs/src/main/java/org/commonjava/indy/bind/jaxrs/util/JaxRsUriFormatter.java index 295bc57ce0..f3cb39c70d 100644 --- a/subsys/jaxrs/src/main/java/org/commonjava/indy/bind/jaxrs/util/JaxRsUriFormatter.java +++ b/subsys/jaxrs/src/main/java/org/commonjava/indy/bind/jaxrs/util/JaxRsUriFormatter.java @@ -19,6 +19,9 @@ import java.net.MalformedURLException; +import org.commonjava.indy.model.core.PackageTypeDescriptor; +import org.commonjava.indy.model.core.PackageTypes; +import org.commonjava.indy.model.core.StoreKey; import org.commonjava.indy.util.UriFormatter; import org.commonjava.atlas.maven.ident.util.JoinString; import org.commonjava.maven.galley.util.PathUtils; @@ -26,8 +29,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.ws.rs.core.UriInfo; + public class JaxRsUriFormatter - implements UriFormatter + implements UriFormatter { private final Logger logger = LoggerFactory.getLogger( getClass() ); @@ -55,31 +60,16 @@ public String formatAbsolutePathTo( final String base, final String... parts ) logger.debug( "Resulting URL: '{}'", url ); return url; - - // URL baseUrl = null; - // String path = base; - // try - // { - // baseUrl = new URL( base ); - // path = baseUrl.getPath(); - // } - // catch ( MalformedURLException e ) - // { - // // not a URL. - // } - // - // path = PathUtils.normalize( base, PathUtils.normalize( parts ) ); - // if ( !path.startsWith( "/" ) ) - // { - // path = "/" + path; - // } - // - // if ( baseUrl != null ) - // { - // // reconstruct... - // } - // - // return path; } + public static String getBaseUrlByStoreKey( UriInfo uriInfo, StoreKey storeKey ) + { + PackageTypeDescriptor typeDescriptor = PackageTypes.getPackageTypeDescriptor( storeKey.getPackageType() ); + return uriInfo.getBaseUriBuilder() + .path( typeDescriptor.getContentRestBasePath() ) + .path( storeKey.getType().singularEndpointName() ) + .path( storeKey.getName() ) + .build() + .toString(); + } }