/**
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2012, United States Government, as represented by the Secretary of Health and Human Services.
 * All rights reserved.
 *  
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of source code must retain the above
 *     copyright notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *   * Neither the name of the United States Government nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *DISCLAIMED. IN NO EVENT SHALL THE UNITED STATES GOVERNMENT BE LIABLE FOR ANY
 *DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package gov.hhs.fha.nhinc.event;

import gov.hhs.fha.nhinc.async.AsyncMessageIdExtractor;
import gov.hhs.fha.nhinc.logging.transaction.TransactionStore;
import gov.hhs.fha.nhinc.logging.transaction.factory.TransactionStoreFactory;
import gov.hhs.fha.nhinc.nhinclib.NhincConstants;
import gov.hhs.fha.nhinc.nhinclib.NullChecker;

import java.util.List;

import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

import org.apache.cxf.jaxws.context.WebServiceContextImpl;

public class SOAPMessageRoutingAccessor implements MessageRoutingAccessor {

	private WebServiceContext context;
	private AsyncMessageIdExtractor extractor;
	private TransactionStoreFactory transactionStoreFactory;

	public SOAPMessageRoutingAccessor() {
		this.context = new WebServiceContextImpl();
		this.extractor = new AsyncMessageIdExtractor();
		this.transactionStoreFactory = new TransactionStoreFactory();
	}

	SOAPMessageRoutingAccessor(WebServiceContext context,
			AsyncMessageIdExtractor extractor,
			TransactionStoreFactory transactionStoreFactory) {
		this.context = context;
		this.extractor = extractor;
		this.transactionStoreFactory = transactionStoreFactory;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see gov.hhs.fha.nhinc.event.HeaderEvent#getMessageId()
	 */
	@Override
	public String getMessageId() {
		return extractor.getMessageId(context);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see gov.hhs.fha.nhinc.event.HeaderEvent#getTransactionId()
	 */
	@Override
	public String getTransactionId() {
		String messageId = extractor.getMessageId(context);
		String transactionId = null;

		List<String> transactionIdList = extractor.getAsyncRelatesTo(context);
		if (NullChecker.isNotNullish(transactionIdList)) {
			TransactionStore store = transactionStoreFactory
					.getTransactionStore();
			transactionId = store.getTransactionId(transactionIdList.get(0));
		}

		if ((transactionId == null) && (messageId != null)) {
			TransactionStore store = transactionStoreFactory
					.getTransactionStore();
			transactionId = store.getTransactionId(messageId);
		}

		return transactionId;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see gov.hhs.fha.nhinc.event.HeaderEvent#buildResponseMsgIdList()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<String> getResponseMsgIdList() {
		MessageContext mContext = context.getMessageContext();
		if (mContext == null) {
			return null;
		}
		return (List<String>) mContext
				.get(NhincConstants.RESPONSE_MESSAGE_ID_LIST_KEY);
	}

}
