/** * Helios, OpenSource Monitoring * Brought to you by the Helios Development Group * * Copyright 2007, Helios Development Group and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This 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. * * This software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * */ package org.helios.apmrouter.server.net.listener.netty.group; import java.lang.management.ManagementFactory; import java.net.SocketAddress; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.management.ObjectName; import org.helios.apmrouter.jmx.JMXHelper; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.group.ChannelGroup; import org.jboss.netty.channel.group.ChannelGroupFuture; import org.jboss.netty.channel.group.DefaultChannelGroup; /** * <p>Title: ManagedChannelGroup</p> * <p>Description: </p> * <p>Company: Helios Development Group LLC</p> * @author Whitehead (nwhitehead AT heliosdev DOT org) * <p><code>org.helios.apmrouter.server.net.listener.netty.group.ManagedChannelGroup</code></p> */ public class ManagedChannelGroup implements ChannelGroup, ManagedChannelGroupMXBean { private static final Map<String, ManagedChannelGroup> groups = new ConcurrentHashMap<String, ManagedChannelGroup>(); /** * @param name * @return ManagedChannelGroup */ public static final ManagedChannelGroup getInstance(String name) { ManagedChannelGroup mcg = groups.get(name); if(mcg==null) { synchronized(groups) { mcg = groups.get(name); if(mcg==null) { mcg = new ManagedChannelGroup(name); } } } return mcg; } /** The delegate channel group */ protected final ChannelGroup channelGroup; /** * Creates a new ManagedChannelGroup * @param name The name of this group */ private ManagedChannelGroup(String name) { channelGroup = new DefaultChannelGroup(name); ObjectName on = JMXHelper.objectName("org.helios.apmrouter.server:service=ChannelGroup,name=" + name); try { if(!ManagementFactory.getPlatformMBeanServer().isRegistered(on)) { ManagementFactory.getPlatformMBeanServer().registerMBean(this, on); } } catch (Exception ex) { ex.printStackTrace(System.err); } } /** * Finds the first channel in this group that has the passed remote address * @param address The remote address to find * @return the first matching channel or null if one was not found */ public Channel findRemote(SocketAddress address) { if(address==null) return null; for(Channel channel: channelGroup) { if(address.equals(channel.getRemoteAddress())) return channel; } return null; } /** * {@inheritDoc} */ public Set<ChannelTracker> getChannels() { Set<ChannelTracker> set = new HashSet<ChannelTracker>(size()); for(ManagedChannel mc: toArray(new ManagedChannel[0])) { set.add(new ChannelTracker(mc)); } return set; } /** * Adds a channel * @param channel The channel to add * @return true if the channel was not in the group before the add * @see java.util.Set#add(java.lang.Object) */ @Override public boolean add(Channel channel) { return channelGroup.add(channel instanceof ManagedChannel ? channel : new ManagedChannel(channel)); } /** * Adds a named channel * @param name The name of this channel * @param channel The channel to add * @return true if the channel was not in the group before the add * @see java.util.Set#add(java.lang.Object) */ public boolean add(Channel channel, String name) { return channelGroup.add(channel instanceof ManagedChannel ? channel : new ManagedChannel(channel, name) ); } /** * @param channels * @return boolean * @see java.util.Set#addAll(java.util.Collection) */ @Override public boolean addAll(Collection<? extends Channel> channels) { boolean changed = false; for(Channel channel: channels) { if(add(channel)) changed = true; } return true; } /** * {@inheritDoc} * @see org.helios.apmrouter.server.net.listener.netty.group.ManagedChannelGroupMXBean#clear() */ @Override public void clear() { channelGroup.clear(); } /** * {@inheritDoc} */ @Override public ChannelGroupFuture close() { return channelGroup.close(); } /** * @param arg0 * @return int * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(ChannelGroup arg0) { return channelGroup.compareTo(arg0); } /** * @param arg0 * @return boolean * @see java.util.Set#contains(java.lang.Object) */ @Override public boolean contains(Object arg0) { return channelGroup.contains(arg0); } /** * @param arg0 * @return boolean * @see java.util.Set#containsAll(java.util.Collection) */ @Override public boolean containsAll(Collection<?> arg0) { return channelGroup.containsAll(arg0); } /** * {@inheritDoc} */ @Override public ChannelGroupFuture disconnect() { return channelGroup.disconnect(); } /** * @param arg0 * @return boolean * @see java.util.Set#equals(java.lang.Object) */ @Override public boolean equals(Object arg0) { return channelGroup.equals(arg0); } /** * {@inheritDoc} * @see org.helios.apmrouter.server.net.listener.netty.group.ManagedChannelGroupMXBean#getName() */ @Override public String getName() { return channelGroup.getName(); } /** * {@inheritDoc} */ @Override public Channel find(Integer id) { return channelGroup.find(id); } /** * @return int * @see java.util.Set#hashCode() */ @Override public int hashCode() { return channelGroup.hashCode(); } /** * {@inheritDoc} * @see org.helios.apmrouter.server.net.listener.netty.group.ManagedChannelGroupMXBean#isEmpty() */ @Override public boolean isEmpty() { return channelGroup.isEmpty(); } /** * @return Iterator<Channel> * @see java.util.Set#iterator() */ @Override public Iterator<Channel> iterator() { return channelGroup.iterator(); } /** * @param arg0 * @return boolean * @see java.util.Set#remove(java.lang.Object) */ @Override public boolean remove(Object arg0) { return channelGroup.remove(arg0); } /** * @param arg0 * @return boolean * @see java.util.Set#removeAll(java.util.Collection) */ @Override public boolean removeAll(Collection<?> arg0) { return channelGroup.removeAll(arg0); } /** * @param arg0 * @return boolean * @see java.util.Set#retainAll(java.util.Collection) */ @Override public boolean retainAll(Collection<?> arg0) { return channelGroup.retainAll(arg0); } /** * @param interestOps * @return ChannelGroupFuture * @see org.jboss.netty.channel.group.ChannelGroup#setInterestOps(int) */ @Override public ChannelGroupFuture setInterestOps(int interestOps) { return channelGroup.setInterestOps(interestOps); } /** * @param readable * @return ChannelGroupFuture * @see org.jboss.netty.channel.group.ChannelGroup#setReadable(boolean) */ @Override public ChannelGroupFuture setReadable(boolean readable) { return channelGroup.setReadable(readable); } /** * {@inheritDoc} * @see org.helios.apmrouter.server.net.listener.netty.group.ManagedChannelGroupMXBean#size() */ @Override public int size() { return channelGroup.size(); } /** * @return Object[] * @see java.util.Set#toArray() */ @Override public Object[] toArray() { return channelGroup.toArray(); } /** * @param arg0 * @return <T> T[] */ @Override public <T> T[] toArray(T[] arg0) { return channelGroup.toArray(arg0); } /** * @param message * @return ChannelGroupFuture * @see org.jboss.netty.channel.group.ChannelGroup#write(java.lang.Object) */ @Override public ChannelGroupFuture write(Object message) { return channelGroup.write(message); } /** * @param message * @param remoteAddress * @return ChannelGroupFuture * @see org.jboss.netty.channel.group.ChannelGroup#write(java.lang.Object, java.net.SocketAddress) */ @Override public ChannelGroupFuture write(Object message, SocketAddress remoteAddress) { return channelGroup.write(message, remoteAddress); } /** * {@inheritDoc} */ @Override public ChannelGroupFuture unbind() { return channelGroup.unbind(); } }