35
36
import com.aelitis.azureus.core.AzureusCore;
36
37
import com.aelitis.azureus.core.AzureusCoreFactory;
38
import com.aelitis.azureus.core.cnetwork.ContentNetwork;
39
import com.aelitis.azureus.core.cnetwork.ContentNetworkManagerFactory;
37
40
import com.aelitis.azureus.core.messenger.browser.BrowserMessage;
38
41
import com.aelitis.azureus.core.messenger.browser.BrowserMessageDispatcher;
39
42
import com.aelitis.azureus.core.messenger.browser.listeners.MessageCompletionListener;
40
43
import com.aelitis.azureus.core.messenger.config.PlatformRelayMessenger;
41
import com.aelitis.azureus.util.ConstantsV3;
42
import com.aelitis.azureus.util.JSONUtils;
43
import com.aelitis.azureus.util.MapUtils;
44
import com.aelitis.azureus.util.*;
45
46
import org.gudy.azureus2.plugins.PluginInterface;
46
47
import org.gudy.azureus2.plugins.utils.resourcedownloader.ResourceDownloader;
67
73
public static String REPLY_RESULT = "response";
69
static private Map mapQueueAuthorized = new LinkedHashMap();
71
static private Map mapQueueNoAZID = new LinkedHashMap();
73
static private Map mapQueue = new LinkedHashMap();
75
/** Key: id of queue; Value: Map of queued messages & listeners */
76
static private Map<String, Map> mapQueues = new HashMap();
78
private static final String QUEUE_AUTH = "Auth.";
80
private static final String QUEUE_NOAZID = "noazid.";
82
private static final String QUEUE_NORMAL = "msg.";
84
private static final String QUEUE_RELAY = "relay.";
75
86
static private AEMonitor queue_mon = new AEMonitor(
76
87
"v3.PlatformMessenger.queue");
78
89
static private Timer timerProcess = new Timer("v3.PlatformMessenger.queue");
80
static private TimerEvent timerEvent = null;
91
//static private TimerEvent timerEvent = null;
93
static private Map<String, TimerEvent> mapTimerEvents = new HashMap<String, TimerEvent>();
95
static private AEMonitor mon_mapTimerEvents = new AEMonitor("mapTimerEvents");
82
97
private static boolean initialized;
118
137
public static void queueMessage(PlatformMessage message,
119
138
PlatformMessengerListener listener, boolean addToBottom) {
140
if ( COConfigurationManager.getStringParameter( "ui", "az3" ).equals( "az2" )){
142
Debug.out( "**** PlatformMessenger shouldn't be used with az2 UI ****" );
120
145
if (!initialized) {
124
if (message != null) {
125
debug("q " + message.toShortString() + ": " + message + " for "
126
+ new Date(message.getFireBefore()) + "; in "
127
+ (message.getFireBefore() - SystemTime.getCurrentTime()) + "ms");
128
if (message.requiresAuthorization() && authorizedDelayed) {
129
debug(" authorized msg is delayed");
149
if (message == null) {
132
150
debug("fire timerevent");
134
152
queue_mon.enter();
155
String queueID = null;
137
156
if (message != null) {
138
if (message.requiresAuthorization()) {
139
mapQueueAuthorized.put(message, listener);
140
} else if (message.sendAZID()) {
141
mapQueue.put(message, listener);
143
mapQueueNoAZID.put(message, listener);
145
fireBefore = message.getFireBefore();
157
long networkID = message.getContentNetworkID();
158
if (networkID <= 0) {
159
debug("Content Network invalid for " + message);
162
if (message.requiresAuthorization()) {
163
queueID = QUEUE_AUTH;
164
} else if (!message.sendAZID()) {
165
queueID = QUEUE_NOAZID;
167
boolean isRelayServer = PlatformRelayMessenger.LISTENER_ID.equals(message.getListenerID());
169
queueID = QUEUE_RELAY;
171
queueID = QUEUE_NORMAL;
174
queueID += networkID;
176
Map<PlatformMessage, PlatformMessengerListener> mapQueue = (Map) mapQueues.get(queueID);
177
if (mapQueue == null) {
178
mapQueue = new LinkedHashMap<PlatformMessage, PlatformMessengerListener>();
179
mapQueues.put(queueID, mapQueue);
181
mapQueue.put(message, listener);
183
debug("q " + queueID + "(" + mapQueue.size() + ") "
184
+ message.toShortString() + ": " + message + " @ "
185
+ new Date(message.getFireBefore()) + "; in "
186
+ (message.getFireBefore() - SystemTime.getCurrentTime()) + "ms");
187
if (message.requiresAuthorization() && authorizedDelayed) {
188
debug(" authorized msg is delayed");
191
fireBefore = message.getFireBefore();
147
193
fireBefore = SystemTime.getCurrentTime();
150
if (timerEvent == null || timerEvent.hasRun()) {
151
timerEvent = timerProcess.addEvent(fireBefore,
152
new TimerEventPerformer() {
153
public void perform(TimerEvent event) {
155
while (mapQueue.size() > 0) {
156
processQueue(mapQueue, false, true);
158
if (!authorizedDelayed) {
159
while (mapQueueAuthorized.size() > 0) {
160
processQueue(mapQueueAuthorized, true, true);
163
while (mapQueueNoAZID.size() > 0) {
164
processQueue(mapQueueNoAZID, false, false);
169
// Move the time up if we have to
196
if (queueID != null) {
171
if (fireBefore < timerEvent.getWhen()) {
172
timerProcess.adjustAllBy(fireBefore - timerEvent.getWhen());
198
mon_mapTimerEvents.enter();
200
TimerEvent timerEvent = mapTimerEvents.get(queueID);
202
if (timerEvent == null || timerEvent.hasRun() || fireBefore < timerEvent.getWhen()) {
203
if (timerEvent != null) {
204
mapTimerEvents.remove(timerEvent);
208
final String fQueueID = queueID;
209
timerEvent = timerProcess.addEvent(fireBefore,
210
new TimerEventPerformer() {
211
public void perform(TimerEvent event) {
213
mon_mapTimerEvents.enter();
215
mapTimerEvents.remove(event);
217
mon_mapTimerEvents.exit();
220
Map mapQueue = mapQueues.get(fQueueID);
221
while (mapQueue != null && mapQueue.size() > 0) {
222
processQueue(fQueueID, mapQueue);
225
Object[] keys = mapQueues.keySet().toArray();
226
for (int i = 0; i < keys.length; i++) {
227
Map mapQueue = mapQueues.get(keys[i]);
228
while (mapQueue != null && mapQueue.size() > 0) {
229
processQueue(mapQueue);
235
mapTimerEvents.put(queueID, timerEvent);
237
if (timerEvent != null) {
238
debug(" next q process for " + queueID + " in " + (timerEvent.getWhen() - SystemTime.getCurrentTime()));
174
} catch (Exception e) {
241
mon_mapTimerEvents.exit();
186
252
public static void debug(String string) {
187
253
AEDiagnosticsLogger diag_logger = AEDiagnostics.getLogger("v3.PMsgr");
188
254
diag_logger.log(string);
189
if (ConstantsV3.DIAG_TO_STDOUT) {
255
if (ConstantsVuze.DIAG_TO_STDOUT) {
190
256
System.out.println(Thread.currentThread().getName() + "|"
191
257
+ System.currentTimeMillis() + "] " + string);
195
261
protected static void debug(String string, Throwable e) {
196
debug(string + "\n\t" + Debug.getCompressedStackTrace(e, 1, 80));
262
debug(string + "\n\t" + e.getClass().getName() + ": " + e.getMessage()
263
+ ", " + Debug.getCompressedStackTrace(e, 1, 80));
201
267
* Sends the message almost immediately, skipping delayauthorization check
207
public static void pushMessageNow(PlatformMessage message, PlatformMessengerListener listener) {
273
public static void pushMessageNow(PlatformMessage message,
274
PlatformMessengerListener listener) {
208
275
debug("push " + message.toShortString() + ": " + message);
210
277
Map map = new HashMap(1);
211
278
map.put(message, listener);
212
processQueue(map, message.requiresAuthorization(), message.sendAZID());
279
processQueue(null, map);
216
283
* @param requiresAuthorization
219
protected static void processQueue(Map mapQueue,
220
final boolean requiresAuthorization, final boolean sendAZID) {
286
protected static void processQueue(String queueID, Map mapQueue) {
221
287
if (!initialized) {
291
//debug("pq " + queueID + " via " + Debug.getCompressedStackTrace());
225
292
final Map mapProcessing = new HashMap();
227
294
boolean loginAndRetry = false;
295
boolean requiresAuthorization = false;
296
boolean sendAZID = true;
297
long contentNetworkID = ContentNetwork.CONTENT_NETWORK_VUZE;
229
299
// Create urlStem (or post data)
230
300
// determine which server to use
327
395
// Build base RPC url based on listener and server
397
// one day all this URL hacking should be moved into the ContentNetwork...
399
ContentNetwork cn = ContentNetworkManagerFactory.getSingleton().getContentNetwork(
402
cn = ConstantsVuze.getDefaultContentNetwork();
329
406
boolean isRelayServer = (PlatformRelayMessenger.MSG_ID + "-" + PlatformRelayMessenger.LISTENER_ID).equals(server);
330
407
if (isRelayServer) {
331
sURL_RPC = ConstantsV3.URL_RELAY_RPC;
409
sURL_RPC = ContentNetworkUtils.getUrl(cn, ContentNetwork.SERVICE_RELAY_RPC);
333
sURL_RPC = ConstantsV3.URL_PREFIX + ConstantsV3.URL_RPC + server;
336
String suffix = ConstantsV3.URL_SUFFIX;
338
suffix = suffix.replaceAll("azid=.*&", "");
412
sURL_RPC = ContentNetworkUtils.getUrl(cn, ContentNetwork.SERVICE_RPC)
341
416
// Build full url and data to send
343
418
String sPostData = null;
419
if (USE_HTTP_POST || requiresAuthorization) {
346
sPostData = ConstantsV3.URL_POST_PLATFORM_DATA + "&" + urlStem.toString()
421
if (requiresAuthorization) {
422
String sAuthUrl = ContentNetworkUtils.getUrl(cn,
423
ContentNetwork.SERVICE_AUTH_RPC);
424
if (sAuthUrl != null) {
429
sPostData = URL_POST_PLATFORM_DATA + "&" + urlStem.toString();
430
sPostData = cn.appendURLSuffix(sPostData, true, sendAZID);
348
432
if (!requiresAuthorization) {
350
434
debug("POST for " + mapProcessing.size() + ": " + sURL + "?"
357
sURL = sURL_RPC + ConstantsV3.URL_PLATFORM_MESSAGE + "&"
358
+ urlStem.toString() + "&" + suffix;
441
sURL = sURL_RPC + URL_PLATFORM_MESSAGE + "&" + urlStem.toString();
443
sURL = cn.appendURLSuffix(sURL, false, sendAZID);
360
446
debug("GET: " + sURL);
362
debug("GET: " + sURL_RPC + ConstantsV3.URL_PLATFORM_MESSAGE);
448
debug("GET: " + sURL_RPC + URL_PLATFORM_MESSAGE);
366
452
final String fURL = sURL;
367
453
final String fPostData = sPostData;
368
454
final boolean fLoginAndRetry = loginAndRetry;
455
final boolean fReqAuth = requiresAuthorization;
370
457
// proccess queue on a new thread
371
458
AEThread2 thread = new AEThread2("v3.PlatformMessenger", true) {
372
459
public void run() {
374
processQueueAsync(fURL, fPostData, mapProcessing,
375
requiresAuthorization, fLoginAndRetry);
461
processQueueAsync(fURL, fPostData, mapProcessing, fReqAuth,
376
463
} catch (Throwable e) {
377
464
if (e instanceof ResourceDownloaderException) {
378
465
debug("Error while sending message(s) to Platform: " + e.toString());
668
757
public void displayBrowserMessage(String message) {
669
log("displayBrowserMessage - " + message );
758
log("displayBrowserMessage - " + message);
672
761
public boolean executeInBrowser(String javascript) {
673
log("executeInBrowser - " + javascript );
762
log("executeInBrowser - " + javascript);
677
766
public Object getBrowserData(String key) {
678
log("getBrowserData - " + key );
767
log("getBrowserData - " + key);
682
771
public boolean sendBrowserMessage(String key, String op) {
683
log("sendBrowserMessage - " + key + "/" + op );
772
log("sendBrowserMessage - " + key + "/" + op);
687
776
public boolean sendBrowserMessage(String key, String op, Map params) {
688
log("sendBrowserMessage - " + key + "/" + op + "/" + params );
777
log("sendBrowserMessage - " + key + "/" + op + "/" + params);
692
781
public void setBrowserData(String key, Object value) {
693
log("setBrowserData - " + key + "/" + value );
782
log("setBrowserData - " + key + "/" + value);
696
785
public boolean sendBrowserMessage(String key, String op, Collection params) {
697
log("sendBrowserMessage - " + key + "/" + op + "/" + params );
786
log("sendBrowserMessage - " + key + "/" + op + "/" + params);
700
790
public void setTorrentURLHandler(torrentURLHandler handler) {
701
log("setTorrentURLHandler - " + handler );
791
log("setTorrentURLHandler - " + handler);
794
public long getContentNetworkID() {
795
return contentNetworkID;
798
public void setContentNetworkID(long contentNetwork) {
799
this.contentNetworkID = contentNetwork;
710
808
public static void setAuthorizedDelayed(boolean authorizedDelayed) {
711
809
debug("setDelayAuthorized " + authorizedDelayed);
712
810
PlatformMessenger.authorizedDelayed = authorizedDelayed;
713
if (!authorizedDelayed && mapQueueAuthorized.size() > 0) {
714
queueMessage(null, null);
811
if (!authorizedDelayed) {
812
boolean fireQueue = false;
815
for (String key : mapQueues.keySet()) {
816
if (key.startsWith(QUEUE_AUTH)) {
817
Map map = mapQueues.get(key);
818
if (map != null && map.size() > 0) {
828
queueMessage(null, null);