| 1 package org.claros.chat.threads; 2 3 import java.util.ArrayList ; 4 import java.util.Collections ; 5 import java.util.List ; 6 7 import org.apache.commons.logging.Log; 8 import org.apache.commons.logging.LogFactory; 9 import org.claros.chat.controllers.QueueController; 10 import org.jivesoftware.smack.PacketListener; 11 import org.jivesoftware.smack.XMPPConnection; 12 import org.jivesoftware.smack.filter.PacketFilter; 13 import org.jivesoftware.smack.packet.Message; 14 import org.jivesoftware.smack.packet.Packet; 15 import org.jivesoftware.smack.packet.Presence; 16 17 20 public class ChatListener extends Thread { 21 private static Log log = LogFactory.getLog(ChatListener.class); 22 private static List subsRequest; 23 private String user; 24 private XMPPConnection conn; 25 private MyListener listener; 26 private MyFilter filter; 27 28 32 private ChatListener() { 33 super(); 34 } 35 36 41 public ChatListener(String user, XMPPConnection conn) { 42 if (subsRequest == null) { 43 subsRequest = Collections.synchronizedList(new ArrayList ()); 44 } 45 this.user = user; 46 this.conn = conn; 47 listener = new MyListener(); 48 filter = new MyFilter(); 49 } 50 51 54 public void run() { 55 conn.addPacketListener(listener, filter); 56 } 57 58 62 public void terminate() { 63 try { 64 conn.removePacketListener(listener); 65 } catch (RuntimeException e) { 66 e.printStackTrace(); 67 } 68 } 69 70 public List getUnreadMessages() { 71 List msgs = null; 72 try { 73 msgs = QueueController.fetchUserMessages(user, QueueController.QUEUE_IN); 74 } catch (Exception e) { 75 log.error("unable to get unread messages", e); 76 } 77 return msgs; 78 } 79 80 public synchronized List getNewSubscriptions() { 81 83 ArrayList outList = new ArrayList (); 84 ArrayList toDelete = new ArrayList (); 85 86 Presence tmp = null; 88 String tmpTo = null; 89 int tmpPos = -1; 90 for (int i=0;i<subsRequest.size();i++) { 91 tmp = (Presence)subsRequest.get(i); 92 tmpTo = tmp.getTo(); 93 tmpPos = tmpTo.indexOf("/"); 94 if (tmpPos > -1) { 95 tmpTo = tmpTo.substring(0, tmpPos); 96 } 97 if (tmpTo.equals(user)) { 98 toDelete.add(new Integer (i)); 99 outList.add(tmp); 100 } 101 } 102 103 for (int i=toDelete.size()-1;i>=0;i--) { 105 try { 106 subsRequest.remove(((Integer )toDelete.get(i)).intValue()); 107 } catch (RuntimeException e) { 108 e.printStackTrace(); 109 } 110 } 111 return outList; 112 } 113 114 119 class MyListener implements PacketListener { 120 121 124 public void processPacket(Packet arg0) { 125 if (arg0 instanceof Message) { 126 Message msg = (Message)arg0; 127 128 if (msg.getFrom().indexOf("/") > -1) { 129 msg.setFrom(msg.getFrom().substring(0, msg.getFrom().indexOf("/"))); 130 } 131 132 if (msg.getTo().indexOf("/") > -1) { 133 msg.setTo(msg.getTo().substring(0, msg.getTo().indexOf("/"))); 134 } 135 136 QueueController.push(msg.getFrom(), msg.getTo(), msg.getBody(), QueueController.QUEUE_IN); 138 139 log.debug("new message written to queue, from:" + msg.getFrom() + " to: " + msg.getTo() + " body: " + msg.getBody()); 140 } else if (arg0 instanceof Presence) { 141 Presence prs = (Presence)arg0; 142 if (prs.getType().equals(Presence.Type.SUBSCRIBE)) { 143 subsRequest.add(arg0); 144 } 145 } 146 } 147 } 148 149 154 class MyFilter implements PacketFilter { 155 156 159 public boolean accept(Packet arg0) { 160 return true; 162 } 163 } 164 165 168 public String getUser() { 169 return user; 170 } 171 172 175 public void setUser(String string) { 176 user = string; 177 } 178 179 } 180 | Popular Tags |