From d2bbc733d7775f2fff4d812bb7852ed957818eb7 Mon Sep 17 00:00:00 2001 From: Danny van Heumen Date: Fri, 29 Aug 2014 21:36:55 +0200 Subject: [PATCH] Gracefully handle race (NPE) --- .../gui/main/chat/ChatConversationPanel.java | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java index 78904db2f..22f03d1cd 100644 --- a/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java +++ b/src/net/java/sip/communicator/impl/gui/main/chat/ChatConversationPanel.java @@ -2107,11 +2107,21 @@ private ReplacementWorker(final String messageID, @Override public void finished() { + ShowPreviewDialog previewDialog = showPreview; + // There is a race between the replacement worker and the + // ChatConversationPanel when it is (being) disposed of. Make sure + // we have an instance before continuing. + if (previewDialog == null) + { + // Abort if dialog has been disposed of. + return; + } + String newMessage = (String) get(); if (newMessage != null && !newMessage.equals(chatString)) { - showPreview.getMsgIDToChatString().put( + previewDialog.getMsgIDToChatString().put( messageID, newMessage); synchronized (scrollToBottomRunnable) { @@ -2229,6 +2239,16 @@ private void processText(final String plainText, final ReplacementService rService, final boolean isURL) { + final ShowPreviewDialog previewDialog = showPreview; + // There is a race between the replacement worker and the + // ChatConversationPanel when it is (being) disposed of. Make sure + // we have an instance before continuing. + if (previewDialog == null) + { + // Abort if dialog has been disposed of. + return; + } + Matcher m = pattern.matcher(plainText); ConfigurationService cfg = GuiActivator.getConfigurationService(); @@ -2276,7 +2296,7 @@ else if (isProposalEnabled) { msgBuff.append(StringEscapeUtils.escapeHtml4(group)); msgBuff.append("