package org.eclipse.wst.ws.internal.wsfinder;

import java.util.List;
import java.util.Vector;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.wst.ws.internal.provisional.wsrt.WebServiceInfo;

/**
 * Extends the Web Services Finder Framework.
 * Finds all .wsdl files in the workspace.
 * Not intended to be used directly.  WorkspaceWSDLLocator registers with WebServiceLocatorRegistry 
 * and is accessed by the {@link WebServiceFinder}. 
 */

public class WorkspaceWSDLLocator extends AbstractWebServiceLocator {
	
	protected List wsdlServices = null;
	private static final String PLATFORM_RES = "platform:/resource";  //$NON-NLS-1$
	private static final String WSDL_EXT = "wsdl";  //$NON-NLS-1$
	
	public WorkspaceWSDLLocator()
	{
		super();	
	}
	
	/**
	 * Returns the collection of all .wsdl files in the workspace.  Currently does not eliminate multiple 
	 * occurences of the same web service. 
	 * 
	 * TODO: add a listener to the workspace resource tree so that getWebServices doesn't always
	 * use the WSDLVisitor to walk the entire resource tree.  That should only happen once.  After
	 * that the resource tree can be monitored for modifications to .wsdl files and changes made to a cache. 
	 * 
	 * @return list of WebServiceInfo objects
	 */
	public List getWebServices() {
		
		if (wsdlServices == null)
		{
			 try{
			      IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		
			      WSDLVisitor visitor = new WSDLVisitor();
			      root.accept(visitor);		
			      visitor.visit(root);
			      wsdlServices = visitor.getWSDL();
			    }
			    catch (Exception ex){
			        	
			    }
		}
		
		return wsdlServices;		
	}

	/**
	 *  Uses the Visitor pattern to walk the workspace resource tree
	 */
	
	private class WSDLVisitor implements IResourceVisitor
    {
	  
	  private Vector wsdl = new Vector();
    
	  /**
	   *
	   * visits every node on the resource tree stopping a file resources
	   * if file resource has extension .wsdl a WebServiceInfo object is created and added to a vector 
	   *  TODO: look at caching to eliminate duplicate web service definitions in the vector returned
	   *  TODO: add more information to the WebServiceInfo object.  Currently only the qualified filename is added.
	   */
	 
	  public boolean visit(IResource resource)
      {
    	if (resource.getType() == IResource.FILE)
        {        
          String ext = resource.getFileExtension();
          if (ext != null && ext.equalsIgnoreCase(WSDL_EXT))
          {
        	String urlString = resource.getFullPath().toString();          
        	urlString = PLATFORM_RES + urlString;
        	
        	WebServiceInfo wsInfo = new WebServiceInfo();
            wsInfo.setWsdlURL(urlString);           
            
            wsdl.add(wsInfo);
          }
        }
        return true;
      }
      
	  /**
	   * 
	   * @return vector of WebServiceInfo objects
	   */
      public Vector getWSDL()
      {
    	  return wsdl;
      }
    }
	
}
