diff options
Diffstat (limited to 'src/javax/jmdns/NetworkTopologyDiscovery.java')
-rw-r--r-- | src/javax/jmdns/NetworkTopologyDiscovery.java | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/javax/jmdns/NetworkTopologyDiscovery.java b/src/javax/jmdns/NetworkTopologyDiscovery.java new file mode 100644 index 0000000..05061db --- /dev/null +++ b/src/javax/jmdns/NetworkTopologyDiscovery.java @@ -0,0 +1,164 @@ +package javax.jmdns; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.concurrent.atomic.AtomicReference; + +import javax.jmdns.impl.NetworkTopologyDiscoveryImpl; + +/** + * This class is used to resolve the list of Internet address to use when attaching JmDNS to the network. + * <p> + * 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. + * + * <pre> + * public static class MyNetworkTopologyDiscovery implements NetworkTopologyDiscovery { + * + * @Override + * public InetAddress[] getInetAddresses() { + * // TODO Auto-generated method stub + * return null; + * } + * + * @Override + * public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress) { + * // TODO Auto-generated method stub + * return false; + * } + * + * } + * + * public static class MyClass implements NetworkTopologyDiscovery.Factory.ClassDelegate { + * public MyClass() { + * super(); + * NetworkTopologyDiscovery.Factory.setClassDelegate(this); + * + * // Access JmDNS or JmmDNS + * } + * + * @Override + * public NetworkTopologyDiscovery newNetworkTopologyDiscovery() { + * return new MyNetworkTopologyDiscovery(); + * } + * + * } + * </pre> + * + * </p> + * + * @author Pierre Frisch + */ +public interface NetworkTopologyDiscovery { + + /** + * NetworkTopologyDiscovery.Factory enable the creation of new instance of NetworkTopologyDiscovery. + */ + public static final class Factory { + private static volatile NetworkTopologyDiscovery _instance; + + /** + * This interface defines a delegate to the NetworkTopologyDiscovery.Factory class to enable subclassing. + */ + public static interface ClassDelegate { + + /** + * Allows the delegate the opportunity to construct and return a different NetworkTopologyDiscovery. + * + * @return Should return a new NetworkTopologyDiscovery Object. + * @see #classDelegate() + * @see #setClassDelegate(ClassDelegate anObject) + */ + public NetworkTopologyDiscovery newNetworkTopologyDiscovery(); + } + + private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>(); + + private Factory() { + super(); + } + + /** + * Assigns <code>delegate</code> as NetworkTopologyDiscovery's class delegate. The class delegate is optional. + * + * @param delegate + * The object to set as NetworkTopologyDiscovery's class delegate. + * @see #classDelegate() + * @see JmmDNS.Factory.ClassDelegate + */ + public static void setClassDelegate(Factory.ClassDelegate delegate) { + _databaseClassDelegate.set(delegate); + } + + /** + * Returns NetworkTopologyDiscovery's class delegate. + * + * @return NetworkTopologyDiscovery's class delegate. + * @see #setClassDelegate(ClassDelegate anObject) + * @see JmmDNS.Factory.ClassDelegate + */ + public static Factory.ClassDelegate classDelegate() { + return _databaseClassDelegate.get(); + } + + /** + * Returns a new instance of NetworkTopologyDiscovery using the class delegate if it exists. + * + * @return new instance of NetworkTopologyDiscovery + */ + protected static NetworkTopologyDiscovery newNetworkTopologyDiscovery() { + NetworkTopologyDiscovery instance = null; + Factory.ClassDelegate delegate = _databaseClassDelegate.get(); + if (delegate != null) { + instance = delegate.newNetworkTopologyDiscovery(); + } + return (instance != null ? instance : new NetworkTopologyDiscoveryImpl()); + } + + /** + * Return the instance of the Multihommed Multicast DNS. + * + * @return the JmmDNS + */ + public static NetworkTopologyDiscovery getInstance() { + if (_instance == null) { + synchronized (NetworkTopologyDiscovery.Factory.class) { + if (_instance == null) { + _instance = NetworkTopologyDiscovery.Factory.newNetworkTopologyDiscovery(); + } + } + } + return _instance; + } + } + + /** + * Get all local Internet Addresses for the machine. + * + * @return Set of InetAddress + */ + public abstract InetAddress[] getInetAddresses(); + + /** + * Check if a given InetAddress should be used for mDNS + * + * @param networkInterface + * @param interfaceAddress + * @return <code>true</code> is the address is to be used, <code>false</code> otherwise. + */ + public boolean useInetAddress(NetworkInterface networkInterface, InetAddress interfaceAddress); + + /** + * Locks the given InetAddress if the device requires it. + * + * @param interfaceAddress + */ + public void lockInetAddress(InetAddress interfaceAddress); + + /** + * Locks the given InetAddress if the device requires it. + * + * @param interfaceAddress + */ + public void unlockInetAddress(InetAddress interfaceAddress); + +}
\ No newline at end of file |