1 // Copyright (c) 1999-2004 Brian Wellington (bwelling (at) xbill.org) 2 3 package org.xbill.DNS; 4 5 import java.io.*; 6 import java.util.*; 7 8 /** 9 * Next name - this record contains the following name in an ordered list 10 * of names in the zone, and a set of types for which records exist for 11 * this name. The presence of this record in a response signifies a 12 * failed query for data in a DNSSEC-signed zone. 13 * 14 * @author Brian Wellington 15 */ 16 17 public class NXTRecord extends Record { 18 19 private static final long serialVersionUID = -8851454400765507520L; 20 21 private Name next; 22 private BitSet bitmap; 23 24 NXTRecord() {} 25 26 Record 27 getObject() { 28 return new NXTRecord(); 29 } 30 31 /** 32 * Creates an NXT Record from the given data 33 * @param next The following name in an ordered list of the zone 34 * @param bitmap The set of type for which records exist at this name 35 */ 36 public 37 NXTRecord(Name name, int dclass, long ttl, Name next, BitSet bitmap) { 38 super(name, Type.NXT, dclass, ttl); 39 this.next = checkName("next", next); 40 this.bitmap = bitmap; 41 } 42 43 void 44 rrFromWire(DNSInput in) throws IOException { 45 next = new Name(in); 46 bitmap = new BitSet(); 47 int bitmapLength = in.remaining(); 48 for (int i = 0; i < bitmapLength; i++) { 49 int t = in.readU8(); 50 for (int j = 0; j < 8; j++) 51 if ((t & (1 << (7 - j))) != 0) 52 bitmap.set(i * 8 + j); 53 } 54 } 55 56 void 57 rdataFromString(Tokenizer st, Name origin) throws IOException { 58 next = st.getName(origin); 59 bitmap = new BitSet(); 60 while (true) { 61 Tokenizer.Token t = st.get(); 62 if (!t.isString()) 63 break; 64 int typecode = Type.value(t.value, true); 65 if (typecode <= 0 || typecode > 128) 66 throw st.exception("Invalid type: " + t.value); 67 bitmap.set(typecode); 68 } 69 st.unget(); 70 } 71 72 /** Converts rdata to a String */ 73 String 74 rrToString() { 75 StringBuffer sb = new StringBuffer(); 76 sb.append(next); 77 int length = bitmap.length(); 78 for (short i = 0; i < length; i++) 79 if (bitmap.get(i)) { 80 sb.append(" "); 81 sb.append(Type.string(i)); 82 } 83 return sb.toString(); 84 } 85 86 /** Returns the next name */ 87 public Name 88 getNext() { 89 return next; 90 } 91 92 /** Returns the set of types defined for this name */ 93 public BitSet 94 getBitmap() { 95 return bitmap; 96 } 97 98 void 99 rrToWire(DNSOutput out, Compression c, boolean canonical) { 100 next.toWire(out, null, canonical); 101 int length = bitmap.length(); 102 for (int i = 0, t = 0; i < length; i++) { 103 t |= (bitmap.get(i) ? (1 << (7 - i % 8)) : 0); 104 if (i % 8 == 7 || i == length - 1) { 105 out.writeU8(t); 106 t = 0; 107 } 108 } 109 } 110 111 } 112