• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  *
3  */
4 package javax.jmdns.impl;
5 
6 import java.lang.reflect.Method;
7 import java.net.InetAddress;
8 import java.net.NetworkInterface;
9 import java.net.SocketException;
10 import java.util.Enumeration;
11 import java.util.HashSet;
12 import java.util.Set;
13 import java.util.logging.Level;
14 import java.util.logging.Logger;
15 
16 import javax.jmdns.NetworkTopologyDiscovery;
17 
18 /**
19  * This class implements NetworkTopologyDiscovery.
20  *
21  * @author Pierre Frisch
22  */
23 public class NetworkTopologyDiscoveryImpl implements NetworkTopologyDiscovery {
24     private final static Logger logger = Logger.getLogger(NetworkTopologyDiscoveryImpl.class.getName());
25 
26     private final Method        _isUp;
27 
28     private final Method        _supportsMulticast;
29 
30     /**
31      *
32      */
NetworkTopologyDiscoveryImpl()33     public NetworkTopologyDiscoveryImpl() {
34         super();
35         Method isUp;
36         try {
37             isUp = NetworkInterface.class.getMethod("isUp", (Class<?>[]) null);
38         } catch (Exception exception) {
39             // We do not want to throw anything if the method does not exist.
40             isUp = null;
41         }
42         _isUp = isUp;
43         Method supportsMulticast;
44         try {
45             supportsMulticast = NetworkInterface.class.getMethod("supportsMulticast", (Class<?>[]) null);
46         } catch (Exception exception) {
47             // We do not want to throw anything if the method does not exist.
48             supportsMulticast = null;
49         }
50         _supportsMulticast = supportsMulticast;
51     }
52 
53     /*
54      * (non-Javadoc)
55      * @see javax.jmdns.JmmDNS.NetworkTopologyDiscovery#getInetAddresses()
56      */
57     @Override
getInetAddresses()58     public InetAddress[] getInetAddresses() {
59         Set<InetAddress> result = new HashSet<InetAddress>();
60         try {
61 
62             for (Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements();) {
63                 NetworkInterface nif = nifs.nextElement();
64                 for (Enumeration<InetAddress> iaenum = nif.getInetAddresses(); iaenum.hasMoreElements();) {
65                     InetAddress interfaceAddress = iaenum.nextElement();
66                     if (logger.isLoggable(Level.FINEST)) {
67                         logger.finest("Found NetworkInterface/InetAddress: " + nif + " -- " + interfaceAddress);
68                     }
69                     if (this.useInetAddress(nif, interfaceAddress)) {
70                         result.add(interfaceAddress);
71                     }
72                 }
73             }
74         } catch (SocketException se) {
75             logger.warning("Error while fetching network interfaces addresses: " + se);
76         }
77         return result.toArray(new InetAddress[result.size()]);
78     }
79 
80     /*
81      * (non-Javadoc)
82      * @see javax.jmdns.JmmDNS.NetworkTopologyDiscovery#useInetAddress(java.net.NetworkInterface, java.net.InetAddress)
83      */
84     @Override
useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress)85     public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress) {
86         try {
87             if (_isUp != null) {
88                 try {
89                     if (!((Boolean) _isUp.invoke(networkInterface, (Object[]) null)).booleanValue()) {
90                         return false;
91                     }
92                 } catch (Exception exception) {
93                     // We should hide that exception.
94                 }
95             }
96             if (_supportsMulticast != null) {
97                 try {
98                     if (!((Boolean) _supportsMulticast.invoke(networkInterface, (Object[]) null)).booleanValue()) {
99                         return false;
100                     }
101                 } catch (Exception exception) {
102                     // We should hide that exception.
103                 }
104             }
105             if (interfaceAddress.isLoopbackAddress()) {
106                 return false;
107             }
108             return true;
109         } catch (Exception exception) {
110             return false;
111         }
112     }
113 
114     /*
115      * (non-Javadoc)
116      * @see javax.jmdns.NetworkTopologyDiscovery#lockInetAddress(java.net.InetAddress)
117      */
118     @Override
lockInetAddress(InetAddress interfaceAddress)119     public void lockInetAddress(InetAddress interfaceAddress) {
120         // Default implementation does nothing.
121     }
122 
123     /*
124      * (non-Javadoc)
125      * @see javax.jmdns.NetworkTopologyDiscovery#unlockInetAddress(java.net.InetAddress)
126      */
127     @Override
unlockInetAddress(InetAddress interfaceAddress)128     public void unlockInetAddress(InetAddress interfaceAddress) {
129         // Default implementation does nothing.
130     }
131 
132 }
133