/*******************************************************************************
 * Copyright (c) 2005, 2006 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.ws.internal.common;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.http.HTTPAddress;
import javax.wsdl.extensions.soap.SOAPAddress;
import org.eclipse.core.resources.IResource;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.ws.internal.WstWSPluginMessages;
import org.eclipse.wst.ws.internal.parser.wsil.WebServicesParser;

/**
 * Utilities for working with a workspace WSDL file resource.
 * 
 * @author joan
 *
 */

public class WSDLUtility {

	protected Definition definition_ = null;
	protected IResource resource_ = null;
	protected String serviceName_ = "";
	protected URL url_ = null;
	
	public WSDLUtility(IResource res)
	{
 		super();
		resource_ = res;
		buildDefinition();		
	}
	
	protected boolean buildDefinition()
	{		
		if (resource_.getType() == IResource.FILE)
	    {        
	        String ext = resource_.getFileExtension();
	        String resPath = resource_.getFullPath().toString();
	        if (ext != null)
	        {
		      	
		        WebServicesParser parser = new WebServicesParser();
		      			      	
		      	try {
		      		definition_ = parser.getWSDLDefinition("platform:" + resPath);
		      	   if (definition_ == null){		      		   
		      		 throw new Exception(NLS.bind(WstWSPluginMessages.MSG_UNABLE_TO_RESOLVE_PLATFORM_URI, resPath));		      		 
		      	   }
		      	}
		      	catch (Exception e){
		      		return false;
		      	}
	        }
	        else if (resPath.indexOf('?') > 0)  //deployed resource
	        {
	        	WebServicesParser parser = new WebServicesParser();
		      			      	
		      	try {
		      		definition_ = parser.getWSDLDefinition("http:" + resPath);
		      	   if (definition_ == null){
		      		 throw new Exception(NLS.bind(WstWSPluginMessages.MSG_UNABLE_TO_RESOLVE_HTTP, resPath));		      		

		      	   }
		      	}
		      	catch (Exception e){
		      		return false;
		      	}
	        }
	    }
		serviceName_ = "";		
		return true;
	}
	
	/**
	 * Determines the name of the service defined in the WSDL file
	 * 
	 * @param resource The workspace resource for the WSDL file
	 * @return Returns a string containing the value of the name attribute of the service element 
	 */
	public String getServiceName()
	{
		if (serviceName_.equals(""))
		{
			if (definition_ != null)
			{
				   Map servicesMap = definition_.getServices();  //jvh - need to handle null definition here....
			  	   Object[] services = servicesMap.values().toArray();
			  	   
			  	   // TODO: here can detect if no service tag - send appropriate message
			  	   // TODO: what if > 1 service defined in the WSDL?
			  	   // for now return the first service name found...
			  	   for (int i = 0; i < services.length; i++) {
					   Service s = (Service)services[i];
					   String qString = s.getQName().toString();
					   
					   //get name only from qualified string
					   int index1 = qString.indexOf("}")+1;  //$NON-NLS-1$
					   int index2 = qString.length();
					   
					   serviceName_ = qString.substring(index1, index2);				   
			  	   }  	
			}				  
		}
	  	return serviceName_;
	}
	
	public URL getWSDLAddress() 
    {
	   if (url_ == null)
	   {	   
	       String locationURI = null;
	       if (definition_ != null)
	       {
	    	   Map servicesMap = definition_.getServices();
		  	   Object[] services = servicesMap.values().toArray();
		  	   
		  	   // TODO: here can detect if no service tag - send appropriate message
		  	   // TODO: what if > 1 service defined in the WSDL?
		  	   for (int i = 0; i < services.length; i++) {
				   Service s = (Service)services[i];
				   Map portsMap = s.getPorts();
				   Object[] ports = portsMap.values().toArray();
		
				   // TODO: here can detect if > 1 port for the service - determine how to handle
				   for (int j = 0; j < ports.length; j++) {
						Port p = (Port)ports[j];
						List extList = p.getExtensibilityElements();
						
						for (int k = 0; j < extList.size(); j++){
						      ExtensibilityElement extElement = (ExtensibilityElement)extList.get(k);
						      if (extElement instanceof SOAPAddress)
						      {  
						        locationURI = ((SOAPAddress)extElement).getLocationURI();
						      }
						      else if (extElement instanceof HTTPAddress)
						       {
						        locationURI = ((HTTPAddress)extElement).getLocationURI();						        
						      }
						      else
						      {
						    	  //TODO: if not SOAP or HTTP - how do we want to handle it... 
						      }
						 }					
				   }
		  	   }  		    	
		  	 
			    try {
			         url_ = new URL(locationURI + "?" + resource_.getFileExtension());	         
			    }
			    catch (MalformedURLException malExc){}
            }	  		      
	    }
	   return url_;
    }
}
