/*
* JBoss, Home of Professional Open Source.
* Copyright 2012, Red Hat, Inc., 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.jboss.as.controller.interfaces;
import static org.jboss.as.controller.interfaces.OverallInterfaceCriteria.PREFER_IPV4_STACK;
import static org.jboss.as.controller.interfaces.OverallInterfaceCriteria.PREFER_IPV6_ADDRESSES;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Utilities for interface criteria testing.
*
* @author Brian Stansberry (c) 2011 Red Hat Inc.
*/
public class InterfaceCriteriaTestUtil {
static final Set<NetworkInterface> loopbackInterfaces;
static final Set<NetworkInterface> nonLoopBackInterfaces;
static final Set<NetworkInterface> allInterfaces;
static final Map<NetworkInterface, Set<InetAddress>> allCandidates;
private static final boolean preferIPv4Stack = Boolean.getBoolean(PREFER_IPV4_STACK);
private static final boolean preferIPv6Stack = Boolean.getBoolean(PREFER_IPV6_ADDRESSES);
static {
Set<NetworkInterface> loop = new HashSet<NetworkInterface>();
Set<NetworkInterface> notLoop = new HashSet<NetworkInterface>();
Set<NetworkInterface> all = new HashSet<NetworkInterface>();
Map<NetworkInterface, Set<InetAddress>> candidates = new HashMap<NetworkInterface, Set<InetAddress>>();
try {
Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
while (nics.hasMoreElements()) {
NetworkInterface nic = nics.nextElement();
all.add(nic);
if (nic.isLoopback()) {
loop.add(nic);
} else {
notLoop.add(nic);
}
Set<InetAddress> addresses = new HashSet<InetAddress>();
Enumeration<InetAddress> addressEnumeration = nic.getInetAddresses();
while (addressEnumeration.hasMoreElements()) {
InetAddress inetAddress = addressEnumeration.nextElement();
if (inetAddress != null) {
addresses.add(inetAddress);
}
}
if (addresses.size() > 0) {
candidates.put(nic, Collections.unmodifiableSet(addresses));
}else{
notLoop.remove(nic);
}
Enumeration<NetworkInterface> subs = nic.getSubInterfaces();
while (subs.hasMoreElements()) {
nic = subs.nextElement();
all.add(nic);
if (nic.isLoopback()) {
loop.add(nic);
} else {
notLoop.add(nic);
}
addresses = new HashSet<InetAddress>();
addressEnumeration = nic.getInetAddresses();
while (addressEnumeration.hasMoreElements()) {
addresses.add(addressEnumeration.nextElement());
}
if (addresses.size() > 0) {
candidates.put(nic, Collections.unmodifiableSet(addresses));
}else{
notLoop.remove(nic);
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
loopbackInterfaces = Collections.unmodifiableSet(loop);
nonLoopBackInterfaces = Collections.unmodifiableSet(notLoop);
allInterfaces = Collections.unmodifiableSet(all);
allCandidates = Collections.unmodifiableMap(candidates);
}
static Set<InetAddress> getRightTypeAddresses(Set<InetAddress> all) {
Set<InetAddress> result = new HashSet<InetAddress>();
for (InetAddress address : all) {
if (preferIPv4Stack && !preferIPv6Stack && !(address instanceof Inet4Address)) {
continue;
} else if (preferIPv6Stack && !preferIPv4Stack && !(address instanceof Inet6Address)) {
continue;
}
result.add(address);
}
return result;
}
}