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

flex.messaging.AbstractConnectionAwareSession Maven / Gradle / Ivy

There is a newer version: 4.8.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 flex.messaging;

import java.util.concurrent.CopyOnWriteArrayList;

/**
 *
 * Abstract base class for ConnectionAwareSession implementations.
 * Provides support for registering FlexSessionConnectivityListeners
 * along with protected methods to notify registered listeners of FlexSessionConnectivityEvents.
 */
public abstract class AbstractConnectionAwareSession extends FlexSession implements ConnectionAwareSession
{
    //--------------------------------------------------------------------------
    //
    // Properties
    //
    //--------------------------------------------------------------------------

    /**
     *
     * Constructs a new instance.
     *
     * @param sessionProvider The provider that instantiated this instance.
     */
    public AbstractConnectionAwareSession(AbstractFlexSessionProvider sessionProvider)
    {
        super(sessionProvider);
    }
    
    //--------------------------------------------------------------------------
    //
    // Properties
    //
    //--------------------------------------------------------------------------

    //----------------------------------
    //  connected
    //----------------------------------
    
    /**
     * Connected flag for the session.
     */
    private boolean connected;

    /**
     * Returns whether the session is connected.
     * 
     * @return true if the session is connected; otherwise false.
     */
    public boolean isConnected()
    {
        synchronized (lock)
        {
            return connected;
        }
    }
    
    /**
     * Sets the connected state for the session.
     * 
     * @param value true for a connected session; false for a disconnected session.
     */
    public void setConnected(boolean value)
    {
        boolean notify = false;
        synchronized (lock)
        {
            if (connected != value)
            {
                connected = value;
                notify = true;
            }
        }
        if (notify)
        {
            if (!value)
                notifySessionDisconnected();
            else
                notifySessionConnected();
        }
    }
    
    //----------------------------------
    //  connectivityListeners
    //----------------------------------
    
    /**
     * The list of connectivity listeners for the session.
     */
    private volatile CopyOnWriteArrayList connectivityListeners;
    
    /**
     * (non-JavaDoc)
     * @see flex.messaging.ConnectionAwareSession#addConnectivityListener(FlexSessionConnectivityListener)
     */
    public void addConnectivityListener(FlexSessionConnectivityListener listener)
    {
        if (connectivityListeners == null)
        {
            synchronized (lock)
            {
                if (connectivityListeners == null)
                    connectivityListeners = new CopyOnWriteArrayList(); 
            }
        }
        if (connectivityListeners.addIfAbsent(listener) && isConnected())
        {
            // If the listener is added when the session has already connected, notify it at add time.
            FlexSessionConnectivityEvent event = new FlexSessionConnectivityEvent(this);
            listener.sessionConnected(event);
        }
    }

    /**
     * (non-JavaDoc)
     * @see flex.messaging.ConnectionAwareSession#removeConnectivityListener(FlexSessionConnectivityListener)
     */
    public void removeConnectivityListener(FlexSessionConnectivityListener listener)
    {
        if (connectivityListeners == null) return;
        connectivityListeners.remove(listener);
    }
    
    //--------------------------------------------------------------------------
    //
    // Protected Methods
    //
    //--------------------------------------------------------------------------    
    
    /**
     * Notifies registered FlexSessionConnectivityListeners that the session has connected.
     */
    protected void notifySessionConnected()
    {
        if (connectivityListeners != null)
        {
            FlexSessionConnectivityEvent event = new FlexSessionConnectivityEvent(this);
            for (FlexSessionConnectivityListener listener : connectivityListeners)
                listener.sessionDisconnected(event);
        }
    }
    
    /**
     * Notifies registered FlexSessionConnectivityListeners that the session has disconnected.
     */
    protected void notifySessionDisconnected()
    {
        if (connectivityListeners != null)
        {
            FlexSessionConnectivityEvent event = new FlexSessionConnectivityEvent(this);
            for (FlexSessionConnectivityListener listener : connectivityListeners)
                listener.sessionDisconnected(event);            
        }
    }    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy