blob: 23599b1e95f318261059e7b3cf8d9ed3185e55b2 [file] [log] [blame]
/* Jackson JSON-processor.
*
* Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi
*/
package com.fasterxml.jackson.core;
/**
* Intermediate base class for all problems encountered when
* processing (parsing, generating) JSON content
* that are not pure I/O problems.
* Regular {@link java.io.IOException}s will be passed through as is.
* Sub-class of {@link java.io.IOException} for convenience.
*/
public class JsonProcessingException extends java.io.IOException
{
final static long serialVersionUID = 123; // Stupid eclipse...
protected JsonLocation _location;
protected JsonProcessingException(String msg, JsonLocation loc, Throwable rootCause) {
/* Argh. IOException(Throwable,String) is only available starting
* with JDK 1.6...
*/
super(msg);
if (rootCause != null) {
initCause(rootCause);
}
_location = loc;
}
protected JsonProcessingException(String msg) {
super(msg);
}
protected JsonProcessingException(String msg, JsonLocation loc) {
this(msg, loc, null);
}
protected JsonProcessingException(String msg, Throwable rootCause) {
this(msg, null, rootCause);
}
protected JsonProcessingException(Throwable rootCause) {
this(null, null, rootCause);
}
/*
/**********************************************************
/* Extended API
/**********************************************************
*/
public JsonLocation getLocation() { return _location; }
/**
* Method that allows to remove context information from this exception's message.
* Useful when you are parsing security-sensitive data and don't want original data excerpts
* to be present in Jackson parser error messages.
*
* @since 2.9
*/
public void clearLocation() { _location = null; }
/**
* Method that allows accessing the original "message" argument,
* without additional decorations (like location information)
* that overridden {@link #getMessage} adds.
*
* @since 2.1
*/
public String getOriginalMessage() { return super.getMessage(); }
/**
* Method that allows accessing underlying processor that triggered
* this exception; typically either {@link JsonParser} or {@link JsonGenerator}
* for exceptions that originate from streaming API.
* Note that it is possible that `null` may be returned if code throwing
* exception either has no access to processor; or has not been retrofitted
* to set it; this means that caller needs to take care to check for nulls.
* Subtypes override this method with co-variant return type, for more
* type-safe access.
*
* @return Originating processor, if available; null if not.
*
* @since 2.7
*/
public Object getProcessor() { return null; }
/*
/**********************************************************
/* Methods for sub-classes to use, override
/**********************************************************
*/
/**
* Accessor that sub-classes can override to append additional
* information right after the main message, but before
* source location information.
*/
protected String getMessageSuffix() { return null; }
/*
/**********************************************************
/* Overrides of standard methods
/**********************************************************
*/
/**
* Default method overridden so that we can add location information
*/
@Override public String getMessage() {
String msg = super.getMessage();
if (msg == null) {
msg = "N/A";
}
JsonLocation loc = getLocation();
String suffix = getMessageSuffix();
// mild optimization, if nothing extra is needed:
if (loc != null || suffix != null) {
StringBuilder sb = new StringBuilder(100);
sb.append(msg);
if (suffix != null) {
sb.append(suffix);
}
if (loc != null) {
sb.append('\n');
sb.append(" at ");
sb.append(loc.toString());
}
msg = sb.toString();
}
return msg;
}
@Override public String toString() { return getClass().getName()+": "+getMessage(); }
}