From df87eb339d8b3856eed88324ca4ad78bd2c22dfd Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Tue, 16 Oct 2018 14:55:14 +0200 Subject: [PATCH] fix concurrency errors and another bug --- G-Earth-UI/src/main/java/gearth/Main.java | 9 +++ .../main/java/gearth/protocol/HMessage.java | 11 +++ .../main/java/gearth/protocol/HPacket.java | 4 + .../java/gearth/ui/extensions/Extensions.java | 75 +++++++++---------- .../gearth/ui/extensions/GEarthExtension.java | 54 ++++++++----- .../loggerdisplays/PacketLoggerFactory.java | 11 +-- 6 files changed, 101 insertions(+), 63 deletions(-) diff --git a/G-Earth-UI/src/main/java/gearth/Main.java b/G-Earth-UI/src/main/java/gearth/Main.java index ee1b8df..5f72843 100644 --- a/G-Earth-UI/src/main/java/gearth/Main.java +++ b/G-Earth-UI/src/main/java/gearth/Main.java @@ -43,4 +43,13 @@ public class Main extends Application { Main.args = args; launch(args); } + + public static boolean hasFlag(String flag) { + for(String s : args) { + if (s.equals(flag)) { + return true; + } + } + return false; + } } diff --git a/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java b/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java index a64a8d1..dbf1406 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java +++ b/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java @@ -19,6 +19,10 @@ public class HMessage implements StringifyAble { constructFromString(fromString); } + public HMessage(HMessage message) { + constructFromHMessage(message); + } + public HMessage(HPacket packet, Side side, int index) { this.side = side; this.hPacket = packet; @@ -66,6 +70,13 @@ public class HMessage implements StringifyAble { this.hPacket = p; } + public void constructFromHMessage(HMessage message) { + this.isBlocked = message.isBlocked(); + this.index = message.getIndex(); + this.side = message.getDestination(); + this.hPacket = new HPacket(message.getPacket()); + } + @Override public boolean equals(Object obj) { if (!(obj instanceof HMessage)) return false; diff --git a/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java b/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java index f87dc87..9f8d21e 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java @@ -17,6 +17,10 @@ public class HPacket implements StringifyAble { public HPacket(byte[] packet) { packetInBytes = packet.clone(); } + public HPacket(HPacket packet) { + packetInBytes = packet.packetInBytes.clone(); + isEdited = packet.isEdited; + } public HPacket(String packet) { packetInBytes = fromStringToBytes(fromExpressionToString(packet)); } diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java b/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java index bb41af8..074236e 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java +++ b/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java @@ -169,48 +169,43 @@ public class Extensions extends SubForm { collection = new HashSet<>(gEarthExtensions); } - String stringified = message.stringify(); HPacket manipulatePacketRequest = new HPacket(OUTGOING_MESSAGES_IDS.PACKETINTERCEPT); manipulatePacketRequest.appendLongString(stringified); + HMessage result = new HMessage(message); + boolean[] isblock = new boolean[1]; - - Iterator it; synchronized (collection) { - it = collection.iterator(); - } - while (true) { - GEarthExtension extension; - synchronized (collection) { - if (!it.hasNext()) break; - extension = it.next(); - } + for (GEarthExtension extension : collection) { + GEarthExtension.ReceiveMessageListener respondCallback = new GEarthExtension.ReceiveMessageListener() { + @Override + public void act(HPacket packet) { + if (packet.headerId() == INCOMING_MESSAGES_IDS.MANIPULATEDPACKET) { + String stringifiedresponse = packet.readLongString(6); + HMessage responseMessage = new HMessage(stringifiedresponse); + if (responseMessage.getDestination() == message.getDestination() && responseMessage.getIndex() == message.getIndex()) { + synchronized (result) { + if (!message.equals(responseMessage)) { + result.constructFromString(stringifiedresponse); + } + if (responseMessage.isBlocked()) { + isblock[0] = true; + } + synchronized (collection) { + collection.remove(extension); + } - GEarthExtension.ReceiveMessageListener respondCallback = new GEarthExtension.ReceiveMessageListener() { - @Override - public void act(HPacket packet) { - if (packet.headerId() == INCOMING_MESSAGES_IDS.MANIPULATEDPACKET) { - String stringifiedresponse = packet.readLongString(6); - HMessage responseMessage = new HMessage(stringifiedresponse); - if (responseMessage.getDestination() == message.getDestination() && responseMessage.getIndex() == message.getIndex()) { - if (!message.equals(responseMessage)) { - message.constructFromString(stringifiedresponse); + extension.removeOnReceiveMessageListener(this); + } } - if (responseMessage.isBlocked()) { - isblock[0] = true; - } - synchronized (collection) { - collection.remove(extension); - } - - extension.removeOnReceiveMessageListener(this); } + } - } - }; - extension.addOnReceiveMessageListener(respondCallback); - extension.sendMessage(manipulatePacketRequest); + }; + extension.addOnReceiveMessageListener(respondCallback); + extension.sendMessage(manipulatePacketRequest); + } } //block untill all extensions have responded @@ -221,22 +216,24 @@ public class Extensions extends SubForm { break; } - for (GEarthExtension extension : collection) { - synchronized (gEarthExtensions) { + synchronized (gEarthExtensions) { + for (GEarthExtension extension : collection) { if (!gEarthExtensions.contains(extension)) willdelete.add(extension); } } + for (int i = willdelete.size() - 1; i >= 0; i--) { - synchronized (collection) { - collection.remove(willdelete.get(i)); - } + collection.remove(willdelete.get(i)); willdelete.remove(i); } } + try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();} } + message.constructFromHMessage(result); + if (isblock[0]) { message.setBlocked(true); } @@ -286,7 +283,7 @@ public class Extensions extends SubForm { if (getHConnection().getState() == HConnection.State.CONNECTED) { extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONSTART)); } - Platform.runLater(() -> producer.extensionConnected(extension)); + extension.onRemoveClick(observable -> { try { extension.getConnection().close(); @@ -295,6 +292,8 @@ public class Extensions extends SubForm { } }); extension.onClick(observable -> extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.ONDOUBLECLICK))); + + Platform.runLater(() -> producer.extensionConnected(extension)); } @Override diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java b/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java index 5dd240f..fc22af9 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java +++ b/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java @@ -103,9 +103,11 @@ public class GEarthExtension { HPacket packet = new HPacket(headerandbody); packet.fixLength(); - for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { - receiveMessageListeners.get(i).act(packet); - packet.setReadIndex(6); + synchronized (receiveMessageListeners) { + for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { + receiveMessageListeners.get(i).act(packet); + packet.setReadIndex(6); + } } } @@ -181,12 +183,16 @@ public class GEarthExtension { } - private List receiveMessageListeners = new ArrayList<>(); + private final List receiveMessageListeners = new ArrayList<>(); public void addOnReceiveMessageListener(ReceiveMessageListener receiveMessageListener) { - receiveMessageListeners.add(receiveMessageListener); + synchronized (receiveMessageListeners) { + receiveMessageListeners.add(receiveMessageListener); + } } public void removeOnReceiveMessageListener(ReceiveMessageListener receiveMessageListener) { - receiveMessageListeners.remove(receiveMessageListener); + synchronized (receiveMessageListeners) { + receiveMessageListeners.remove(receiveMessageListener); + } } public interface ReceiveMessageListener { @@ -200,33 +206,45 @@ public class GEarthExtension { } - private List onRemoveClickListener = new ArrayList<>(); + private final List onRemoveClickListener = new ArrayList<>(); public void onRemoveClick(InvalidationListener listener) { - onRemoveClickListener.add(listener); + synchronized (onRemoveClickListener) { + onRemoveClickListener.add(listener); + } } public void isRemoveClickTrigger() { - for (int i = onRemoveClickListener.size() - 1; i >= 0; i--) { - onRemoveClickListener.get(i).invalidated(null); + synchronized (onRemoveClickListener) { + for (int i = onRemoveClickListener.size() - 1; i >= 0; i--) { + onRemoveClickListener.get(i).invalidated(null); + } } } - private List onClickListener = new ArrayList<>(); + private final List onClickListener = new ArrayList<>(); public void onClick(InvalidationListener listener) { - onClickListener.add(listener); + synchronized (onClickListener) { + onClickListener.add(listener); + } } public void isClickTrigger() { - for (int i = onClickListener.size() - 1; i >= 0; i--) { - onClickListener.get(i).invalidated(null); + synchronized (onClickListener) { + for (int i = onClickListener.size() - 1; i >= 0; i--) { + onClickListener.get(i).invalidated(null); + } } } - private List onDeleteListeners = new ArrayList<>(); + private final List onDeleteListeners = new ArrayList<>(); public void onDelete(InvalidationListener listener) { - onDeleteListeners.add(listener); + synchronized (onDeleteListeners) { + onDeleteListeners.add(listener); + } } public void delete() { - for (int i = onDeleteListeners.size() - 1; i >= 0; i--) { - onDeleteListeners.get(i).invalidated(null); + synchronized (onDeleteListeners) { + for (int i = onDeleteListeners.size() - 1; i >= 0; i--) { + onDeleteListeners.get(i).invalidated(null); + } } } } \ No newline at end of file diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java b/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java index c12fd5f..bee5cda 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java +++ b/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java @@ -1,5 +1,6 @@ package gearth.ui.logger.loggerdisplays; +import gearth.Main; import gearth.misc.OSValidator; /** @@ -8,13 +9,9 @@ import gearth.misc.OSValidator; public class PacketLoggerFactory { public static PacketLogger get() { -// if (OSValidator.isUnix()) { -// return new LinuxTerminalLogger(); -// } -// if (System.getenv("XDG_CURRENT_DESKTOP") != null && System.getenv("XDG_CURRENT_DESKTOP").toLowerCase().contains("gnome")) { -// return new GnomeTerminalLogger(); -// } -// return new SimpleTerminalLogger(); + if (OSValidator.isUnix() && Main.hasFlag("-t")) { + return new LinuxTerminalLogger(); + } return new UiLogger(); }