zoukankan      html  css  js  c++  java
  • [原]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);
            }
    5、由于继承了BasicModule类,有如下的处理:
    1)实现了initialize方法,通过下面的方法找到配置的相应的provider方法,如果没有,返回默认的provier
              String className = JiveGlobals.getProperty("provider.vcard.className",
                    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字段,不是全部返回给客户端。
  • 相关阅读:
    imp.load_source的用法
    第12周翻译
    第十周学习笔记
    翻译:高级t
    t-sql
    9周学习笔记
    第8周学习笔记
    t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数
    数据库设计层次3:构建表
    第七周学习笔记
  • 原文地址:https://www.cnblogs.com/jizha/p/openfire_vcard.html
Copyright © 2011-2022 走看看