All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jivesoftware.openfire.crowd.CrowdVCardProvider Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 Issa Gorissen . All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jivesoftware.openfire.crowd;

import java.io.StringReader;
import java.util.concurrent.ConcurrentHashMap;

import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jivesoftware.openfire.crowd.jaxb.User;
import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.openfire.vcard.DefaultVCardProvider;
import org.jivesoftware.util.AlreadyExistsException;
import org.jivesoftware.util.NotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * VCard provider for Crowd.
 * 
 * 

The name, email will be provided by crowd. All other information * can be managed by the XMPP client */ public class CrowdVCardProvider extends DefaultVCardProvider { private static final Logger LOG = LoggerFactory.getLogger(CrowdVCardProvider.class); private static final String VCARD_TEMPLATE = "@displayname@@lastname@@firstname@@nickname@@email@"; private static final ConcurrentHashMap MUTEX = new ConcurrentHashMap<>(); /** * @see org.jivesoftware.openfire.vcard.DefaultVCardProvider#loadVCard(java.lang.String) */ @Override public Element loadVCard(String username) { if (LOG.isDebugEnabled()) { LOG.debug("loadvcard:" + username); } if (MUTEX.containsKey(username)) { // preventing looping return null; } try { MUTEX.put(username, username); Element vcard = super.loadVCard(username); if (vcard == null) { CrowdUserProvider userProvider = (CrowdUserProvider) UserManager.getUserProvider(); try { User user = userProvider.getCrowdUser(username); String str = VCARD_TEMPLATE.replace("@displayname@", user.displayName) .replace("@lastname@", user.lastName) .replace("@firstname@", user.firstName) .replace("@email@", user.email) .replace("@nickname@", username); SAXReader xmlReader = new SAXReader(); xmlReader.setEncoding("UTF-8"); vcard = xmlReader.read(new StringReader(str)).getRootElement(); } catch (UserNotFoundException unfe) { LOG.error("Unable to find user:" + String.valueOf(username) + " for loading its vcard", unfe); return null; } catch (DocumentException de) { LOG.error("vcard parsing error", de); return null; } if (LOG.isDebugEnabled()) { LOG.debug(vcard != null ? vcard.asXML() : "vcard is null"); } // store this new vcard if (vcard != null) { try { createVCard(username, vcard); } catch (AlreadyExistsException aee) { LOG.error("Unable to create and store a new vcard for user:" + username + "; one already exists", aee); } } } return vcard; } catch (RuntimeException re) { LOG.error("Failure occured when loading a vcard for user:" + username, re); throw re; } finally { MUTEX.remove(username); } } /** * @see org.jivesoftware.openfire.vcard.DefaultVCardProvider#createVCard(java.lang.String, org.dom4j.Element) */ @Override public Element createVCard(String username, Element vCardElement) throws AlreadyExistsException { if (LOG.isDebugEnabled()) { LOG.debug("createvcard:" + vCardElement.asXML()); } return super.createVCard(username, vCardElement); } /** * @see org.jivesoftware.openfire.vcard.DefaultVCardProvider#updateVCard(java.lang.String, org.dom4j.Element) */ @Override public Element updateVCard(String username, Element vCard) throws NotFoundException { // make sure some properties have not been overridden Element nickNameNode = vCard.element("NICKNAME"); Element displayNameNode = vCard.element("FN"); Element nameNode = vCard.element("N"); Element lastNameNode = nameNode.element("FAMILY"); Element firstnameNode = nameNode.element("GIVEN"); Element emailNode = vCard.element("EMAIL").element("USERID"); CrowdUserProvider userProvider = (CrowdUserProvider) UserManager.getUserProvider(); try { User user = userProvider.getCrowdUser(username); nickNameNode.setText(username); displayNameNode.setText(user.displayName); lastNameNode.setText(user.lastName); firstnameNode.setText(user.firstName); emailNode.setText(user.email); } catch (UserNotFoundException unfe) { LOG.error("Unable to find user:" + String.valueOf(username) + " for updating its vcard", unfe); } if (LOG.isDebugEnabled()) { LOG.debug("updatevcard:" + vCard.asXML()); } return super.updateVCard(username, vCard); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy