/*
 * Copyright  1999-2004 The Apache Software Foundation.
 *
 *  Licensed 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.savan.messagereceiver;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
import org.apache.savan.SavanException;
import org.apache.savan.SavanMessageContext;
import org.apache.savan.configuration.Protocol;
import org.apache.savan.util.ProtocolManager;
import org.apache.savan.util.UtilFactory;

/**
 * InOut message deceiver for Savan. 
 * May get called for control messages depending on the protocol.
 */
public class SavanInOutMessageReceiver extends AbstractInOutSyncMessageReceiver {

	public void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage) throws AxisFault {

		SavanMessageContext savanInMessage = new SavanMessageContext (inMessage);
		
		//setting the Protocol
		Protocol protocol = ProtocolManager.getMessageProtocol(savanInMessage);
		if (protocol==null) {
			//this message does not have a matching protocol
			//so let it go
			throw new SavanException ("Cannot find a matching protocol");
		}
		
		savanInMessage.setProtocol(protocol);
		
		UtilFactory utilFactory = protocol.getUtilFactory();
		MessageReceiverDeligater deligator = utilFactory.createMessageReceiverDeligater();
		
		deligator.processMessage(savanInMessage);
		deligator.doProtocolSpecificProcessing (savanInMessage, outMessage);
		
	}

}
