/*
* System Abbrev :
* system Name :
* Component No :
* Component Name:
* File name :ChatLogsInterceptor.java
* Author :Peter.Qiu
* Date :2016年12月14日
* Description : <description>
*/
/* Updation record 1:
* Updation date : 2016年12月14日
* Updator : Peter.Qiu
* Trace No: <Trace No>
* Updation No: <Updation No>
* Updation Content: <List all contents of updation and all methods updated.>
*/
package com.qiuzhping.openfire.plugin;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;
import org.jivesoftware.database.SequenceManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import org.xmpp.packet.Presence;
import com.qiuzhping.openfire.plugin.entity.ChatLogs;
import com.qiuzhping.openfire.plugin.entity.ChatLogs.ChatLogsConstants;
/**
* <Description functions in a word>
*
* <Detail description>
*
* @author Peter.Qiu
* @version [Version NO, 2016年12月14日]
* @see [Related classes/methods]
* @since [product/module version]
*/
public class ChatLogsInterceptor implements PacketInterceptor {
public static final String MESSAGE_TYPE = "messageType";// 聊天记录类型
public static final String BODY_CONTEXT = "bodyContext";// 聊天记录内容
private ChatLogsDbManager logsManager = ChatLogsDbManager.getInstance();
public ChatLogsInterceptor() {
}
/**
* 拦截消息核心方法,Packet就是拦截消息对象
* @param packet
* @param session
* @param incoming
* @param processed
* @throws PacketRejectedException
*/
@Override
public void interceptPacket(Packet packet, Session session,
boolean incoming, boolean processed) throws PacketRejectedException {
if (session != null) {
debug(packet, incoming, processed, session);
}
this.doAction(packet, incoming, processed, session);
}
/** <Description functions in a word>
* 执行保存/分析聊天记录动作
* <Detail description>
* @author Peter.Qiu
* @param packet
* @param incoming
* @param processed
* @param session [Parameters description]
* @return void [Return type description]
* @exception throws [Exception] [Exception description]
* @see [Related classes#Related methods#Related properties]
*/
private void doAction(Packet packet, boolean incoming, boolean processed,
Session session) {
Packet copyPacket = packet.createCopy();
if (packet instanceof Message) {
Message message = (Message) copyPacket;
// 一对一聊天,单人模式
if (message.getType() == Message.Type.chat) {
logsManager.add(this.get(packet, incoming, session));
// 群聊天,多人模式
} else if (message.getType() == Message.Type.groupchat) {
logsManager.add(this.get(packet, incoming, session));
// 其他信息
} else {
logsManager.add(this.get(packet, incoming, session));
}
} else if (packet instanceof IQ) {
IQ iq = (IQ) copyPacket;
if (iq.getType() == IQ.Type.set && iq.getChildElement() != null
&& "session".equals(iq.getChildElement().getName())) {
System.out.println("用户登录成功Start======================");
System.out.println("用户登录成功:"+iq.toXML());
System.out.println("用户登录成功End=======================");
}
} else if (packet instanceof Presence) {
Presence presence = (Presence) copyPacket;
if (presence.getType() == Presence.Type.unavailable) {
System.out.println("用户退出服务器成功Start======================");
System.out.println("用户退出服务器成功:" + presence.toXML());
System.out.println("用户退出服务器成功End========================");
}
}
}
/** <Description functions in a word>
* 创建一个聊天记录实体对象,并设置相关数据
* <Detail description>
* @author Peter.Qiu
* @param packet 数据包
* @param incoming 如果为ture就表明是发送者
* @param session 当前用户session
* @return [Parameters description]
* @return ChatLogs [Return type description]
* @exception throws [Exception] [Exception description]
* @see [Related classes#Related methods#Related properties]
*/
private ChatLogs get(Packet packet, boolean incoming, Session session) {
//保留发送者信息.
/*if (packet == null || !incoming) {
return null;
}*/
Message message = (Message) packet;
ChatLogs logs = new ChatLogs();
JID jid = session.getAddress();
logs.setSender(jid.getNode());
JID recipient = message.getTo();
logs.setReceiver(recipient.getNode());
//自己发送的信息不用保存.
if (logs.getSender() != null && logs.getReceiver() != null
&& logs.getSender().equalsIgnoreCase(logs.getReceiver())) {
return null;
}
logs.setContent(message.getBody());
logs.setCreateDate(new Timestamp(new Date().getTime()));
logs.setDetail(message.toXML());
logs.setLength(logs.getContent().length());
logs.setState(0);
logs.setSessionJID(jid.toString());
// 生成主键id,利用序列生成器
long messageID = SequenceManager.nextID(ChatLogsConstants.CHAT_LOGS);
logs.setMessageId(messageID);
//解析body.json
//messageType: 聊天记录类型
//bodyContext:聊天记录内容
System.out.println("解析ParseBody聊天body Start=====================");
System.out.println("message.getBody():" + message.getBody());
Map<String, String> body = parseBody(message.getBody());
if (body != null) {
System.out.println("解析body.json");
logs.setMessageType(body.get(MESSAGE_TYPE));
logs.setContent(body.get(BODY_CONTEXT));
}
System.out.println("解析ParseBody聊天body End=====================");
return logs;
}
/** <Description functions in a word>
* messageType: 聊天记录类型
* bodyContext: 聊天记录内容
* <Detail description>
* @author Peter.Qiu
* @param body
* @return [Parameters description]
* @return Map<String,String> [Return type description]
* @exception throws [Exception] [Exception description]
* @see [Related classes#Related methods#Related properties]
*/
private Map<String, String> parseBody(String body) {
if (body == null || body.length() < 10) {
return null;
}
try {
JSONObject json = JSONObject.fromObject(body);
System.out.println("parseBody:"+ json);
if (json != null) {
Map<String, String> bodyMap = new HashMap<String, String>();
String messageType = json.getString(MESSAGE_TYPE);
if (messageType == null || Integer.parseInt(messageType) < 0) {
return null;
}
bodyMap.put(MESSAGE_TYPE, json.getString(MESSAGE_TYPE));
bodyMap.put(BODY_CONTEXT, json.getString(BODY_CONTEXT));
return bodyMap;
}
} catch (Exception e) {
System.out.println("parseBody转换JSON失败:"+ e);
return null;
}
return null;
}
/** <Description functions in a word>
* 打印日志.
* <Detail description>
* @author Peter.Qiu
* @param packet
* @param incoming
* @param processed
* @param session [Parameters description]
* @return void [Return type description]
* @exception throws [Exception] [Exception description]
* @see [Related classes#Related methods#Related properties]
*/
private void debug(Packet packet, boolean incoming, boolean processed,
Session session) {
long start = System.currentTimeMillis();
System.out.println("###################debug start “"+start+"” ###################");
String info = "[ packetID: " + packet.getID() + ", to: "
+ packet.getTo() + ", from: " + packe
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Openfire插件开发实例.zip (30个子文件)
bin
com
qiuzhping
openfire
plugin
ChatLogsDbManager.class 3KB
ChatLogsPlugin.class 2KB
entity
ChatLogs$LogState.class 314B
ChatLogs.class 3KB
ChatLogs$ChatLogsConstants.class 709B
ChatLogsInterceptor.class 7KB
plugin.xml 521B
ChatPlugin.jar 9KB
.settings
org.eclipse.jdt.core.prefs 598B
src
plugins
ChatPlugin
com
qiuzhping
openfire
plugin
ChatLogsPlugin.java 1KB
ChatLogsDbManager.java 2KB
ChatLogsInterceptor.java 9KB
entity
ChatLogs.java 3KB
plugin.xml 521B
.project 390B
.classpath 1KB
lib
ezmorph-1.0.6.jar 84KB
commons-collections-3.2.1.jar 562KB
commons-beanutils-1.8.0.jar 226KB
jasper-runtime.jar 75KB
json-lib-2.3-jdk15.jar 148KB
commons-codec-1.9.jar 258KB
commons-logging-1.2.jar 60KB
jasper-compiler.jar 398KB
commons-io-2.2.jar 170KB
commons-lang-2.5.jar 273KB
servlet.jar 129KB
openfire.jar 7.26MB
build
build.xml 1KB
build.properties 145B
共 30 条
- 1
资源评论
- SingleMore2018-02-02。。。。。好
- hope109872018-04-23不错,可用
Nocturne2011
- 粉丝: 68
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功