package com.gci.common;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;//消息监听器
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.RosterListener;// 好友监听器
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketIDFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Mode;
import com.gci.common.GlobalResource;
import com.gci.common.ManagerProtocol;
import com.gci.service.terminalgroupImpl.TerminalMessageManagerImpl;
public class XMPPService{
private static XMPPService xmpp = new XMPPService();
private Connection connection = null;
-------------
private XMPPService() {
};
-------------
public static XMPPService getInstance() {
return xmpp;
}
--------------
//是否在运行通过connection来判断
public boolean working() {
if (connection == null) {
return false;
}
return true;
}
---------------
public void XMPPReset(){
//TerminalMessageManager.getInstance().addSysLog("xmpp","reset",GlobalResource.getInstance().INFO);
System.out.println("xmpp server reset\n");
disconnect();//断开XMPP连接,connection.disconnect();
XMPPInit();
}
------------------
// XMPP初始化
public void XMPPInit() {
System.out.println("XMPPInit\n");
if (connection != null) {
//TerminalMessageManager.getInstance().addSysLog("xmpp","connection no init again ",GlobalResource.getInstance().INFO);
//System.out.println("xmpp server is running\n");
return;
}
//TerminalMessageManager.getInstance().addSysLog("xmpp","init",GlobalResource.getInstance().INFO);
ConnectionConfiguration config;
config = new ConnectionConfiguration(GlobalResource.getInstance().xmppAddr, GlobalResource.getInstance().xmppPort);
/** @Value("${xmppAddr}")
public String xmppAddr = "127.0.0.1";
@Value("${xmppName}")
public String xmppName = "admin";
public int xmppPort = 5222;
public String xmppPS = "jiesai";
public boolean autofound = true;
@Value("${redisAddr}")
public String redisAddr = "127.0.0.1";
@Value("${updatePath}")
public String updatePath = "";
*/
config.setReconnectionAllowed(true);
connection = new XMPPConnection(config);
try {
connection.connect();
connection.login(GlobalResource.getInstance().xmppName, GlobalResource.getInstance().xmppPS);
connection.getRoster().setSubscriptionMode(
Roster.SubscriptionMode.accept_all);
System.out.println("xmpp connecting ok\n");
//TerminalMessageManager.getInstance().addSysLog("xmpp","init success",GlobalResource.getInstance().INFO);
// 待更改
//addRosterListener(null);
// 添加消息监听器
//setChatListener(null);
} catch (XMPPException e) {
// e.printStackTrace();
String msg = e.toString();
if (msg.contains("XMPPError connecting")) {
System.out.println("XMPPError connecting");
connection.disconnect();
connection = null;
//TerminalMessageManager.getInstance().addSysLog("xmpp","init faile",GlobalResource.getInstance().FATAL);
}
}
}
-------------------
// 消息监听器
public void addRosterListener(RosterListener listener) {
// 好友监听器
if (connection==null){
//TerminalMessageManager.getInstance().addSysLog("xmpp","addRosterListener error",GlobalResource.getInstance().ERROR);
return;
}
connection.getRoster().addRosterListener(listener);
}
--------------
// 消息监听器
public void setChatListener(final MessageListener listener) {
if (connection==null){
//TerminalMessageManager.getInstance().addSysLog("xmpp","setChatListener error",GlobalResource.getInstance().ERROR);
return;
}
ChatManager manager = connection.getChatManager();
manager.addChatListener( new ChatManagerListener() {
public void chatCreated(Chat chat, boolean arg1) {
chat.addMessageListener(listener);
}
});
}
---------------------
// 获取所有用户状态
public List<HashMap<String, String>> getAllFriendsWithState() {
List<HashMap<String, String>> statuslist = new ArrayList<HashMap<String, String>>();
List<RosterEntry> userlist = getAllFriends();
for (int i = 0; i < userlist.size(); i++) {
HashMap<String, String> amap = new HashMap<String, String>();
String nickname = userlist.get(i).getName();
String groups = userlist.get(i).getGroups().iterator().next().getName();
//System.out.println(nickname);
/*
try {
nickname = new String(nickname.getBytes("UTF-8"),"UTF-8");
groups = new String(groups.getBytes("UTF-8"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
amap.put("nickName", nickname);
amap.put("userName", userlist.get(i).getUser());
amap.put("groups", groups);
//System.out.println(amap.get("groups"));
String state = new String();
state = state + connection.getRoster().getPresence(userlist.get(i).getUser());
amap.put("state", state);
statuslist.add(amap);
}
return statuslist;
}
------------
public boolean deleteTerminal(String username)
{
boolean b = false;
try {
connection.getRoster().removeEntry(connection.getRoster().getEntry(username));
b = true;
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
--------------
//判断一个用户组是否存在
public boolean isUser(String username)
{
boolean b = connection.getRoster().contains(username);
return b;
}
---------------
//判断一个用户是否存在
public boolean isGroupAssist(String group)
{
boolean b = false;
try
{
b = connection.getRoster().getGroups().contains(connection.getRoster().getGroup(group));
}catch(Exception e)
{
b = false;
}
return b;
}
// 获取所有用户状态,返回值:用户名:昵称:状态
public List<String> getAllFriendsStatus() {
List<String> statuslist = new ArrayList<String>();
List<RosterEntry> userlist = getAllFriends();
for (int i = 0; i < userlist.size(); i++) {
statuslist.add(userlist.get(i).getName()
+ ":"
+ connection.getRoster().getPresence(
userlist.get(i).getUser()));
}
return statuslist;
}
-----------------
//通过用户名获取昵称
public String getNicknameByUsername(String username)
{
return connection.getRoster().getEntry(username).getName();
}
//通过用户名获取用户状态
public String getFriendStatus(String userName) {
return connection.getRoster().getPresence(userName).toString();
}
------------------
// 获取所有用户列表
public List<RosterEntry> getAllFriends() {
List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
Collection<RosterEntry> rosterEntry = connection.getRoster().getEntries();
Iterator<RosterEntry> i = rosterEntry.iterator();
while (i.hasNext()) {
EntriesList.add(i.next());
}
return EntriesList;
}
------------------------
// 获取某个分组下的所有用户列表
public List<RosterEntry> getAllFriendsByGroup(String groupName) {
List<RosterEntry> EntriesList = new ArrayList<RosterEntry>();
RosterGroup rosterGroup = connection.getRoster().getGroup(groupName);
Collection<RosterEntry> rosterEntry = rosterGroup.getEntries();
Iterator<RosterEntry> i = rosterEntry.iterator();
while (i.hasNext())
EntriesList.add(i.next());
return EntriesList;
}
//获取某个分组下的所有在线用户
public List<RosterEntry> getOnlineListByGroup(String groupName) {
List<RosterEntry> onlinelist = new ArrayList<RosterEntry>();
List<RosterEntry> userList = getAllFriendsByGroup(groupName);
for (int i = 0; i < userList.size(); i++) {
if (!connection.getRoster().getPresence(userList.get(i).getUser())
.toString().contains("unavailable"))
onlinelist.add(userList.get(i));
}
return onlinelist;
}
//获取某个分组下的所有离线用户
public List<RosterEntry> getOfflineListByGroup(String groupName)
{
List<RosterEntry> offlinelist = new ArrayList<RosterEntry>();
List<RosterEntry> userList = getAllFriendsByGroup(groupName);
for (int i = 0; i < userList.size(); i++)
{
if (connection.getRoster().getPresence(userList.get(i).getUser())
.toString().contains("unavailable"))
offlinelist.add(userList.get(i));
}
return offlinelist;
}
// 获取某个分组下的所有在线用户名
public List<String> getUsernameByGroup(String groupName) {
List<String> onlinelist = new ArrayList<String>();
List<RosterEntry> userList = getAllFriendsByGroup(groupName);
for (int i = 0; i < userList.size(); i++) {
if (!connection.getRoster().getPresence(userList.get(i).getUser())
.toString().contains("unavailable"))
onlinelist.add(userList.get(i).getUser());
}
return onlinelist;
}
/**
* 获取所有分组列表
*/
public List<RosterGroup> getAllGroups() {
List<RosterGroup> groupsList = new ArrayList<RosterGroup>();
Collection<RosterGroup> rosterGroup = connection.getRoster()
.getGroups();
Iterator<RosterGroup> i = rosterGroup.iterator();
while (i.hasNext())
groupsList.add(i.next());
return groupsList;
}
/**
* 断开XMPP连接
*/
public void disconnect() {
connection.disconnect();
connection = null;
}
/**
* 添加组
*/
public boolean addGroup(String groupName) {
try {
connection.getRoster().createGroup(groupName);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除组
*/
public static boolean removeGroup(Roster roster, String groupName) {
return false;
}
/**
* 获取openfire服务域名
*/
public String getServiceName() {
return connection.getServiceName();
}
public String getUser() {
return connection.getUser();
}
/**
* 添加好友
*/
public static boolean addUser(Roster roster, String userName, String name) {
try {
roster.createEntry(userName, name, null);
return true;
} catch (Exception e) {
e.printStackTrace();
//TerminalMessageManager.getInstance().addSysLog("xmpp","add user error",GlobalResource.getInstance().ERROR);
return false;
}
}
/**
* 添加好友
*
* @param roster
* @param userName
* @param name
* @return
*/
public static boolean addUser(Roster roster, String userName, String name,
String groupName) {
try {
roster.createEntry(userName, name, new String[] { groupName });
return true;
} catch (Exception e) {
e.printStackTrace();
//TerminalMessageManager.getInstance().addSysLog("xmpp","add user with group error",GlobalResource.getInstance().ERROR);
return false;
}
}
//发送消息并记录日志,content 是一个完整的协议,参考终端管理系统协议
public String sendMessageSyncT(String userName, String msg) {
Message message = new Message();
String content = msg;
System.out.println("--------------"+content+"-------------");
message.setBody(content);
message.setTo(userName);
PacketFilter filter = new PacketIDFilter(message.getPacketID());
PacketCollector myCollector = connection.createPacketCollector(filter);
//TerminalMessageManager.getInstance().addSysLog("xmpp","sendMessageSync:content:\t"+content,GlobalResource.getInstance().DEBUG);
// Send create & join packet.
connection.sendPacket(message);
// 接着, 我们创建一个 packet listener. 方便起见我们使用匿名内部类.
PacketListener myListener = new PacketListener() {
public void processPacket(Packet packet) {
// 当包到的时候你做什么.
if(packet instanceof Message) {
System.out.println("From: " + packet.getFrom() + "\n");
System.out.println("Body: " + ((Message)packet).getBody());
}
//myCollector.cancel();
}
};
// 注册.
connection.addPacketListener(myListener, filter);
return "sucess";
}
-------------------------
//发送消息并记录日志,content 是一个完整的协议,参考终端管理系统协议
public String sendMessageSync(String userName, String msg) {
Message message = new Message();
String content = msg;
System.out.println("--------------"+content+"-------------");
message.setBody(content);
message.setTo(userName);
PacketFilter filter = new PacketIDFilter(message.getPacketID());
PacketCollector myCollector = connection.createPacketCollector(filter);
//TerminalMessageManager.getInstance().addSysLog("xmpp","sendMessageSync:content:\t"+content,GlobalResource.getInstance().DEBUG);
// Send create & join packet.
connection.sendPacket(message);
// Wait up to a certain number of seconds for a reply.
int time = 0;
String result = "";
String body = "";
//如果结果是success,或者error,timeout,都会退出
Packet packet = myCollector.nextResult(5000);
myCollector.cancel();
System.out.println("From: " + packet.getFrom() + "\n");
// when receiving prc's Message, just say something else again
// Interprete the result and answer the privacy only if it is valid
if (packet == null) {
result = "time_out";
}else if (packet.getError() != null) {
result = "pack_error";
}else{
if(packet instanceof Message) {
Message msg1 = (Message)packet;
System.out.println("From: " + msg1.getFrom() + "\n");
System.out.println("Body: " + msg1.getBody());
result = msg1.getBody();
}
}
return result;
}
--------------------------
//发送消息,立刻返回,并记录日志,content是完成的管理协议,包含msg id 方便日后检索结果
public String sendMessageAsync(String userName, String msg) {
Message message = new Message();
String content = msg;
System.out.println("--------------"+content+"-------------");
message.setBody(content);
message.setTo(userName);
connection.sendPacket(message);
System.out.println(userName);
try {
// 分析content内容,归类
//TerminalManager.getDataSevice().addMgrTermLog(message.getPacketID(), proto.type(), userName, content ,"Async");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
MysqlService log = new MysqlService();
userName = userName.substring(0, userName.indexOf("@"));
try {
log.savelog(userName, content);
log.close();
} catch (Exception e) {
e.printStackTrace();
}*/
return message.getPacketID();
}
--------------------
//修改组名
public void renameGroup(String groupName,String newName)
{
connection.getRoster().getGroup(groupName).setName(newName);
}
--------------------
//通过用户名查找该用户所在的组
public String getGroupByUsername(String username)
{
return connection.getRoster().getEntry(username).getGroups().iterator().next().getName();
}
--------------------
//修改终端昵称和分组
public void editTerminal(String userName,String nickName,String group)
{
try
{
connection.getRoster().createEntry(userName, nickName, new String[]{group});
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//TerminalMessageManager.getInstance().addSysLog("xmpp","edit user error",GlobalResource.getInstance().ERROR);
}
}
--------------------
public void add2FriendsGroup(String addr)
{
try {
connection.getRoster().createEntry(addr,
addr.substring(0, addr.indexOf("@")),
new String[] { "friends" });
} catch (XMPPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//TerminalMessageManager.getInstance().addSysLog("xmpp","add user to friend error",GlobalResource.getInstance().ERROR);
}
}
}