001 /* 002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org 003 * Copyright (C) 2011 NightLabs Consulting GmbH 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 package org.cumulus4j.keymanager.front.shared; 019 020 import java.io.Serializable; 021 022 import javax.xml.bind.annotation.XmlRootElement; 023 024 /** 025 * DTO for sending an error back to the client (<code>KeyManagerAPI</code>). 026 * It can optionally wrap a {@link Throwable} to provide more precise information 027 * (the type) than just a message. 028 * 029 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de 030 */ 031 @XmlRootElement 032 public class Error implements Serializable 033 { 034 private static final long serialVersionUID = 1L; 035 036 private String rootType; 037 private String rootMessage; 038 039 private String type; 040 private String message; 041 042 /** 043 * Create an empty instance of <code>Error</code>. 044 * Only used for serialisation/deserialisation. 045 */ 046 public Error() { } 047 048 /** 049 * Create an instance of <code>Error</code> wrapping a {@link Throwable}. 050 * @param throwable the error to be wrapped and sent back to the client instead of a normal response. 051 */ 052 public Error(Throwable throwable) { 053 this.type = throwable.getClass().getName(); 054 this.message = throwable.getMessage(); 055 056 Throwable r = throwable; 057 while (r.getCause() != null) 058 r = r.getCause(); 059 060 if (r != throwable) { 061 this.rootType = r.getClass().getName(); 062 this.rootMessage = r.getMessage(); 063 } 064 } 065 066 /** 067 * Create an instance of <code>Error</code> with an error message. 068 * @param message the message describing what went wrong. 069 */ 070 public Error(String message) { 071 this.message = message; 072 } 073 074 /** 075 * Get the fully qualified class-name of the root-{@link Throwable} in the exception's cause-chain. 076 * @return the fully qualified class-name of the root-{@link Throwable}. Can be <code>null</code>. 077 */ 078 public String getRootType() { 079 return rootType; 080 } 081 /** 082 * Get the fully qualified class-name of the root-{@link Throwable} in the exception's cause-chain. 083 * @param rootType the fully qualified class-name of the root-{@link Throwable} or <code>null</code>. 084 */ 085 public void setRootType(String rootType) { 086 this.rootType = rootType; 087 } 088 /** 089 * Get the root-{@link Throwable}'s exception-{@link Throwable#getMessage() message}. 090 * @return the message of the root-{@link Throwable} in the exception's cause-chain. 091 */ 092 public String getRootMessage() { 093 return rootMessage; 094 } 095 /** 096 * Set the root-{@link Throwable}'s exception-{@link Throwable#getMessage() message}. 097 * @param rootMessage the message of the root-{@link Throwable} in the exception's cause-chain. 098 */ 099 public void setRootMessage(String rootMessage) { 100 this.rootMessage = rootMessage; 101 } 102 /** 103 * Get the fully qualified class-name of the wrapped {@link Throwable}. 104 * @return the fully qualified class-name of the wrapped {@link Throwable}. 105 */ 106 public String getType() { 107 return type; 108 } 109 /** 110 * Set the fully qualified class-name of the wrapped {@link Throwable}. 111 * @param type the fully qualified class-name of the wrapped {@link Throwable}. 112 */ 113 public void setType(String type) { 114 this.type = type; 115 } 116 /** 117 * Get the error-message. If this <code>Error</code> wraps a {@link Throwable}, this is 118 * {@link Throwable#getMessage()} 119 * @return the error-message. 120 */ 121 public String getMessage() { 122 return message; 123 } 124 /** 125 * Set the error-message. 126 * @param message the error-message. 127 */ 128 public void setMessage(String message) { 129 this.message = message; 130 } 131 }