/*
* Sun Public License
*
* The contents of this file are subject to the Sun Public License Version
* 1.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is available at http://www.sun.com/
*
* The Original Code is the SLAMD Distributed Load Generation Engine.
* The Initial Developer of the Original Code is Neil A. Wilson.
* Portions created by Neil A. Wilson are Copyright (C) 2004-2010.
* Some preexisting portions Copyright (C) 2002-2006 Sun Microsystems, Inc.
* All Rights Reserved.
*
* Contributor(s): Neil A. Wilson
*/
package com.slamd.tools.ldapdecoder.protocol;
import java.io.PrintStream;
import java.util.Date;
import com.slamd.asn1.ASN1Element;
import com.slamd.asn1.ASN1OctetString;
import com.slamd.asn1.ASN1Sequence;
/**
* This class defines an LDAP search result reference, which provides a link to
* one or more other locations in which the search should be performed.
*
*
* @author Neil A. Wilson
*/
public class SearchResultReference
extends ProtocolOp
{
// The set of referral URLs for this search result reference.
private String[] referralURLs;
/**
* Creates a new search result reference with the provided referral URLs.
*
* @param referralURLs The referral URLs for use in this search result
* reference.
*/
public SearchResultReference(String[] referralURLs)
{
this.referralURLs = referralURLs;
}
/**
* Retrieves the set of referral URLs associated with this search result
* reference.
*
* @return The set of referral URLs associated with this search result
* reference.
*/
public String[] getReferralURLs()
{
return referralURLs;
}
/**
* Encodes this protocol op to an ASN.1 element.
*
* @return The ASN.1 element containing the encoded protocol op.
*/
public ASN1Element encode()
{
ASN1Element[] referralElements;
if ((referralURLs == null) || (referralURLs.length == 0))
{
referralElements = new ASN1Element[0];
}
else
{
referralElements = new ASN1Element[referralURLs.length];
for (int i=0; i < referralElements.length; i++)
{
referralElements[i] = new ASN1OctetString(referralURLs[i]);
}
}
return new ASN1Sequence(SEARCH_RESULT_REFERENCE_TYPE, referralElements);
}
/**
* Decodes the provided ASN.1 element as a search result reference protocol
* op.
*
* @param element The ASN.1 element to be decoded.
*
* @return The decoded search result reference.
*
* @throws ProtocolException If a problem occurs while decoding the provided
* ASN.1 element as a search result reference.
*/
public static SearchResultReference
decodeSearchResultReference(ASN1Element element)
throws ProtocolException
{
try
{
ASN1Element[] referralElements = element.decodeAsSequence().getElements();
String[] referralURLs = new String[referralElements.length];
for (int i=0; i < referralElements.length; i++)
{
referralURLs[i] =
referralElements[i].decodeAsOctetString().getStringValue();
}
return new SearchResultReference(referralURLs);
}
catch (Exception e)
{
throw new ProtocolException("Unable to decode search result reference " +
"sequence", e);
}
}
/**
* Retrieves a user-friendly name for this protocol op.
*
* @return A user-friendly name for this protocol op.
*/
public String getProtocolOpType()
{
return "LDAP SearchResultReference";
}
/**
* Retrieves a string representation of this protocol op with the specified
* indent.
*
* @param indent The number of spaces to indent the output.
*
* @return A string representation of this protocol op with the specified
* indent.
*/
public String toString(int indent)
{
StringBuilder indentBuf = new StringBuilder(indent);
for (int i=0; i < indent; i++)
{
indentBuf.append(' ');
}
StringBuilder buffer = new StringBuilder();
buffer.append(indentBuf).append("Referral URLs: ").
append(LDAPMessage.EOL);
for (int i=0; ((referralURLs != null) && (i < referralURLs.length)); i++)
{
buffer.append(indentBuf).append(" ").append(referralURLs[i]).
append(LDAPMessage.EOL);
}
return buffer.toString();
}
/**
* Constructs a string representation of this LDAP message in a form that can
* be written to a SLAMD script. It may be empty if this message isn't one
* that would be generated as part of a client request.
*
* @param scriptWriter The print stream to which the script contents should
* be written.
*/
public void toSLAMDScript(PrintStream scriptWriter)
{
// This is not something that would be generated by a client and therefore
// no operation needs to be performed. However, we can write a comment
// to the script indicating that an add response was received.
scriptWriter.println("#### Search result reference captured at " +
new Date());
scriptWriter.println("# Referral URLs: ");
for (int i=0; ((referralURLs != null) && (i < referralURLs.length)); i++)
{
scriptWriter.println("# " + referralURLs[i]);
}
scriptWriter.println();
scriptWriter.println();
}
}