/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.platform;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
/**
* Class for exceptions generated by an OWS2.0 service.
* <p>
* It adds support to HTTP return codes.
* </p>
*
* @author Emanuele Tajariol - GeoSolutions
*/
public class OWS20Exception extends ServiceException {
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(OWS20Exception.class);
/**
* Serial UID
*/
private static final long serialVersionUID = 7254349181794561724L;
public static class OWSExceptionCode {
private final static Map<String, OWSExceptionCode> codes = new HashMap<String, OWSExceptionCode>();
public final static OWSExceptionCode OperationNotSupported = new OWSExceptionCode("OperationNotSupported", 501, "Not Implemented");
public final static OWSExceptionCode MissingParameterValue = new OWSExceptionCode("MissingParameterValue", 400, "Bad request");
public final static OWSExceptionCode InvalidParameterValue = new OWSExceptionCode("InvalidParameterValue", 400, "Bad request");
public final static OWSExceptionCode VersionNegotiationFailed = new OWSExceptionCode("VersionNegotiationFailed", 400, "Bad request");
public final static OWSExceptionCode InvalidUpdateSequence = new OWSExceptionCode("InvalidUpdateSequence", 400, "Bad request");
public final static OWSExceptionCode OptionNotSupported = new OWSExceptionCode("OptionNotSupported", 501, "Not Implemented");
public final static OWSExceptionCode NoApplicableCode = new OWSExceptionCode("NoApplicableCode", 500, "Not Implemented");
public final static OWSExceptionCode InvalidCoverageType = new OWSExceptionCode("InvalidCoverageType", 404, "Coverage addressed is not a grid coverage");
private final String exceptionCode;
private final Integer httpCode;
private final String httpMessage;
public OWSExceptionCode(String exceptionCode) {
this(exceptionCode, null, null);
}
public OWSExceptionCode(String exceptionCode, Integer httpCode) {
this(exceptionCode, httpCode, null);
}
protected OWSExceptionCode(String exceptionCode, Integer httpCode, String message) {
this.exceptionCode = exceptionCode;
this.httpCode = httpCode;
this.httpMessage = message;
OWSExceptionCode old = codes.put(exceptionCode, this);
if(old != null) {
LOGGER.warning("Replacing exception code " + old + " with " + this);
}
}
public String getExceptionCode() {
return exceptionCode;
}
public Integer getHttpCode() {
return httpCode;
}
public String getHttpMessage() {
return httpMessage;
}
public static OWSExceptionCode getByCode(String code) {
return codes.get(code);
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append(getClass().getSimpleName()).append("[exCode:").append(exceptionCode).append(" httpCode=").append(httpCode);
if(httpMessage!=null){
builder.append(" httpMessage=").append(httpMessage);
}
builder.append(']');
return builder.toString() ;
}
}
/**
* HTTP response code. May be null when not specified.
*/
protected Integer httpCode;
/**
* Constructs the exception from a message.
*
* @param message The message describing the exception.
*/
public OWS20Exception(String message) {
super(message);
}
/**
* Constructs the exception from a message and causing exception.
*
* @param message The message describing the exception.
* @param cause The case of the exception.
*/
public OWS20Exception(String message, Throwable cause) {
super(message, cause);
}
/**
* Constructs the exception from a message, causing exception, and code.
*
* @param message The message describing the exception.
* @param cause The case of the exception.
* @param code The application specific exception code for the exception.
*/
public OWS20Exception(String message, Throwable cause, String code) {
this(message, cause);
}
/**
* Constructs the exception from a message, causing exception, code, and locator.
*
* @param message The message describing the exception.
* @param cause The case of the exception.
* @param code The application specific exception code for the exception.
* @param locator The application specific locator for the exception.
*/
protected OWS20Exception(String message, Throwable cause, String code, String locator) {
super(message, cause, code);
}
public OWS20Exception(String message, Throwable cause, OWSExceptionCode code, String locator) {
super(message, cause, code.getExceptionCode());
setHttpCode(code.getHttpCode());
}
/**
* Constructs the exception from a message, and code.
*
* @param message The message describing the exception.
* @param code The application specific exception code for the exception.
*/
protected OWS20Exception(String message, String code) {
super(message);
}
public OWS20Exception(String message, OWSExceptionCode code) {
super(message, code.getExceptionCode());
setHttpCode(code.getHttpCode());
}
/**
* Constructs the exception from a message,code, and locator.
*
* @param message The message describing the exception.
* @param code The application specific exception code for the exception.
* @param locator The application specific locator for the exception.
*/
protected OWS20Exception(String message, String code, String locator) {
super(message, code);
}
public OWS20Exception(String message, OWSExceptionCode code, String locator) {
super(message, code.getExceptionCode(), locator);
setHttpCode(code.getHttpCode());
}
/**
* Constructs the exception from a causing exception.
*
* @param cause The case of the exception.
*/
public OWS20Exception(Throwable cause) {
super(cause);
}
/**
* Constructs the exception from causing exception, and code.
*
* @param cause The case of the exception.
* @param code The application specific exception code for the exception.
*/
protected OWS20Exception(Throwable cause, String code) {
super(cause);
}
/**
* Constructs the exception from a causing exception, code, and locator.
*
* @param cause The case of the exception.
* @param code The application specific exception code for the exception.
* @param locator The application specific locator for the exception.
*/
protected OWS20Exception(Throwable cause, String code, String locator) {
super(cause, code);
}
public OWS20Exception(Throwable cause, OWSExceptionCode code, String locator) {
super(cause, code.getExceptionCode());
setHttpCode(code.getHttpCode());
}
public Integer getHttpCode() {
return httpCode;
}
public void setHttpCode(Integer httpCode) {
this.httpCode = httpCode;
}
@Override
public String toString() {
String msg = super.toString();
if (httpCode == null) {
return msg;
} else {
return msg + NEW_LINE + "HTTPcode:" + httpCode;
}
}
}