@Override public synchronized void sendXmlMessage(User user, final XmlMessage xmlMessage) { if (!myUI.connectAndLogin(null)) { return; } final String threadId = getThreadId(user); final PacketCollector packetCollector = myFacade.getConnection().createPacketCollector(new ThreadFilter(threadId)); doSendMessage(xmlMessage, user, threadId); if (xmlMessage.needsResponse()) { //noinspection HardCodedStringLiteral final Runnable responseWaiterRunnable = () -> { try { processResponse(xmlMessage, packetCollector); } finally { packetCollector.cancel(); } }; myIdeFacade.runOnPooledThread(responseWaiterRunnable); } else { packetCollector.cancel(); } }
private static void processResponse(XmlMessage xmlMessage, PacketCollector collector) { boolean gotResponse = false; while (!gotResponse) { Message response = (Message) collector.nextResult(RESPONSE_TIMEOUT); if (response == null) break; final Collection<PacketExtension> extensions = response.getExtensions(); for (PacketExtension o : extensions) { if (o instanceof JDOMExtension) { JDOMExtension extension = (JDOMExtension) o; if (RESPONSE.equals(extension.getElement().getName())) { xmlMessage.processResponse(extension.getElement()); gotResponse = true; break; } } } } }