/*******************************************************************************
*Copyright (c) 2009 Eucalyptus Systems, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, only version 3 of the License.
*
*
* This file is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Please contact Eucalyptus Systems, Inc., 130 Castilian
* Dr., Goleta, CA 93101 USA or visit <http://www.eucalyptus.com/licenses/>
* if you need additional information or have any questions.
*
* This file may incorporate work covered under the following copyright and
* permission notice:
*
* Software License Agreement (BSD License)
*
* Copyright (c) 2008, Regents of the University of California
* All rights reserved.
*
* Redistribution and use of this software in source and binary forms, with
* or without modification, are permitted provided that the following
* conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USERS OF
* THIS SOFTWARE ACKNOWLEDGE THE POSSIBLE PRESENCE OF OTHER OPEN SOURCE
* LICENSED MATERIAL, COPYRIGHTED MATERIAL OR PATENTED MATERIAL IN THIS
* SOFTWARE, AND IF ANY SUCH MATERIAL IS DISCOVERED THE PARTY DISCOVERING
* IT MAY INFORM DR. RICH WOLSKI AT THE UNIVERSITY OF CALIFORNIA, SANTA
* BARBARA WHO WILL THEN ASCERTAIN THE MOST APPROPRIATE REMEDY, WHICH IN
* THE REGENTS’ DISCRETION MAY INCLUDE, WITHOUT LIMITATION, REPLACEMENT
* OF THE CODE SO IDENTIFIED, LICENSING OF THE CODE SO IDENTIFIED, OR
* WITHDRAWAL OF THE CODE CAPABILITY TO THE EXTENT NEEDED TO COMPLY WITH
* ANY SUCH LICENSES OR RIGHTS.
*******************************************************************************/
// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org)
package com.eucalyptus.dns;
import java.util.*;
import org.xbill.DNS.CNAMERecord;
import org.xbill.DNS.DNAMERecord;
import org.xbill.DNS.Master;
import org.xbill.DNS.RRset;
import org.xbill.DNS.DClass;
import org.xbill.DNS.Record;
import org.xbill.DNS.SOARecord;
import org.xbill.DNS.ARecord;
import org.xbill.DNS.Name;
import org.xbill.DNS.NSRecord;
import org.xbill.DNS.Type;
import org.xbill.DNS.ZoneTransferException;
import org.xbill.DNS.ZoneTransferIn;
/**
* The Response from a query to Cache.lookupRecords() or Zone.findRecords()
* @see Cache
* @see Zone
*
* @author Brian Wellington
*/
public class SetResponse {
/**
* The Cache contains no information about the requested name/type
*/
static final int UNKNOWN = 0;
/**
* The Zone does not contain the requested name, or the Cache has
* determined that the name does not exist.
*/
static final int NXDOMAIN = 1;
/**
* The Zone contains the name, but no data of the requested type,
* or the Cache has determined that the name exists and has no data
* of the requested type.
*/
static final int NXRRSET = 2;
/**
* A delegation enclosing the requested name was found.
*/
static final int DELEGATION = 3;
/**
* The Cache/Zone found a CNAME when looking for the name.
* @see CNAMERecord
*/
static final int CNAME = 4;
/**
* The Cache/Zone found a DNAME when looking for the name.
* @see DNAMERecord
*/
static final int DNAME = 5;
/**
* The Cache/Zone has successfully answered the question for the
* requested name/type/class.
*/
static final int SUCCESSFUL = 6;
private static final SetResponse unknown = new SetResponse(UNKNOWN);
private static final SetResponse nxdomain = new SetResponse(NXDOMAIN);
private static final SetResponse nxrrset = new SetResponse(NXRRSET);
private int type;
private Object data;
private
SetResponse() {}
SetResponse(int type, RRset rrset) {
if (type < 0 || type > 6)
throw new IllegalArgumentException("invalid type");
this.type = type;
this.data = rrset;
}
SetResponse(int type) {
if (type < 0 || type > 6)
throw new IllegalArgumentException("invalid type");
this.type = type;
this.data = null;
}
static SetResponse
ofType(int type) {
switch (type) {
case UNKNOWN:
return unknown;
case NXDOMAIN:
return nxdomain;
case NXRRSET:
return nxrrset;
case DELEGATION:
case CNAME:
case DNAME:
case SUCCESSFUL:
SetResponse sr = new SetResponse();
sr.type = type;
sr.data = null;
return sr;
default:
throw new IllegalArgumentException("invalid type");
}
}
void
addRRset(RRset rrset) {
if (data == null)
data = new ArrayList();
List l = (List) data;
l.add(rrset);
}
/** Is the answer to the query unknown? */
public boolean
isUnknown() {
return (type == UNKNOWN);
}
/** Is the answer to the query that the name does not exist? */
public boolean
isNXDOMAIN() {
return (type == NXDOMAIN);
}
/** Is the answer to the query that the name exists, but the type does not? */
public boolean
isNXRRSET() {
return (type == NXRRSET);
}
/** Is the result of the lookup that the name is below a delegation? */
public boolean
isDelegation() {
return (type == DELEGATION);
}
/** Is the result of the lookup a CNAME? */
public boolean
isCNAME() {
return (type == CNAME);
}
/** Is the result of the lookup a DNAME? */
public boolean
isDNAME() {
return (type == DNAME);
}
/** Was the query successful? */
public boolean
isSuccessful() {
return (type == SUCCESSFUL);
}
/** If the query was successful, return the answers */
public RRset []
answers() {
if (type != SUCCESSFUL)
return null;
List l = (List) data;
return (RRset []) l.toArray(new RRset[l.size()]);
}
/**
* If the query encountered a CNAME, return it.
*/
public CNAMERecord
getCNAME() {
return (CNAMERecord)((RRset)data).first();
}
/**
* If the query encountered a DNAME, return it.
*/
public DNAMERecord
getDNAME() {
return (DNAMERecord)((RRset)data).first();
}
/**
* If the query hit a delegation point, return the NS set.
*/
public RRset
getNS() {
return (RRset)data;
}
/** Prints the value of the SetResponse */
public String
toString() {
switch (type) {
case UNKNOWN: return "unknown";
case NXDOMAIN: return "NXDOMAIN";
case NXRRSET: return "NXRRSET";
case DELEGATION: return "delegation: " + data;
case CNAME: return "CNAME: " + data;
case DNAME: return "DNAME: " + data;
case SUCCESSFUL: return "successful";
default: return null;
}
}
}