View Javadoc

1   // Licensed under Apache License version 2.0
2   package javax.jmdns.impl.tasks.resolver;
3   
4   import java.io.IOException;
5   import java.util.Timer;
6   import java.util.logging.Level;
7   import java.util.logging.Logger;
8   
9   import javax.jmdns.impl.DNSOutgoing;
10  import javax.jmdns.impl.JmDNSImpl;
11  import javax.jmdns.impl.constants.DNSConstants;
12  import javax.jmdns.impl.tasks.DNSTask;
13  
14  /**
15   * This is the root class for all resolver tasks.
16   * 
17   * @author Pierre Frisch
18   */
19  public abstract class DNSResolverTask extends DNSTask {
20      private static Logger logger = Logger.getLogger(DNSResolverTask.class.getName());
21  
22      /**
23       * Counts the number of queries being sent.
24       */
25      protected int         _count = 0;
26  
27      /**
28       * @param jmDNSImpl
29       */
30      public DNSResolverTask(JmDNSImpl jmDNSImpl) {
31          super(jmDNSImpl);
32      }
33  
34      /*
35       * (non-Javadoc)
36       * @see java.lang.Object#toString()
37       */
38      @Override
39      public String toString() {
40          return super.toString() + " count: " + _count;
41      }
42  
43      /*
44       * (non-Javadoc)
45       * @see javax.jmdns.impl.tasks.DNSTask#start(java.util.Timer)
46       */
47      @Override
48      public void start(Timer timer) {
49          if (!this.getDns().isCanceling() && !this.getDns().isCanceled()) {
50              timer.schedule(this, DNSConstants.QUERY_WAIT_INTERVAL, DNSConstants.QUERY_WAIT_INTERVAL);
51          }
52      }
53  
54      /*
55       * (non-Javadoc)
56       * @see java.util.TimerTask#run()
57       */
58      @Override
59      public void run() {
60          try {
61              if (this.getDns().isCanceling() || this.getDns().isCanceled()) {
62                  this.cancel();
63              } else {
64                  if (_count++ < 3) {
65                      if (logger.isLoggable(Level.FINER)) {
66                          logger.finer(this.getName() + ".run() JmDNS " + this.description());
67                      }
68                      DNSOutgoing out = new DNSOutgoing(DNSConstants.FLAGS_QR_QUERY);
69                      out = this.addQuestions(out);
70                      if (this.getDns().isAnnounced()) {
71                          out = this.addAnswers(out);
72                      }
73                      if (!out.isEmpty()) {
74                          this.getDns().send(out);
75                      }
76                  } else {
77                      // After three queries, we can quit.
78                      this.cancel();
79                  }
80              }
81          } catch (Throwable e) {
82              logger.log(Level.WARNING, this.getName() + ".run() exception ", e);
83              this.getDns().recover();
84          }
85      }
86  
87      /**
88       * Overridden by subclasses to add questions to the message.<br/>
89       * <b>Note:</b> Because of message size limitation the returned message may be different than the message parameter.
90       * 
91       * @param out
92       *            outgoing message
93       * @return the outgoing message.
94       * @exception IOException
95       */
96      protected abstract DNSOutgoing addQuestions(DNSOutgoing out) throws IOException;
97  
98      /**
99       * Overridden by subclasses to add questions to the message.<br/>
100      * <b>Note:</b> Because of message size limitation the returned message may be different than the message parameter.
101      * 
102      * @param out
103      *            outgoing message
104      * @return the outgoing message.
105      * @exception IOException
106      */
107     protected abstract DNSOutgoing addAnswers(DNSOutgoing out) throws IOException;
108 
109     /**
110      * Returns a description of the resolver for debugging
111      * 
112      * @return resolver description
113      */
114     protected abstract String description();
115 
116 }