@Override public final EncodingException missingMediaType() { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), missingMediaType$str())); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String invalidMediaTypeSubtype = "ISPN000930: MediaType must contain a type and a subtype separated by '/'";
private static int forDigit(char digit) { if (digit >= '0' && digit <= '9') return digit - 48; if (digit == 'a') return 10; if (digit == 'b') return 11; if (digit == 'c') return 12; if (digit == 'd') return 13; if (digit == 'e') return 14; if (digit == 'f') return 15; throw new EncodingException("Invalid digit found in hex format!"); }
public static byte[] hexToBytes(String hex) { if (hex == null) return null; if (hex.isEmpty()) return new byte[]{}; if (!hex.startsWith("0x") || hex.length() % 2 != 0) { throw new EncodingException("Illegal hex literal!"); } byte[] result = new byte[(hex.length() - 2) / 2]; for (int i = 2; i < hex.length(); i += 2) { int msb = forDigit(hex.charAt(i)); int lsb = forDigit(hex.charAt(i + 1)); byte b = (byte) (msb * 16 + lsb); result[(i - 2) / 2] = b; } return result; }
@Override public final EncodingException invalidMediaType(final String expected, final String actual) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidMediaType$str(), expected, actual)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String invalidTextContent = "ISPN000938: Invalid text content '%s'";
/** * Decode a octet-stream content that is not a byte[]. For this, it uses a special * param called "encoding" in the "application/octet-stream" MediaType. * The "encoding" param supports only the "hex" value that represents an octet-stream * as a hexadecimal representation, for example "0xdeadbeef". * * In the absence of the "encoding" param, it will assume base64 encoding. * * @param input Object representing the binary content. * @param octetStream The MediaType describing the input. * @return a byte[] with the decoded content. */ public static byte[] decodeOctetStream(Object input, MediaType octetStream) { if (input == null) { throw new NullPointerException("input must not be null"); } if (input instanceof byte[]) return (byte[]) input; if (input instanceof String) { String encoding = octetStream.getParameter("encoding").orElse("hex"); String src = input.toString(); return encoding.equals("hex") ? hexToBytes(src) : getUrlDecoder().decode(src); } throw new EncodingException("Cannot decode binary content " + input.getClass()); }
@Override public final EncodingException invalidMediaTypeParam(final String param) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidMediaTypeParam$str(), param)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String unquotedMediaTypeParam = "ISPN000932: Unclosed param value quote";
if (content instanceof byte[]) return content; if (content instanceof String) return hexToBytes(content.toString()); throw new EncodingException("Cannot read ByteArray!"); return content; } catch (ClassNotFoundException cne) { throw new EncodingException("Cannot decode object!", cne);
@Override public final EncodingException conversionNotSupported(final Object content, final String fromMediaType, final String toMediaType) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), conversionNotSupported$str(), content, fromMediaType, toMediaType)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String cannotDecodeFormURLContent = "ISPN000940: Invalid application/x-www-form-urlencoded content: '%s'";
@Override public Object transcode(Object content, MediaType contentType, MediaType destinationType) { switch (destinationType.toString()) { case "application/foo": return content.toString().replaceAll("bar", "foo"); case "application/bar": return content.toString().replaceAll("foo", "bar"); default: throw new EncodingException("Not supported!"); } }
@Override public final EncodingException unquotedMediaTypeParam() { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), unquotedMediaTypeParam$str())); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String invalidCharMediaType = "ISPN000933: Invalid character '%s' found in token '%s'";
/** * Converts a java object to a sequence of bytes applying standard java serialization. * * @param source source the java object to convert. * @param sourceMediaType the MediaType matching application/x-application-object describing the source. * @return byte[] representation of the java object. * @throws EncodingException if the sourceMediaType is not a application/x-java-object or if the conversion is * not supported. */ public static byte[] convertJavaToOctetStream(Object source, MediaType sourceMediaType, Marshaller marshaller) throws IOException, InterruptedException { if (source == null) return null; if (!sourceMediaType.match(MediaType.APPLICATION_OBJECT)) { throw new EncodingException("destination MediaType not conforming to application/x-java-object!"); } Object decoded = decodeObjectContent(source, sourceMediaType); if (decoded instanceof byte[]) return (byte[]) decoded; if (decoded instanceof String && isJavaString(sourceMediaType)) return ((String) decoded).getBytes(StandardCharsets.UTF_8); return marshaller.objectToByteBuffer(source); }
@Override public final EncodingException invalidTextContent(final Object content) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidTextContent$str(), content)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String conversionNotSupported = "ISPN000939: Conversion of content '%s' from '%s' to '%s' not supported";
@Override public final EncodingException errorEncoding(final Object content, final MediaType mediaType) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), errorEncoding$str(), content, mediaType)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } @Override
@Override public final EncodingException invalidMediaTypeSubtype() { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidMediaTypeSubtype$str())); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String invalidMediaTypeParam = "ISPN000931: Failed to parse MediaType: Invalid param description '%s'";
@Override public final EncodingException cannotDecodeFormURLContent(final Object content) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), cannotDecodeFormURLContent$str(), content)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String errorEncoding = "ISPN000941: Error encoding content '%s' to '%s'";
@Override public final EncodingException invalidCharMediaType(final char character, final String token) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidCharMediaType$str(), character, token)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String unsupportedContent = "ISPN000934: Unsupported content '%s'";
@Override public final EncodingException unsupportedContent(final Object content) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), unsupportedContent$str(), content)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String invalidWeight = "ISPN000935: Invalid Weight '%s'. Supported values are between 0 and 1.0";
@Override public final EncodingException invalidWeight(final Object weight) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), invalidWeight$str(), weight)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String classNotInWhitelist = "ISPN000936: Class '%s' blocked by deserialization white list. Adjust the configuration serialization white list regular expression to include this class.";
@Override public final EncodingException errorSerializingResponse(final Object o) { final EncodingException result = new EncodingException(String.format(getLoggingLocale(), errorSerializingResponse$str(), o)); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } }