Go to the documentation of this file.00001
00002
00003
00004
00005 package javax.jmdns.impl;
00006
00007 import java.io.ByteArrayOutputStream;
00008 import java.io.DataOutputStream;
00009 import java.io.IOException;
00010 import java.util.Collections;
00011 import java.util.Map;
00012
00013 import javax.jmdns.ServiceInfo.Fields;
00014 import javax.jmdns.impl.constants.DNSRecordClass;
00015 import javax.jmdns.impl.constants.DNSRecordType;
00016
00022 public abstract class DNSEntry {
00023
00024 private final String _key;
00025
00026 private final String _name;
00027
00028 private final String _type;
00029
00030 private final DNSRecordType _recordType;
00031
00032 private final DNSRecordClass _dnsClass;
00033
00034 private final boolean _unique;
00035
00036 final Map<Fields, String> _qualifiedNameMap;
00037
00041 DNSEntry(String name, DNSRecordType type, DNSRecordClass recordClass, boolean unique) {
00042 _name = name;
00043
00044 _recordType = type;
00045 _dnsClass = recordClass;
00046 _unique = unique;
00047 _qualifiedNameMap = ServiceInfoImpl.decodeQualifiedNameMapForType(this.getName());
00048 String domain = _qualifiedNameMap.get(Fields.Domain);
00049 String protocol = _qualifiedNameMap.get(Fields.Protocol);
00050 String application = _qualifiedNameMap.get(Fields.Application);
00051 String instance = _qualifiedNameMap.get(Fields.Instance).toLowerCase();
00052 _type = (application.length() > 0 ? "_" + application + "." : "") + (protocol.length() > 0 ? "_" + protocol + "." : "") + domain + ".";
00053 _key = ((instance.length() > 0 ? instance + "." : "") + _type).toLowerCase();
00054 }
00055
00056
00057
00058
00059
00060 @Override
00061 public boolean equals(Object obj) {
00062 boolean result = false;
00063 if (obj instanceof DNSEntry) {
00064 DNSEntry other = (DNSEntry) obj;
00065 result = this.getKey().equals(other.getKey()) && this.getRecordType().equals(other.getRecordType()) && this.getRecordClass() == other.getRecordClass();
00066 }
00067 return result;
00068 }
00069
00076 public boolean isSameEntry(DNSEntry entry) {
00077 return this.getKey().equals(entry.getKey()) && this.getRecordType().equals(entry.getRecordType()) && ((DNSRecordClass.CLASS_ANY == entry.getRecordClass()) || this.getRecordClass().equals(entry.getRecordClass()));
00078 }
00079
00086 public boolean sameSubtype(DNSEntry other) {
00087 return this.getSubtype().equals(other.getSubtype());
00088 }
00089
00095 public String getSubtype() {
00096 String subtype = this.getQualifiedNameMap().get(Fields.Subtype);
00097 return (subtype != null ? subtype : "");
00098 }
00099
00105 public String getName() {
00106 return (_name != null ? _name : "");
00107 }
00108
00112 public String getType() {
00113 return (_type != null ? _type : "");
00114 }
00115
00121 public String getKey() {
00122 return (_key != null ? _key : "");
00123 }
00124
00128 public DNSRecordType getRecordType() {
00129 return (_recordType != null ? _recordType : DNSRecordType.TYPE_IGNORE);
00130 }
00131
00135 public DNSRecordClass getRecordClass() {
00136 return (_dnsClass != null ? _dnsClass : DNSRecordClass.CLASS_UNKNOWN);
00137 }
00138
00142 public boolean isUnique() {
00143 return _unique;
00144 }
00145
00146 public Map<Fields, String> getQualifiedNameMap() {
00147 return Collections.unmodifiableMap(_qualifiedNameMap);
00148 }
00149
00150 public boolean isServicesDiscoveryMetaQuery() {
00151 return _qualifiedNameMap.get(Fields.Application).equals("dns-sd") && _qualifiedNameMap.get(Fields.Instance).equals("_services");
00152 }
00153
00154 public boolean isDomainDiscoveryQuery() {
00155
00156
00157
00158
00159
00160
00161 if (_qualifiedNameMap.get(Fields.Application).equals("dns-sd")) {
00162 String name = _qualifiedNameMap.get(Fields.Instance);
00163 return "b".equals(name) || "db".equals(name) || "r".equals(name) || "dr".equals(name) || "lb".equals(name);
00164 }
00165 return false;
00166 }
00167
00168 public boolean isReverseLookup() {
00169 return this.isV4ReverseLookup() || this.isV6ReverseLookup();
00170 }
00171
00172 public boolean isV4ReverseLookup() {
00173 return _qualifiedNameMap.get(Fields.Domain).endsWith("in-addr.arpa");
00174 }
00175
00176 public boolean isV6ReverseLookup() {
00177 return _qualifiedNameMap.get(Fields.Domain).endsWith("ip6.arpa");
00178 }
00179
00187 public abstract boolean isStale(long now);
00188
00196 public abstract boolean isExpired(long now);
00197
00204 public boolean isSameRecordClass(DNSEntry entry) {
00205 return (entry != null) && (entry.getRecordClass() == this.getRecordClass());
00206 }
00207
00214 public boolean isSameType(DNSEntry entry) {
00215 return (entry != null) && (entry.getRecordType() == this.getRecordType());
00216 }
00217
00222 protected void toByteArray(DataOutputStream dout) throws IOException {
00223 dout.write(this.getName().getBytes("UTF8"));
00224 dout.writeShort(this.getRecordType().indexValue());
00225 dout.writeShort(this.getRecordClass().indexValue());
00226 }
00227
00233 protected byte[] toByteArray() {
00234 try {
00235 ByteArrayOutputStream bout = new ByteArrayOutputStream();
00236 DataOutputStream dout = new DataOutputStream(bout);
00237 this.toByteArray(dout);
00238 dout.close();
00239 return bout.toByteArray();
00240 } catch (IOException e) {
00241 throw new InternalError();
00242 }
00243 }
00244
00251 public int compareTo(DNSEntry that) {
00252 byte[] thisBytes = this.toByteArray();
00253 byte[] thatBytes = that.toByteArray();
00254 for (int i = 0, n = Math.min(thisBytes.length, thatBytes.length); i < n; i++) {
00255 if (thisBytes[i] > thatBytes[i]) {
00256 return 1;
00257 } else if (thisBytes[i] < thatBytes[i]) {
00258 return -1;
00259 }
00260 }
00261 return thisBytes.length - thatBytes.length;
00262 }
00263
00267 @Override
00268 public int hashCode() {
00269 return this.getKey().hashCode() + this.getRecordType().indexValue() + this.getRecordClass().indexValue();
00270 }
00271
00272
00273
00274
00275
00276 @Override
00277 public String toString() {
00278 StringBuilder aLog = new StringBuilder(200);
00279 aLog.append("[" + this.getClass().getSimpleName() + "@" + System.identityHashCode(this));
00280 aLog.append(" type: " + this.getRecordType());
00281 aLog.append(", class: " + this.getRecordClass());
00282 aLog.append((_unique ? "-unique," : ","));
00283 aLog.append(" name: " + _name);
00284 this.toString(aLog);
00285 aLog.append("]");
00286 return aLog.toString();
00287 }
00288
00292 protected void toString(StringBuilder aLog) {
00293
00294 }
00295
00296 }