Package jetbrains.communicator.jabber.impl

Source Code of jetbrains.communicator.jabber.impl.JabberSyncUserMessage

/*
* Copyright 2000-2006 JetBrains s.r.o.
*
* 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 jetbrains.communicator.jabber.impl;

import jetbrains.communicator.core.EventVisitor;
import jetbrains.communicator.core.dispatcher.Message;
import jetbrains.communicator.core.users.User;
import jetbrains.communicator.core.users.UserEvent;
import static jetbrains.communicator.core.users.UserEvent.Updated.DISPLAY_NAME;
import static jetbrains.communicator.core.users.UserEvent.Updated.GROUP;
import jetbrains.communicator.jabber.JabberFacade;
import org.apache.log4j.Logger;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPException;

/** Propagate local changes to Jabber Roster*/
class JabberSyncUserMessage implements Message {
  private static final Logger LOG = Logger.getLogger(JabberSyncUserMessage.class);
  private final UserEvent myEvent;

  JabberSyncUserMessage(UserEvent event) {
    myEvent = event;
  }

  public boolean send(User user) {
    final JabberTransport jabberTransport = JabberTransport.getInstance();
    if (jabberTransport != null && jabberTransport.isOnline()) {
      final Roster roster = jabberTransport.getFacade().getConnection().getRoster();
      final RosterEntry userEntry = roster.getEntry(myEvent.getUser().getName());
      if (userEntry != null) {
        jabberTransport.runIngnoringUserEvents(new Runnable() {
          public void run() {
            processEvent(jabberTransport.getFacade(), userEntry);
          }
        });
      }
      return true;
    }
    return false;
  }

  private void processEvent(final JabberFacade jabberFacade, final RosterEntry userEntry) {
    myEvent.accept(new EventVisitor(){
      @Override public void visitUserUpdated(UserEvent.Updated event) {
        try {
          if (GROUP.equals(event.getPropertyName())) {
            changeUsersGroup(event, jabberFacade.getConnection().getRoster(), userEntry);
          } else if (DISPLAY_NAME.equals(event.getPropertyName())) {
            userEntry.setName((String) event.getNewValue());
          }
        } catch (XMPPException e) {
          processXMPPException(e, event);
        }
      }

      @Override public void visitUserRemoved(UserEvent.Removed event) {
        try {
          jabberFacade.changeSubscription(userEntry.getUser(), false);
          jabberFacade.getConnection().getRoster().removeEntry(userEntry);
        } catch (XMPPException e) {
          processXMPPException(e, event);
        }
      }
    });
  }

  private void processXMPPException(XMPPException e, UserEvent event) {
    if (e.getXMPPError() == null || e.getXMPPError().getCode() != 406) { // Not acceptable
      final String s = e.getMessage() + "\nLocal event: " + event;
      LOG.error(s);
      LOG.info(s, e);
    }
  }

  private void changeUsersGroup(UserEvent.Updated event, final Roster roster, final RosterEntry userEntry) throws XMPPException {
    RosterGroup oldGroup = roster.getGroup((String) event.getOldValue());
    RosterGroup newGroup = roster.getGroup((String) event.getNewValue());
    if (oldGroup != null) {
      oldGroup.removeEntry(userEntry);
    }

    if (newGroup == null) {
      newGroup = roster.createGroup((String) event.getNewValue());
    }
    newGroup.addEntry(userEntry);
  }

  public String toString() {
    return "JabberSyncUserMessage: " + myEvent;
  }
}
TOP

Related Classes of jetbrains.communicator.jabber.impl.JabberSyncUserMessage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.