package org.taverna.server.master.utils;

import static org.apache.commons.logging.LogFactory.getLog;
import static org.apache.cxf.common.util.UrlUtils.parseQueryString;
import static org.apache.cxf.message.Message.HTTP_REQUEST_METHOD;
import static org.apache.cxf.message.Message.QUERY_STRING;
import static org.apache.cxf.message.Message.REQUEST_URL;
import static org.apache.cxf.phase.Phase.READ;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.cxf.binding.soap.interceptor.EndpointSelectionInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;


/**
 * Thunk for TAVSERV-293.
 * 
 * @author Donal Fellows (based on work by Daniel Hagen)
 */
public class WSDLHeadOptionsInterceptor extends
		AbstractPhaseInterceptor<Message> {
	public static final Log log = getLog("Taverna.Server.Utils");

	public WSDLHeadOptionsInterceptor() {
		super(READ);
		getAfter().add(EndpointSelectionInterceptor.class.getName());
	}

	@Override
	public void handleMessage(Message message) throws Fault {
		String method = (String) message.get(HTTP_REQUEST_METHOD);
		String query = (String) message.get(QUERY_STRING);

		if (("HEAD".equals(method) || "OPTIONS".equals(method))
				&& query != null && !query.trim().isEmpty()
				&& isRecognizedQuery(query)) {
			log.debug("adjusting message request method " + method + " for "
					+ message.get(REQUEST_URL) + " to GET");
			message.put(HTTP_REQUEST_METHOD, "GET");
		}
	}

	/*
	 * Stolen from http://permalink.gmane.org/gmane.comp.apache.cxf.user/20037
	 * which is itself in turn stolen from
	 * org.apache.cxf.frontend.WSDLGetInterceptor.isRecognizedQuery
	 */
	/**
	 * Is this a query for WSDL or XSD relating to it?
	 * 
	 * @param query
	 *            The query string to check
	 * @return If the query is one to handle.
	 * @see org.apache.cxf.frontend.WSDLGetInterceptor#isRecognizedQuery(Map,String,String,org.apache.cxf.service.model.EndpointInfo)
	 *      WSDLGetInterceptor
	 */
	private boolean isRecognizedQuery(String query) {
		Map<String, String> map = parseQueryString(query);
		return map.containsKey("wsdl") || map.containsKey("xsd");
	}
}
