diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java index 6d80c8af2..a472773a6 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java @@ -18,6 +18,8 @@ package org.apache.archiva.rest.api.services; * under the License. */ +import javax.xml.bind.annotation.XmlRootElement; + /** * @author Olivier Lamy * @since 1.4-M1 @@ -27,6 +29,9 @@ public class ArchivaRestServiceException { private int httpErrorCode; + + private String errorKey; + public ArchivaRestServiceException( String message ) { @@ -48,4 +53,14 @@ public class ArchivaRestServiceException { this.httpErrorCode = httpErrorCode; } + + public String getErrorKey() + { + return errorKey; + } + + public void setErrorKey( String errorKey ) + { + this.errorKey = errorKey; + } } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java index d5309a41e..f06bed640 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java @@ -81,6 +81,8 @@ import org.springframework.stereotype.Service; import javax.inject.Inject; import javax.inject.Named; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -614,11 +616,23 @@ public class DefaultRepositoriesService { // TODO use constants from a class instead of magic number throw new ArchivaRestServiceException( "deleteArtifact call: userName not found", 403 ); + } if ( artifact == null ) { throw new ArchivaRestServiceException( "artifact cannot be null", 400 ); } + + if ( StringUtils.isEmpty( artifact.getGroupId() ) ) + { + throw new ArchivaRestServiceException( "artifact.groupId cannot be null", 400 ); + } + + if ( StringUtils.isEmpty( artifact.getArtifactId() ) ) + { + throw new ArchivaRestServiceException( "artifact.artifactId cannot be null", 400 ); + } + if ( StringUtils.isEmpty( repositoryId ) ) { throw new ArchivaRestServiceException( "repositoryId cannot be null", 400 ); diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/RestError.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/RestError.java new file mode 100644 index 000000000..e93c5b7a2 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/RestError.java @@ -0,0 +1,80 @@ +package org.apache.archiva.rest.services; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import org.apache.archiva.rest.api.services.ArchivaRestServiceException; + +import javax.xml.bind.annotation.XmlRootElement; + +/** + * @author Olivier Lamy + * @since 1.4-M2 + */ +@XmlRootElement( name = "restError" ) +public class RestError +{ + + private int httpErrorCode; + + private String errorKey; + + private String errorMessage; + + public RestError() + { + // no op + } + + public RestError( ArchivaRestServiceException e) + { + httpErrorCode = e.getHttpErrorCode(); + errorKey = e.getErrorKey(); + errorMessage = e.getMessage(); + } + + public int getHttpErrorCode() + { + return httpErrorCode; + } + + public void setHttpErrorCode( int httpErrorCode ) + { + this.httpErrorCode = httpErrorCode; + } + + public String getErrorKey() + { + return errorKey; + } + + public void setErrorKey( String errorKey ) + { + this.errorKey = errorKey; + } + + public String getErrorMessage() + { + return errorMessage; + } + + public void setErrorMessage( String errorMessage ) + { + this.errorMessage = errorMessage; + } +} diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/ArchivaRestServiceExceptionMapper.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/ArchivaRestServiceExceptionMapper.java new file mode 100644 index 000000000..4f3500ab3 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/ArchivaRestServiceExceptionMapper.java @@ -0,0 +1,45 @@ +package org.apache.archiva.rest.services.interceptors; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +import org.apache.archiva.rest.api.services.ArchivaRestServiceException; +import org.apache.archiva.rest.services.RestError; +import org.springframework.stereotype.Service; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; + +/** + * @author Olivier Lamy + * @since 1.4-M2 + */ +@Provider +@Service( "archivaRestServiceExceptionMapper" ) +public class ArchivaRestServiceExceptionMapper + implements ExceptionMapper +{ + public Response toResponse( ArchivaRestServiceException e ) + { + RestError restError = new RestError( e ); + Response.ResponseBuilder responseBuilder = Response.status( e.getHttpErrorCode() ).entity( restError ); + return responseBuilder.build(); + } +} diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java index 6b032aec7..43180d838 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java @@ -18,8 +18,6 @@ package org.apache.archiva.rest.services.interceptors; * under the License. */ -import org.codehaus.redback.rest.services.RedbackRequestInformation; - /** * @author Olivier Lamy * @since 1.4-M1 diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml index 09bb0c206..f5cfcb7d5 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml @@ -45,6 +45,7 @@ + @@ -64,6 +65,9 @@ + + + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java index effe67c43..d9c120c89 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java @@ -76,14 +76,8 @@ public class RepositoriesServiceTest public void deleteArtifactKarmaFailed() throws Exception { - initSourceTargetRepo(); try { - File artifactFile = - new File( "target/test-origin-repo/commons-logging/commons-logging/1.0.1/commons-logging-1.0.1.jar" ); - - assertTrue( "artifact not exists:" + artifactFile.getPath(), artifactFile.exists() ); - Artifact artifact = new Artifact(); artifact.setGroupId( "commons-logging" ); artifact.setArtifactId( "commons-logging" ); @@ -100,9 +94,29 @@ public class RepositoriesServiceTest throw e; } - finally + } + + @Test( expected = ServerWebApplicationException.class ) + public void deleteWithRepoNull() + throws Exception + { + try { - cleanRepos(); + + RepositoriesService repositoriesService = getRepositoriesService( authorizationHeader ); + + Artifact artifact = new Artifact(); + artifact.setGroupId( "commons-logging" ); + artifact.setArtifactId( "commons-logging" ); + artifact.setVersion( "1.0.1" ); + artifact.setPackaging( "jar" ); + + repositoriesService.deleteArtifact( artifact, null ); + } + catch ( ServerWebApplicationException e ) + { + assertEquals( "not http 400 status", 400, e.getStatus() ); + throw e; } }