public static void callListeners(Message message) { synchronized (listeners) { if (!listeners.containsKey(message.getChannel()) || !listeners.get(message.getChannel()).containsKey(message.getPacket())) { return; } if (!packets.containsKey(message.getChannel())) { return; } // Build up that message if (!packets.get(message.getChannel()).containsKey(message.getPacket())) { return; } Class packetClass = packets.get(message.getChannel()).get(message.getPacket()); try { net.cubespace.ComuCator.API.Message.Message message1 = (net.cubespace.ComuCator.API.Message.Message) packetClass.newInstance(); message1.read(new DataInputStream(new ByteArrayInputStream(message.getMessage()))); for (ListenerMethod listenerMethod : listeners.get(message.getChannel()).get(message.getPacket())) { listenerMethod.getMethod().invoke(listenerMethod.getPacketListener(), message1); } } catch (Throwable throwable) { Logger.warn("Could not execute Listeners", throwable); } } }
public static void registerPacket(Class packet) { if (!net.cubespace.ComuCator.API.Message.Message.class.isAssignableFrom(packet)) { Logger.warn("This packet does not implement the Message Interface - " + packet.getName()); return; } // Create the Packet once try { net.cubespace.ComuCator.API.Message.Message message = (net.cubespace.ComuCator.API.Message.Message) packet.newInstance(); // Find the Channel to which this Packet belongs String channel; if (packet.isAnnotationPresent(Channel.class)) { channel = ((Channel) packet.getAnnotation(Channel.class)).value(); } else { channel = message.getChannel(); } // If there is no channel for this Packet => Outta here if (channel == null) { Logger.warn( "The packet has no Channel annotation and did gave null back on getChannel() - " + packet.getName()); return; } Long key = StringCode.getStringCode(channel); Long classKey = StringCode.getStringCode(packet.getName()); synchronized (packets) { // Check if Channel exists if (packets.containsKey(key)) { packets.get(key).put(classKey, packet); } else { LinkedHashMap<Long, Class> classes = new LinkedHashMap<>(); classes.put(classKey, packet); packets.put(key, classes); ChannelKeyCache.addToCache(channel); } ClassKeyCache.addToCache(packet); } } catch (Exception e) { Logger.warn( "The packet could not be build. Make sure it has a default Constructor - " + packet.getName()); } }
public static void removePacket(Class packet) { if (!net.cubespace.ComuCator.API.Message.Message.class.isAssignableFrom(packet)) { Logger.warn("This packet does not implement the Message Interface - " + packet.getName()); return; } // Create the Packet once try { net.cubespace.ComuCator.API.Message.Message message = (net.cubespace.ComuCator.API.Message.Message) packet.newInstance(); // Find the Channel to which this Packet belongs String channel; if (packet.isAnnotationPresent(Channel.class)) { channel = ((Channel) packet.getAnnotation(Channel.class)).value(); } else { channel = message.getChannel(); } // If there is no channel for this Packet => Outta here if (channel == null) { Logger.warn( "The packet has no Channel annotation and did gave null back on getChannel() - " + packet.getName()); return; } Long key = StringCode.getStringCode(channel); Long classKey = StringCode.getStringCode(packet.getName()); synchronized (packets) { // Check if Channel exists if (packets.containsKey(key)) { packets.get(key).remove(classKey); ClassKeyCache.removeFromCache(packet); } if (packets.get(key).size() == 0) { ChannelKeyCache.removeFromCache(channel); } } synchronized (listeners) { if (listeners.containsKey(key)) { listeners.get(key).remove(classKey); PacketRegister packetRegister = new PacketRegister(); packetRegister.setMode((byte) 1); packetRegister.setChannel(key); packetRegister.setPacket(classKey); P2PServers.broadCastToAll(packetRegister); P2PServers.removePacket(key, classKey); } } } catch (Exception e) { Logger.warn( "The packet could not be build. Make sure it has a default Constructor - " + packet.getName()); } }