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              */
newNetworkTopologyDiscovery()71             public NetworkTopologyDiscovery newNetworkTopologyDiscovery();
72         }
73 
74         private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>();
75 
Factory()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          */
setClassDelegate(Factory.ClassDelegate delegate)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          */
classDelegate()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          */
newNetworkTopologyDiscovery()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          */
getInstance()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      */
getInetAddresses()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      */
useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress)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      */
lockInetAddress(InetAddress interfaceAddress)155     public void lockInetAddress(InetAddress interfaceAddress);
156 
157     /**
158      * Locks the given InetAddress if the device requires it.
159      *
160      * @param interfaceAddress
161      */
unlockInetAddress(InetAddress interfaceAddress)162     public void unlockInetAddress(InetAddress interfaceAddress);
163 
164 }