/*******************************************************************************
 * 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.ui;

import javax.xml.namespace.QName;

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.internal.util.*;

import org.eclipse.wst.wsdl.binding.soap.*;
import org.eclipse.wst.wsdl.binding.soap.internal.util.*;

public class SampleWSDLGenerator 
{
  public SampleWSDLGenerator()
  {
    init();
  }

  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.getNamespaces().put("tns", "http://www.temperature.com");
    
    // Other namespaces - wsdl, soap, xsd
    definition.getNamespaces().put("wsdl", WSDLConstants.WSDL_NAMESPACE_URI);
    definition.getNamespaces().put("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;  
  }

}
