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/tasks/state/DNSStateTask.java | |
parent | 19376825c9e562c188aef9ccd09a7220bd3c0a20 (diff) | |
parent | 76f0067cea0428b683cba2f187d81e723658f964 (diff) | |
download | jmdns-53d1e72ef4bb01389f1b9847d038fd32644e985a.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/tasks/state/DNSStateTask.java')
-rw-r--r-- | src/javax/jmdns/impl/tasks/state/DNSStateTask.java | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/javax/jmdns/impl/tasks/state/DNSStateTask.java b/src/javax/jmdns/impl/tasks/state/DNSStateTask.java new file mode 100644 index 0000000..a0896d9 --- /dev/null +++ b/src/javax/jmdns/impl/tasks/state/DNSStateTask.java @@ -0,0 +1,188 @@ +// Licensed under Apache License version 2.0 +package javax.jmdns.impl.tasks.state; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.jmdns.ServiceInfo; +import javax.jmdns.impl.DNSOutgoing; +import javax.jmdns.impl.DNSStatefulObject; +import javax.jmdns.impl.JmDNSImpl; +import javax.jmdns.impl.ServiceInfoImpl; +import javax.jmdns.impl.constants.DNSConstants; +import javax.jmdns.impl.constants.DNSState; +import javax.jmdns.impl.tasks.DNSTask; + +/** + * This is the root class for all state tasks. These tasks work with objects that implements the {@link javax.jmdns.impl.DNSStatefulObject} interface and therefore participate in the state machine. + * + * @author Pierre Frisch + */ +public abstract class DNSStateTask extends DNSTask { + static Logger logger1 = Logger.getLogger(DNSStateTask.class.getName()); + + /** + * By setting a 0 ttl we effectively expire the record. + */ + private final int _ttl; + + private static int _defaultTTL = DNSConstants.DNS_TTL; + + /** + * The state of the task. + */ + private DNSState _taskState = null; + + public abstract String getTaskDescription(); + + public static int defaultTTL() { + return _defaultTTL; + } + + /** + * For testing only do not use in production. + * + * @param value + */ + public static void setDefaultTTL(int value) { + _defaultTTL = value; + } + + /** + * @param jmDNSImpl + * @param ttl + */ + public DNSStateTask(JmDNSImpl jmDNSImpl, int ttl) { + super(jmDNSImpl); + _ttl = ttl; + } + + /** + * @return the ttl + */ + public int getTTL() { + return _ttl; + } + + /** + * Associate the DNS host and the service infos with this task if not already associated and in the same state. + * + * @param state + * target state + */ + protected void associate(DNSState state) { + synchronized (this.getDns()) { + this.getDns().associateWithTask(this, state); + } + for (ServiceInfo serviceInfo : this.getDns().getServices().values()) { + ((ServiceInfoImpl) serviceInfo).associateWithTask(this, state); + } + } + + /** + * Remove the DNS host and service info association with this task. + */ + protected void removeAssociation() { + // Remove association from host to this + synchronized (this.getDns()) { + this.getDns().removeAssociationWithTask(this); + } + + // Remove associations from services to this + for (ServiceInfo serviceInfo : this.getDns().getServices().values()) { + ((ServiceInfoImpl) serviceInfo).removeAssociationWithTask(this); + } + } + + @Override + public void run() { + DNSOutgoing out = this.createOugoing(); + try { + if (!this.checkRunCondition()) { + this.cancel(); + return; + } + List<DNSStatefulObject> stateObjects = new ArrayList<DNSStatefulObject>(); + // send probes for JmDNS itself + synchronized (this.getDns()) { + if (this.getDns().isAssociatedWithTask(this, this.getTaskState())) { + logger1.finer(this.getName() + ".run() JmDNS " + this.getTaskDescription() + " " + this.getDns().getName()); + stateObjects.add(this.getDns()); + out = this.buildOutgoingForDNS(out); + } + } + // send probes for services + for (ServiceInfo serviceInfo : this.getDns().getServices().values()) { + ServiceInfoImpl info = (ServiceInfoImpl) serviceInfo; + + synchronized (info) { + if (info.isAssociatedWithTask(this, this.getTaskState())) { + logger1.fine(this.getName() + ".run() JmDNS " + this.getTaskDescription() + " " + info.getQualifiedName()); + stateObjects.add(info); + out = this.buildOutgoingForInfo(info, out); + } + } + } + if (!out.isEmpty()) { + logger1.finer(this.getName() + ".run() JmDNS " + this.getTaskDescription() + " #" + this.getTaskState()); + this.getDns().send(out); + + // Advance the state of objects. + this.advanceObjectsState(stateObjects); + } else { + // Advance the state of objects. + this.advanceObjectsState(stateObjects); + + // If we have nothing to send, another timer taskState ahead of us has done the job for us. We can cancel. + cancel(); + return; + } + } catch (Throwable e) { + logger1.log(Level.WARNING, this.getName() + ".run() exception ", e); + this.recoverTask(e); + } + + this.advanceTask(); + } + + protected abstract boolean checkRunCondition(); + + protected abstract DNSOutgoing buildOutgoingForDNS(DNSOutgoing out) throws IOException; + + protected abstract DNSOutgoing buildOutgoingForInfo(ServiceInfoImpl info, DNSOutgoing out) throws IOException; + + protected abstract DNSOutgoing createOugoing(); + + protected void advanceObjectsState(List<DNSStatefulObject> list) { + if (list != null) { + for (DNSStatefulObject object : list) { + synchronized (object) { + object.advanceState(this); + } + } + } + } + + protected abstract void recoverTask(Throwable e); + + protected abstract void advanceTask(); + + /** + * @return the taskState + */ + protected DNSState getTaskState() { + return this._taskState; + } + + /** + * @param taskState + * the taskState to set + */ + protected void setTaskState(DNSState taskState) { + this._taskState = taskState; + } + +} |