/*
 *   Licensed to the Apache Software Foundation (ASF) under one
 *   or more contributor license agreements.  See the NOTICE file
 *   distributed with this work for additional information
 *   regarding copyright ownership.  The ASF licenses this file
 *   to you under the Apache License, Version 2.0 (the
 *   "License"); you may not use this file except in compliance
 *   with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing,
 *   software distributed under the License is distributed on an
 *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *   KIND, either express or implied.  See the License for the
 *   specific language governing permissions and limitations
 *   under the License.
 *
 */
package org.apache.directory.api.ldap.extras.extended.ads_impl.whoAmI;


import org.apache.directory.api.ldap.codec.api.ExtendedRequestDecorator;
import org.apache.directory.api.ldap.codec.api.LdapApiService;
import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIRequest;
import org.apache.directory.api.ldap.extras.extended.whoAmI.WhoAmIResponse;


/**
 * A Decorator for WhoAmIRequest extended request.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class WhoAmIRequestDecorator extends ExtendedRequestDecorator<WhoAmIRequest> implements WhoAmIRequest
{
    /** The internal WhoAmIRequest */
    private WhoAmIRequest whoAmIRequest;

    /**
     * Create a new decorator instance 
     * @param codec The codec service
     * @param decoratedMessage The decorated WhoAmIRequest
     */
    public WhoAmIRequestDecorator( LdapApiService codec, WhoAmIRequest decoratedMessage )
    {
        super( codec, decoratedMessage );
        whoAmIRequest = decoratedMessage;
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public WhoAmIResponse getResultResponse()
    {
        return ( WhoAmIResponse ) whoAmIRequest.getResultResponse();
    }
}
