1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS;
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.*;
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Response from a query to Cache.lookupRecords() or Zone.findRecords()
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Cache
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see Zone
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Brian Wellington
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class SetResponse {
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Cache contains no information about the requested name/type
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int UNKNOWN	= 0;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Zone does not contain the requested name, or the Cache has
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * determined that the name does not exist.
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int NXDOMAIN	= 1;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Zone contains the name, but no data of the requested type,
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * or the Cache has determined that the name exists and has no data
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * of the requested type.
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int NXRRSET	= 2;
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A delegation enclosing the requested name was found.
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int DELEGATION	= 3;
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Cache/Zone found a CNAME when looking for the name.
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see CNAMERecord
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int CNAME		= 4;
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Cache/Zone found a DNAME when looking for the name.
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @see DNAMERecord
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int DNAME		= 5;
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The Cache/Zone has successfully answered the question for the
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * requested name/type/class.
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic final int SUCCESSFUL	= 6;
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final SetResponse unknown = new SetResponse(UNKNOWN);
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final SetResponse nxdomain = new SetResponse(NXDOMAIN);
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate static final SetResponse nxrrset = new SetResponse(NXRRSET);
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate int type;
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate Object data;
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprivate
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSetResponse() {}
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSetResponse(int type, RRset rrset) {
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (type < 0 || type > 6)
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("invalid type");
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.type = type;
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.data = rrset;
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenSetResponse(int type) {
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (type < 0 || type > 6)
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new IllegalArgumentException("invalid type");
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.type = type;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.data = null;
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic SetResponse
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenofType(int type) {
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	switch (type) {
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case UNKNOWN:
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return unknown;
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case NXDOMAIN:
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return nxdomain;
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case NXRRSET:
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return nxrrset;
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case DELEGATION:
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case CNAME:
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case DNAME:
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case SUCCESSFUL:
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			SetResponse sr = new SetResponse();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			sr.type = type;
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			sr.data = null;
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return sr;
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		default:
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			throw new IllegalArgumentException("invalid type");
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenaddRRset(RRset rrset) {
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (data == null)
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		data = new ArrayList();
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	List l = (List) data;
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	l.add(rrset);
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the answer to the query unknown? */
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisUnknown() {
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == UNKNOWN);
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the answer to the query that the name does not exist? */
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisNXDOMAIN() {
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == NXDOMAIN);
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the answer to the query that the name exists, but the type does not? */
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisNXRRSET() {
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == NXRRSET);
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the result of the lookup that the name is below a delegation? */
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisDelegation() {
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == DELEGATION);
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the result of the lookup a CNAME? */
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisCNAME() {
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == CNAME);
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Is the result of the lookup a DNAME? */
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisDNAME() {
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == DNAME);
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Was the query successful? */
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic boolean
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenisSuccessful() {
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (type == SUCCESSFUL);
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** If the query was successful, return the answers */
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic RRset []
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenanswers() {
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (type != SUCCESSFUL)
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return null;
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	List l = (List) data;
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (RRset []) l.toArray(new RRset[l.size()]);
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * If the query encountered a CNAME, return it.
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic CNAMERecord
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetCNAME() {
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (CNAMERecord)((RRset)data).first();
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * If the query encountered a DNAME, return it.
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic DNAMERecord
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetDNAME() {
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (DNAMERecord)((RRset)data).first();
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * If the query hit a delegation point, return the NS set.
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic RRset
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChengetNS() {
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	return (RRset)data;
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** Prints the value of the SetResponse */
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic String
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChentoString() {
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	switch (type) {
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case UNKNOWN:		return "unknown";
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case NXDOMAIN:		return "NXDOMAIN";
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case NXRRSET:		return "NXRRSET";
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case DELEGATION:	return "delegation: " + data;
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case CNAME:		return "CNAME: " + data;
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case DNAME:		return "DNAME: " + data;
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		case SUCCESSFUL:	return "successful";
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		default:		throw new IllegalStateException();
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
203