jazz/ActiveMQ/08-10-27: _amq.js

File _amq.js, 5.1 KB (added by jazz, 17 years ago)
Line 
1/**
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18// AMQ Ajax handler
19// This class provides the main API for using the Ajax features of AMQ. It
20// allows JMS messages to be sent and received from javascript when used
21// with the org.apache.activemq.web.MessageListenerServlet
22//
23var amq =
24{
25  // The URI of the MessageListenerServlet
26  uri: '/amq',
27
28  // Polling. Set to true (default) if waiting poll for messages is needed
29  poll: true,
30 
31  // Poll delay. if set to positive integer, this is the time to wait in ms before
32  // sending the next poll after the last completes.
33  _pollDelay: 0,
34
35  _first: true,
36  _pollEvent: function(first) {},
37  _handlers: new Array(),
38
39  _messages:0,
40  _messageQueue: '',
41  _queueMessages: 0,
42
43  _messageHandler: function(request)
44  {
45    try
46    {
47      if (request.status == 200)
48      {
49        var response = request.responseXML.getElementsByTagName("ajax-response");
50        if (response != null && response.length == 1)
51        {
52          for ( var i = 0 ; i < response[0].childNodes.length ; i++ )
53          {
54            var responseElement = response[0].childNodes[i];
55
56            // only process nodes of type element.....
57            if ( responseElement.nodeType != 1 )
58              continue;
59
60            var id   = responseElement.getAttribute('id');
61
62
63            var handler = amq._handlers[id];
64            if (handler!=null)
65            {
66              for (var j = 0; j < responseElement.childNodes.length; j++)
67              {
68                handler(responseElement.childNodes[j]);
69        }
70            }
71          }
72        }
73      }
74    }
75    catch(e)
76    {
77      alert(e);
78    }
79  },
80
81  startBatch: function()
82  {
83    amq._queueMessages++;
84  },
85
86  endBatch: function()
87  {
88    amq._queueMessages--;
89    if (amq._queueMessages==0 && amq._messages>0)
90    {
91      var body = amq._messageQueue;
92      amq._messageQueue='';
93      amq._messages=0;
94      amq._queueMessages++;
95      new Ajax.Request(amq.uri, { method: 'post', postBody: body, onSuccess: amq.endBatch});
96    }
97  },
98
99  _pollHandler: function(request)
100  {
101    amq.startBatch();
102    try
103    {
104      amq._messageHandler(request);
105      amq._pollEvent(amq._first);
106      amq._first=false;
107    }
108    catch(e)
109    {
110        alert(e);
111    }
112    amq.endBatch();
113
114    if (amq._pollDelay>0)
115      setTimeout('amq._sendPoll()',amq._pollDelay);
116    else
117      amq._sendPoll();
118  },
119 
120  _sendPoll: function(request)
121  {
122    new Ajax.Request(amq.uri, { method: 'get', onSuccess: amq._pollHandler });
123  },
124
125  // Add a function that gets called on every poll response, after all received
126  // messages have been handled.  The poll handler is past a boolean that indicates
127  // if this is the first poll for the page.
128  addPollHandler : function(func)
129  {
130    var old = amq._pollEvent;
131    amq._pollEvent = function(first)
132    {
133      old(first);
134      func(first);
135    }
136  },
137
138  // Send a JMS message to a destination (eg topic://MY.TOPIC).  Message should be xml or encoded
139  // xml content.
140  sendMessage : function(destination,message)
141  {
142    amq._sendMessage(destination,message,'send');
143  },
144
145  // Listen on a channel or topic.   handler must be a function taking a message arguement
146  addListener : function(id,destination,handler)
147  {
148    amq._handlers[id]=handler;
149    amq._sendMessage(destination,id,'listen');
150  },
151
152  // remove Listener from channel or topic.
153  removeListener : function(id,destination)
154  {
155    amq._handlers[id]=null;
156    amq._sendMessage(destination,id,'unlisten');
157  },
158
159  _sendMessage : function(destination,message,type)
160  {
161    if (amq._queueMessages>0)
162    {
163      if (amq._messages==0)
164      {
165        amq._messageQueue='destination='+destination+'&message='+message+'&type='+type;
166      }
167      else
168      {
169        amq._messageQueue+='&d'+amq._messages+'='+destination+'&m'+amq._messages+'='+message+'&t'+amq._messages+'='+type;
170      }
171      amq._messages++;
172    }
173    else
174    {
175      amq.startBatch();
176      new Ajax.Request(amq.uri, { method: 'post', postBody: 'destination='+destination+'&message='+message+'&type='+type, onSuccess: amq.endBatch});
177    }
178  },
179 
180  _startPolling : function()
181  {
182   if (amq.poll)
183      new Ajax.Request(amq.uri, { method: 'get', parameters: 'timeout=0', onSuccess: amq._pollHandler });
184  }
185};
186
187Behaviour.addLoadEvent(amq._startPolling);
188
189function getKeyCode(ev)
190{
191    var keyc;
192    if (window.event)
193        keyc=window.event.keyCode;
194    else
195        keyc=ev.keyCode;
196    return keyc;
197}