blob: 5f1d458292d5e1a43ede754cfa9e0c3364c32af6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cometd.bayeux.samples;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextAttributeEvent;
import org.apache.cometd.bayeux.Bayeux;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.cometd.bayeux.Client;
import org.apache.cometd.bayeux.Listener;
import org.apache.cometd.bayeux.Message;
import org.apache.cometd.bayeux.Channel;
public class EchoChatClient implements ServletContextListener, ServletContextAttributeListener, Listener {
static AtomicInteger counter = new AtomicInteger(0);
protected int id;
protected Bayeux b;
protected Client c;
protected boolean alive = true;
protected TimestampThread tt = new TimestampThread();
public EchoChatClient() {
id = counter.incrementAndGet();
System.out.println("new listener created with id:"+id);
}
public void contextDestroyed(ServletContextEvent servletContextEvent) {
alive = false;
tt.interrupt();
}
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
public void attributeAdded(ServletContextAttributeEvent scae) {
if (scae.getName().equals(Bayeux.DOJOX_COMETD_BAYEUX)) {
System.out.println("Starting echo chat client!");
b = (Bayeux)scae.getValue();
c = b.newClient("echochat-",this);
Channel ch = b.getChannel("/chat/demo",true);
ch.subscribe(c);
tt.start();
}
}
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
}
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
}
public void removed(boolean timeout) {
System.out.println("Client removed.");
}
public void deliver(Message[] msgs) {
for (int i=0; msgs!=null && i<msgs.length; i++) {
Message msg = msgs[i];
System.out.println("[echochatclient ]received message:" + msg);
Message m = b.newMessage(c);
m.putAll(msg);
//echo the same message
m.put("user", "echochatserver");
if (m.containsKey("msg")) {
//simple chat demo
String chat = (String) m.get("msg");
m.put("msg", "echochatserver|I received your message-" + chat.substring(chat.indexOf("|") + 1));
}
System.out.println("[echochatclient ]sending message:" + m);
msg.getChannel().publish(m);
}
}
public class TimestampThread extends Thread {
public TimestampThread() {
setDaemon(true);
}
public void run() {
while (alive) {
try {
sleep(5000);
Channel ch = b.getChannel("/chat/demo",false);
if (ch.getSubscribers().size()<=1) {
continue;
}
Message m = b.newMessage(c);
m.put("user","echochatserver");
m.put("chat","Time is:"+new java.sql.Date(System.currentTimeMillis()).toLocaleString());
m.put("join",false);
ch.publish(m);
}catch (InterruptedException ignore) {
Thread.currentThread().interrupted();
}catch (Exception x) {
x.printStackTrace();
}
}
}
}
}