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