524N/A/*
2362N/A * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved.
524N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
524N/A *
524N/A * This code is free software; you can redistribute it and/or modify it
524N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
524N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
524N/A *
524N/A * This code is distributed in the hope that it will be useful, but WITHOUT
524N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
524N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
524N/A * version 2 for more details (a copy is included in the LICENSE file that
524N/A * accompanied this code).
524N/A *
524N/A * You should have received a copy of the GNU General Public License version
524N/A * 2 along with this work; if not, write to the Free Software Foundation,
524N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
524N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
524N/A */
524N/A
524N/Apackage sun.nio.ch;
524N/A
524N/Aimport java.nio.channels.*;
524N/Aimport java.net.InetAddress;
524N/Aimport java.net.NetworkInterface;
524N/Aimport java.util.*;
524N/A
524N/A/**
524N/A * Simple registry of membership keys for a MulticastChannel.
524N/A *
524N/A * Instances of this object are not safe by multiple concurrent threads.
524N/A */
524N/A
524N/Aclass MembershipRegistry {
524N/A
524N/A // map multicast group to keys
524N/A private Map<InetAddress,List<MembershipKeyImpl>> groups = null;
524N/A
524N/A MembershipRegistry() {
524N/A }
524N/A
524N/A /**
524N/A * Checks registry for membership of the group on the given
524N/A * network interface.
524N/A */
524N/A MembershipKey checkMembership(InetAddress group, NetworkInterface interf,
524N/A InetAddress source)
524N/A {
524N/A if (groups != null) {
524N/A List<MembershipKeyImpl> keys = groups.get(group);
524N/A if (keys != null) {
524N/A for (MembershipKeyImpl key: keys) {
893N/A if (key.networkInterface().equals(interf)) {
524N/A // already a member to receive all packets so return
524N/A // existing key or detect conflict
524N/A if (source == null) {
893N/A if (key.sourceAddress() == null)
524N/A return key;
524N/A throw new IllegalStateException("Already a member to receive all packets");
524N/A }
524N/A
524N/A // already have source-specific membership so return key
524N/A // or detect conflict
893N/A if (key.sourceAddress() == null)
524N/A throw new IllegalStateException("Already have source-specific membership");
893N/A if (source.equals(key.sourceAddress()))
524N/A return key;
524N/A }
524N/A }
524N/A }
524N/A }
524N/A return null;
524N/A }
524N/A
524N/A /**
524N/A * Add membership to the registry, returning a new membership key.
524N/A */
524N/A void add(MembershipKeyImpl key) {
893N/A InetAddress group = key.group();
524N/A List<MembershipKeyImpl> keys;
524N/A if (groups == null) {
524N/A groups = new HashMap<InetAddress,List<MembershipKeyImpl>>();
524N/A keys = null;
524N/A } else {
524N/A keys = groups.get(group);
524N/A }
524N/A if (keys == null) {
524N/A keys = new LinkedList<MembershipKeyImpl>();
524N/A groups.put(group, keys);
524N/A }
524N/A keys.add(key);
524N/A }
524N/A
524N/A /**
524N/A * Remove a key from the registry
524N/A */
524N/A void remove(MembershipKeyImpl key) {
893N/A InetAddress group = key.group();
524N/A List<MembershipKeyImpl> keys = groups.get(group);
524N/A if (keys != null) {
524N/A Iterator<MembershipKeyImpl> i = keys.iterator();
524N/A while (i.hasNext()) {
524N/A if (i.next() == key) {
524N/A i.remove();
524N/A break;
524N/A }
524N/A }
524N/A if (keys.isEmpty()) {
524N/A groups.remove(group);
524N/A }
524N/A }
524N/A }
524N/A
524N/A /**
524N/A * Invalidate all keys in the registry
524N/A */
524N/A void invalidateAll() {
893N/A if (groups != null) {
893N/A for (InetAddress group: groups.keySet()) {
893N/A for (MembershipKeyImpl key: groups.get(group)) {
893N/A key.invalidate();
893N/A }
524N/A }
524N/A }
524N/A }
524N/A}