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