mirror of https://github.com/apache/archiva.git
add an exception Mapper to customize reponse http status and response content
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1200250 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
d174bd2427
commit
3f8665087a
|
@ -18,6 +18,8 @@ package org.apache.archiva.rest.api.services;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Olivier Lamy
|
* @author Olivier Lamy
|
||||||
* @since 1.4-M1
|
* @since 1.4-M1
|
||||||
|
@ -28,6 +30,9 @@ public class ArchivaRestServiceException
|
||||||
|
|
||||||
private int httpErrorCode;
|
private int httpErrorCode;
|
||||||
|
|
||||||
|
private String errorKey;
|
||||||
|
|
||||||
|
|
||||||
public ArchivaRestServiceException( String message )
|
public ArchivaRestServiceException( String message )
|
||||||
{
|
{
|
||||||
super( message );
|
super( message );
|
||||||
|
@ -48,4 +53,14 @@ public class ArchivaRestServiceException
|
||||||
{
|
{
|
||||||
this.httpErrorCode = httpErrorCode;
|
this.httpErrorCode = httpErrorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getErrorKey()
|
||||||
|
{
|
||||||
|
return errorKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrorKey( String errorKey )
|
||||||
|
{
|
||||||
|
this.errorKey = errorKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,8 @@ import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
import javax.ws.rs.WebApplicationException;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -614,11 +616,23 @@ public class DefaultRepositoriesService
|
||||||
{
|
{
|
||||||
// TODO use constants from a class instead of magic number
|
// TODO use constants from a class instead of magic number
|
||||||
throw new ArchivaRestServiceException( "deleteArtifact call: userName not found", 403 );
|
throw new ArchivaRestServiceException( "deleteArtifact call: userName not found", 403 );
|
||||||
|
|
||||||
}
|
}
|
||||||
if ( artifact == null )
|
if ( artifact == null )
|
||||||
{
|
{
|
||||||
throw new ArchivaRestServiceException( "artifact cannot be null", 400 );
|
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 ) )
|
if ( StringUtils.isEmpty( repositoryId ) )
|
||||||
{
|
{
|
||||||
throw new ArchivaRestServiceException( "repositoryId cannot be null", 400 );
|
throw new ArchivaRestServiceException( "repositoryId cannot be null", 400 );
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<ArchivaRestServiceException>
|
||||||
|
{
|
||||||
|
public Response toResponse( ArchivaRestServiceException e )
|
||||||
|
{
|
||||||
|
RestError restError = new RestError( e );
|
||||||
|
Response.ResponseBuilder responseBuilder = Response.status( e.getHttpErrorCode() ).entity( restError );
|
||||||
|
return responseBuilder.build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,8 +18,6 @@ package org.apache.archiva.rest.services.interceptors;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import org.codehaus.redback.rest.services.RedbackRequestInformation;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Olivier Lamy
|
* @author Olivier Lamy
|
||||||
* @since 1.4-M1
|
* @since 1.4-M1
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
<ref bean="authenticationInterceptor#rest"/>
|
<ref bean="authenticationInterceptor#rest"/>
|
||||||
<ref bean="permissionInterceptor#rest"/>
|
<ref bean="permissionInterceptor#rest"/>
|
||||||
<ref bean="httpContextThreadLocalInterceptor#rest"/>
|
<ref bean="httpContextThreadLocalInterceptor#rest"/>
|
||||||
|
<ref bean="archivaRestServiceExceptionMapper"/>
|
||||||
</jaxrs:providers>
|
</jaxrs:providers>
|
||||||
|
|
||||||
<jaxrs:serviceBeans>
|
<jaxrs:serviceBeans>
|
||||||
|
@ -64,6 +65,9 @@
|
||||||
<ref bean="httpContextThreadLocalCleaner#rest"/>
|
<ref bean="httpContextThreadLocalCleaner#rest"/>
|
||||||
</jaxrs:outInterceptors>
|
</jaxrs:outInterceptors>
|
||||||
|
|
||||||
|
<jaxrs:outFaultInterceptors>
|
||||||
|
|
||||||
|
</jaxrs:outFaultInterceptors>
|
||||||
</jaxrs:server>
|
</jaxrs:server>
|
||||||
|
|
||||||
</beans>
|
</beans>
|
|
@ -76,14 +76,8 @@ public class RepositoriesServiceTest
|
||||||
public void deleteArtifactKarmaFailed()
|
public void deleteArtifactKarmaFailed()
|
||||||
throws Exception
|
throws Exception
|
||||||
{
|
{
|
||||||
initSourceTargetRepo();
|
|
||||||
try
|
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 artifact = new Artifact();
|
||||||
artifact.setGroupId( "commons-logging" );
|
artifact.setGroupId( "commons-logging" );
|
||||||
artifact.setArtifactId( "commons-logging" );
|
artifact.setArtifactId( "commons-logging" );
|
||||||
|
@ -100,9 +94,29 @@ public class RepositoriesServiceTest
|
||||||
throw e;
|
throw e;
|
||||||
|
|
||||||
}
|
}
|
||||||
finally
|
}
|
||||||
|
|
||||||
|
@Test( expected = ServerWebApplicationException.class )
|
||||||
|
public void deleteWithRepoNull()
|
||||||
|
throws Exception
|
||||||
{
|
{
|
||||||
cleanRepos();
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue