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

org.jivesoftware.openfire.net.VirtualConnection Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2005-2008 Jive Software. 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.net;

import java.security.cert.Certificate;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

import org.jivesoftware.openfire.Connection;
import org.jivesoftware.openfire.ConnectionCloseListener;
import org.jivesoftware.openfire.PacketDeliverer;
import org.jivesoftware.openfire.session.LocalSession;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.util.LocaleUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Abstract implementation of the Connection interface that models abstract connections. Abstract
 * connections are connections that don't have a physical connection counterpart. Instead they
 * can be seen as conceptual or just 'abstract' connections.

* * Default values and common behavior of virtual connections are modeled in this class. Subclasses * should just need to specify how packets are delivered and what means closing the connection. * * @author Gaston Dombiak */ public abstract class VirtualConnection implements Connection { private static final Logger Log = LoggerFactory.getLogger(VirtualConnection.class); protected LocalSession session; final private Map listeners = new HashMap<>(); private AtomicReference state = new AtomicReference(State.OPEN); @Override public int getMajorXMPPVersion() { // Information not available. Return any value. This is not actually used. return 0; } @Override public int getMinorXMPPVersion() { // Information not available. Return any value. This is not actually used. return 0; } @Override public Certificate[] getLocalCertificates() { // Ignore return new Certificate[0]; } @Override public Certificate[] getPeerCertificates() { // Ignore return new Certificate[0]; } @Override public void setUsingSelfSignedCertificate(boolean isSelfSigned) { } @Override public boolean isUsingSelfSignedCertificate() { return false; } @Override public boolean isClosed() { return state.get() == State.CLOSED; } @Override public Connection.CompressionPolicy getCompressionPolicy() { // Return null since compression is not used for virtual connections return null; } @Override public Connection.TLSPolicy getTlsPolicy() { // Return null since TLS is not used for virtual connections return null; } @Override public boolean isCompressed() { // Return false since compression is not used for virtual connections return false; } @Override public boolean isFlashClient() { // Return false since flash clients is not used for virtual connections return false; } @Override public void setFlashClient(boolean flashClient) { //Ignore } @Override public void setXMPPVersion(int majorVersion, int minorVersion) { //Ignore } @Override public void setCompressionPolicy(CompressionPolicy compressionPolicy) { //Ignore } @Override public void setTlsPolicy(TLSPolicy tlsPolicy) { //Ignore } @Override public PacketDeliverer getPacketDeliverer() { //Ignore return null; } @Deprecated @Override public void startTLS(boolean clientMode, String remoteServer, ClientAuth authentication) throws Exception { //Ignore } public void startTLS(boolean clientMode) throws Exception { //Ignore } public void addCompression() { //Ignore } @Override public void startCompression() { //Ignore } @Override public boolean isSecure() { // Return false since TLS is not used for virtual connections return false; } @Override public boolean validate() { // Return true since the virtual connection is valid until it no longer exists return true; } @Override public void init(LocalSession session) { this.session = session; } @Override public void reinit(LocalSession session) { this.session = session; } /** * Closes the session, the virtual connection and notifies listeners that the connection * has been closed. */ @Override public void close() { if (state.compareAndSet(State.OPEN, State.CLOSED)) { if (session != null) { session.setStatus(Session.STATUS_CLOSED); } try { closeVirtualConnection(); } catch (Exception e) { Log.error(LocaleUtils.getLocalizedString("admin.error.close") + "\n" + toString(), e); } notifyCloseListeners(); } } @Override public void registerCloseListener(ConnectionCloseListener listener, Object handbackMessage) { if (isClosed()) { listener.onConnectionClose(handbackMessage); } else { listeners.put(listener, handbackMessage); } } @Override public void removeCloseListener(ConnectionCloseListener listener) { listeners.remove(listener); } /** * Notifies all close listeners that the connection has been closed. */ private void notifyCloseListeners() { synchronized (listeners) { for (ConnectionCloseListener listener : listeners.keySet()) { try { listener.onConnectionClose(listeners.get(listener)); } catch (Exception e) { Log.error("Error notifying listener: " + listener, e); } } } } /** * Closes the virtual connection. Subsclasses should indicate what closing a virtual * connection means. At this point the session has a CLOSED state. */ public abstract void closeVirtualConnection(); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy