summaryrefslogtreecommitdiffstats
path: root/base/common/src/com
diff options
context:
space:
mode:
authorEndi Sukma Dewata <edewata@redhat.com>2012-03-01 19:58:34 -0600
committerEndi Sukma Dewata <edewata@redhat.com>2012-03-30 16:54:32 -0500
commit0b39b68e4e72cbcf0f4d28488d54ce06117efa9c (patch)
tree1a2cfc235f1f6a062e7c88c554a9f9bf82822f72 /base/common/src/com
parent70fdf22f76494a84b6cbef10598ed897a48f0798 (diff)
Added CMSException.
The CMSException was added to simplify error handling in REST services. The exception may include an error message and some other attributes. When the server throws a CMSException (or its subclass), the exception will be marshalled into XML and unmarshalled by the client, then thrown again as a new exception which can be caught by the application. Ticket #100
Diffstat (limited to 'base/common/src/com')
-rw-r--r--base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java11
-rw-r--r--base/common/src/com/netscape/certsrv/request/RequestId.java11
-rw-r--r--base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java7
-rw-r--r--base/common/src/com/netscape/cms/servlet/base/CMSException.java165
-rw-r--r--base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java17
-rw-r--r--base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java5
-rw-r--r--base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java5
-rw-r--r--base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java25
-rw-r--r--base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java5
-rw-r--r--base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java46
10 files changed, 260 insertions, 37 deletions
diff --git a/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java b/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java
index f998bf97a..b8bb1870b 100644
--- a/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java
+++ b/base/common/src/com/netscape/certsrv/dbs/keydb/KeyId.java
@@ -95,6 +95,17 @@ public class KeyId {
return value.toString();
}
+ /**
+ * Converts the KeyId into its hex string representation. The string
+ * form can be stored in a database (such as the LDAP directory)
+ *
+ * @return
+ * a string containing the hex (hex 16) value for the identifier.
+ */
+ public String toHexString() {
+ return "0x"+value.toString(16);
+ }
+
@Override
public int hashCode() {
final int prime = 31;
diff --git a/base/common/src/com/netscape/certsrv/request/RequestId.java b/base/common/src/com/netscape/certsrv/request/RequestId.java
index da61f2bc0..b643fa30d 100644
--- a/base/common/src/com/netscape/certsrv/request/RequestId.java
+++ b/base/common/src/com/netscape/certsrv/request/RequestId.java
@@ -94,6 +94,17 @@ public class RequestId {
return value.toString();
}
+ /**
+ * Converts the RequestId into its hex string representation. The string
+ * form can be stored in a database (such as the LDAP directory)
+ *
+ * @return
+ * a string containing the hex (base 16) value for the identifier.
+ */
+ public String toHexString() {
+ return "0x"+value.toString(16);
+ }
+
@Override
public int hashCode() {
final int prime = 31;
diff --git a/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java b/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java
index 48f410c73..4dccb141f 100644
--- a/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/admin/SystemCertificateResourceService.java
@@ -21,8 +21,6 @@ package com.netscape.cms.servlet.admin;
import java.security.cert.CertificateEncodingException;
import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import com.netscape.certsrv.apps.CMS;
@@ -39,9 +37,6 @@ import com.netscape.cms.servlet.cert.model.CertificateData;
*/
public class SystemCertificateResourceService extends CMSResourceService implements SystemCertificateResource {
- @Context
- Request request;
-
/**
* Used to retrieve the transport certificate
*/
@@ -74,7 +69,7 @@ public class SystemCertificateResourceService extends CMSResourceService impleme
e.printStackTrace();
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
- return sendConditionalGetResponse(DEFAULT_LONG_CACHE_LIFETIME, cert, request);
+ return sendConditionalGetResponse(DEFAULT_LONG_CACHE_LIFETIME, cert);
}
}
diff --git a/base/common/src/com/netscape/cms/servlet/base/CMSException.java b/base/common/src/com/netscape/cms/servlet/base/CMSException.java
new file mode 100644
index 000000000..eda5566ac
--- /dev/null
+++ b/base/common/src/com/netscape/cms/servlet/base/CMSException.java
@@ -0,0 +1,165 @@
+package com.netscape.cms.servlet.base;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.ExceptionMapper;
+import javax.ws.rs.ext.Provider;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlValue;
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+public class CMSException extends RuntimeException {
+
+ private static final long serialVersionUID = 6000910362260369923L;
+
+ public int code;
+
+ public CMSException(String message) {
+ super(message);
+ code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
+ }
+
+ public CMSException(int code, String message) {
+ super(message);
+ this.code = code;
+ }
+
+ public CMSException(Response.Status status, String message) {
+ super(message);
+ code = status.getStatusCode();
+ }
+
+ public CMSException(String message, Throwable cause) {
+ super(message, cause);
+ code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
+ }
+
+ public CMSException(int code, String message, Throwable cause) {
+ super(message, cause);
+ this.code = code;
+ }
+
+ public CMSException(Response.Status status, String message, Throwable cause) {
+ super(message, cause);
+ code = status.getStatusCode();
+ }
+
+ public CMSException(Data data) {
+ super(data.message);
+ code = data.code;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public Data getData() {
+ Data data = new Data();
+ data.className = getClass().getName();
+ data.code = code;
+ data.message = getMessage();
+ return data;
+ }
+
+ @XmlRootElement(name="CMSException")
+ public static class Data {
+
+ @XmlElement(name="ClassName")
+ public String className;
+
+ @XmlElement(name="Code")
+ public int code;
+
+ @XmlElement(name="Message")
+ public String message;
+
+ @XmlElement(name="Attributes")
+ @XmlJavaTypeAdapter(MapAdapter.class)
+ public Map<String, String> attributes = new LinkedHashMap<String, String>();
+
+ public String getAttribute(String name) {
+ return attributes.get(name);
+ }
+
+ public void setAttribute(String name, String value) {
+ attributes.put(name, value);
+ }
+ }
+
+ public static class MapAdapter extends XmlAdapter<AttributeList, Map<String, String>> {
+
+ public AttributeList marshal(Map<String, String> map) {
+ AttributeList list = new AttributeList();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ Attribute attribute = new Attribute();
+ attribute.name = entry.getKey();
+ attribute.value = entry.getValue();
+ list.attributes.add(attribute);
+ }
+ return list;
+ }
+
+ public Map<String, String> unmarshal(AttributeList list) {
+ Map<String, String> map = new LinkedHashMap<String, String>();
+ for (Attribute attribute : list.attributes) {
+ map.put(attribute.name, attribute.value);
+ }
+ return map;
+ }
+ }
+
+ public static class AttributeList {
+ @XmlElement(name="Attribute")
+ public List<Attribute> attributes = new ArrayList<Attribute>();
+ }
+
+ public static class Attribute {
+
+ @XmlAttribute
+ public String name;
+
+ @XmlValue
+ public String value;
+ }
+
+ @Provider
+ public static class Mapper implements ExceptionMapper<CMSException> {
+
+ public Response toResponse(CMSException exception) {
+ // convert CMSException into HTTP response with XML content
+ return Response
+ .status(exception.getCode())
+ .entity(exception.getData())
+ .type(MediaType.TEXT_XML)
+ .build();
+ }
+ }
+
+ public static void main(String args[]) throws Exception {
+ Data data = new Data();
+ data.className = CMSException.class.getName();
+ data.code = Response.Status.INTERNAL_SERVER_ERROR.getStatusCode();
+ data.message = "An error has occured";
+ data.setAttribute("attr1", "value1");
+ data.setAttribute("attr2", "value2");
+
+ JAXBContext context = JAXBContext.newInstance(Data.class);
+ Marshaller marshaller = context.createMarshaller();
+ marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+ marshaller.marshal(data, System.out);
+ }
+}
diff --git a/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java b/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java
index acddba559..24c3cd74d 100644
--- a/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/base/CMSResourceService.java
@@ -20,9 +20,11 @@ package com.netscape.cms.servlet.base;
import java.security.cert.CertificateEncodingException;
import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Response.ResponseBuilder;
import com.netscape.certsrv.apps.CMS;
@@ -35,13 +37,24 @@ import com.netscape.cms.servlet.cert.model.CertificateData;
*
*/
public class CMSResourceService {
+
public static final String HEADER = "-----BEGIN NEW CERTIFICATE REQUEST-----";
public static final String TRAILER = "-----END NEW CERTIFICATE REQUEST-----";
// caching parameters
- protected static final int DEFAULT_LONG_CACHE_LIFETIME = 1000;
+ public static final int DEFAULT_LONG_CACHE_LIFETIME = 1000;
+
+ @Context
+ protected UriInfo uriInfo;
+
+ @Context
+ protected Request request;
+
+ public Response createOKResponse(Object object) {
+ return Response.ok(object).build();
+ }
- protected Response sendConditionalGetResponse(int ctime, Object object, Request request) {
+ public Response sendConditionalGetResponse(int ctime, Object object) {
CacheControl cc = new CacheControl();
cc.setMaxAge(ctime);
EntityTag tag = new EntityTag(Integer.toString(object.hashCode()));
diff --git a/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java b/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java
index 79e6ccfdb..88f2f8a82 100644
--- a/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/key/KeyResourceService.java
@@ -20,10 +20,8 @@ package com.netscape.cms.servlet.key;
import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
import com.netscape.cms.servlet.base.CMSResourceService;
import com.netscape.cms.servlet.key.model.KeyDAO;
@@ -43,9 +41,6 @@ import com.netscape.certsrv.dbs.keydb.KeyId;
*/
public class KeyResourceService extends CMSResourceService implements KeyResource{
- @Context
- UriInfo uriInfo;
-
/**
* Used to retrieve a key
* @param data
diff --git a/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java b/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java
index a7876a6c6..d525d5a77 100644
--- a/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/key/KeysResourceService.java
@@ -21,9 +21,7 @@
package com.netscape.cms.servlet.key;
import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
@@ -38,9 +36,6 @@ import com.netscape.cmsutil.ldap.LDAPUtil;
*/
public class KeysResourceService extends CMSResourceService implements KeysResource {
- @Context
- UriInfo uriInfo;
-
/**
* Used to generate list of key infos based on the search parameters
*/
diff --git a/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java b/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java
index 43e58bbdc..b9ba206c1 100644
--- a/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/request/KeyRequestResourceService.java
@@ -19,27 +19,24 @@
package com.netscape.cms.servlet.request;
import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
+
import com.netscape.certsrv.base.EBaseException;
import com.netscape.certsrv.request.RequestId;
+import com.netscape.cms.servlet.base.CMSException;
import com.netscape.cms.servlet.base.CMSResourceService;
import com.netscape.cms.servlet.request.model.ArchivalRequestData;
import com.netscape.cms.servlet.request.model.KeyRequestDAO;
import com.netscape.cms.servlet.request.model.KeyRequestInfo;
import com.netscape.cms.servlet.request.model.RecoveryRequestData;
-
+
/**
* @author alee
- *
+ *
*/
public class KeyRequestResourceService extends CMSResourceService implements KeyRequestResource {
- @Context
- UriInfo uriInfo;
-
/**
* Used to retrieve key request info for a specific request
*/
@@ -52,15 +49,15 @@ public class KeyRequestResourceService extends CMSResourceService implements Key
} catch (EBaseException e) {
// log error
e.printStackTrace();
- throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
+ throw new CMSException(e.getMessage(), e);
}
if (info == null) {
// request does not exist
- throw new WebApplicationException(Response.Status.NOT_FOUND);
+ throw new RequestNotFoundException(id);
}
return info;
}
-
+
// Archiving - used to test integration with a browser
public KeyRequestInfo archiveKey(MultivaluedMap<String, String> form) {
ArchivalRequestData data = new ArchivalRequestData(form);
@@ -88,7 +85,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key
}
return info;
}
-
+
//Recovery - used to test integration with a browser
public KeyRequestInfo recoverKey(MultivaluedMap<String, String> form) {
RecoveryRequestData data = new RecoveryRequestData(form);
@@ -117,7 +114,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key
}
return info;
}
-
+
public void approveRequest(RequestId id) {
if (id == null) {
throw new WebApplicationException(Response.Status.BAD_REQUEST);
@@ -132,7 +129,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
-
+
public void rejectRequest(RequestId id) {
if (id == null) {
throw new WebApplicationException(Response.Status.BAD_REQUEST);
@@ -147,7 +144,7 @@ public class KeyRequestResourceService extends CMSResourceService implements Key
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}
-
+
public void cancelRequest(RequestId id) {
if (id == null) {
throw new WebApplicationException(Response.Status.BAD_REQUEST);
diff --git a/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java b/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java
index 11898ef7a..82b1efa07 100644
--- a/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java
+++ b/base/common/src/com/netscape/cms/servlet/request/KeyRequestsResourceService.java
@@ -19,9 +19,7 @@
package com.netscape.cms.servlet.request;
import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
import com.netscape.certsrv.apps.CMS;
import com.netscape.certsrv.base.EBaseException;
@@ -37,9 +35,6 @@ import com.netscape.cmsutil.ldap.LDAPUtil;
*/
public class KeyRequestsResourceService extends CMSResourceService implements KeyRequestsResource{
- @Context
- UriInfo uriInfo;
-
/**
* Used to generate list of key requests based on the search parameters
*/
diff --git a/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java b/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java
new file mode 100644
index 000000000..5d6b5563b
--- /dev/null
+++ b/base/common/src/com/netscape/cms/servlet/request/RequestNotFoundException.java
@@ -0,0 +1,46 @@
+package com.netscape.cms.servlet.request;
+
+import javax.ws.rs.core.Response;
+
+import com.netscape.certsrv.request.RequestId;
+import com.netscape.cms.servlet.base.CMSException;
+
+public class RequestNotFoundException extends CMSException {
+
+ private static final long serialVersionUID = -4784839378360933483L;
+
+ public RequestId requestId;
+
+ public RequestNotFoundException(RequestId requestId) {
+ this(requestId, "Request ID "+requestId.toHexString()+" not found");
+ }
+
+ public RequestNotFoundException(RequestId requestId, String message) {
+ super(Response.Status.NOT_FOUND, message);
+ this.requestId = requestId;
+ }
+
+ public RequestNotFoundException(RequestId requestId, String message, Throwable cause) {
+ super(Response.Status.NOT_FOUND, message, cause);
+ this.requestId = requestId;
+ }
+
+ public RequestNotFoundException(Data data) {
+ super(data);
+ requestId = new RequestId(data.getAttribute("requestId"));
+ }
+
+ public Data getData() {
+ Data data = super.getData();
+ data.setAttribute("requestId", requestId.toString());
+ return data;
+ }
+
+ public RequestId getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(RequestId requestId) {
+ this.requestId = requestId;
+ }
+}