source: VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/rest/VirtualCollectionRegistryExceptionMapper.java @ 215

Last change on this file since 215 was 215, checked in by oschonef, 14 years ago
  • improve error handling
  • improve error messages and reporting
  • Property svn:eol-style set to native
File size: 2.6 KB
Line 
1package eu.clarin.cmdi.virtualcollectionregistry.rest;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import javax.ws.rs.core.MediaType;
7import javax.ws.rs.core.Response;
8import javax.ws.rs.core.Response.Status;
9import javax.ws.rs.ext.ExceptionMapper;
10import javax.ws.rs.ext.Provider;
11import javax.xml.stream.XMLStreamException;
12
13import org.xml.sax.SAXParseException;
14
15import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionMetadataNotFoundException;
16import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionNotFoundException;
17import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryException;
18import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryPermissionException;
19import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryUsageException;
20
21@Provider
22public class VirtualCollectionRegistryExceptionMapper implements
23                ExceptionMapper<VirtualCollectionRegistryException> {
24
25        public Response toResponse(VirtualCollectionRegistryException e) {
26                Status       status = null;
27                List<String> errors = null;
28                if (e instanceof VirtualCollectionRegistryUsageException) {
29                        status = Status.BAD_REQUEST;
30                        errors = getErrors(e.getCause());
31                } else if (e instanceof VirtualCollectionRegistryPermissionException) {
32                        status = Status.FORBIDDEN;
33                } else if (e instanceof VirtualCollectionNotFoundException) {
34                        status = Status.NOT_FOUND;
35                } else if (e instanceof VirtualCollectionMetadataNotFoundException) {
36                        status = Status.NOT_FOUND;
37                } else {
38                        if (hasCause(e.getCause(), XMLStreamException.class)) {
39                                status = Status.BAD_REQUEST;
40                        } else {
41                                status = Status.INTERNAL_SERVER_ERROR;
42                        }
43                        errors = getErrors(e.getCause());
44                }
45                RestResponse response = new RestResponse();
46                response.setIsSuccess(false);
47                response.setInfo(e.getMessage());
48                if (errors != null) {
49                        response.setError(errors);
50                }
51                return Response
52                                .status(status)
53                                .type(MediaType.APPLICATION_XML)
54                                .entity(response)
55                                .build();
56        }
57
58        private static List<String> getErrors(Throwable t) {
59                ArrayList<String> errors = new ArrayList<String>();
60                while (t != null) {
61                        if (t instanceof SAXParseException) {
62                                SAXParseException e = (SAXParseException) t;
63                                errors.add(e.getMessage() + ", line = " + e.getLineNumber()
64                                                + ", column = " + e.getColumnNumber());
65                        } else {
66                                errors.add(t.getMessage());
67                        }
68                        t = t.getCause();
69                };
70                return errors;
71        }
72
73        private static boolean hasCause(Throwable t, Class<?> clazz) {
74                while (t != null) {
75                        if (clazz.isInstance(t)) {
76                                return true;
77                        }
78                        t = t.getCause();
79                }
80                return false;
81        }
82
83} // class VirtualCollectionRegistryExceptionMapper
Note: See TracBrowser for help on using the repository browser.