class RequestPayload
    implements java.io.Serializable // just in case, even though likely included as transient
{
    private static final long serialVersionUID = 1L;

    // request payload as byte[]
    protected byte[] _payloadAsBytes;

    // request payload as String
    protected CharSequence _payloadAsText;

    // Charset if the request payload is set in bytes
    protected String _charset;

    public RequestPayload(byte[] bytes, String charset) {
        if (bytes == null) {
            throw new IllegalArgumentException();
        }
        _payloadAsBytes = bytes;
        _charset = (charset == null || charset.isEmpty()) ? "UTF-8" : charset;
    }

    public RequestPayload(CharSequence str) {
        if (str == null) {
            throw new IllegalArgumentException();
        }
        _payloadAsText = str;
    }

    /**
     * Returns the raw request payload object i.e, either byte[] or String
     *
     * @return Object which is a raw request payload i.e, either byte[] or
     *         String
     */
    public Object getRawPayload() {
        if (_payloadAsBytes != null) {
            return _payloadAsBytes;
        }

        return _payloadAsText;
    }

    @Override
    public String toString() {<FILL_FUNCTION_BODY>}
}

        if (_payloadAsBytes != null) {
            try {
                return new String(_payloadAsBytes, _charset);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return _payloadAsText.toString();
    
<no_super_class>