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 * @Override 18 * public InetAddress[] getInetAddresses() { 19 * // TODO Auto-generated method stub 20 * return null; 21 * } 22 * 23 * @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 * @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 }