/*
 * 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.axis2.jaxws.description.builder;

import junit.framework.TestCase;
import org.apache.axis2.jaxws.description.DescriptionFactory;
import org.apache.axis2.jaxws.description.DescriptionTestUtils;
import org.apache.axis2.jaxws.description.ServiceDescription;

import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceClient;
import java.net.URL;

/**
 * 
 */
public class SparseAnnotTests extends TestCase {
    private String namespaceURI = "http://org.apache.axis2.jaxws.description.builder.SparseAnnotTests";
    private String svcLocalPart = "svcLocalPart";

    public void testNoSparseAnnot() {
        QName serviceQName = new QName(namespaceURI, svcLocalPart);
        ServiceDescription svcDesc = 
            DescriptionFactory.createServiceDescription(null, serviceQName, 
                                                        SparseAnnotServiceSubclass.class);
        assertNotNull(svcDesc);
        // A DBC will be created for us
        DescriptionBuilderComposite svcDescComposite = DescriptionTestUtils.getServiceDescriptionComposite(svcDesc);
        assertNotNull(svcDescComposite);
        WebServiceClient wsClient = svcDescComposite.getWebServiceClientAnnot();
        // There is no DBC Annot in this case; it is the class annotation but it should be 
        // returned as an instance of a WebServiceClientAnnot
        assertTrue(wsClient instanceof WebServiceClientAnnot);
    }
    
    public void testAssociatedClass() {
        QName serviceQName = new QName(namespaceURI, svcLocalPart);
        // Create a composite with a WebServiceClient override of the WSDL location.
        DescriptionBuilderComposite composite = new DescriptionBuilderComposite();
        String overridenWsdlLocation = DescriptionTestUtils.getWSDLLocation("ClientEndpointMetadata.wsdl");
        WebServiceClientAnnot wsClientAnno = 
            WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, overridenWsdlLocation);
        composite.setWebServiceClientAnnot(wsClientAnno);
        Object compositeKey = "CompositeKey";
        ServiceDescription svcDesc = 
            DescriptionFactory.createServiceDescription(null, serviceQName, 
                                                        SparseAnnotServiceSubclass.class, 
                                                        composite, compositeKey);
        assertNotNull(svcDesc);
        DescriptionBuilderComposite svcDescComposite = DescriptionTestUtils.getServiceDescriptionComposite(svcDesc);
        assertNotNull(svcDescComposite);
        assertNotSame(composite, svcDescComposite);
        assertSame(SparseAnnotServiceSubclass.class, svcDescComposite.getCorrespondingClass());
        assertSame(composite, svcDescComposite.getSparseComposite(compositeKey));
        WebServiceClient wsClient = svcDescComposite.getWebServiceClientAnnot();
        assertTrue(wsClient instanceof WebServiceClientAnnot);
    }
    /**
     * The WebServiceRef annotation isn't processed by the JAXWS runtime.  The container (i.e. the
     * client container, web container, or ejb container) processes it since it is responsible for
     * doing resource injection.  This means none of the other tests deal with WebServiceRef, so
     * this simple test validates a few aspects of the composite annotation processing.
     */
    public void testWebServiceRef() {
        org.apache.axis2.jaxws.description.builder.WebServiceRefAnnot wsr = WebServiceRefAnnot.createWebServiceRefAnnotImpl();
        assertTrue(wsr.name().equals(""));
        assertTrue(wsr.wsdlLocation().equals(""));
        assertTrue("".equals(wsr.getTypeString()));
        assertTrue("".equals(wsr.getValueString()));
        assertNull(wsr.type());
        assertNull(wsr.value());
        
        wsr = WebServiceRefAnnot.createWebServiceRefAnnotImpl("name", "wsdlLocation", String.class, Object.class, "mappedName");
        assertTrue(wsr.name().equals("name"));
        assertTrue(wsr.wsdlLocation().equals("wsdlLocation"));
        assertTrue("".equals(wsr.getTypeString()));
        assertTrue("".equals(wsr.getValueString()));
        assertTrue(wsr.type() == String.class);
        assertTrue(wsr.value() == Object.class);
    }

}

@WebServiceClient(targetNamespace="originalTNS", wsdlLocation="originalWsdlLocation")
class SparseAnnotServiceSubclass extends javax.xml.ws.Service {

    protected SparseAnnotServiceSubclass(URL wsdlDocumentLocation, QName serviceName) {
        super(wsdlDocumentLocation, serviceName);
    }
}
