/*
 * 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.camel.component.cxf;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.w3c.dom.Document;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Unit test for setting arbitrary payload in MESSAGE mode
 */
public class CxfDispatchMessageTest extends CxfDispatchTestSupport {

    @Override
    protected AbstractApplicationContext createApplicationContext() {
        return new ClassPathXmlApplicationContext("org/apache/camel/component/cxf/CxfDispatchMessageBeans.xml");
    }

    @Test
    public void testDipatchMessage() throws Exception {
        final String name = "Tila";
        Exchange exchange = sendJaxWsDispatchMessage(name, false);
        assertEquals("The request should be handled sucessfully ", exchange.isFailed(), false);
        
        org.apache.camel.Message response = exchange.getOut();
        assertNotNull("The response message must not be null ", response);
        
        String value = decodeResponseFromMessage(response.getBody(InputStream.class), exchange);
        assertTrue("The response body must match the request ", value.endsWith(name));
    }
    
    @Test
    public void testDipatchMessageOneway() throws Exception {
        final String name = "Tila";
        Exchange exchange = sendJaxWsDispatchMessage(name, true);
        assertEquals("The request should be handled sucessfully ", exchange.isFailed(), false);
        
        org.apache.camel.Message response = exchange.getOut();
        assertNotNull("The response message must not be null ", response);
        
        assertNull("The response body must be null ", response.getBody());
    }


    protected Exchange sendJaxWsDispatchMessage(final String name, final boolean oneway) {
        Exchange exchange = template.send("direct:producer", new Processor() {
            public void process(final Exchange exchange) {
                InputStream request = encodeRequestInMessage(oneway ? MESSAGE_ONEWAY_TEMPLATE : MESSAGE_TEMPLATE, name, exchange);
                exchange.getIn().setBody(request, InputStream.class);
                // set the operation for oneway; otherwise use the default operation                
                if (oneway) {
                    exchange.getIn().setHeader(CxfConstants.OPERATION_NAME, INVOKE_ONEWAY_NAME);
                }
            }
        });
        return exchange;
    }
    
    private static InputStream encodeRequestInMessage(String form, String name, Exchange exchange) {
        String payloadstr = String.format(form, name);
        InputStream message = null;
        try {
            message = new ByteArrayInputStream(payloadstr.getBytes("utf-8"));
        } catch (Exception e) {
            // ignore and let it fail
        }
        return message;
    }

    private String decodeResponseFromMessage(InputStream message, Exchange exchange) {
        String value = null;
        try {
            Document doc = getDocumentBuilderFactory().newDocumentBuilder().parse(message);
            value = getResponseType(doc.getDocumentElement());
        } catch (Exception e) {
            // ignore and let it fail
        }
        return value;
    }
}
