OpenFire源码学习之二十二:openfie对用户的优化(下)

用户名片

在预初始化中,贴出来用户名片的程序。这里也一样不在重复。

首先同样先修改系统属性:

provider.vcard.className

org.jivesoftware.util.redis.expand.RedisVCardProvider

然后需要修改VCardManager名片管理这个类。

RedisVCardProvider:

import redis.clients.jedis.Jedis;public class RedisVCardProvider implements VCardProvider {private static final Logger Log = LoggerFactory.getLogger(RedisVCardProvider.class);private static final String DELETE_PROPERTIES ="DELETE FROM ofVCard WHERE username=?";private static final String UPDATE_PROPERTIES ="UPDATE ofVCard SET vcard=? WHERE username=?";private static final String INSERT_PROPERTY ="INSERT INTO ofVCard (username, vcard) VALUES (?, ?)";private static final int POOL_SIZE = 10;private BlockingQueue<SAXReader> xmlReaders = new LinkedBlockingQueue<SAXReader>(POOL_SIZE);public RedisVCardProvider() {super();// Initialize the pool of sax readersfor (int i=0; i<POOL_SIZE; i++) {SAXReader xmlReader = new SAXReader();xmlReader.setEncoding("UTF-8");xmlReaders.add(xmlReader);}}@Overridepublic Element loadVCard(String username) {synchronized (username.intern()) {Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();Element vCardElement = null;SAXReader xmlReader = null;try {// Get a sax reader from the poolxmlReader = xmlReaders.take();String usercard = jedis.get("OFVCARD:" + username);if (usercard == null || "".equals(usercard)) {return XMPPServer.getInstance().getJedisConfDao().getVCardProvider().loadVCard(username);}vCardElement = xmlReader.read(new StringReader(usercard)).getRootElement();}catch (Exception e) {Log.error("Error loading vCard of username: " + username, e);}finally {if (xmlReader != null) {xmlReaders.add(xmlReader);}XMPPServer.getInstance().getUserJedis().returnRes(jedis);}return vCardElement;}}@Overridepublic Element createVCard(String username, Element vCardElement)throws AlreadyExistsException {……}@Overridepublic Element updateVCard(String username, Element vCardElement)throws NotFoundException {……}@Overridepublic void deleteVCard(String username) {……}@Overridepublic boolean isReadOnly() {// TODO Auto-generated method stubreturn false;}}

VCardManager

/** * Manages VCard information for users. * * @author Matt Tucker */public class VCardManager extends BasicModule implements ServerFeaturesProvider {private static final Logger Log = LoggerFactory.getLogger(VCardManager.class);private VCardProvider provider;private static VCardManager instance;private EventHandler eventHandler;private static HmThreadPool threadPool = new HmThreadPool(5);public static VCardManager getInstance() {return instance;}public static VCardProvider getProvider() {return instance.provider;}public VCardManager() {super("VCard Manager");//String cacheName = "VCard";//vcardCache = CacheFactory.createCache(cacheName);this.eventHandler = new EventHandler();// Keeps the cache updated in case the vCard action was not performed by VCardManagerVCardEventDispatcher.addListener(new VCardListener() {public void vCardCreated(String username, Element vCard) {// Since the vCard could be created by the provider, add it to the cache.//vcardCache.put(username, vCard);Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();try {jedis.set("OFVCARD:" + username, vCard.asXML());} finally {XMPPServer.getInstance().getUserJedis().returnRes(jedis);}}public void vCardUpdated(String username, Element vCard) {// Since the vCard could be updated by the provider, update it to the cache.//vcardCache.put(username, vCard);vCardCreated(username, vCard);}public void vCardDeleted(String username, Element vCard) {// Since the vCard could be delated by the provider, remove it to the cache.//vcardCache.remove(username);Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();try {jedis.del("OFVCARD:" + username);} finally {XMPPServer.getInstance().getUserJedis().returnRes(jedis);}}});}public String getVCardProperty(String username, String name) {……}public void setVCard(String username, Element vCardElement) throws Exception {boolean created = false;boolean updated = false;if (provider.isReadOnly()) {throw new UnsupportedOperationException("VCard provider is read-only.");}//Element newvCard = null;Jedis jedis = XMPPServer.getInstance().getUserJedis().getJedis();try {boolean exists = jedis.exists("OFVCARD:" + username);if (exists) {threadPool.execute(createTaskByUpdateVCard(provider, username, vCardElement));updated = true;}else {threadPool.execute(createTaskByCreateVCard(provider, username, vCardElement));created = true;}}finally {XMPPServer.getInstance().getUserJedis().returnRes(jedis);}// Dispatch vCard eventsif (created) {// Alert listeners that a new vCard has been createdVCardEventDispatcher.dispatchVCardCreated(username, vCardElement);} else if (updated) {// Alert listeners that a vCard has been updatedVCardEventDispatcher.dispatchVCardUpdated(username, vCardElement);}}private Runnable createTaskByCreateVCard(final VCardProvider provider, final String username,final Element vCardElement) {return new Runnable() {public void run() {try {provider.createVCard(username, vCardElement);} catch (AlreadyExistsException e) {Log.error("AlreadyExistsException: username=" + username + ", vCardElement=" + vCardElement);}}};}private Runnable createTaskByUpdateVCard(final VCardProvider provider, final String username,final Element vCardElement) {return new Runnable() {public void run() {try {provider.updateVCard(username, vCardElement);} catch (NotFoundException e) {Log.error("NotFoundException: username=" + username + ", vCardElement=" + vCardElement);}}};}public void deleteVCard(String username) {if (provider.isReadOnly()) {throw new UnsupportedOperationException("VCard provider is read-only.");}final String vusername = username;threadPool.execute(new Runnable() {@Overridepublic void run() {provider.deleteVCard(vusername);}});VCardEventDispatcher.dispatchVCardDeleted(username, null);}public Element getVCard(String username) {Element vCardElement = getOrLoadVCard(username);return vCardElement == null ? null : vCardElement.createCopy();}private Element getOrLoadVCard(String username) {return provider.loadVCard(username);}@Overridepublic void initialize(XMPPServer server) {……}@Overridepublic void start() {……}@Overridepublic void stop() {// Remove this module as a user event listenerUserEventDispatcher.removeListener(eventHandler);}public void reset() {//vcardCache.clear();}@Overridepublic Iterator<String> getFeatures() {ArrayList<String> features = new ArrayList<String>();features.add("redis-vcard-temp");return features.iterator();}private class EventHandler extends UserEventAdapter {@Overridepublic void userDeleting(User user, Map params) {try {deleteVCard(user.getUsername());} catch (UnsupportedOperationException ue) { /* Do Nothing */ }}}public UserCardEnity getUserCardByUserName (String username) {Element element = getVCard(username);UserCardEnity uce = new UserCardEnity();if (element != null) {String myName = element.elementText("MYNAME");String sex = element.elementText("SEX");String oname = element.elementText("ONAME");String moblie = element.elementText("MOBILE");String landline = element.elementText("LANDLINE");String address = element.elementText("ADDRESS");String workUnit = element.elementText("WORKUNIT");String birthday = element.elementText("BIRTHDAY");String photo = element.elementText("PHOTO");String userType = element.elementText("USERTYPE");uce.setMyName( myName);uce.setSex(sex);uce.setOname(oname);uce.setMoblie( moblie) ;uce.setLandline(landline);uce.setAddress(address);uce.setWorkUnit(workUnit) ;uce.setBirthday(birthday);uce.setPhoto(photo);if (userType == null) {uce.setUserType("");}else if (1 == Integer.valueOf(userType)) {uce.setUserType("student");}else if (2 == Integer.valueOf(userType)) {uce.setUserType("teacher");}else if (3 == Integer.valueOf(userType)) {uce.setUserType("Guardian");}else if (4 == Integer.valueOf(userType)) {uce.setUserType("edusun admin");}else if (5 == Integer.valueOf(userType)) {uce.setUserType("Agents");}else {uce.setUserType("Other locations");}}return uce;}}

用户名片就到这了。

用户搜索

搜索用户的时候,在openfire中都是重新查找关系数据库的。因为我们已经将用户预加载到了redis中。那么这里只需要对用户做一些分词存储检索即可。

本人在这里做了比较简单的分词处理。比如用户名,手机号码等。

年轻是我们唯一拥有权利去编织梦想的时光

OpenFire源码学习之二十二:openfie对用户的优化(下)

相关文章:

你感兴趣的文章:

标签云: