1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS; 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.Serializable; 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.*; 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A set of Records with the same name, type, and class. Also included 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * are all RRSIG records signing the data records. 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Record 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see RRSIGRecord 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class RRset implements Serializable { 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final long serialVersionUID = -3270249290171239695L; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * rrs contains both normal and RRSIG records, with the RRSIG records 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * at the end. 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate List rrs; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate short nsigs; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate short position; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Creates an empty RRset */ 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRRset() { 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs = new ArrayList(1); 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nsigs = 0; 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen position = 0; 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Creates an RRset and sets its contents to the specified record */ 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRRset(Record record) { 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this(); 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen safeAddRR(record); 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Creates an RRset with the contents of an existing RRset */ 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenRRset(RRset rrset) { 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (rrset) { 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs = (List) ((ArrayList)rrset.rrs).clone(); 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nsigs = rrset.nsigs; 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen position = rrset.position; 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate void 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChensafeAddRR(Record r) { 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!(r instanceof RRSIGRecord)) { 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (nsigs == 0) 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs.add(r); 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs.add(rrs.size() - nsigs, r); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs.add(r); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nsigs++; 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Adds a Record to an RRset */ 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized void 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenaddRR(Record r) { 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (rrs.size() == 0) { 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen safeAddRR(r); 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return; 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Record first = first(); 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!r.sameRRset(first)) 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalArgumentException("record does not match " + 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "rrset"); 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (r.getTTL() != first.getTTL()) { 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (r.getTTL() > first.getTTL()) { 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen r = r.cloneRecord(); 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen r.setTTL(first.getTTL()); 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (int i = 0; i < rrs.size(); i++) { 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Record tmp = (Record) rrs.get(i); 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen tmp = tmp.cloneRecord(); 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen tmp.setTTL(r.getTTL()); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs.set(i, tmp); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!rrs.contains(r)) 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen safeAddRR(r); 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Deletes a Record from an RRset */ 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized void 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChendeleteRR(Record r) { 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (rrs.remove(r) && (r instanceof RRSIGRecord)) 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nsigs--; 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Deletes all Records from an RRset */ 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized void 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclear() { 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rrs.clear(); 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen position = 0; 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen nsigs = 0; 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate synchronized Iterator 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Cheniterator(boolean data, boolean cycle) { 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int size, start, total; 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen total = rrs.size(); 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (data) 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen size = total - nsigs; 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen size = nsigs; 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (size == 0) 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.EMPTY_LIST.iterator(); 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (data) { 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!cycle) 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen start = 0; 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else { 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (position >= size) 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen position = 0; 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen start = position++; 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen start = total - nsigs; 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen List list = new ArrayList(size); 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (data) { 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen list.addAll(rrs.subList(start, size)); 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (start != 0) 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen list.addAll(rrs.subList(0, start)); 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } else { 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen list.addAll(rrs.subList(start, total)); 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return list.iterator(); 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an Iterator listing all (data) records. 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param cycle If true, cycle through the records so that each Iterator will 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * start with a different record. 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized Iterator 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenrrs(boolean cycle) { 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return iterator(true, cycle); 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an Iterator listing all (data) records. This cycles through 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the records, so each Iterator will start with a different record. 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized Iterator 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenrrs() { 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return iterator(true, true); 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns an Iterator listing all signature records */ 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized Iterator 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chensigs() { 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return iterator(false, false); 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the number of (data) records */ 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized int 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chensize() { 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return rrs.size() - nsigs; 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the name of the records 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Name 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic Name 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetName() { 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return first().getName(); 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the type of the records 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Type 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetType() { 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return first().getRRsetType(); 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the class of the records 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see DClass 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic int 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetDClass() { 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return first().getDClass(); 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Returns the ttl of the records */ 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized long 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetTTL() { 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return first().getTTL(); 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the first record 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws IllegalStateException if the rrset is empty 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic synchronized Record 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenfirst() { 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (rrs.size() == 0) 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen throw new IllegalStateException("rrset is empty"); 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return (Record) rrs.get(0); 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate String 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi CheniteratorToString(Iterator it) { 226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (it.hasNext()) { 228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Record rr = (Record) it.next(); 229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("["); 230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(rr.rdataToString()); 231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("]"); 232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (it.hasNext()) 233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" "); 234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Converts the RRset to a String */ 239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic String 240d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoString() { 241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (rrs == null) 242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return ("{empty}"); 243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuffer sb = new StringBuffer(); 244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append("{ "); 245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(getName() + " "); 246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(getTTL() + " "); 247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(DClass.string(getDClass()) + " "); 248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(Type.string(getType()) + " "); 249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(iteratorToString(iterator(true, false))); 250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (nsigs > 0) { 251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" sigs: "); 252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(iteratorToString(iterator(false, false))); 253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen sb.append(" }"); 255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return sb.toString(); 256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 259