/*******************************************************************************
 * Copyright (c) 2004, 2005 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *******************************************************************************/
package org.eclipse.wst.common.uriresolver.internal;

import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverExtension;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
import org.osgi.framework.Bundle;


/**
 * @author csalter
 * 
 */
public class ExtensibleURIResolver implements URIResolver
{
	private static final boolean logExceptions = false;

	//protected IProject project;

	//TODO... consider ctor that takes a project arg
	//public ExtensibleURIResolver(IProject project)
	//{
	//	this.project = project;
	//}

	public ExtensibleURIResolver()
	{
	}

	public String resolve(String baseLocation, String publicId, String systemId)
	{
		boolean debug = 
				"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN".equals(publicId)  //$NON-NLS-1$
				&& "http://java.sun.com/dtd/application_1_3.dtd".equals(systemId); //$NON-NLS-1$

		
		String result = systemId;
		
		if (debug){
			System.out.println("ExtensibleURIResolver - Initial result: " + result);
		}

		// compute the project that holds the resource
		//
    IFile file = computeFile(baseLocation);
		IProject project =  file != null ? file.getProject() : null;

		URIResolverExtensionRegistry resolverRegistry = URIResolverExtensionRegistry.getIntance();
		List list = resolverRegistry.getExtensionDescriptors(project);
		
		if (debug){
			System.out.println("ExtensibleURIResolver - Resolvers in URIResolverExtensionRegistry");
			for (Iterator i = list.iterator(); i.hasNext();){
				URIResolverExtensionDescriptor d = (URIResolverExtensionDescriptor) i.next();
				System.out.println(d.getResolver());
			}
		}

		// get the list of applicable pre-normalized resolvers from the
		// extension registry
		//
		
		if (debug){
			System.out.println("ExtensibleURIResolver - Pre-normalized resolvers in URIResolverExtensionRegistry");
			for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_PRENORMALIZATION).iterator(); i.hasNext();){
				URIResolverExtension resolver = (URIResolverExtension) i.next();
				System.out.println(resolver);
			}
		}
		
		for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_PRENORMALIZATION).iterator(); i.hasNext();)
		{
			URIResolverExtension resolver = (URIResolverExtension) i.next();
			String tempresult = resolver.resolve(file, baseLocation, publicId, result);
			if(tempresult != null)
			{
			  result = tempresult;
			  if (debug){
				  System.out.println("ExtensibleURIResolver - Result returned by pre-normalized resolver " + resolver + ": " + result);
			  }
			}
		}

		// normalize the uri
		//
		
		if (debug){
			System.out.println("ExtensibleURIResolver - Before normalize, base location: " +  baseLocation + ", result: " + result);
		}
		
		result = normalize(baseLocation, result);

		if (debug){
			System.out.println("ExtensibleURIResolver - After normalize, base location: " +  baseLocation + ", result: " + result);
		}
		
		// get the list of applicable post-normalized resolvers from the
		// extension registry
		//	
		
		if (debug){
			System.out.println("ExtensibleURIResolver - Post-normalized resolvers in URIResolverExtensionRegistry");
			for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_POSTNORMALIZATION).iterator(); i.hasNext();){
				URIResolverExtension resolver = (URIResolverExtension) i.next();
				System.out.println(resolver);
			}
		}
		
		for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_POSTNORMALIZATION).iterator(); i.hasNext();)
		{ 
			URIResolverExtension resolver = (URIResolverExtension) i.next();
			String tempresult = resolver.resolve(file, baseLocation, publicId, result);
			if(tempresult != null)
			{
			  result = tempresult;
			  System.out.println("ExtensibleURIResolver - Result returned by post-normalized resolver " + resolver + ": " + result);
			}
		}

		if (debug){
			System.out.println("ExtensibleURIResolver - Final result: " + result);
		}
		return result;
	}
    
    public String resolvePhysicalLocation(String baseLocation, String publicId, String logicalLocation)
    {
      String result = logicalLocation;
      URIResolverExtensionRegistry resolverRegistry = URIResolverExtensionRegistry.getIntance();
      IFile file = computeFile(baseLocation);
      
      // compute the project that holds the resource
      //      
      IProject project =  file != null ? file.getProject() : null;            
      List list = resolverRegistry.getExtensionDescriptors(project);      
      for (Iterator i = resolverRegistry.getMatchingURIResolvers(list, URIResolverExtensionRegistry.STAGE_PHYSICAL).iterator(); i.hasNext(); )
      {        
        // get the list of applicable physical resolvers from the extension registry
        //
        while (i.hasNext())
        {
          URIResolverExtension resolver = (URIResolverExtension) i.next();
          String tempresult = resolver.resolve(file, baseLocation, publicId, result);
          if(tempresult != null)
          {
            result = tempresult;
          }
        }
      }        
      return result;
    }
    

	protected String normalize(String baseLocation, String systemId)
	{
	  // If no systemId has been specified there is nothing to do
	  // so return null;
	  if(systemId == null)
	    return null;
	  String result = systemId;
      
      // cs : sometimes normalizing the URI will cause an exception to get thrown
      // for example the 'bad' version of the URI below ...
      //
      //   good = "jar:/resource/project-name/WebContent/WEB-INF/lib/generator.jar!/META-INF/schema/config.dtd"
      //   bad  = "jar:/resource/project-name/WebContent/WEB-INF/lib/generator.jar/META-INF/schema/config.dtd"
      //
      // Here we enclose the normalization in a try/catch block with the assumption that the caller
      // (i.e. the 'resolve' method) isn't interested in handling this exception.        
	  try
	  {
	    // normalize the URI
	    URI systemURI = URI.createURI(systemId);
	    if (systemURI.isRelative())
	    {
	      baseLocation = baseLocation.replace('\\','/');
	      URI baseURI = URI.createURI(baseLocation);
          
          // TODO (cs) we should add more comments to explain this in a bit more detail
	      try
	      {
	        result = systemURI.resolve(baseURI).toString();
	      }
	      catch (IllegalArgumentException e) {
	        Bundle bundle = URIResolverPlugin.getInstance().getBundle();
	        IStatus statusObj = null;
	        java.net.URI baseURI2 = null;
	        try {
	          baseURI2 = java.net.URI.create(baseLocation);
	        }
	        catch (IllegalArgumentException e2) {
	          if(logExceptions) {
	            statusObj = new Status(IStatus.ERROR, bundle.getSymbolicName(), IStatus.ERROR, "Problem in creating java.net.URI in ExtensibleURIResolver:" + e2.getMessage(), e2); //$NON-NLS-1$
	            Platform.getLog(bundle).log(statusObj);
	          }
	        }
	        try {
	          if(baseURI2 != null) {
	            java.net.URI resultURI = baseURI2.resolve(systemId);
	            result = resultURI.toString();
	          }
	        }
	        catch (IllegalArgumentException e2) {
	          if(logExceptions) {
	            statusObj = new Status(IStatus.ERROR, bundle.getSymbolicName(), IStatus.ERROR, "Problem in resolving with java.net.URI in ExtensibleURIResolver:" + e2.getMessage(), null); //$NON-NLS-1$
	            Platform.getLog(bundle).log(statusObj);
	          }
	        }
	      }
	    }
	  }
	  catch (Exception e)
	  {     
        // just eat the exception and return back the original systemId
	  }
	  return result;
	}

  protected IFile computeFile(String baseLocation)
  {
    IFile file = null;
    if (baseLocation != null)
    {
      String pattern = "file:///"; //$NON-NLS-1$
      if (baseLocation.startsWith(pattern))
      {
        baseLocation = baseLocation.substring(pattern.length());
      }
      IPath path = new Path(baseLocation);
      file = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
    }
    return file;    
  }
}
