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字段,不是全部返回给客户端。
  • 相关阅读:
    VML编程之shape多边型.shapetype模版.shape与curve曲线《VML极道教程》原著:沐缘华
    VML编程之image图片《VML极道教程》原著:沐缘华
    软件开发项目的风险管理 (转)
    VML编程之polyline多边型《VML极道教程》原著:沐缘华
    VML编程之标记实战与line线《VML极道教程》原著:沐缘
    xml操作类,封装了常用的对XML文件的操作功能....
    Bugzilla 安装手册
    IT项目管理之<<少林练步拳>>(转)
    Atlas学习手记(8):调用本地Web Service简单介绍(转摘)
    WF从设计器出发,到对从设计器出来的工作流的调用加载,已经完成了整个工作流的详细设计,目前工作流设计器已经完成!
  • 原文地址:https://www.cnblogs.com/jizha/p/openfire_vcard.html
Copyright © 2011-2022 走看看