/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.gravity; import java.security.Principal; import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import javax.servlet.ServletContext; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import org.granite.config.GraniteConfig; import org.granite.config.flex.ServicesConfig; import flex.messaging.messages.AsyncMessage; import flex.messaging.messages.ErrorMessage; import flex.messaging.messages.Message; /** * @author William DRAI */ public class GravityProxy implements Gravity { private ServletContext servletContext; private Set<Listener> listeners = new CopyOnWriteArraySet<Listener>(); public GravityProxy() { } public GravityProxy(ServletContext servletContext) { this.servletContext = servletContext; try { servletContext.addListener(gravityListener); } catch (Throwable t) { // Not Servlet 3.0 compatible } } protected Gravity getGravity() { return GravityManager.getGravity(servletContext); } /////////////////////////////////////////////////////////////////////////// // Granite/Services configs access. public GravityConfig getGravityConfig() { if (!isStarted()) return null; return getGravity().getGravityConfig(); } public ServicesConfig getServicesConfig() { if (!isStarted()) return null; return getGravity().getServicesConfig(); } public GraniteConfig getGraniteConfig() { if (!isStarted()) return null; return getGravity().getGraniteConfig(); } /////////////////////////////////////////////////////////////////////////// // Properties. public boolean isStarted() { if (getGravity() == null) return false; return getGravity().isStarted(); } @Override public void start() throws Exception { getGravity().start(); } @Override public void reconfigure(GravityConfig gravityConfig, GraniteConfig graniteConfig) { if (!isStarted()) return; getGravity().reconfigure(gravityConfig, graniteConfig); } @Override public void stop() throws Exception { if (!isStarted()) return; getGravity().stop(); } @Override public void stop(boolean now) throws Exception { if (!isStarted()) return; getGravity().stop(now); } /////////////////////////////////////////////////////////////////////////// // Operations. @Override public List<Channel> getConnectedChannels() { return getGravity().getConnectedChannels(); } @Override public Set<Principal> getConnectedUsers() { return getGravity().getConnectedUsers(); } @Override public List<Channel> getConnectedChannelsByDestination(String destination) { return getGravity().getConnectedChannelsByDestination(destination); } @Override public Set<Principal> getConnectedUsersByDestination(String destination) { return getGravity().getConnectedUsersByDestination(destination); } @Override public List<Channel> findConnectedChannelsByUser(String name) { return getGravity().findConnectedChannelsByUser(name); } @Override public Channel findChannelByClientId(String clientId) { return getGravity().findChannelByClientId(clientId); } @Override public Channel findCurrentChannel(String destination) { return getGravity().findCurrentChannel(destination); } @Override public Message handleMessage(Message message) { return getGravity().handleMessage(message); } @Override public Message handleMessage(Message message, boolean skipInterceptor) { return getGravity().handleMessage(message, skipInterceptor); } public Message publishMessage(AsyncMessage message) { return publishMessage(null, message); } public Message publishMessage(Channel fromChannel, AsyncMessage message) { // Should probably throw an exception, not intended to be used through the proxy if (!isStarted()) return new ErrorMessage(message, new IllegalStateException("Gravity not initialized")); return getGravity().publishMessage(fromChannel, message); } @Override public Message sendRequest(Channel fromChannel, AsyncMessage message) { if (!isStarted()) return new ErrorMessage(message, new IllegalStateException("Gravity not initialized")); return getGravity().sendRequest(fromChannel, message); } @Override public void registerListener(Listener listener) { if (getGravity() == null) { listeners.add(listener); return; } getGravity().registerListener(listener); } @Override public void unregisterListener(Listener listener) { if (getGravity() == null) { listeners.remove(listener); return; } getGravity().unregisterListener(listener); } private ServletContextAttributeListener gravityListener = new ServletContextAttributeListener() { @Override public void attributeReplaced(ServletContextAttributeEvent event) { } @Override public void attributeRemoved(ServletContextAttributeEvent event) { } @Override public void attributeAdded(ServletContextAttributeEvent event) { if (event.getName().equals(GravityManager.GRAVITY_KEY)) { Gravity gravity = (Gravity)event.getValue(); for (Listener listener : listeners) gravity.registerListener(listener); listeners.clear(); } } }; }