java - Smack XMPP Java : How to access the original XML reprsentation of a ByteStreamRequest (OPEN)?

标签 java xmpp smack

我需要访问字节流初始化的原始 XML 表示,因为我需要与自定义实现进行通信。 toXML 方法只是重建 XMLStrutur。

我已经尝试使用订阅实现来实现自定义调试器,但 StreamElement 也不包含原始发送的 XML 数据。

最佳答案

通过实现订阅调试器来解决,该调试器可以将原始 XML 日志转发到监听器。示例:

公共(public)类 SubscribeDebugger 扩展了 SmackDebugger {

private static List<IncomingRequestDebugListener> incomingRequestDebugListeners = new ArrayList<>();
private static List<OutgoingRequestDebugListener> outgoingRequestDebugListeners = new ArrayList<>();
private static Boolean enableOutputToConsole;
private static SmackDebugger consoleDebugger;
private ReaderListener readerListener;
private WriterListener writerListener;
private ObservableWriter writer;
private ObservableReader reader;

public SubscribeDebugger(XMPPConnection connection) {
    super(connection);
    if (this.getEnableOutputToConsole()) {
        consoleDebugger = new ConsoleDebugger(connection);
    }
    readerListener = str -> notifyIncomingRequestDebugListeners(str.toString());
    writerListener = str -> notifyOutgoingRequestDebugListeners(str.toString());
}

public Boolean getEnableOutputToConsole() { return enableOutputToConsole; }
public static void setEnableOutputToConsole(Boolean active) {
    enableOutputToConsole = active;
}

/*Static part since a debugger will be initiated by xmpp connection. Smack does not
  provide access on the debugger instances. All instances share the listeners.*/
public static void registerIncomingRequestDebugListener (IncomingRequestDebugListener listener) {
    incomingRequestDebugListeners.add(listener);
}
public static void unregisterIncomingRequestDebugListener(IncomingRequestDebugListener listener) {
    incomingRequestDebugListeners.remove(listener);
}
public static void registerOutgoingRequestDebugListener (OutgoingRequestDebugListener listener) {
    outgoingRequestDebugListeners.add(listener);
}
public static void unregisterOutgoingRequestDebugListener(OutgoingRequestDebugListener listener) {
    outgoingRequestDebugListeners.remove(listener);
}
protected void notifyIncomingRequestDebugListeners (String streamElement) {
    incomingRequestDebugListeners.parallelStream().forEach((listener) -> {
        listener.onRequestReceived(streamElement);
    });
}
protected void notifyOutgoingRequestDebugListeners (String streamElement) {
    outgoingRequestDebugListeners.parallelStream().forEach((listener) -> {
        listener.onRequestSent(streamElement);
    });
}

@Override
public void userHasLogged(EntityFullJid user) {

}

@Override
public Reader newConnectionReader(Reader reader) {


    ObservableReader debugReader = new ObservableReader(reader);
    debugReader.addReaderListener(readerListener);
    reader = debugReader;

    if (enableOutputToConsole && consoleDebugger != null)
        return consoleDebugger.newConnectionReader(reader);
    return reader;
}

@Override
public Writer newConnectionWriter(Writer writer) {
    if(enableOutputToConsole && consoleDebugger != null)
        return consoleDebugger.newConnectionWriter(writer);
    return writer;
}

@Override
public void onIncomingStreamElement(TopLevelStreamElement streamElement) {
    if(enableOutputToConsole && consoleDebugger != null)
        consoleDebugger.onIncomingStreamElement(streamElement);


}

@Override
public void onOutgoingStreamElement(TopLevelStreamElement streamElement) {
    if (enableOutputToConsole && consoleDebugger != null)
        consoleDebugger.onOutgoingStreamElement(streamElement);

}

}

关于java - Smack XMPP Java : How to access the original XML reprsentation of a ByteStreamRequest (OPEN)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59094778/

相关文章:

java - IntelliJ 列代码格式化

java - Java中将所有字符大写并在每个字符之间添加空格的递归方法

java - 通过 Smack android api 添加新用户到 ejabberd

java - 算术赋值没有隐式转换?

java - 对象到 XML,向后和向前兼容

java - 我看到花括号、圆括号和分号彼此相邻,为什么?

android - 获取 smack 中最近消息的发送状态

xml - 在 XMPP 中交换自定义 XML 元素的最佳方式?

java - 在 XMPP 客户端中更改传出状态节

android - 如何检查客户端是否连接到 XMPP 服务器