📄 rrset.java
字号:
// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)package org.xbill.DNS;import java.util.*;/** * A set of Records with the same name, type, and class. Also included * are all SIG/RRSIG records signing the data records. * @see Record * @see SIGRecord * @see RRSIGRecord * * @author Brian Wellington */public class RRset implements TypedObject {/* * rrs contains both normal and SIG/RRSIG records, with the SIG/RRSIG records * at the end. */private List rrs;private short nsigs;private short position;/** Creates an empty RRset */publicRRset() { rrs = new ArrayList(1); nsigs = 0; position = 0;}/** Creates an RRset and sets its contents to the specified record */publicRRset(Record record) { this(); safeAddRR(record);}/** Creates an RRset with the contents of an existing RRset */publicRRset(RRset rrset) { synchronized (rrset) { rrs = (List) ((ArrayList)rrset.rrs).clone(); nsigs = rrset.nsigs; position = rrset.position; }}private voidsafeAddRR(Record r) { if (!(r instanceof SIGBase)) { if (nsigs == 0) rrs.add(r); else rrs.add(rrs.size() - nsigs, r); } else { rrs.add(r); nsigs++; }}/** Adds a Record to an RRset */public synchronized voidaddRR(Record r) { if (rrs.size() == 0) { safeAddRR(r); return; } Record first = first(); if (!r.sameRRset(first)) throw new IllegalArgumentException("record does not match " + "rrset"); if (r.getTTL() != first.getTTL()) { if (r.getTTL() > first.getTTL()) { r = r.cloneRecord(); r.setTTL(first.getTTL()); } else { for (int i = 0; i < rrs.size(); i++) { Record tmp = (Record) rrs.get(i); tmp = tmp.cloneRecord(); tmp.setTTL(r.getTTL()); rrs.set(i, tmp); } } } if (!rrs.contains(r)) safeAddRR(r);}/** Deletes a Record from an RRset */public synchronized voiddeleteRR(Record r) { if (rrs.remove(r) && (r instanceof SIGBase)) nsigs--;}/** Deletes all Records from an RRset */public synchronized voidclear() { rrs.clear(); position = 0; nsigs = 0;}private synchronized Iteratoriterator(boolean data, boolean cycle) { int size, start, total; total = rrs.size(); if (data) size = total - nsigs; else size = nsigs; if (size == 0) return Collections.EMPTY_LIST.iterator(); if (data) { if (!cycle) start = 0; else { if (position >= size) position = 0; start = position++; } } else { start = total - nsigs; } List list = new ArrayList(size); if (data) { list.addAll(rrs.subList(start, size)); if (start != 0) list.addAll(rrs.subList(0, start)); } else { list.addAll(rrs.subList(start, total)); } return list.iterator();}/** * Returns an Iterator listing all (data) records. * @param cycle If true, cycle through the records so that each Iterator will * start with a different record. */public synchronized Iteratorrrs(boolean cycle) { return iterator(true, cycle);}/** * Returns an Iterator listing all (data) records. This cycles through * the records, so each Iterator will start with a different record. */public synchronized Iteratorrrs() { return iterator(true, true);}/** Returns an Iterator listing all signature records */public synchronized Iteratorsigs() { return iterator(false, false);}/** Returns the number of (data) records */public intsize() { return rrs.size() - nsigs;}/** * Returns the name of the records * @see Name */public NamegetName() { return first().getName();}/** * Returns the type of the records * @see Type */public intgetType() { return first().getRRsetType();}/** * Returns the class of the records * @see DClass */public intgetDClass() { return first().getDClass();}/** Returns the ttl of the records */public synchronized longgetTTL() { return first().getTTL();}/** * Returns the first record * @throws IllegalStateException if the rrset is empty */public synchronized Recordfirst() { if (rrs.size() == 0) throw new IllegalStateException("rrset is empty"); return (Record) rrs.get(0);}private StringiteratorToString(Iterator it) { StringBuffer sb = new StringBuffer(); while (it.hasNext()) { Record rr = (Record) it.next(); sb.append("["); sb.append(rr.rdataToString()); sb.append("]"); if (it.hasNext()) sb.append(" "); } return sb.toString();}/** Converts the RRset to a String */public StringtoString() { if (rrs == null) return ("{empty}"); StringBuffer sb = new StringBuffer(); sb.append("{ "); sb.append(getName() + " "); sb.append(getTTL() + " "); sb.append(DClass.string(getDClass()) + " "); sb.append(Type.string(getType()) + " "); sb.append(iteratorToString(iterator(true, false))); if (nsigs > 0) { sb.append(" sigs: "); sb.append(iteratorToString(iterator(false, false))); } sb.append(" }"); return sb.toString();}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -