]> source.dussan.org Git - archiva.git/commitdiff
add an exception Mapper to customize reponse http status and response content
authorOlivier Lamy <olamy@apache.org>
Thu, 10 Nov 2011 10:04:22 +0000 (10:04 +0000)
committerOlivier Lamy <olamy@apache.org>
Thu, 10 Nov 2011 10:04:22 +0000 (10:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1200250 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRestServiceException.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/RestError.java [new file with mode: 0644]
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/ArchivaRestServiceExceptionMapper.java [new file with mode: 0644]
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/interceptors/HttpContextThreadLocal.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/resources/META-INF/spring-context.xml
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RepositoriesServiceTest.java

index 6d80c8af2fbe01c1cd5f9ec92ae9a8eed0fff08d..a472773a67675945d4799c578093e7fc54300a2a 100644 (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;
+    }
 }
index d5309a41eb932de250093139beb67db97a87e9ed..f06bed6406d50cc6bca6cf6a41e186c87f984c86 100644 (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 );
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 (file)
index 0000000..e93c5b7
--- /dev/null
@@ -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 (file)
index 0000000..4f3500a
--- /dev/null
@@ -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();
+    }
+}
index 09bb0c206faa37e87e67fe932011e72263944cd1..f5cfcb7d5d0c947e6b26ef72b3e24e6888475a1a 100644 (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>
\ No newline at end of file
index effe67c43322421667c5c93524a095fd4222149e..d9c120c8908df0e8e441d3c2604bbd9b26e6b046 100644 (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;
         }
     }