transportsession.java
来自「基于Jabber协议的即时消息服务器」· Java 代码 · 共 400 行
JAVA
400 行
/** * $Revision$ * $Date$ * * Copyright (C) 2006 Jive Software. All rights reserved. * * This software is published under the terms of the GNU Public License (GPL), * a copy of which is included in this distribution. */package org.jivesoftware.wildfire.gateway;import org.xmpp.packet.JID;import org.jivesoftware.wildfire.user.UserNotFoundException;import org.jivesoftware.wildfire.roster.RosterItem;import org.jivesoftware.wildfire.roster.Roster;import org.jivesoftware.util.Log;import java.util.TreeMap;import java.util.ArrayList;/** * Interface for a transport session. * * This outlines all of the functionality that is required for a transport * to implement. These are functions that the XMPP side of things are going * interact with. The legacy transport itself is expected to handle messages * going to the Jabber user. * * @author Daniel Henninger */public abstract class TransportSession implements Runnable { /** * Creates a TransportSession instance. * * @param registration Registration this session is associated with. * @param jid JID of user associated with this session. * @param transport Transport this session is associated with. */ public TransportSession(Registration registration, JID jid, BaseTransport transport) { this.jid = new JID(jid.toBareJID()); this.registration = registration; this.transport = transport; Log.debug("Created "+transport.getType()+" session for "+jid+" as '"+registration.getUsername()+"'"); } /** * Convenience constructor that includes priority. * * @param registration Registration this session is associated with. * @param jid JID of user associated with this session. * @param transport Transport this session is associated with. * @param priority Priority associated with session. */ public TransportSession(Registration registration, JID jid, BaseTransport transport, Integer priority) { this.jid = new JID(jid.toBareJID()); this.registration = registration; this.transport = transport; addResource(jid.getResource(), priority); Log.debug("Created "+transport.getType()+" session for "+jid+" as '"+registration.getUsername()+"'"); } /** * Registration that this session is associated with. */ public Registration registration; /** * Transport this session is associated with. */ public BaseTransport transport; /** * The bare JID the session is associated with. */ public JID jid; /** * All JIDs (including resources) that are associated with this session. */ public TreeMap<Integer,String> resources = new TreeMap<Integer,String>(); /** * Is this session valid? Set to false when session is done. */ public boolean validSession = true; /** * The current login status on the legacy network. */ public TransportLoginStatus loginStatus = TransportLoginStatus.LOGGED_OUT; /** * Supported features. */ public ArrayList<SupportedFeature> supportedFeatures = new ArrayList<SupportedFeature>(); /** * Associates a resource with the session, and tracks it's priority. * * @param resource Resource string * @param priority Priority of resource */ public void addResource(String resource, Integer priority) { resources.put(priority, resource); } /** * Removes an association of a resource with the session. * * @param resource Resource string */ public void removeResource(String resource) { for (Integer i : resources.keySet()) { if (resources.get(i).equals(resource)) { resources.remove(i); try { getTransport().notifyRosterOffline(new JID(getJID().getNode(),getJID().getDomain(),resource)); } catch (UserNotFoundException e) { // Don't care } break; } } } /** * Updates the priority of a resource. * * @param resource Resource string * @param priority New priority */ public void updateResource(String resource, Integer priority) { for (Integer i : resources.keySet()) { if (resources.get(i).equals(resource)) { resources.remove(i); break; } } resources.put(priority, resource); } /** * Removes all resources associated with a session. */ public void removeAllResources() { for (String resource : resources.values()) { removeResource(resource); } } /** * Returns the number of active resources. * * @return Number of active resources. */ public int getResourceCount() { return resources.size(); } /** * Retrieves the registration information associated with the session. * * @return Registration information of the user associated with the session. */ public Registration getRegistration() { return registration; } /** * Retrieves the transport associated with the session. * * @return Transport associated with the session. */ public BaseTransport getTransport() { return transport; } /** * Retrieves the roster associated with the session. * * @return Roster associated with the session, or null if none. */ public Roster getRoster() { try { return getTransport().getRosterManager().getRoster(getJID().getNode()); } catch (UserNotFoundException e) { return null; } } /** * Retrieves the bare jid associated with the session. * * @return JID of the user associated with this session. */ public JID getJID() { return jid; } /** * Retrieves the JID of the highest priority resource. * * @return Full JID including resource with highest priority. */ public JID getJIDWithHighestPriority() { return new JID(jid.getNode(),jid.getDomain(),resources.get(resources.lastKey())); } /** * Given a resource, returns whether it's priority is the highest. * * @param resource Resource to be checked. * @return True or false if the resource is the highest priority. */ public Boolean isHighestPriority(String resource) { return (resources.get(resources.lastKey()).equals(resource)); } /** * Change the priority of a given resource. * * @param resource Resource to be changed. * @param priority New priority of resource */ public void updatePriority(String resource, Integer priority) { updateResource(resource, priority); // TODO: should potentially ask for status of highest priority } /** * Retrieves the priority of a given resource. * * @param resource Resource to be checked. * @return Priority of the resource, or null if not found. */ public Integer getPriority(String resource) { for (Integer i : resources.keySet()) { if (resources.get(i).equals(resource)) { return i; } } return null; } /** * Given a resource, returns whether the resource is currently associated with this session. * * @param resource Resource to be checked. * @return True of false if the resource is associated with this session. */ public Boolean hasResource(String resource) { return (resources.containsValue(resource)); } /** * Sets a feature that the client supports. * * @param feature Feature that the session supports. */ public void setSupportedFeature(SupportedFeature feature) { if (!supportedFeatures.contains(feature)) { supportedFeatures.add(feature); } } /** * Removes a feature that the client supports. * * @param feature Feature to be removed from the supported list. */ public void removeSupportedFeature(SupportedFeature feature) { supportedFeatures.remove(feature); } /** * Clears all of the supported features recorded. */ public void clearSupportedFeatures() { supportedFeatures.clear(); } /** * Retrieves whether this session supports a specific feature. * * @param feature Feature to check for support of. * @return True or false if the session supports the specified feature. */ public Boolean isFeatureSupported(SupportedFeature feature) { return supportedFeatures.contains(feature); } /** * Updates the login status. * * @param status New login status. */ public void setLoginStatus(TransportLoginStatus status) { loginStatus = status; } /** * Retrieves the current login status. * * @return Login status of session. */ public TransportLoginStatus getLoginStatus() { return loginStatus; } /** * Returns true only if we are completely logged in. * * @return True or false whether we are currently completely logged in. */ public Boolean isLoggedIn() { return (loginStatus == TransportLoginStatus.LOGGED_IN); } /** * Handles monitoring of whether session is still valid. */ public void run() { while (validSession) { } } /** * Indicates that the session is done and should be stopped. */ public void sessionDone() { validSession = false; } /** * Updates status on legacy service. * * @param presenceType Type of presence. * @param verboseStatus Longer status description. */ public abstract void updateStatus(PresenceType presenceType, String verboseStatus); /** * Adds a legacy contact to the legacy service. * * @param item Roster item associated with the legacy contact. */ public abstract void addContact(RosterItem item); /** * Removes a legacy contact from the legacy service. * * @param item Roster item associated with the legacy contact. */ public abstract void removeContact(RosterItem item); /** * Updates a legacy contact on the legacy service. * * @param item Roster item associated with the legacy contact. */ public abstract void updateContact(RosterItem item); /** * Sends an outgoing message through the legacy serivce. * * @param jid JID associated with the target contact. * @param message Message to be sent. */ public abstract void sendMessage(JID jid, String message); /** * Sends an outgoing message directly to the legacy serivce. * * Doesn't -have- to do anything. Only occasionally useful. * * @param message Message to be sent. */ public abstract void sendServerMessage(String message); /** * Asks the legacy service to send a presence packet for a contact. * * This is typically response to a probe. * * @param jid JID to be checked. */ public abstract void retrieveContactStatus(JID jid); /** * Asks the legacy service to send presence packets for all known contacts. * * @param jid JID to have the presence packets sent to. */ public abstract void resendContactStatuses(JID jid);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?