blob: 5fe4a19e8f97fd10efb8834b9dda8f92158f4a00 [file] [log] [blame]
/*
* 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 <tt>ConnectionAwareSession</tt> implementations.
* Provides support for registering <tt>FlexSessionConnectivityListener</tt>s
* along with protected methods to notify registered listeners of <tt>FlexSessionConnectivityEvent</tt>s.
*/
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<FlexSessionConnectivityListener> 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<FlexSessionConnectivityListener>();
}
}
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 <tt>FlexSessionConnectivityListener</tt>s 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 <tt>FlexSessionConnectivityListener</tt>s that the session has disconnected.
*/
protected void notifySessionDisconnected() {
if (connectivityListeners != null) {
FlexSessionConnectivityEvent event = new FlexSessionConnectivityEvent(this);
for (FlexSessionConnectivityListener listener : connectivityListeners)
listener.sessionDisconnected(event);
}
}
}