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

org.red5.net.websocket.WebSocketScope Maven / Gradle / Ivy

/*
 * RED5 Open Source Flash Server - http://code.google.com/p/red5/
 * 
 * Copyright 2006-2014 by respective authors (see below). 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.red5.net.websocket;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.red5.net.websocket.listener.IWebSocketDataListener;
import org.red5.net.websocket.model.WSMessage;
import org.red5.server.plugin.PluginRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WebSocketScope {

	private static final Logger log = LoggerFactory.getLogger(WebSocketScope.class);
	
	private String path;

	private Set conns = new HashSet();

	private Set listeners = new HashSet();

	/**
	 * Registers with the WebSocketScopeManager.
	 */
	public void register() {
		WebSocketScopeManager manager = ((WebSocketPlugin) PluginRegistry.getPlugin("WebSocketPlugin")).getManager();
		manager.addWebSocketScope(this);
	}
	
	/**
	 * Un-registers from the WebSocketScopeManager.
	 */
	public void unregister() {
		WebSocketScopeManager manager = ((WebSocketPlugin) PluginRegistry.getPlugin("WebSocketPlugin")).getManager();
		manager.removeWebSocketScope(this);		
	}
	
	/**
	 * Returns the set of connections.
	 * 
	 * @return conns
	 */
	public Set getConns() {
		return conns;
	}

	/**
	 * Sets the path.
	 * 
	 * @param path
	 */
	public void setPath(String path) {
		this.path = path; // /room/name
	}
	
	/**
	 * Returns the path of the scope.
	 * 
	 * @return path
	 */
	public String getPath() {
		return path;
	}

	/**
	 * Add new connection on scope.
	 * 
	 * @param conn WebSocketConnection
	 */
	public void addConnection(WebSocketConnection conn) {
		conns.add(conn);
		for (IWebSocketDataListener listener : listeners) {
			listener.onWSConnect(conn);
		}
	}

	/**
	 * Remove connection from scope.
	 * 
	 * @param conn WebSocketConnection
	 */
	public void removeConnection(WebSocketConnection conn) {
		conns.remove(conn);
		for (IWebSocketDataListener listener : listeners) {
			listener.onWSDisconnect(conn);
		}
	}

	/**
	 * Add new listener on scope.
	 * 
	 * @param listener IWebSocketDataListener
	 */
	public void addListener(IWebSocketDataListener listener) {
		log.info("addListener: {}", listener);
		listeners.add(listener);
	}

	/**
	 * Remove listener from scope.
	 * 
	 * @param listener IWebSocketDataListener
	 */
	public void removeListener(IWebSocketDataListener listener) {
		log.info("removeListener: {}", listener);
		listeners.remove(listener);
	}
	
	/**
	 * Add new listeners on scope.
	 * 
	 * @param listenerList list of IWebSocketDataListener
	 */	
	public void setListeners(Collection listeners) {
		log.trace("setListeners: {}", listeners);
		this.listeners.addAll(listeners);
	}

	/**
	 * Returns the listeners in an unmodifiable set.
	 * 
	 * @return listeners
	 */
	public Set getListeners() {
		return Collections.unmodifiableSet(listeners);
	}
	
	/**
	 * Check the scope state.
	 * 
	 * @return true:still have relation
	 */
	public boolean isValid() {
		return (conns.size() + listeners.size()) > 0;
	}

	/**
	 * Message received from client and passed on to the listeners.
	 * 
	 * @param message
	 */
	public void onMessage(WSMessage message) {
		log.trace("Listeners: {}", listeners.size());
		for (IWebSocketDataListener listener : listeners) {
			try {
				listener.onWSMessage(message);
			} catch (Exception e) {
				log.warn("onMessage exception", e);
			}
		}
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((path == null) ? 0 : path.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		WebSocketScope other = (WebSocketScope) obj;
		if (path == null) {
			if (other.path != null)
				return false;
		} else if (!path.equals(other.path))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "WebSocketScope [path=" + path + ", listeners=" + listeners.size()  + ", connections=" + conns.size() + "]";
	}
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy