Go to the documentation of this file.00001
00004 package javax.jmdns.impl;
00005
00006 import java.util.Date;
00007 import java.util.Timer;
00008 import java.util.TimerTask;
00009 import java.util.concurrent.ConcurrentHashMap;
00010 import java.util.concurrent.ConcurrentMap;
00011 import java.util.concurrent.atomic.AtomicReference;
00012
00013 import javax.jmdns.impl.tasks.RecordReaper;
00014 import javax.jmdns.impl.tasks.Responder;
00015 import javax.jmdns.impl.tasks.resolver.ServiceInfoResolver;
00016 import javax.jmdns.impl.tasks.resolver.ServiceResolver;
00017 import javax.jmdns.impl.tasks.resolver.TypeResolver;
00018 import javax.jmdns.impl.tasks.state.Announcer;
00019 import javax.jmdns.impl.tasks.state.Canceler;
00020 import javax.jmdns.impl.tasks.state.Prober;
00021 import javax.jmdns.impl.tasks.state.Renewer;
00022
00031 public interface DNSTaskStarter {
00032
00036 public static final class Factory {
00037
00038 private static volatile Factory _instance;
00039 private final ConcurrentMap<JmDNSImpl, DNSTaskStarter> _instances;
00040
00044 public static interface ClassDelegate {
00045
00055 public DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl);
00056 }
00057
00058 private static final AtomicReference<Factory.ClassDelegate> _databaseClassDelegate = new AtomicReference<Factory.ClassDelegate>();
00059
00060 private Factory() {
00061 super();
00062 _instances = new ConcurrentHashMap<JmDNSImpl, DNSTaskStarter>(20);
00063 }
00064
00073 public static void setClassDelegate(Factory.ClassDelegate delegate) {
00074 _databaseClassDelegate.set(delegate);
00075 }
00076
00084 public static Factory.ClassDelegate classDelegate() {
00085 return _databaseClassDelegate.get();
00086 }
00087
00095 protected static DNSTaskStarter newDNSTaskStarter(JmDNSImpl jmDNSImpl) {
00096 DNSTaskStarter instance = null;
00097 Factory.ClassDelegate delegate = _databaseClassDelegate.get();
00098 if (delegate != null) {
00099 instance = delegate.newDNSTaskStarter(jmDNSImpl);
00100 }
00101 return (instance != null ? instance : new DNSTaskStarterImpl(jmDNSImpl));
00102 }
00103
00109 public static Factory getInstance() {
00110 if (_instance == null) {
00111 synchronized (DNSTaskStarter.Factory.class) {
00112 if (_instance == null) {
00113 _instance = new Factory();
00114 }
00115 }
00116 }
00117 return _instance;
00118 }
00119
00127 public DNSTaskStarter getStarter(JmDNSImpl jmDNSImpl) {
00128 DNSTaskStarter starter = _instances.get(jmDNSImpl);
00129 if (starter == null) {
00130 _instances.putIfAbsent(jmDNSImpl, newDNSTaskStarter(jmDNSImpl));
00131 starter = _instances.get(jmDNSImpl);
00132 }
00133 return starter;
00134 }
00135
00136 }
00137
00138 public static final class DNSTaskStarterImpl implements DNSTaskStarter {
00139
00140 private final JmDNSImpl _jmDNSImpl;
00141
00145 private final Timer _timer;
00146
00150 private final Timer _stateTimer;
00151
00152 public static class StarterTimer extends Timer {
00153
00154
00155 private volatile boolean _cancelled;
00156
00160 public StarterTimer() {
00161 super();
00162 _cancelled = false;
00163 }
00164
00168 public StarterTimer(boolean isDaemon) {
00169 super(isDaemon);
00170 _cancelled = false;
00171 }
00172
00177 public StarterTimer(String name, boolean isDaemon) {
00178 super(name, isDaemon);
00179 _cancelled = false;
00180 }
00181
00185 public StarterTimer(String name) {
00186 super(name);
00187 _cancelled = false;
00188 }
00189
00190
00191
00192
00193
00194 @Override
00195 public synchronized void cancel() {
00196 if (_cancelled) return;
00197 _cancelled = true;
00198 super.cancel();
00199 }
00200
00201
00202
00203
00204
00205 @Override
00206 public synchronized void schedule(TimerTask task, long delay) {
00207 if (_cancelled) return;
00208 super.schedule(task, delay);
00209 }
00210
00211
00212
00213
00214
00215 @Override
00216 public synchronized void schedule(TimerTask task, Date time) {
00217 if (_cancelled) return;
00218 super.schedule(task, time);
00219 }
00220
00221
00222
00223
00224
00225 @Override
00226 public synchronized void schedule(TimerTask task, long delay, long period) {
00227 if (_cancelled) return;
00228 super.schedule(task, delay, period);
00229 }
00230
00231
00232
00233
00234
00235 @Override
00236 public synchronized void schedule(TimerTask task, Date firstTime, long period) {
00237 if (_cancelled) return;
00238 super.schedule(task, firstTime, period);
00239 }
00240
00241
00242
00243
00244
00245 @Override
00246 public synchronized void scheduleAtFixedRate(TimerTask task, long delay, long period) {
00247 if (_cancelled) return;
00248 super.scheduleAtFixedRate(task, delay, period);
00249 }
00250
00251
00252
00253
00254
00255 @Override
00256 public synchronized void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) {
00257 if (_cancelled) return;
00258 super.scheduleAtFixedRate(task, firstTime, period);
00259 }
00260
00261 }
00262
00263 public DNSTaskStarterImpl(JmDNSImpl jmDNSImpl) {
00264 super();
00265 _jmDNSImpl = jmDNSImpl;
00266 _timer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").Timer", true);
00267 _stateTimer = new StarterTimer("JmDNS(" + _jmDNSImpl.getName() + ").State.Timer", false);
00268 }
00269
00270
00271
00272
00273
00274 @Override
00275 public void purgeTimer() {
00276 _timer.purge();
00277 }
00278
00279
00280
00281
00282
00283 @Override
00284 public void purgeStateTimer() {
00285 _stateTimer.purge();
00286 }
00287
00288
00289
00290
00291
00292 @Override
00293 public void cancelTimer() {
00294 _timer.cancel();
00295 }
00296
00297
00298
00299
00300
00301 @Override
00302 public void cancelStateTimer() {
00303 _stateTimer.cancel();
00304 }
00305
00306
00307
00308
00309
00310 @Override
00311 public void startProber() {
00312 new Prober(_jmDNSImpl).start(_stateTimer);
00313 }
00314
00315
00316
00317
00318
00319 @Override
00320 public void startAnnouncer() {
00321 new Announcer(_jmDNSImpl).start(_stateTimer);
00322 }
00323
00324
00325
00326
00327
00328 @Override
00329 public void startRenewer() {
00330 new Renewer(_jmDNSImpl).start(_stateTimer);
00331 }
00332
00333
00334
00335
00336
00337 @Override
00338 public void startCanceler() {
00339 new Canceler(_jmDNSImpl).start(_stateTimer);
00340 }
00341
00342
00343
00344
00345
00346 @Override
00347 public void startReaper() {
00348 new RecordReaper(_jmDNSImpl).start(_timer);
00349 }
00350
00351
00352
00353
00354
00355 @Override
00356 public void startServiceInfoResolver(ServiceInfoImpl info) {
00357 new ServiceInfoResolver(_jmDNSImpl, info).start(_timer);
00358 }
00359
00360
00361
00362
00363
00364 @Override
00365 public void startTypeResolver() {
00366 new TypeResolver(_jmDNSImpl).start(_timer);
00367 }
00368
00369
00370
00371
00372
00373 @Override
00374 public void startServiceResolver(String type) {
00375 new ServiceResolver(_jmDNSImpl, type).start(_timer);
00376 }
00377
00378
00379
00380
00381
00382 @Override
00383 public void startResponder(DNSIncoming in, int port) {
00384 new Responder(_jmDNSImpl, in, port).start(_timer);
00385 }
00386 }
00387
00391 public void purgeTimer();
00392
00396 public void purgeStateTimer();
00397
00401 public void cancelTimer();
00402
00406 public void cancelStateTimer();
00407
00411 public void startProber();
00412
00416 public void startAnnouncer();
00417
00421 public void startRenewer();
00422
00426 public void startCanceler();
00427
00431 public void startReaper();
00432
00439 public void startServiceInfoResolver(ServiceInfoImpl info);
00440
00444 public void startTypeResolver();
00445
00452 public void startServiceResolver(String type);
00453
00462 public void startResponder(DNSIncoming in, int port);
00463
00464 }