/**
 * 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.cxf.dosgi.itests.multi;

import java.net.URL;
import java.util.concurrent.Callable;

import javax.ws.rs.core.MediaType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.cxf.dosgi.samples.soap.Task;
import org.apache.cxf.dosgi.samples.soap.TaskService;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerClass;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Deploys the sample SOAP service and zookeeper discovery.
 * Then checks the service can be called via plain CXF and is announced in zookeeper
 */
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class TestExportService extends AbstractDosgiTest {

    private static final String SERVICE_URI = HTTP_BASE_URI + "/cxf/taskservice";
    private static final String REST_SERVICE_URI = HTTP_BASE_URI + "/cxf/tasks";

    private static final String GREETER_ZOOKEEPER_NODE = //
        "/osgi/service_registry/http:##localhost:8181#cxf#taskservice";

    @Configuration
    public static Option[] configure() throws Exception {
        return new Option[] //
        {//
         basicTestOptions(), //
         configZKServer(), //
         configZKConsumer(), //
         taskServiceAPI(), //
         taskServiceImpl(), //
         taskRESTAPI(), //
         taskRESTImpl(), //
         //debug(),
        };
    }

    @Test
    public void testSOAPCall() throws Exception {
        checkWsdl(new URL(SERVICE_URI + "?wsdl"));
        TaskService taskService = TaskServiceProxyFactory.create(SERVICE_URI);
        Task task = taskService.get(1);
        Assert.assertEquals("Buy some coffee", task.getTitle());
    }

    @Test
    public void testRESTCall() throws Exception {
        waitWebPage(REST_SERVICE_URI);
        final WebClient client = WebClient.create(REST_SERVICE_URI + "/1");
        client.accept(MediaType.APPLICATION_XML_TYPE);
        org.apache.cxf.dosgi.samples.rest.Task task = tryTo("Call REST Resource", 
                                                            new Callable<org.apache.cxf.dosgi.samples.rest.Task>() {
            public org.apache.cxf.dosgi.samples.rest.Task call() throws Exception {
                return client.get(org.apache.cxf.dosgi.samples.rest.Task.class);
            }
        }
        );
        Assert.assertEquals("Buy some coffee", task.getTitle());
        final WebClient swaggerClient = WebClient.create(REST_SERVICE_URI + "/swagger.json");
        String swaggerJson = swaggerClient.get(String.class);
        Assert.assertEquals("{\"swagger\":\"2.0\"", swaggerJson.substring(0, 16));
    }

    @Test
    public void testDiscoveryExport() throws Exception {
        ZooKeeper zk = createZookeeperClient();
        assertNodeExists(zk, GREETER_ZOOKEEPER_NODE, 5000);
        zk.close();
    }

    private void checkWsdl(final URL wsdlURL) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        dbf.setValidating(false);
        final DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = tryTo("Parse WSDL", new Callable<Document>() {
            public Document call() throws Exception {
                return db.parse(wsdlURL.openStream());
            }
        });

        Element el = doc.getDocumentElement();
        Assert.assertEquals("definitions", el.getLocalName());
        Assert.assertEquals("http://schemas.xmlsoap.org/wsdl/", el.getNamespaceURI());
        Assert.assertEquals("TaskServiceService", el.getAttribute("name"));
    }

}
