/*
 * 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 flex.messaging.services.http;

import flex.management.runtime.messaging.services.http.SOAPProxyAdapterControl;
import flex.messaging.messages.Message;
import flex.messaging.messages.SOAPMessage;
import flex.messaging.messages.HTTPMessage;
import flex.messaging.services.http.proxy.ProxyContext;
import flex.messaging.Destination;
import flex.messaging.MessageException;

/**
 * A Soap specific subclass of HttpProxyAdapter to
 * allow for future web services features.
 */
public class SOAPProxyAdapter extends HTTPProxyAdapter {
    private SOAPProxyAdapterControl controller;

    //--------------------------------------------------------------------------
    //
    // Constructor
    //
    //--------------------------------------------------------------------------

    /**
     * Constructs an unmanaged <code>SOAPProxyAdapter</code> instance.
     */
    public SOAPProxyAdapter() {
        this(false);
    }

    /**
     * Constructs a <code>SOAPProxyAdapter</code> instance.
     *
     * @param enableManagement <code>true</code> if the <code>SOAPProxyAdapter</code> has a
     *                         corresponding MBean control for management; otherwise <code>false</code>.
     */
    public SOAPProxyAdapter(boolean enableManagement) {
        super(enableManagement);
    }

    //--------------------------------------------------------------------------
    //
    // Other Public APIs
    //                 
    //-------------------------------------------------------------------------- 

    /**
     * {@inheritDoc}
     */
    public Object invoke(Message msg) {
        HTTPMessage message = (HTTPMessage) msg;
        ProxyContext context = new ProxyContext();

        if (message instanceof SOAPMessage) {
            context.setSoapRequest(true);
        }

        setupContext(context, message);

        try {
            filterChain.invoke(context);
            return context.getResponse();
        } catch (MessageException ex) {
            throw ex;
        } catch (Throwable t) {
            // this should never happen- ErrorFilter should catch everything
            t.printStackTrace();
            throw new MessageException(t.toString());
        }
    }

    //--------------------------------------------------------------------------
    //
    // Protected/private APIs
    //             
    //--------------------------------------------------------------------------

    /**
     * Invoked automatically to allow the <code>SOAPProxyAdapter</code> to setup its corresponding
     * MBean control.
     *
     * @param broker The <code>Destination</code> that manages this <code>SOAPProxyAdapter</code>.
     */
    protected void setupAdapterControl(Destination destination) {
        controller = new SOAPProxyAdapterControl(this, destination.getControl());
        controller.register();
        setControl(controller);
    }
}
