Commit d0bae58d04b8b2160c8f336ceac82f652d21843f

Authored by Mumfrey
1 parent e9fae278

Fix incorrect silence check in PluginChannels

java/common/com/mumfrey/liteloader/core/PluginChannels.java
1 -package com.mumfrey.liteloader.core;  
2 -  
3 -import io.netty.buffer.Unpooled;  
4 -  
5 -import java.util.Collections;  
6 -import java.util.HashMap;  
7 -import java.util.HashSet;  
8 -import java.util.LinkedList;  
9 -import java.util.List;  
10 -import java.util.Map;  
11 -import java.util.Set;  
12 -  
13 -import net.minecraft.network.INetHandler;  
14 -import net.minecraft.network.PacketBuffer;  
15 -  
16 -import com.google.common.base.Charsets;  
17 -import com.mumfrey.liteloader.api.InterfaceProvider;  
18 -import com.mumfrey.liteloader.interfaces.FastIterableDeque;  
19 -import com.mumfrey.liteloader.util.log.LiteLoaderLogger;  
20 -  
21 -/**  
22 - * Manages plugin channel connections and subscriptions for LiteLoader  
23 - *  
24 - * @author Adam Mummery-Smith  
25 - */  
26 -public abstract class PluginChannels<L extends CommonPluginChannelListener> implements InterfaceProvider  
27 -{  
28 - // reserved channel consts  
29 - protected static final String CHANNEL_REGISTER = "REGISTER";  
30 - protected static final String CHANNEL_UNREGISTER = "UNREGISTER";  
31 -  
32 - /**  
33 - * Number of faults for a specific listener before a warning is generated  
34 - */  
35 - protected static final int WARN_FAULT_THRESHOLD = 1000;  
36 -  
37 - /**  
38 - * Mapping of plugin channel names to listeners  
39 - */  
40 - protected final HashMap<String, LinkedList<L>> pluginChannels = new HashMap<String, LinkedList<L>>();  
41 -  
42 - /**  
43 - * List of mods which implement PluginChannelListener interface  
44 - */  
45 - protected final FastIterableDeque<L> pluginChannelListeners;  
46 -  
47 - /**  
48 - * Plugin channels that we know the server supports  
49 - */  
50 - protected final Set<String> remotePluginChannels = new HashSet<String>();  
51 -  
52 - /**  
53 - * Keep track of faulting listeners so that we can periodically log a message if a listener is throwing LOTS of exceptions  
54 - */  
55 - protected final Map<L, Integer> faultingPluginChannelListeners = new HashMap<L, Integer>();  
56 -  
57 - /**  
58 - * Package private  
59 - */  
60 - PluginChannels()  
61 - {  
62 - this.pluginChannelListeners = this.createHandlerList();  
63 - }  
64 -  
65 - /**  
66 - * Spawn the handler list instance for this channel manager  
67 - */  
68 - protected abstract FastIterableDeque<L> createHandlerList();  
69 -  
70 - /**  
71 - * Get the current set of registered client-side channels  
72 - */  
73 - public Set<String> getLocalChannels()  
74 - {  
75 - return Collections.unmodifiableSet(this.pluginChannels.keySet());  
76 - }  
77 -  
78 - /**  
79 - * Get the current set of registered server channels  
80 - */  
81 - public Set<String> getRemoteChannels()  
82 - {  
83 - return Collections.unmodifiableSet(this.remotePluginChannels);  
84 - }  
85 -  
86 - /**  
87 - * Check whether a server plugin channel is registered  
88 - *  
89 - * @param channel  
90 - * @return true if the channel is registered at the server side  
91 - */  
92 - public boolean isRemoteChannelRegistered(String channel)  
93 - {  
94 - return this.remotePluginChannels.contains(channel);  
95 - }  
96 -  
97 - /**  
98 - * @param pluginChannelListener  
99 - */  
100 - protected void addPluginChannelListener(L pluginChannelListener)  
101 - {  
102 - this.pluginChannelListeners.add(pluginChannelListener);  
103 - }  
104 -  
105 - /**  
106 - * Connecting to a new server, clear plugin channels  
107 - *  
108 - * @param netHandler  
109 - */  
110 - protected void clearPluginChannels(INetHandler netHandler)  
111 - {  
112 - this.pluginChannels.clear();  
113 - this.remotePluginChannels.clear();  
114 - this.faultingPluginChannelListeners.clear();  
115 - }  
116 -  
117 - /**  
118 - * @param data  
119 - */  
120 - protected void onRegisterPacketReceived(PacketBuffer data)  
121 - {  
122 - try  
123 - {  
124 - byte[] bytes = new byte[data.readableBytes()];  
125 - data.readBytes(bytes);  
126 - String channels = new String(bytes, Charsets.UTF_8);  
127 - for (String channel : channels.split("\u0000"))  
128 - {  
129 - this.remotePluginChannels.add(channel);  
130 - }  
131 - }  
132 - catch (Exception ex)  
133 - {  
134 - LiteLoaderLogger.warning(ex, "Error decoding REGISTER packet from remote host %s", ex.getClass().getSimpleName());  
135 - }  
136 - }  
137 -  
138 - /**  
139 - *  
140 - */  
141 - protected PacketBuffer getRegistrationData()  
142 - {  
143 - // If any mods have registered channels, send the REGISTER packet  
144 - if (this.pluginChannels.keySet().size() > 0)  
145 - {  
146 - StringBuilder channelList = new StringBuilder();  
147 - boolean separator = false;  
148 -  
149 - for (String channel : this.pluginChannels.keySet())  
150 - {  
151 - if (separator) channelList.append("\u0000");  
152 - channelList.append(channel);  
153 - separator = true;  
154 - }  
155 -  
156 - PacketBuffer buffer = new PacketBuffer(Unpooled.buffer());  
157 - buffer.writeBytes(channelList.toString().getBytes(Charsets.UTF_8));  
158 - return buffer;  
159 - }  
160 -  
161 - return null;  
162 - }  
163 -  
164 - /**  
165 - * Adds plugin channels for the specified listener to the local channels  
166 - * collection  
167 - *  
168 - * @param pluginChannelListener  
169 - */  
170 - protected void addPluginChannelsFor(L pluginChannelListener)  
171 - {  
172 - List<String> channels = pluginChannelListener.getChannels();  
173 -  
174 - if (channels != null)  
175 - {  
176 - for (String channel : channels)  
177 - {  
178 - if (channel.length() > 16 || channel.toUpperCase().equals(CHANNEL_REGISTER) || channel.toUpperCase().equals(CHANNEL_UNREGISTER))  
179 - continue;  
180 -  
181 - if (!this.pluginChannels.containsKey(channel))  
182 - {  
183 - this.pluginChannels.put(channel, new LinkedList<L>());  
184 - }  
185 -  
186 - this.pluginChannels.get(channel).add(pluginChannelListener);  
187 - }  
188 - }  
189 - }  
190 -  
191 - /**  
192 - * Policy for dispatching plugin channel packets  
193 - *  
194 - * @author Adam Mummery-Smith  
195 - */  
196 - public enum ChannelPolicy  
197 - {  
198 - /**  
199 - * Dispatch the message, throw an exception if the channel is not registered  
200 - */  
201 - DISPATCH,  
202 -  
203 - /**  
204 - * Dispatch the message, return false if the channel is not registered  
205 - */  
206 - DISPATCH_IF_REGISTERED,  
207 -  
208 - /**  
209 - * Dispatch the message  
210 - */  
211 - DISPATCH_ALWAYS;  
212 -  
213 - /**  
214 - * True if this policy allows outbound traffic on the specified channel  
215 - *  
216 - * @param channel  
217 - */  
218 - public boolean allows(PluginChannels<?> channels, String channel)  
219 - {  
220 - if (this == ChannelPolicy.DISPATCH_ALWAYS) return true;  
221 - return channels.isRemoteChannelRegistered(channel);  
222 - }  
223 -  
224 - /**  
225 - * True if this policy does not throw an exception for unregistered outbound channels  
226 - */  
227 - public boolean isSilent()  
228 - {  
229 - return (this != ChannelPolicy.DISPATCH_IF_REGISTERED);  
230 - }  
231 - }  
232 -} 1 +package com.mumfrey.liteloader.core;
  2 +
  3 +import io.netty.buffer.Unpooled;
  4 +
  5 +import java.util.Collections;
  6 +import java.util.HashMap;
  7 +import java.util.HashSet;
  8 +import java.util.LinkedList;
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +import java.util.Set;
  12 +
  13 +import net.minecraft.network.INetHandler;
  14 +import net.minecraft.network.PacketBuffer;
  15 +
  16 +import com.google.common.base.Charsets;
  17 +import com.mumfrey.liteloader.api.InterfaceProvider;
  18 +import com.mumfrey.liteloader.interfaces.FastIterableDeque;
  19 +import com.mumfrey.liteloader.util.log.LiteLoaderLogger;
  20 +
  21 +/**
  22 + * Manages plugin channel connections and subscriptions for LiteLoader
  23 + *
  24 + * @author Adam Mummery-Smith
  25 + */
  26 +public abstract class PluginChannels<L extends CommonPluginChannelListener> implements InterfaceProvider
  27 +{
  28 + // reserved channel consts
  29 + protected static final String CHANNEL_REGISTER = "REGISTER";
  30 + protected static final String CHANNEL_UNREGISTER = "UNREGISTER";
  31 +
  32 + /**
  33 + * Number of faults for a specific listener before a warning is generated
  34 + */
  35 + protected static final int WARN_FAULT_THRESHOLD = 1000;
  36 +
  37 + /**
  38 + * Mapping of plugin channel names to listeners
  39 + */
  40 + protected final HashMap<String, LinkedList<L>> pluginChannels = new HashMap<String, LinkedList<L>>();
  41 +
  42 + /**
  43 + * List of mods which implement PluginChannelListener interface
  44 + */
  45 + protected final FastIterableDeque<L> pluginChannelListeners;
  46 +
  47 + /**
  48 + * Plugin channels that we know the server supports
  49 + */
  50 + protected final Set<String> remotePluginChannels = new HashSet<String>();
  51 +
  52 + /**
  53 + * Keep track of faulting listeners so that we can periodically log a message if a listener is throwing LOTS of exceptions
  54 + */
  55 + protected final Map<L, Integer> faultingPluginChannelListeners = new HashMap<L, Integer>();
  56 +
  57 + /**
  58 + * Package private
  59 + */
  60 + PluginChannels()
  61 + {
  62 + this.pluginChannelListeners = this.createHandlerList();
  63 + }
  64 +
  65 + /**
  66 + * Spawn the handler list instance for this channel manager
  67 + */
  68 + protected abstract FastIterableDeque<L> createHandlerList();
  69 +
  70 + /**
  71 + * Get the current set of registered client-side channels
  72 + */
  73 + public Set<String> getLocalChannels()
  74 + {
  75 + return Collections.unmodifiableSet(this.pluginChannels.keySet());
  76 + }
  77 +
  78 + /**
  79 + * Get the current set of registered server channels
  80 + */
  81 + public Set<String> getRemoteChannels()
  82 + {
  83 + return Collections.unmodifiableSet(this.remotePluginChannels);
  84 + }
  85 +
  86 + /**
  87 + * Check whether a server plugin channel is registered
  88 + *
  89 + * @param channel
  90 + * @return true if the channel is registered at the server side
  91 + */
  92 + public boolean isRemoteChannelRegistered(String channel)
  93 + {
  94 + return this.remotePluginChannels.contains(channel);
  95 + }
  96 +
  97 + /**
  98 + * @param pluginChannelListener
  99 + */
  100 + protected void addPluginChannelListener(L pluginChannelListener)
  101 + {
  102 + this.pluginChannelListeners.add(pluginChannelListener);
  103 + }
  104 +
  105 + /**
  106 + * Connecting to a new server, clear plugin channels
  107 + *
  108 + * @param netHandler
  109 + */
  110 + protected void clearPluginChannels(INetHandler netHandler)
  111 + {
  112 + this.pluginChannels.clear();
  113 + this.remotePluginChannels.clear();
  114 + this.faultingPluginChannelListeners.clear();
  115 + }
  116 +
  117 + /**
  118 + * @param data
  119 + */
  120 + protected void onRegisterPacketReceived(PacketBuffer data)
  121 + {
  122 + try
  123 + {
  124 + byte[] bytes = new byte[data.readableBytes()];
  125 + data.readBytes(bytes);
  126 + String channels = new String(bytes, Charsets.UTF_8);
  127 + for (String channel : channels.split("\u0000"))
  128 + {
  129 + this.remotePluginChannels.add(channel);
  130 + }
  131 + }
  132 + catch (Exception ex)
  133 + {
  134 + LiteLoaderLogger.warning(ex, "Error decoding REGISTER packet from remote host %s", ex.getClass().getSimpleName());
  135 + }
  136 + }
  137 +
  138 + /**
  139 + *
  140 + */
  141 + protected PacketBuffer getRegistrationData()
  142 + {
  143 + // If any mods have registered channels, send the REGISTER packet
  144 + if (this.pluginChannels.keySet().size() > 0)
  145 + {
  146 + StringBuilder channelList = new StringBuilder();
  147 + boolean separator = false;
  148 +
  149 + for (String channel : this.pluginChannels.keySet())
  150 + {
  151 + if (separator) channelList.append("\u0000");
  152 + channelList.append(channel);
  153 + separator = true;
  154 + }
  155 +
  156 + PacketBuffer buffer = new PacketBuffer(Unpooled.buffer());
  157 + buffer.writeBytes(channelList.toString().getBytes(Charsets.UTF_8));
  158 + return buffer;
  159 + }
  160 +
  161 + return null;
  162 + }
  163 +
  164 + /**
  165 + * Adds plugin channels for the specified listener to the local channels
  166 + * collection
  167 + *
  168 + * @param pluginChannelListener
  169 + */
  170 + protected void addPluginChannelsFor(L pluginChannelListener)
  171 + {
  172 + List<String> channels = pluginChannelListener.getChannels();
  173 +
  174 + if (channels != null)
  175 + {
  176 + for (String channel : channels)
  177 + {
  178 + if (channel.length() > 16 || channel.toUpperCase().equals(CHANNEL_REGISTER) || channel.toUpperCase().equals(CHANNEL_UNREGISTER))
  179 + continue;
  180 +
  181 + if (!this.pluginChannels.containsKey(channel))
  182 + {
  183 + this.pluginChannels.put(channel, new LinkedList<L>());
  184 + }
  185 +
  186 + this.pluginChannels.get(channel).add(pluginChannelListener);
  187 + }
  188 + }
  189 + }
  190 +
  191 + /**
  192 + * Policy for dispatching plugin channel packets
  193 + *
  194 + * @author Adam Mummery-Smith
  195 + */
  196 + public enum ChannelPolicy
  197 + {
  198 + /**
  199 + * Dispatch the message, throw an exception if the channel is not registered
  200 + */
  201 + DISPATCH,
  202 +
  203 + /**
  204 + * Dispatch the message, return false if the channel is not registered
  205 + */
  206 + DISPATCH_IF_REGISTERED,
  207 +
  208 + /**
  209 + * Dispatch the message
  210 + */
  211 + DISPATCH_ALWAYS;
  212 +
  213 + /**
  214 + * True if this policy allows outbound traffic on the specified channel
  215 + *
  216 + * @param channel
  217 + */
  218 + public boolean allows(PluginChannels<?> channels, String channel)
  219 + {
  220 + if (this == ChannelPolicy.DISPATCH_ALWAYS) return true;
  221 + return channels.isRemoteChannelRegistered(channel);
  222 + }
  223 +
  224 + /**
  225 + * True if this policy does not throw an exception for unregistered outbound channels
  226 + */
  227 + public boolean isSilent()
  228 + {
  229 + return (this != ChannelPolicy.DISPATCH);
  230 + }
  231 + }
  232 +}