1 /* Jackson JSON-processor. 2 * 3 * Copyright (c) 2007- Tatu Saloranta, tatu.saloranta@iki.fi 4 */ 5 6 package edu.internet2.middleware.grouperClientExt.com.fasterxml.jackson.core; 7 8 /** 9 * Intermediate base class for all problems encountered when 10 * processing (parsing, generating) JSON content 11 * that are not pure I/O problems. 12 * Regular {@link java.io.IOException}s will be passed through as is. 13 * Sub-class of {@link java.io.IOException} for convenience. 14 *<p> 15 * Since Jackson 2.12 extends intermediate {@link JacksonException} type 16 * instead of directly extending {@link java.io.IOException}. 17 */ 18 public class JsonProcessingException extends JacksonException 19 { 20 private final static long serialVersionUID = 123; // eclipse complains otherwise 21 22 protected JsonLocation _location; 23 24 protected JsonProcessingException(String msg, JsonLocation loc, Throwable rootCause) { 25 super(msg, rootCause); 26 _location = loc; 27 } 28 29 protected JsonProcessingException(String msg) { 30 super(msg); 31 } 32 33 protected JsonProcessingException(String msg, JsonLocation loc) { 34 this(msg, loc, null); 35 } 36 37 protected JsonProcessingException(String msg, Throwable rootCause) { 38 this(msg, null, rootCause); 39 } 40 41 protected JsonProcessingException(Throwable rootCause) { 42 this(null, null, rootCause); 43 } 44 45 /* 46 /********************************************************************** 47 /* Extended API 48 /********************************************************************** 49 */ 50 51 @Override 52 public JsonLocation getLocation() { return _location; } 53 54 /** 55 * Method that allows to remove context information from this exception's message. 56 * Useful when you are parsing security-sensitive data and don't want original data excerpts 57 * to be present in Jackson parser error messages. 58 * 59 * @since 2.9 60 */ 61 public void clearLocation() { _location = null; } 62 63 /** 64 * Method that allows accessing the original "message" argument, 65 * without additional decorations (like location information) 66 * that overridden {@link #getMessage} adds. 67 * 68 * @return Original message passed in constructor 69 * 70 * @since 2.1 71 */ 72 @Override 73 public String getOriginalMessage() { return super.getMessage(); } 74 75 /** 76 * Method that allows accessing underlying processor that triggered 77 * this exception; typically either {@link JsonParser} or {@link JsonGenerator} 78 * for exceptions that originate from streaming API. 79 * Note that it is possible that `null` may be returned if code throwing 80 * exception either has no access to processor; or has not been retrofitted 81 * to set it; this means that caller needs to take care to check for nulls. 82 * Subtypes override this method with co-variant return type, for more 83 * type-safe access. 84 * 85 * @return Originating processor, if available; null if not. 86 * 87 * @since 2.7 88 */ 89 @Override 90 public Object getProcessor() { return null; } 91 92 /* 93 /********************************************************************** 94 /* Methods for sub-classes to use, override 95 /********************************************************************** 96 */ 97 98 /** 99 * Accessor that sub-classes can override to append additional 100 * information right after the main message, but before 101 * source location information. 102 * 103 * @return Message suffix assigned, if any; {@code null} if none 104 */ 105 protected String getMessageSuffix() { return null; } 106 107 /* 108 /********************************************************************** 109 /* Overrides of standard methods 110 /********************************************************************** 111 */ 112 113 /** 114 * Default implementation overridden so that we can add location information 115 * 116 * @return Original {@code message} preceded by optional prefix and followed by 117 * location information, message and location information separated by a linefeed 118 */ 119 @Override public String getMessage() { 120 String msg = super.getMessage(); 121 if (msg == null) { 122 msg = "N/A"; 123 } 124 JsonLocation loc = getLocation(); 125 String suffix = getMessageSuffix(); 126 // mild optimization, if nothing extra is needed: 127 if (loc != null || suffix != null) { 128 StringBuilder sb = new StringBuilder(100); 129 sb.append(msg); 130 if (suffix != null) { 131 sb.append(suffix); 132 } 133 if (loc != null) { 134 sb.append('\n'); 135 sb.append(" at "); 136 sb.append(loc.toString()); 137 } 138 msg = sb.toString(); 139 } 140 return msg; 141 } 142 143 @Override public String toString() { return getClass().getName()+": "+getMessage(); } 144 }