diff options
author | Mike Lockwood <lockwood@google.com> | 2012-03-21 12:26:23 -0700 |
---|---|---|
committer | Mike Lockwood <lockwood@google.com> | 2012-03-21 12:26:23 -0700 |
commit | f4eb7466d5c09098f9dc54137ed3235e3c43fc9f (patch) | |
tree | 56e1bf5e433e60e3a18d5a9d08b7d55a64d8ae1d /src/javax/jmdns/impl/DNSTaskStarter.java | |
parent | 19376825c9e562c188aef9ccd09a7220bd3c0a20 (diff) | |
parent | 76f0067cea0428b683cba2f187d81e723658f964 (diff) | |
download | jmdns-android-5.1.1_r2.tar.gz |
Merge remote-tracking branch 'goog/ics-aah-exp'android-wear-n-preview-3android-wear-n-preview-2android-wear-n-preview-1android-wear-7.1.1_r1android-wear-5.1.1_r1android-wear-5.1.0_r1android-wear-5.0.0_r1android-sdk-support_r11android-sdk-4.4.2_r1.0.1android-sdk-4.4.2_r1android-n-preview-5android-n-preview-4android-n-preview-3android-n-preview-2android-n-preview-1android-n-iot-preview-2android-m-preview-2android-m-preview-1android-m-previewandroid-l-preview_r2android-cts-6.0_r9android-cts-6.0_r8android-cts-6.0_r7android-cts-6.0_r6android-cts-6.0_r5android-cts-6.0_r4android-cts-6.0_r32android-cts-6.0_r31android-cts-6.0_r30android-cts-6.0_r3android-cts-6.0_r29android-cts-6.0_r28android-cts-6.0_r27android-cts-6.0_r26android-cts-6.0_r25android-cts-6.0_r24android-cts-6.0_r23android-cts-6.0_r22android-cts-6.0_r21android-cts-6.0_r20android-cts-6.0_r2android-cts-6.0_r19android-cts-6.0_r18android-cts-6.0_r17android-cts-6.0_r16android-cts-6.0_r15android-cts-6.0_r14android-cts-6.0_r13android-cts-6.0_r12android-cts-6.0_r1android-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-cts-5.0_r9android-cts-5.0_r8android-cts-5.0_r7android-cts-5.0_r6android-cts-5.0_r5android-cts-5.0_r4android-cts-5.0_r3android-cts-4.4_r4android-cts-4.4_r1android-cts-4.2_r2android-cts-4.2_r1android-cts-4.1_r4android-cts-4.1_r2android-cts-4.1_r1android-6.0.1_r9android-6.0.1_r81android-6.0.1_r80android-6.0.1_r8android-6.0.1_r79android-6.0.1_r78android-6.0.1_r77android-6.0.1_r74android-6.0.1_r73android-6.0.1_r72android-6.0.1_r70android-6.0.1_r7android-6.0.1_r69android-6.0.1_r68android-6.0.1_r67android-6.0.1_r66android-6.0.1_r65android-6.0.1_r63android-6.0.1_r62android-6.0.1_r61android-6.0.1_r60android-6.0.1_r59android-6.0.1_r58android-6.0.1_r57android-6.0.1_r56android-6.0.1_r55android-6.0.1_r54android-6.0.1_r53android-6.0.1_r52android-6.0.1_r51android-6.0.1_r50android-6.0.1_r5android-6.0.1_r49android-6.0.1_r48android-6.0.1_r47android-6.0.1_r46android-6.0.1_r45android-6.0.1_r43android-6.0.1_r42android-6.0.1_r41android-6.0.1_r40android-6.0.1_r4android-6.0.1_r33android-6.0.1_r32android-6.0.1_r31android-6.0.1_r30android-6.0.1_r3android-6.0.1_r28android-6.0.1_r27android-6.0.1_r26android-6.0.1_r25android-6.0.1_r24android-6.0.1_r22android-6.0.1_r21android-6.0.1_r20android-6.0.1_r18android-6.0.1_r17android-6.0.1_r16android-6.0.1_r13android-6.0.1_r12android-6.0.1_r11android-6.0.1_r10android-6.0.1_r1android-6.0.0_r7android-6.0.0_r6android-6.0.0_r5android-6.0.0_r41android-6.0.0_r4android-6.0.0_r3android-6.0.0_r26android-6.0.0_r25android-6.0.0_r24android-6.0.0_r23android-6.0.0_r2android-6.0.0_r13android-6.0.0_r12android-6.0.0_r11android-6.0.0_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1android-5.0.2_r3android-5.0.2_r1android-5.0.1_r1android-5.0.0_r7android-5.0.0_r6android-5.0.0_r5.1android-5.0.0_r5android-5.0.0_r4android-5.0.0_r3android-5.0.0_r2android-5.0.0_r1android-4.4w_r1android-4.4_r1.2.0.1android-4.4_r1.2android-4.4_r1.1.0.1android-4.4_r1.1android-4.4_r1.0.1android-4.4_r1android-4.4_r0.9android-4.4_r0.8android-4.4_r0.7android-4.4.4_r2.0.1android-4.4.4_r2android-4.4.4_r1.0.1android-4.4.4_r1android-4.4.3_r1.1.0.1android-4.4.3_r1.1android-4.4.3_r1.0.1android-4.4.3_r1android-4.4.2_r2.0.1android-4.4.2_r2android-4.4.2_r1.0.1android-4.4.2_r1android-4.4.1_r1.0.1android-4.4.1_r1android-4.3_r3.1android-4.3_r3android-4.3_r2.3android-4.3_r2.2android-4.3_r2.1android-4.3_r2android-4.3_r1.1android-4.3_r1android-4.3_r0.9.1android-4.3_r0.9android-4.3.1_r1android-4.2_r1android-4.2.2_r1.2android-4.2.2_r1.1android-4.2.2_r1android-4.2.1_r1.2android-4.2.1_r1.1android-4.2.1_r1android-4.1.2_r2.1android-4.1.2_r2android-4.1.2_r1android-4.1.1_r6.1android-4.1.1_r6android-4.1.1_r5android-4.1.1_r4android-4.1.1_r3android-4.1.1_r2android-4.1.1_r1.1android-4.1.1_r1tools_r22.2tools_r22tools_r21nougat-mr1-wear-releasen-iot-preview-2master-soongmarshmallow-releasemarshmallow-mr3-releasemarshmallow-mr2-releasemarshmallow-mr1-releasemarshmallow-mr1-devmarshmallow-dr1.6-releasemarshmallow-dr1.5-releasemarshmallow-dr1.5-devmarshmallow-dr-releasemarshmallow-dr-dragon-releasemarshmallow-dr-devmarshmallow-devmarshmallow-cts-releaselollipop-wear-releaselollipop-releaselollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-releaselollipop-devlollipop-cts-releasel-previewkitkat-wearkitkat-releasekitkat-mr2.2-releasekitkat-mr2.1-releasekitkat-mr2-releasekitkat-mr1.1-releasekitkat-mr1-releasekitkat-devkitkat-cts-releasekitkat-cts-devjb-releasejb-mr2.0.0-releasejb-mr2.0-releasejb-mr2-releasejb-mr2-devjb-mr1.1-releasejb-mr1.1-dev-plus-aospjb-mr1.1-devjb-mr1-releasejb-mr1-dev-plus-aospjb-mr1-devjb-mr0-releasejb-devidea133-weekly-releaseidea133
Diffstat (limited to 'src/javax/jmdns/impl/DNSTaskStarter.java')
-rw-r--r-- | src/javax/jmdns/impl/DNSTaskStarter.java | 464 |
1 files changed, 464 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/DNSTaskStarter.java b/src/javax/jmdns/impl/DNSTaskStarter.java new file mode 100644 index 0000000..ab17201 --- /dev/null +++ b/src/javax/jmdns/impl/DNSTaskStarter.java @@ -0,0 +1,464 @@ +/** + * + */ +package javax.jmdns.impl; + +import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicReference; + +import javax.jmdns.impl.tasks.RecordReaper; +import javax.jmdns.impl.tasks.Responder; +import javax.jmdns.impl.tasks.resolver.ServiceInfoResolver; +import javax.jmdns.impl.tasks.resolver.ServiceResolver; +import javax.jmdns.impl.tasks.resolver.TypeResolver; +import javax.jmdns.impl.tasks.state.Announcer; +import javax.jmdns.impl.tasks.state.Canceler; +import javax.jmdns.impl.tasks.state.Prober; +import javax.jmdns.impl.tasks.state.Renewer; + +/** + * 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. + * <p> + * <b>Note: </b> This is not considered as part of the general public API of JmDNS. + * </p> + * + * @author Pierre Frisch + */ +public interface DNSTaskStarter { + + /** + * DNSTaskStarter.Factory enable the creation of new instance of DNSTaskStarter. + */ + public static final class Factory { + + private static volatile Factory _instance; + private final ConcurrentMap<JmDNSImpl, DNSTaskStarter> _instances; + + /** + * This interface defines a delegate to the DNSTaskStarter class to enable subclassing. + */ + public static interface ClassDelegate { + + /** + * Allows the delegate the opportunity to construct and return a different DNSTaskStarter. + * + * @param jmDNSImpl + * jmDNS instance + * @return Should return a new DNSTaskStarter Object. + * @see #classDelegate() + * @see #setClassDelegate(ClassDelegate anObject) + */ + public DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl); + } + + private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>(); + + private Factory() { + super(); + _instances = new ConcurrentHashMap<JmDNSImpl, DNSTaskStarter>(20); + } + + /** + * Assigns <code>delegate</code> as DNSTaskStarter's class delegate. The class delegate is optional. + * + * @param delegate + * The object to set as DNSTaskStarter's class delegate. + * @see #classDelegate() + * @see DNSTaskStarter.Factory.ClassDelegate + */ + public static void setClassDelegate(Factory.ClassDelegate delegate) { + _databaseClassDelegate.set(delegate); + } + + /** + * Returns DNSTaskStarter's class delegate. + * + * @return DNSTaskStarter's class delegate. + * @see #setClassDelegate(ClassDelegate anObject) + * @see DNSTaskStarter.Factory.ClassDelegate + */ + public static Factory.ClassDelegate classDelegate() { + return _databaseClassDelegate.get(); + } + + /** + * Returns a new instance of DNSTaskStarter using the class delegate if it exists. + * + * @param jmDNSImpl + * jmDNS instance + * @return new instance of DNSTaskStarter + */ + protected static DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl) { + DNSTaskStarter instance = null; + Factory.ClassDelegate delegate = _databaseClassDelegate.get(); + if (delegate != null) { + instance = delegate.newDNSTaskStarter(jmDNSImpl); + } + return (instance != null ? instance : new DNSTaskStarterImpl(jmDNSImpl)); + } + + /** + * Return the instance of the DNSTaskStarter Factory. + * + * @return DNSTaskStarter Factory + */ + public static Factory getInstance() { + if (_instance == null) { + synchronized (DNSTaskStarter.Factory.class) { + if (_instance == null) { + _instance = new Factory(); + } + } + } + return _instance; + } + + /** + * Return the instance of the DNSTaskStarter for the JmDNS. + * + * @param jmDNSImpl + * jmDNS instance + * @return the DNSTaskStarter + */ + public DNSTaskStarter getStarter(JmDNSImpl jmDNSImpl) { + DNSTaskStarter starter = _instances.get(jmDNSImpl); + if (starter == null) { + _instances.putIfAbsent(jmDNSImpl, newDNSTaskStarter(jmDNSImpl)); + starter = _instances.get(jmDNSImpl); + } + return starter; + } + + } + + public static final class DNSTaskStarterImpl implements DNSTaskStarter { + + private final JmDNSImpl _jmDNSImpl; + + /** + * The timer is used to dispatch all outgoing messages of JmDNS. It is also used to dispatch maintenance tasks for the DNS cache. + */ + private final Timer _timer; + + /** + * The timer is used to dispatch maintenance tasks for the DNS cache. + */ + private final Timer _stateTimer; + + public static class StarterTimer extends Timer { + + // 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 + private volatile boolean _cancelled; + + /** + * + */ + public StarterTimer() { + super(); + _cancelled = false; + } + + /** + * @param isDaemon + */ + public StarterTimer(boolean isDaemon) { + super(isDaemon); + _cancelled = false; + } + + /** + * @param name + * @param isDaemon + */ + public StarterTimer(String name, boolean isDaemon) { + super(name, isDaemon); + _cancelled = false; + } + + /** + * @param name + */ + public StarterTimer(String name) { + super(name); + _cancelled = false; + } + + /* + * (non-Javadoc) + * @see java.util.Timer#cancel() + */ + @Override + public synchronized void cancel() { + if (_cancelled) return; + _cancelled = true; + super.cancel(); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#schedule(java.util.TimerTask, long) + */ + @Override + public synchronized void schedule(TimerTask task, long delay) { + if (_cancelled) return; + super.schedule(task, delay); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#schedule(java.util.TimerTask, java.util.Date) + */ + @Override + public synchronized void schedule(TimerTask task, Date time) { + if (_cancelled) return; + super.schedule(task, time); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#schedule(java.util.TimerTask, long, long) + */ + @Override + public synchronized void schedule(TimerTask task, long delay, long period) { + if (_cancelled) return; + super.schedule(task, delay, period); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#schedule(java.util.TimerTask, java.util.Date, long) + */ + @Override + public synchronized void schedule(TimerTask task, Date firstTime, long period) { + if (_cancelled) return; + super.schedule(task, firstTime, period); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, long, long) + */ + @Override + public synchronized void scheduleAtFixedRate(TimerTask task, long delay, long period) { + if (_cancelled) return; + super.scheduleAtFixedRate(task, delay, period); + } + + /* + * (non-Javadoc) + * @see java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, java.util.Date, long) + */ + @Override + public synchronized void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) { + if (_cancelled) return; + super.scheduleAtFixedRate(task, firstTime, period); + } + + } + + public DNSTaskStarterImpl(JmDNSImpl jmDNSImpl) { + super(); + _jmDNSImpl = jmDNSImpl; + _timer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").Timer", true); + _stateTimer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").State.Timer", false); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#purgeTimer() + */ + @Override + public void purgeTimer() { + _timer.purge(); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#purgeStateTimer() + */ + @Override + public void purgeStateTimer() { + _stateTimer.purge(); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#cancelTimer() + */ + @Override + public void cancelTimer() { + _timer.cancel(); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#cancelStateTimer() + */ + @Override + public void cancelStateTimer() { + _stateTimer.cancel(); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startProber() + */ + @Override + public void startProber() { + new Prober(_jmDNSImpl).start(_stateTimer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startAnnouncer() + */ + @Override + public void startAnnouncer() { + new Announcer(_jmDNSImpl).start(_stateTimer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startRenewer() + */ + @Override + public void startRenewer() { + new Renewer(_jmDNSImpl).start(_stateTimer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startCanceler() + */ + @Override + public void startCanceler() { + new Canceler(_jmDNSImpl).start(_stateTimer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startReaper() + */ + @Override + public void startReaper() { + new RecordReaper(_jmDNSImpl).start(_timer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startServiceInfoResolver(javax.jmdns.impl.ServiceInfoImpl) + */ + @Override + public void startServiceInfoResolver(ServiceInfoImpl info) { + new ServiceInfoResolver(_jmDNSImpl, info).start(_timer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startTypeResolver() + */ + @Override + public void startTypeResolver() { + new TypeResolver(_jmDNSImpl).start(_timer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startServiceResolver(java.lang.String) + */ + @Override + public void startServiceResolver(String type) { + new ServiceResolver(_jmDNSImpl, type).start(_timer); + } + + /* + * (non-Javadoc) + * @see javax.jmdns.impl.DNSTaskStarter#startResponder(javax.jmdns.impl.DNSIncoming, int) + */ + @Override + public void startResponder(DNSIncoming in, int port) { + new Responder(_jmDNSImpl, in, port).start(_timer); + } + } + + /** + * Purge the general task timer + */ + public void purgeTimer(); + + /** + * Purge the state task timer + */ + public void purgeStateTimer(); + + /** + * Cancel the generals task timer + */ + public void cancelTimer(); + + /** + * Cancel the state task timer + */ + public void cancelStateTimer(); + + /** + * Start a new prober task + */ + public void startProber(); + + /** + * Start a new announcer task + */ + public void startAnnouncer(); + + /** + * Start a new renewer task + */ + public void startRenewer(); + + /** + * Start a new canceler task + */ + public void startCanceler(); + + /** + * Start a new reaper task. There is only supposed to be one reaper running at a time. + */ + public void startReaper(); + + /** + * Start a new service info resolver task + * + * @param info + * service info to resolve + */ + public void startServiceInfoResolver(ServiceInfoImpl info); + + /** + * Start a new service type resolver task + */ + public void startTypeResolver(); + + /** + * Start a new service resolver task + * + * @param type + * service type to resolve + */ + public void startServiceResolver(String type); + + /** + * Start a new responder task + * + * @param in + * incoming message + * @param port + * incoming port + */ + public void startResponder(DNSIncoming in, int port); + +} |