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