openfire是一个扩张性比较好的xmpp服务器框架,最近公司准备用这个做移动端im,然后就研究了下用户数据库的整合...
用户整合是比较简单的...网上很多资料...在系统属性里添加个用户数据库的连接,再加几个基本的查询用户的sql,定义一些用户字段的映射,基本就ok了,不用写写什么代码..
然后就是整合好友列表,一般不太会有这个需求,因为差不多只用这个当im,好友列表都走自己的接口,但是像spark这样的客户端是走的openfire自带的好友关系,所以要让这个里边显示自己用户系统中的好友列表的话,就需要整合好友列表..然后去网上找这个..没找到有关资料..
接下来就用jd看了下openfire反编译后的源码...
包的结构和清晰,按模块分包.
发现好友关系模块(包名org.jivesoftware.openfire.roster)里边值有一个DefaultRosterItemProvider 并没有像用户模块一样有JDBCProvider的扩展..
所有我们就得自己来实现这个东西了...
但是怎么让openfire用我们自己实现的模块有事个问题...开始想过自己实现一个直接覆盖jar包里的class,但始终感觉不妥..
然后就找它的根....
发现在 RosterManager 这个类里边实例化 RosterItemProvider 的时候会在系统属性里找 provider.roster.className 这个属性....惊喜中~~~
如果有这个属性他会把这个属性所指向的类作为好友管理类.. 你只用实现 RosterItemProvider 接口
1 package org.jivesoftware.openfire.roster; 2 3 import java.util.Iterator; 4 import org.jivesoftware.openfire.user.UserAlreadyExistsException; 5 import org.jivesoftware.openfire.user.UserNotFoundException; 6 7 public abstract interface RosterItemProvider 8 { 9 public abstract RosterItem createItem(String paramString, RosterItem paramRosterItem) 10 throws UserAlreadyExistsException; 11 12 public abstract void updateItem(String paramString, RosterItem paramRosterItem) 13 throws UserNotFoundException; 14 15 public abstract void deleteItem(String paramString, long paramLong); 16 17 public abstract Iterator<String> getUsernames(String paramString); 18 19 public abstract int getItemCount(String paramString); 20 21 public abstract Iterator<RosterItem> getItems(String paramString); 22 }
然后更加自己的用户系统结构给查接口中需要的数据(具体可以参考 DefaultRosterItemProvider 的实现)
openfire好友关系表字段解释可参考 http://hi.baidu.com/wangguoqingsll/item/77cec2f1fce2bc7d3d198b81
下边是我用的几个字段的值(写死了,因为我们是sns用户系统,单向好友关系)
//substate 2
//askstatus -1
//recvstatus -1