13742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/** 23742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 33742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 43742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpackage javax.jmdns.impl; 53742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 63742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.Date; 73742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.Timer; 83742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.TimerTask; 93742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.concurrent.ConcurrentHashMap; 103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.concurrent.ConcurrentMap; 113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport java.util.concurrent.atomic.AtomicReference; 123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.RecordReaper; 143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.Responder; 153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.resolver.ServiceInfoResolver; 163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.resolver.ServiceResolver; 173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.resolver.TypeResolver; 183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.state.Announcer; 193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.state.Canceler; 203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.state.Prober; 213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanimport javax.jmdns.impl.tasks.state.Renewer; 223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman/** 243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * This class is used by JmDNS to start the various task required to run the DNS discovery. This interface is only there in order to support MANET modifications. 253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * <p> 263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * <b>Note: </b> This is not considered as part of the general public API of JmDNS. 273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * </p> 283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @author Pierre Frisch 303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Romanpublic interface DNSTaskStarter { 323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * DNSTaskStarter.Factory enable the creation of new instance of DNSTaskStarter. 353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final class Factory { 373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private static volatile Factory _instance; 393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final ConcurrentMap<JmDNSImpl, DNSTaskStarter> _instances; 403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * This interface defines a delegate to the DNSTaskStarter class to enable subclassing. 433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static interface ClassDelegate { 453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Allows the delegate the opportunity to construct and return a different DNSTaskStarter. 483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param jmDNSImpl 503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * jmDNS instance 513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return Should return a new DNSTaskStarter Object. 523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see #classDelegate() 533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see #setClassDelegate(ClassDelegate anObject) 543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl); 563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>(); 593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private Factory() { 613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(); 623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _instances = new ConcurrentHashMap<JmDNSImpl, DNSTaskStarter>(20); 633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Assigns <code>delegate</code> as DNSTaskStarter's class delegate. The class delegate is optional. 673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param delegate 693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * The object to set as DNSTaskStarter's class delegate. 703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see #classDelegate() 713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see DNSTaskStarter.Factory.ClassDelegate 723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static void setClassDelegate(Factory.ClassDelegate delegate) { 743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _databaseClassDelegate.set(delegate); 753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Returns DNSTaskStarter's class delegate. 793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return DNSTaskStarter's class delegate. 813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see #setClassDelegate(ClassDelegate anObject) 823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see DNSTaskStarter.Factory.ClassDelegate 833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static Factory.ClassDelegate classDelegate() { 853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return _databaseClassDelegate.get(); 863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Returns a new instance of DNSTaskStarter using the class delegate if it exists. 903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param jmDNSImpl 923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * jmDNS instance 933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return new instance of DNSTaskStarter 943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman protected static DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl) { 963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSTaskStarter instance = null; 973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman Factory.ClassDelegate delegate = _databaseClassDelegate.get(); 983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (delegate != null) { 993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman instance = delegate.newDNSTaskStarter(jmDNSImpl); 1003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return (instance != null ? instance : new DNSTaskStarterImpl(jmDNSImpl)); 1023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Return the instance of the DNSTaskStarter Factory. 1063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 1073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return DNSTaskStarter Factory 1083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static Factory getInstance() { 1103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_instance == null) { 1113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman synchronized (DNSTaskStarter.Factory.class) { 1123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_instance == null) { 1133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _instance = new Factory(); 1143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return _instance; 1183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Return the instance of the DNSTaskStarter for the JmDNS. 1223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 1233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param jmDNSImpl 1243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * jmDNS instance 1253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @return the DNSTaskStarter 1263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public DNSTaskStarter getStarter(JmDNSImpl jmDNSImpl) { 1283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman DNSTaskStarter starter = _instances.get(jmDNSImpl); 1293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (starter == null) { 1303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _instances.putIfAbsent(jmDNSImpl, newDNSTaskStarter(jmDNSImpl)); 1313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman starter = _instances.get(jmDNSImpl); 1323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman return starter; 1343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static final class DNSTaskStarterImpl implements DNSTaskStarter { 1393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final JmDNSImpl _jmDNSImpl; 1413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * The timer is used to dispatch all outgoing messages of JmDNS. It is also used to dispatch maintenance tasks for the DNS cache. 1443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final Timer _timer; 1463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * The timer is used to dispatch maintenance tasks for the DNS cache. 1493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private final Timer _stateTimer; 1513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public static class StarterTimer extends Timer { 1533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman // This is needed because in some case we cancel the timers before all the task have finished running and in some case they will try to reschedule 1553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman private volatile boolean _cancelled; 1563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 1593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public StarterTimer() { 1613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(); 1623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _cancelled = false; 1633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param isDaemon 1673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public StarterTimer(boolean isDaemon) { 1693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(isDaemon); 1703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _cancelled = false; 1713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param name 1753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param isDaemon 1763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public StarterTimer(String name, boolean isDaemon) { 1783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(name, isDaemon); 1793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _cancelled = false; 1803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 1833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param name 1843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public StarterTimer(String name) { 1863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(name); 1873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _cancelled = false; 1883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 1893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 1903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 1913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 1923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#cancel() 1933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 1943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 1953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void cancel() { 1963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 1973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _cancelled = true; 1983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.cancel(); 1993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#schedule(java.util.TimerTask, long) 2043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void schedule(TimerTask task, long delay) { 2073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.schedule(task, delay); 2093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#schedule(java.util.TimerTask, java.util.Date) 2143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void schedule(TimerTask task, Date time) { 2173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.schedule(task, time); 2193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#schedule(java.util.TimerTask, long, long) 2243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void schedule(TimerTask task, long delay, long period) { 2273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.schedule(task, delay, period); 2293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#schedule(java.util.TimerTask, java.util.Date, long) 2343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void schedule(TimerTask task, Date firstTime, long period) { 2373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.schedule(task, firstTime, period); 2393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, long, long) 2443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void scheduleAtFixedRate(TimerTask task, long delay, long period) { 2473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.scheduleAtFixedRate(task, delay, period); 2493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, java.util.Date, long) 2543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public synchronized void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) { 2573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman if (_cancelled) return; 2583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super.scheduleAtFixedRate(task, firstTime, period); 2593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public DNSTaskStarterImpl(JmDNSImpl jmDNSImpl) { 2643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman super(); 2653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _jmDNSImpl = jmDNSImpl; 2663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _timer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").Timer", true); 2673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _stateTimer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").State.Timer", false); 2683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#purgeTimer() 2733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void purgeTimer() { 2763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _timer.purge(); 2773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#purgeStateTimer() 2823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void purgeStateTimer() { 2853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _stateTimer.purge(); 2863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#cancelTimer() 2913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 2923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 2933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void cancelTimer() { 2943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _timer.cancel(); 2953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 2963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 2973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 2983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 2993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#cancelStateTimer() 3003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void cancelStateTimer() { 3033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman _stateTimer.cancel(); 3043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startProber() 3093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startProber() { 3123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new Prober(_jmDNSImpl).start(_stateTimer); 3133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startAnnouncer() 3183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startAnnouncer() { 3213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new Announcer(_jmDNSImpl).start(_stateTimer); 3223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startRenewer() 3273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startRenewer() { 3303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new Renewer(_jmDNSImpl).start(_stateTimer); 3313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startCanceler() 3363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startCanceler() { 3393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new Canceler(_jmDNSImpl).start(_stateTimer); 3403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startReaper() 3453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startReaper() { 3483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new RecordReaper(_jmDNSImpl).start(_timer); 3493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startServiceInfoResolver(javax.jmdns.impl.ServiceInfoImpl) 3543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startServiceInfoResolver(ServiceInfoImpl info) { 3573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new ServiceInfoResolver(_jmDNSImpl, info).start(_timer); 3583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startTypeResolver() 3633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3653742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startTypeResolver() { 3663742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new TypeResolver(_jmDNSImpl).start(_timer); 3673742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3683742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3693742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3703742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3713742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startServiceResolver(java.lang.String) 3723742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3733742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3743742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startServiceResolver(String type) { 3753742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new ServiceResolver(_jmDNSImpl, type).start(_timer); 3763742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3773742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3783742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /* 3793742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * (non-Javadoc) 3803742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @see javax.jmdns.impl.DNSTaskStarter#startResponder(javax.jmdns.impl.DNSIncoming, int) 3813742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3823742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman @Override 3833742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startResponder(DNSIncoming in, int port) { 3843742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman new Responder(_jmDNSImpl, in, port).start(_timer); 3853742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3863742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman } 3873742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3883742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 3893742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Purge the general task timer 3903742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3913742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void purgeTimer(); 3923742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3933742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 3943742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Purge the state task timer 3953742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 3963742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void purgeStateTimer(); 3973742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 3983742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 3993742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Cancel the generals task timer 4003742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4013742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void cancelTimer(); 4023742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4033742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4043742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Cancel the state task timer 4053742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4063742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void cancelStateTimer(); 4073742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4083742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4093742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new prober task 4103742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4113742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startProber(); 4123742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4133742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4143742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new announcer task 4153742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4163742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startAnnouncer(); 4173742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4183742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4193742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new renewer task 4203742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4213742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startRenewer(); 4223742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4233742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4243742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new canceler task 4253742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4263742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startCanceler(); 4273742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4283742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4293742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new reaper task. There is only supposed to be one reaper running at a time. 4303742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4313742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startReaper(); 4323742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4333742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4343742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new service info resolver task 4353742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 4363742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param info 4373742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * service info to resolve 4383742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4393742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startServiceInfoResolver(ServiceInfoImpl info); 4403742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4413742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4423742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new service type resolver task 4433742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4443742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startTypeResolver(); 4453742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4463742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4473742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new service resolver task 4483742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 4493742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param type 4503742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * service type to resolve 4513742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4523742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startServiceResolver(String type); 4533742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4543742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman /** 4553742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * Start a new responder task 4563742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * 4573742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param in 4583742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * incoming message 4593742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * @param port 4603742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman * incoming port 4613742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman */ 4623742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman public void startResponder(DNSIncoming in, int port); 4633742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman 4643742d9db8b6edb10627b0f89336cca5249f1d15aManuel Roman} 465