/** * Builds a new Record from its textual representation * * @param name The owner name of the record. * @param type The record's type. * @param defaultClass The record's class. * @param ttl The record's time to live. * @param st A tokenizer containing the textual representation of the rdata. * @param origin The default origin to be appended to relative domain names. * @return The new record * @throws IOException The text format was invalid. */ public static Record fromString( Name name, int type, DClass defaultClass, long ttl, Tokenizer st, Name origin) throws IOException { Record rec; if (!name.isAbsolute()) { throw new RelativeNameException(name); } Type.check(type); TTL.check(ttl); Tokenizer.Token t = st.get(); if (t.type == Tokenizer.IDENTIFIER && t.value.equals("\\#")) { int length = st.getUInt16(); byte[] data = st.getHex(); if (data == null) { data = new byte[0]; } if (length != data.length) throw st.exception("invalid unknown RR encoding: " + "length mismatch"); DNSInput in = new DNSInput(data); return newRecord(name, type, defaultClass, ttl, length, in); } st.unget(); rec = getEmptyRecord(name, type, defaultClass, ttl, true); rec.rdataFromString(st, origin); t = st.get(); if (t.type != Tokenizer.EOL && t.type != Tokenizer.EOF) { throw st.exception("unexpected tokens at end of record"); } return rec; }
/** Converts a Record into a String representation */ public String toString() { StringBuilder sb = new StringBuilder(); sb.append(name); if (sb.length() < 8) { sb.append("\t"); } if (sb.length() < 16) { sb.append("\t"); } sb.append("\t"); if (Options.check("BINDTTL")) { sb.append(TTL.format(ttl)); } else { sb.append(ttl); } sb.append("\t"); if (dclass != DClass.IN || !Options.check("noPrintIN")) { sb.append(dclass.getName()); sb.append("\t"); } sb.append(Type.string(type)); String rdata = rrToString(); if (!rdata.equals("")) { sb.append("\t"); sb.append(rdata); } return sb.toString(); }
/** * Creates a new empty record, with the given parameters. * * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @return An object of a subclass of Record */ public static Record newRecord(Name name, int type, DClass dclass, long ttl) { if (!name.isAbsolute()) { throw new RelativeNameException(name); } Type.check(type); TTL.check(ttl); return getEmptyRecord(name, type, dclass, ttl, false); }
protected Record(Name name, int type, DClass dclass, long ttl) { if (!name.isAbsolute()) { throw new RelativeNameException(name); } Type.check(type); TTL.check(ttl); this.name = name; this.type = type; this.dclass = dclass; this.ttl = ttl; }
private static Record getEmptyRecord( Name name, int type, DClass dclass, long ttl, boolean hasData) { Record proto, rec; if (hasData) { proto = Type.getProto(type); if (proto != null) { rec = proto.getObject(); } else { rec = new UNKRecord(); } } else { rec = new EmptyRecord(); } rec.name = name; rec.type = type; rec.dclass = dclass; rec.ttl = ttl; return rec; }
/** * Creates a new record, with the given parameters. * * @param name The owner name of the record. * @param type The record's type. * @param dclass The record's class. * @param ttl The record's time to live. * @param length The length of the record's data. * @param data The rdata of the record, in uncompressed DNS wire format. Only the first length * bytes are used. */ public static Record newRecord( Name name, int type, DClass dclass, long ttl, int length, byte[] data) { if (!name.isAbsolute()) { throw new RelativeNameException(name); } Type.check(type); TTL.check(ttl); DNSInput in; if (data != null) { in = new DNSInput(data); } else { in = null; } try { return newRecord(name, type, dclass, ttl, length, in); } catch (IOException e) { return null; } }