View Javadoc

1   package javax.jmdns;
2   
3   import java.net.InetAddress;
4   import java.net.NetworkInterface;
5   import java.util.concurrent.atomic.AtomicReference;
6   
7   import javax.jmdns.impl.NetworkTopologyDiscoveryImpl;
8   
9   /**
10   * This class is used to resolve the list of Internet address to use when attaching JmDNS to the network.
11   * <p>
12   * To create you own filtering class for Internet Addresses you will need to implement the class and the factory delegate. These must be called before any other call to JmDNS.
13   *
14   * <pre>
15   * public static class MyNetworkTopologyDiscovery implements NetworkTopologyDiscovery {
16   *
17   *     &#064;Override
18   *     public InetAddress[] getInetAddresses() {
19   *         // TODO Auto-generated method stub
20   *         return null;
21   *     }
22   *
23   *     &#064;Override
24   *     public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress) {
25   *         // TODO Auto-generated method stub
26   *         return false;
27   *     }
28   *
29   * }
30   *
31   * public static class MyClass implements NetworkTopologyDiscovery.Factory.ClassDelegate {
32   *     public MyClass() {
33   *         super();
34   *         NetworkTopologyDiscovery.Factory.setClassDelegate(this);
35   *
36   *         // Access JmDNS or JmmDNS
37   *     }
38   *
39   *     &#064;Override
40   *     public NetworkTopologyDiscovery newNetworkTopologyDiscovery() {
41   *         return new MyNetworkTopologyDiscovery();
42   *     }
43   *
44   * }
45   * </pre>
46   *
47   * </p>
48   *
49   * @author Pierre Frisch
50   */
51  public interface NetworkTopologyDiscovery {
52  
53      /**
54       * NetworkTopologyDiscovery.Factory enable the creation of new instance of NetworkTopologyDiscovery.
55       */
56      public static final class Factory {
57          private static volatile NetworkTopologyDiscovery _instance;
58  
59          /**
60           * This interface defines a delegate to the NetworkTopologyDiscovery.Factory class to enable subclassing.
61           */
62          public static interface ClassDelegate {
63  
64              /**
65               * Allows the delegate the opportunity to construct and return a different NetworkTopologyDiscovery.
66               *
67               * @return Should return a new NetworkTopologyDiscovery Object.
68               * @see #classDelegate()
69               * @see #setClassDelegate(ClassDelegate anObject)
70               */
71              public NetworkTopologyDiscovery newNetworkTopologyDiscovery();
72          }
73  
74          private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>();
75  
76          private Factory() {
77              super();
78          }
79  
80          /**
81           * Assigns <code>delegate</code> as NetworkTopologyDiscovery's class delegate. The class delegate is optional.
82           *
83           * @param delegate
84           *            The object to set as NetworkTopologyDiscovery's class delegate.
85           * @see #classDelegate()
86           * @see JmmDNS.Factory.ClassDelegate
87           */
88          public static void setClassDelegate(Factory.ClassDelegate delegate) {
89              _databaseClassDelegate.set(delegate);
90          }
91  
92          /**
93           * Returns NetworkTopologyDiscovery's class delegate.
94           *
95           * @return NetworkTopologyDiscovery's class delegate.
96           * @see #setClassDelegate(ClassDelegate anObject)
97           * @see JmmDNS.Factory.ClassDelegate
98           */
99          public static Factory.ClassDelegate classDelegate() {
100             return _databaseClassDelegate.get();
101         }
102 
103         /**
104          * Returns a new instance of NetworkTopologyDiscovery using the class delegate if it exists.
105          *
106          * @return new instance of NetworkTopologyDiscovery
107          */
108         protected static NetworkTopologyDiscovery newNetworkTopologyDiscovery() {
109             NetworkTopologyDiscovery instance = null;
110             Factory.ClassDelegate delegate = _databaseClassDelegate.get();
111             if (delegate != null) {
112                 instance = delegate.newNetworkTopologyDiscovery();
113             }
114             return (instance != null ? instance : new NetworkTopologyDiscoveryImpl());
115         }
116 
117         /**
118          * Return the instance of the Multihommed Multicast DNS.
119          *
120          * @return the JmmDNS
121          */
122         public static NetworkTopologyDiscovery getInstance() {
123             if (_instance == null) {
124                 synchronized (NetworkTopologyDiscovery.Factory.class) {
125                     if (_instance == null) {
126                         _instance = NetworkTopologyDiscovery.Factory.newNetworkTopologyDiscovery();
127                     }
128                 }
129             }
130             return _instance;
131         }
132     }
133 
134     /**
135      * Get all local Internet Addresses for the machine.
136      *
137      * @return Set of InetAddress
138      */
139     public abstract InetAddress[] getInetAddresses();
140 
141     /**
142      * Check if a given InetAddress should be used for mDNS
143      *
144      * @param networkInterface
145      * @param interfaceAddress
146      * @return <code>true</code> is the address is to be used, <code>false</code> otherwise.
147      */
148     public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress);
149 
150     /**
151      * Locks the given InetAddress if the device requires it.
152      *
153      * @param interfaceAddress
154      */
155     public void lockInetAddress(InetAddress interfaceAddress);
156 
157     /**
158      * Locks the given InetAddress if the device requires it.
159      *
160      * @param interfaceAddress
161      */
162     public void unlockInetAddress(InetAddress interfaceAddress);
163 
164 }