From 19cf1fd3441426bedcf3b4d9c213c57e10e62555 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 4 Aug 2018 17:03:55 -0400 Subject: [PATCH] ge plugin: fix accessing item composition from executor thread --- .../grandexchange/GrandExchangePanel.java | 5 +++-- .../GrandExchangeSearchPanel.java | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java index b8bf685117..e489d54dc8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePanel.java @@ -34,6 +34,7 @@ import javax.swing.border.EmptyBorder; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.client.callback.ClientThread; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.PluginPanel; @@ -56,7 +57,7 @@ class GrandExchangePanel extends PluginPanel private GrandExchangeOffersPanel offersPanel; @Inject - GrandExchangePanel(Client client, ItemManager itemManager, ScheduledExecutorService executor) + GrandExchangePanel(Client client, ClientThread clientThread, ItemManager itemManager, ScheduledExecutorService executor) { super(false); @@ -64,7 +65,7 @@ class GrandExchangePanel extends PluginPanel setBackground(ColorScheme.DARK_GRAY_COLOR); // Search Panel - searchPanel = new GrandExchangeSearchPanel(client, itemManager, executor); + searchPanel = new GrandExchangeSearchPanel(clientThread, itemManager, executor); //Offers Panel offersPanel = new GrandExchangeOffersPanel(client, itemManager, executor); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index 20d28c7a16..d57e599021 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -40,14 +40,15 @@ import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Client; import net.runelite.api.ItemComposition; +import net.runelite.client.callback.ClientThread; import net.runelite.client.game.AsyncBufferedImage; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.components.IconTextField; import net.runelite.client.ui.components.PluginErrorPanel; import net.runelite.client.util.ImageUtil; +import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.http.api.item.Item; import net.runelite.http.api.item.ItemPrice; import net.runelite.http.api.item.SearchResult; @@ -69,7 +70,7 @@ class GrandExchangeSearchPanel extends JPanel private final GridBagConstraints constraints = new GridBagConstraints(); private final CardLayout cardLayout = new CardLayout(); - private final Client client; + private final ClientThread clientThread; private final ItemManager itemManager; private final ScheduledExecutorService executor; @@ -99,9 +100,9 @@ class GrandExchangeSearchPanel extends JPanel ERROR_ICON = new ImageIcon(ImageUtil.getResourceStreamFromClass(IconTextField.class, "error.png")); } - GrandExchangeSearchPanel(Client client, ItemManager itemManager, ScheduledExecutorService executor) + GrandExchangeSearchPanel(ClientThread clientThread, ItemManager itemManager, ScheduledExecutorService executor) { - this.client = client; + this.clientThread = clientThread; this.itemManager = itemManager; this.executor = executor; init(); @@ -120,7 +121,7 @@ class GrandExchangeSearchPanel extends JPanel searchBox.setBackground(ColorScheme.MEDIUM_GRAY_COLOR); searchBox.setHoverBackgroundColor(ColorScheme.MEDIUM_GRAY_COLOR.brighter()); searchBox.setIcon(SEARCH_ICON); - searchBox.addActionListener(e -> executor.execute(() -> priceLookup(false))); + searchBox.addActionListener(e -> executor.execute(RunnableExceptionLogger.wrap(() -> priceLookup(false)))); searchItemsPanel.setLayout(new GridBagLayout()); searchItemsPanel.setBackground(ColorScheme.DARK_GRAY_COLOR); @@ -163,7 +164,7 @@ class GrandExchangeSearchPanel extends JPanel void priceLookup(String item) { searchBox.setText(item); - executor.execute(() -> priceLookup(true)); + executor.execute(RunnableExceptionLogger.wrap(() -> priceLookup(true))); } private void priceLookup(boolean exactMatch) @@ -199,6 +200,12 @@ class GrandExchangeSearchPanel extends JPanel return; } + // move to client thread to lookup item composition + clientThread.invokeLater(() -> processResult(result, lookup, exactMatch)); + } + + private void processResult(SearchResult result, String lookup, boolean exactMatch) + { itemsList.clear(); if (result != null && !result.getItems().isEmpty()) @@ -209,7 +216,7 @@ class GrandExchangeSearchPanel extends JPanel { int itemId = item.getId(); - ItemComposition itemComp = client.getItemDefinition(itemId); + ItemComposition itemComp = itemManager.getItemComposition(itemId); if (itemComp == null) { continue;