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 legal-notices/CDDLv1_0.txt
010 * or http://forgerock.org/license/CDDLv1.0.html.
011 * See the License for the specific language governing permissions
012 * and limitations under the License.
013 *
014 * When distributing Covered Code, include this CDDL HEADER in each
015 * file and include the License file at legal-notices/CDDLv1_0.txt.
016 * If applicable, add the following below this CDDL HEADER, with the
017 * fields enclosed by brackets "[]" replaced with your own identifying
018 * information:
019 *      Portions Copyright [yyyy] [name of copyright owner]
020 *
021 * CDDL HEADER END
022 *
023 *
024 *      Copyright 2009 Sun Microsystems, Inc.
025 *      Portions copyright 2013 ForgeRock AS.
026 */
027
028package org.forgerock.opendj.io;
029
030import java.io.IOException;
031
032import org.forgerock.i18n.LocalizableMessage;
033import org.forgerock.opendj.ldap.ByteString;
034import org.forgerock.opendj.ldap.DecodeException;
035import org.forgerock.opendj.ldap.requests.AbandonRequest;
036import org.forgerock.opendj.ldap.requests.AddRequest;
037import org.forgerock.opendj.ldap.requests.CompareRequest;
038import org.forgerock.opendj.ldap.requests.DeleteRequest;
039import org.forgerock.opendj.ldap.requests.ExtendedRequest;
040import org.forgerock.opendj.ldap.requests.GenericBindRequest;
041import org.forgerock.opendj.ldap.requests.ModifyDNRequest;
042import org.forgerock.opendj.ldap.requests.ModifyRequest;
043import org.forgerock.opendj.ldap.requests.Request;
044import org.forgerock.opendj.ldap.requests.SearchRequest;
045import org.forgerock.opendj.ldap.requests.UnbindRequest;
046import org.forgerock.opendj.ldap.responses.BindResult;
047import org.forgerock.opendj.ldap.responses.CompareResult;
048import org.forgerock.opendj.ldap.responses.ExtendedResult;
049import org.forgerock.opendj.ldap.responses.IntermediateResponse;
050import org.forgerock.opendj.ldap.responses.Response;
051import org.forgerock.opendj.ldap.responses.Result;
052import org.forgerock.opendj.ldap.responses.SearchResultEntry;
053import org.forgerock.opendj.ldap.responses.SearchResultReference;
054
055/**
056 * This class provides a skeletal implementation of the
057 * {@link LDAPMessageHandler} interface, in order to minimize the effort
058 * required to implement this interface. By default each method throws a fatal
059 * {@link DecodeException}.
060 */
061public abstract class AbstractLDAPMessageHandler implements LDAPMessageHandler {
062    /**
063     * Default constructor.
064     */
065    protected AbstractLDAPMessageHandler() {
066        // No implementation required.
067    }
068
069    @Override
070    public void abandonRequest(final int messageID, final AbandonRequest request)
071            throws DecodeException, IOException {
072        throw newUnexpectedRequestException(messageID, request);
073    }
074
075    @Override
076    public void addRequest(final int messageID, final AddRequest request) throws DecodeException,
077            IOException {
078        throw newUnexpectedRequestException(messageID, request);
079    }
080
081    @Override
082    public void addResult(final int messageID, final Result result) throws DecodeException,
083            IOException {
084        throw newUnexpectedResponseException(messageID, result);
085    }
086
087    @Override
088    public void bindRequest(final int messageID, final int version, final GenericBindRequest request)
089            throws DecodeException, IOException {
090        throw newUnexpectedRequestException(messageID, request);
091    }
092
093    @Override
094    public void bindResult(final int messageID, final BindResult result) throws DecodeException,
095            IOException {
096        throw newUnexpectedResponseException(messageID, result);
097    }
098
099    @Override
100    public void compareRequest(final int messageID, final CompareRequest request)
101            throws DecodeException, IOException {
102        throw newUnexpectedRequestException(messageID, request);
103    }
104
105    @Override
106    public void compareResult(final int messageID, final CompareResult result)
107            throws DecodeException, IOException {
108        throw newUnexpectedResponseException(messageID, result);
109    }
110
111    @Override
112    public void deleteRequest(final int messageID, final DeleteRequest request)
113            throws DecodeException, IOException {
114        throw newUnexpectedRequestException(messageID, request);
115    }
116
117    @Override
118    public void deleteResult(final int messageID, final Result result) throws DecodeException,
119            IOException {
120        throw newUnexpectedResponseException(messageID, result);
121    }
122
123    @Override
124    public <R extends ExtendedResult> void extendedRequest(final int messageID,
125            final ExtendedRequest<R> request) throws DecodeException, IOException {
126        throw newUnexpectedRequestException(messageID, request);
127    }
128
129    @Override
130    public void extendedResult(final int messageID, final ExtendedResult result)
131            throws DecodeException, IOException {
132        throw newUnexpectedResponseException(messageID, result);
133    }
134
135    @Override
136    public void intermediateResponse(final int messageID, final IntermediateResponse response)
137            throws DecodeException, IOException {
138        throw newUnexpectedResponseException(messageID, response);
139    }
140
141    @Override
142    public void modifyDNRequest(final int messageID, final ModifyDNRequest request)
143            throws DecodeException, IOException {
144        throw newUnexpectedRequestException(messageID, request);
145    }
146
147    @Override
148    public void modifyDNResult(final int messageID, final Result result) throws DecodeException,
149            IOException {
150        throw newUnexpectedResponseException(messageID, result);
151    }
152
153    @Override
154    public void modifyRequest(final int messageID, final ModifyRequest request)
155            throws DecodeException, IOException {
156        throw newUnexpectedRequestException(messageID, request);
157    }
158
159    @Override
160    public void modifyResult(final int messageID, final Result result) throws DecodeException,
161            IOException {
162        throw newUnexpectedResponseException(messageID, result);
163    }
164
165    @Override
166    public void searchRequest(final int messageID, final SearchRequest request)
167            throws DecodeException, IOException {
168        throw newUnexpectedRequestException(messageID, request);
169    }
170
171    @Override
172    public void searchResult(final int messageID, final Result result) throws DecodeException,
173            IOException {
174        throw newUnexpectedResponseException(messageID, result);
175    }
176
177    @Override
178    public void searchResultEntry(final int messageID, final SearchResultEntry entry)
179            throws DecodeException, IOException {
180        throw newUnexpectedResponseException(messageID, entry);
181    }
182
183    @Override
184    public void searchResultReference(final int messageID, final SearchResultReference reference)
185            throws DecodeException, IOException {
186        throw newUnexpectedResponseException(messageID, reference);
187    }
188
189    @Override
190    public void unbindRequest(final int messageID, final UnbindRequest request)
191            throws DecodeException, IOException {
192        throw newUnexpectedRequestException(messageID, request);
193    }
194
195    @Override
196    public void unrecognizedMessage(final int messageID, final byte messageTag,
197            final ByteString messageBytes) throws DecodeException, IOException {
198        throw newUnsupportedMessageException(messageID, messageTag, messageBytes);
199    }
200
201    /**
202     * Returns a decoding exception suitable for use when an unsupported LDAP
203     * message is received.
204     *
205     * @param messageID
206     *            The LDAP message ID.
207     * @param messageTag
208     *            The LDAP message type.
209     * @param messageBytes
210     *            The LDAP message content.
211     * @return A decoding exception suitable for use when an unsupported LDAP
212     *         message is received.
213     */
214    protected DecodeException newUnsupportedMessageException(final int messageID,
215            final byte messageTag, final ByteString messageBytes) {
216        return DecodeException.fatalError(LocalizableMessage.raw(
217                "Unsupported LDAP message: id=%d, tag=%d, content=%s", messageID, messageTag,
218                messageBytes));
219    }
220
221    /**
222     * Returns a decoding exception suitable for use when an unexpected LDAP
223     * request is received.
224     *
225     * @param messageID
226     *            The LDAP message ID.
227     * @param request
228     *            The LDAP request.
229     * @return A decoding exception suitable for use when an unexpected LDAP
230     *         request is received.
231     */
232    protected DecodeException newUnexpectedRequestException(final int messageID,
233            final Request request) {
234        return DecodeException.fatalError(LocalizableMessage.raw(
235                "Unexpected LDAP request: id=%d, message=%s", messageID, request));
236    }
237
238    /**
239     * Returns a decoding exception suitable for use when an unexpected LDAP
240     * response is received.
241     *
242     * @param messageID
243     *            The LDAP message ID.
244     * @param response
245     *            The LDAP response.
246     * @return A decoding exception suitable for use when an unexpected LDAP
247     *         response is received.
248     */
249    protected DecodeException newUnexpectedResponseException(final int messageID,
250            final Response response) {
251        return DecodeException.fatalError(LocalizableMessage.raw(
252                "Unexpected LDAP response: id=%d, message=%s", messageID, response));
253    }
254}