001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2008 Sun Microsystems, Inc.
026 */
027
028 package org.opends.server.tools;
029
030 import org.opends.server.protocols.asn1.ASN1Reader;
031 import org.opends.server.protocols.asn1.ASN1Element;
032 import org.opends.server.protocols.asn1.ASN1Exception;
033 import org.opends.server.protocols.asn1.ASN1Sequence;
034 import org.opends.server.protocols.ldap.LDAPMessage;
035 import org.opends.server.types.LDAPException;
036
037 import java.io.IOException;
038 import java.net.Socket;
039
040 /**
041 * This class defines a utility that can be used to read LDAP messages from a
042 * provided socket.
043 */
044 public class LDAPReader
045 {
046 private ASN1Reader asn1Reader;
047 private VerboseTracer tracer;
048
049 /**
050 * Creates a new LDAP reader that will read messages from the provided
051 * socket.
052 *
053 * @param socket The socket from which to read the LDAP messages.
054 *
055 * @throws IOException If a problem occurs while attempting to obtain an
056 * ASN.1 reader for the socket.
057 */
058 public LDAPReader(Socket socket)
059 throws IOException
060 {
061 this(socket, null);
062 }
063
064 /**
065 * Creates a new LDAP reader that will read messages from the provided
066 * socket and trace the messages using a provided tracer.
067 *
068 * @param socket The socket from which to read the LDAP messages.
069 *
070 * @param tracer Specifies a tracer to be used for tracing messages read.
071 *
072 * @throws IOException If a problem occurs while attempting to obtain an
073 * input stream for the socket.
074 */
075 public LDAPReader(Socket socket, VerboseTracer tracer)
076 throws IOException
077 {
078 this.asn1Reader = new ASN1Reader(socket);
079 this.tracer = tracer;
080 }
081
082 /**
083 * Reads an LDAP message from the associated input stream.
084 *
085 * @return The LDAP message read from the associated input stream, or
086 * <CODE>null</CODE> if the end of the stream has been reached.
087 *
088 * @throws IOException If a problem occurs while attempting to read from the
089 * input stream.
090 *
091 * @throws ASN1Exception If a problem occurs while attempting to decode the
092 * data read as an ASN.1 sequence.
093
094 * @throws LDAPException If a problem occurs while attempting to decode the
095 * LDAP message.
096 */
097 public LDAPMessage readMessage()
098 throws IOException, ASN1Exception, LDAPException
099 {
100 ASN1Element element = asn1Reader.readElement();
101 if (element == null)
102 {
103 return null;
104 }
105
106 ASN1Sequence sequence = ASN1Sequence.decodeAsSequence(element);
107 LDAPMessage message = LDAPMessage.decode(sequence);
108 if (tracer != null)
109 {
110 tracer.traceIncomingMessage(message, sequence);
111 }
112
113 return message;
114 }
115
116 /**
117 * Closes this LDAP reader and the underlying socket.
118 */
119 public void close()
120 {
121 asn1Reader.close();
122 }
123
124 /**
125 * Get the underlying ASN1 reader.
126 *
127 * @return The underlying ASN1 reader.
128 */
129 public ASN1Reader getASN1Reader()
130 {
131 return asn1Reader;
132 }
133
134
135 }