Home | History | Annotate | Download | only in jmdns
      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 }