View Javadoc

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       */
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
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
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
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
128     public void unlockInetAddress(InetAddress interfaceAddress) {
129         // Default implementation does nothing.
130     }
131 
132 }