[原]OpenFire Vcard的代码分析
VCardProvider:
所有提供vcard服务的程序需要实现的接口,包括如下功能:
- loadVCard:通过用户名加载vcard
- createVCard:新建vcard
- updateVCard:更新已有vcard
- deleteVCard:删除vcard
- isReadOnly:vcardProvider是否为只读(不允许写入和更新)
DefaultVCardProvider implements VCardProvider:
1、提供对VCardProvider接口的默认实现,从本地数据表ofvcard中读写数据。当然也可以有其他实现,如从ldap数据源获取vcard信息,只需要实现该VCardProvider接口即可。
2、因为是本地数据库,所有isReadOnly方法返回false,代表可读可写。
3、在表ofproperty表中,有如下的一条记录:
provider.vcard.className org.jivesoftware.openfire.vcard.DefaultVCardProvider
代表openfire目前在用的VCardProvider是DefaultVCardProvider,如果自己实现的其他的vcard源,可以自己实现一个VCardProvider来替换掉,只需要更改掉该条记录即可。
VCardManager extends BasicModule:
1、实现对用户vcard信息的管理,功能有提供基本的vcard增删改查操作、vcard缓存操作、vcard事件管理操作等
2、在该模块进行实例化时(系统启动时),在构造函数中使用CacheFactory.createCache(cacheName)方法创建了vcard缓存,并且订阅了vcard的事件(创建、更新、删除),在事件处理中更新vcard缓存
3、在加载vcard信息的时候,先查询缓存中是否含有该用户的vcard信息,没有的话再查询数据库。并把查询的结果更新到缓存中。
4、调用VCardProvider的相关方法进行vcard的查询和设置vcard信息,并在完成后,使用下面的方法更新缓存和激发事件。
更新缓存:
vcardCache.put(username, newvCard);
分发事件:
// Dispatch vCard events
if (created) {
// Alert listeners that a new vCard has been created
VCardEventDispatcher.dispatchVCardCreated(username, newvCard);
} else if (updated) {
// Alert listeners that a vCard has been updated
VCardEventDispatcher.dispatchVCardUpdated(username, newvCard);
}
// Alert listeners that a new vCard has been created
VCardEventDispatcher.dispatchVCardCreated(username, newvCard);
} else if (updated) {
// Alert listeners that a vCard has been updated
VCardEventDispatcher.dispatchVCardUpdated(username, newvCard);
}
5、由于继承了BasicModule类,有如下的处理:
1)实现了initialize方法,通过下面的方法找到配置的相应的provider方法,如果没有,返回默认的provier
String className = JiveGlobals.getProperty("provider.vcard.className",
DefaultVCardProvider.class.getName());
DefaultVCardProvider.class.getName());
2)实现了start方法,在该方法中订阅用户事件
UserEventDispatcher.addListener(eventHandler);
在该事件的处理方法中,如果发现用户被删除,则调用方法删除该用户的缓存及vcard。
org.jivesoftware.openfire.handler.IQvCardHandler
1、用于接受客户端发来的vcard相关请求(获取vcard和设置vcard)
2、handleIQ()方法调用VCardManager的setVCard和getVCard方法来操作vcard信息。
3、在iq=get的时候,判断发来的请求是否需要过滤掉部分vcard字段,不是全部返回给客户端。