/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.wsdl.tests;

import javax.xml.namespace.QName;

import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

import org.eclipse.wst.wsdl.*;
import org.eclipse.wst.wsdl.tests.util.DefinitionLoader;
import org.eclipse.wst.wsdl.util.WSDLConstants;

import org.eclipse.wst.wsdl.binding.soap.*;
import org.eclipse.wst.wsdl.binding.soap.internal.util.*;
import org.eclipse.wst.wsdl.internal.util.WSDLResourceFactoryImpl;
import org.eclipse.xsd.XSDPackage;
import org.eclipse.xsd.util.XSDResourceFactoryImpl;

public class WSDLGenerationTest extends TestCase
{
  public WSDLGenerationTest()
  {
    init();
  }
  
  public WSDLGenerationTest(String name) 
  {
    super(name);
  }  
  
  public static Test suite() 
  {
    TestSuite suite = new TestSuite();
    
    suite.addTest
      (new WSDLGenerationTest("SampleWSDLGeneration") 
         {
           protected void runTest() 
           {
             testSampleWSDLGeneration();
         }
       }
     );
    
    return suite;
  }
  
  public void testSampleWSDLGeneration() 
  {
    try
    {
      generateTemperatureService("./TemperatureService.wsdl");
    }
    catch (Exception e)
    {
      Assert.fail("Test failed due to an exception: " + e.getLocalizedMessage());
    }
  }
  
  protected void setUp() throws Exception 
  {
    super.setUp();
    
    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("wsdl", new WSDLResourceFactoryImpl());
    WSDLPackage pkg = WSDLPackage.eINSTANCE;
    
    // We need this for XSD <import>.
    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", new XSDResourceFactoryImpl());
    XSDPackage xsdpkg = XSDPackage.eINSTANCE;
  }

  protected void tearDown() throws Exception 
  {
    super.tearDown();
  }
  
  public void generateTemperatureService(String outputFile) throws Exception
  {
    ResourceSet resourceSet = new ResourceSetImpl();
    Resource resource = resourceSet.createResource(URI.createFileURI(outputFile));
    resourceSet.getResources().add(resource);

    // Create a Definition - Temperature
    Definition definition = WSDLFactory.eINSTANCE.createDefinition();
    definition.setQName(new QName(WSDLConstants.WSDL_NAMESPACE_URI,"Temparature"));
    resource.getContents().add(definition);
    
    // Target namespace - http://www.temperature.com
    definition.setTargetNamespace("http://www.temperature.com");
    definition.addNamespace("tns", "http://www.temperature.com");
    
    // Other namespaces - wsdl, soap, xsd
    definition.addNamespace("wsdl", WSDLConstants.WSDL_NAMESPACE_URI);
    definition.addNamespace("xsd", WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001);
    definition.getNamespaces().put("soap", SOAPConstants.SOAP_NAMESPACE_URI);

    //
    // Let's start building two messages
    //
    
    // Create a Part - ZipCode
    Part part = WSDLFactory.eINSTANCE.createPart();
    part.setName("ZipCode");
    part.setTypeName(new QName(WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"string"));
    
    // Create a Message - GetTemperatureInput
    Message inputMessage = WSDLFactory.eINSTANCE.createMessage();
    inputMessage.setQName(new QName(definition.getTargetNamespace(), "GetTemparatureInput"));
    inputMessage.addPart(part);
    definition.addMessage(inputMessage);
    
    // Create a Part - Temperature
    part = WSDLFactory.eINSTANCE.createPart();
    part.setName("Temperature");
    part.setTypeName(new QName(WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"float"));

    // Create a Message - GetTemperatureOutput
    Message outputMessage = WSDLFactory.eINSTANCE.createMessage();
    outputMessage.setQName(new QName(definition.getTargetNamespace(), "GetTemparatureOutput"));
    outputMessage.addPart(part);
    definition.addMessage(outputMessage);
    
    //
    // Next, build a PortType
    //
    
    // Create an Input - GetTemperatureInput
    Input input = WSDLFactory.eINSTANCE.createInput();
    input.setMessage(inputMessage);

    // Create an Output - GetTemperatureOutput
    Output output = WSDLFactory.eINSTANCE.createOutput();
    output.setMessage(outputMessage);
   
    // Create an Operation - GetTemperatureForZipCode
    Operation operation = WSDLFactory.eINSTANCE.createOperation();
    operation.setName("GetTemperatureForZipCode");
    operation.setInput(input);
    operation.setOutput(output);
    
    // Create a PortType
    PortType portType = WSDLFactory.eINSTANCE.createPortType();
    portType.setQName(new QName(definition.getTargetNamespace(),"GetTemparatureInfoSOAP"));
    portType.addOperation(operation);
    definition.addPortType(portType);
    
    //
    // Now, let's work on Binding
    //
    
    // Create a Binding - GetTemperatureInfoSOAP
    Binding binding = WSDLFactory.eINSTANCE.createBinding();
    binding.setQName(new QName(definition.getTargetNamespace(), "GetTemparatureInfoSOAP"));
    binding.setPortType(portType);
    definition.addBinding(binding);

    // Create a SOAP Binding
    SOAPBinding soapBinding = SOAPFactory.eINSTANCE.createSOAPBinding();
    soapBinding.setStyle("rpc");
    soapBinding.setTransportURI("http://schemas.xmlsoap.org/soap/http");
    binding.addExtensibilityElement(soapBinding);

    // Create a Binding Operation
    BindingOperation bindingOperation = WSDLFactory.eINSTANCE.createBindingOperation();
    bindingOperation.setName("GetTemperatureForZipCode");
    binding.addBindingOperation(bindingOperation);

    // Create a SOAP Operation
    SOAPOperation soapOperation = SOAPFactory.eINSTANCE.createSOAPOperation();
    soapOperation.setSoapActionURI("http://www.temperature.com/GetTemperatureForZipCode");
    bindingOperation.addExtensibilityElement(soapOperation);    

    // Create a SOAP Body
    SOAPBody soapBody = SOAPFactory.eINSTANCE.createSOAPBody();
    soapBody.setUse("encoded");
    soapBody.getEncodingStyles().add("http://schemas.xmlsoap.org/soap/encoding/");
    soapBody.setNamespaceURI("http://www.temperature.com/");

    // Create a Binding Input
    BindingInput bindingInput = WSDLFactory.eINSTANCE.createBindingInput();
    bindingInput.addExtensibilityElement(soapBody);
    bindingOperation.setBindingInput(bindingInput);
    
    // Create a SOAP Body
    soapBody = SOAPFactory.eINSTANCE.createSOAPBody();
    soapBody.setUse("encoded");
    soapBody.getEncodingStyles().add("http://schemas.xmlsoap.org/soap/encoding/");
    soapBody.setNamespaceURI("http://www.temperature.com/");
    
    // Create a Binding Output
    BindingOutput bindingOuput = WSDLFactory.eINSTANCE.createBindingOutput();
    bindingOuput.addExtensibilityElement(soapBody);
    bindingOperation.setBindingOutput(bindingOuput);
    
    //
    // Finally, we are building a Service
    //

    // Create a SOAP Address
    SOAPAddress soapAddress = SOAPFactory.eINSTANCE.createSOAPAddress();
    soapAddress.setLocationURI("http://todo-some-address/");

    // Create a Port - GetTemperatureInfoSOAP
    Port port = WSDLFactory.eINSTANCE.createPort();
    port.setName("GetTemperatureInfoSOAP");
    port.setBinding(binding);
    port.addExtensibilityElement(soapAddress);
    
    // Create a Service - TemperatureService
    Service service = WSDLFactory.eINSTANCE.createService();
    service.setQName(new QName(definition.getTargetNamespace(),"TemperatureService"));
    service.addPort(port);
    definition.addService(service);
    
    //
    // Phew, we are done. Let's serialize it.
    //
    
    resource.save(null);
 
  }

  private void init()
  {
    Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("wsdl", new WSDLResourceFactoryImpl());
    WSDLPackage pkg = WSDLPackage.eINSTANCE;  
  }

}
