Browse Source

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
tags/archiva-1.4-M2
Olivier Lamy 12 years ago
parent
commit
3f8665087a

+ 15
- 0
archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java View File

@@ -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;
}
}

+ 14
- 0
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java View File

@@ -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 );

+ 80
- 0
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/RestError.java View File

@@ -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;
}
}

+ 45
- 0
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/ArchivaRestServiceExceptionMapper.java View File

@@ -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();
}
}

+ 0
- 2
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java View File

@@ -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

+ 4
- 0
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml View File

@@ -45,6 +45,7 @@
<ref bean="authenticationInterceptor#rest"/>
<ref bean="permissionInterceptor#rest"/>
<ref bean="httpContextThreadLocalInterceptor#rest"/>
<ref bean="archivaRestServiceExceptionMapper"/>
</jaxrs:providers>

<jaxrs:serviceBeans>
@@ -64,6 +65,9 @@
<ref bean="httpContextThreadLocalCleaner#rest"/>
</jaxrs:outInterceptors>

<jaxrs:outFaultInterceptors>

</jaxrs:outFaultInterceptors>
</jaxrs:server>

</beans>

+ 22
- 8
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java View File

@@ -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;
}
}


Loading…
Cancel
Save