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

import java.util.Iterator;

import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Import;
import org.eclipse.wst.wsdl.Types;
import org.eclipse.wst.wsdl.XSDSchemaExtensibilityElement;
import org.eclipse.wst.wsdl.internal.impl.WSDLElementImpl;
import org.eclipse.wst.wsdl.internal.util.WSDLModelLocator;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDSchemaDirective;
import org.w3c.dom.Element;


public class WSDLResourceUtil
{
  public static void reloadDirectives(Definition definition)
  {
    Resource rootResource = definition.eResource();
    ResourceSet resourceSet = rootResource.getResourceSet();

    for (Iterator i = resourceSet.getResources().iterator(); i.hasNext();)
    {
      Resource resource = (Resource) i.next();
      if (resource != rootResource)
      {
        //  TODO... consider unloading the resources  	
        //  resource.unload();		      
        i.remove();
      }
    }
    ReloadDirectiveVisitor visitor = new ReloadDirectiveVisitor();
    visitor.visitDefinition(definition);
  }

  static class ReloadDirectiveVisitor
  {

    public void visitImport(Import theImport)
    {
      // force the import to reload
      Element element = WSDLEditorUtil.getInstance().getElementForObject(theImport);
      if (element != null)
      {
        ((WSDLElementImpl)theImport).elementChanged(element);
      }
    }

    public void visitXSDSchemaDirective(XSDSchemaDirective directive)
    {
      // force the schema directive to reload
      Element element = directive.getElement();
      if (element != null)
      {
        directive.elementAttributesChanged(element);
      }
    }

    public void visitDefinition(Definition definition)
    {
      if (definition != null)
      {
        for (Iterator i = definition.getEImports().iterator(); i.hasNext();)
        {
          visitImport((Import) i.next());
        }
        Types types = definition.getETypes();
        if (types != null)
        {

          for (Iterator i = types.getEExtensibilityElements().iterator(); i.hasNext();)
          {
            Object o = i.next();
            if (o instanceof XSDSchemaExtensibilityElement)
            {
              XSDSchemaExtensibilityElement e = (XSDSchemaExtensibilityElement) o;
              if (e.getSchema() != null)
              {
                visitSchema(e.getSchema());
              }
            }
          }
        }
      }
    }

    public void visitSchema(XSDSchema schema)
    {
      for (Iterator i = schema.getContents().iterator(); i.hasNext();)
      {
        Object o = i.next();
        if (o instanceof XSDSchemaDirective)
        {
          visitXSDSchemaDirective((XSDSchemaDirective) o);
        }
      }
    }
  }


  public static class InternalURIResolver implements WSDLModelLocator
  {
    //IdResolver idResolver = new IdResolverImpl(null, true);
    org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver resolver = URIResolverPlugin.createResolver();

    InternalURIResolver()
    {  
    }

    public String resolveURI(String baseLocation, String namespace, String location)
    {
      String resolvedLocation = resolver.resolve(baseLocation, namespace, location);

      // here's an ugly hack... Platform.resolve() returns Windows files with the pattern "file:D:/hello.xsd"
      // but EMF's URI class expects a pattern like this "file:///D:/hello.xsd"
      //        
      if (resolvedLocation != null)
      {
		String fileProtocol = "file:";      	
        if (resolvedLocation.startsWith(fileProtocol) && !resolvedLocation.startsWith(fileProtocol + "/"))
        {
          resolvedLocation = resolvedLocation.substring(fileProtocol.length());
        }
        resolvedLocation = URIHelper.addImpliedFileProtocol(resolvedLocation);
      }
      // end ugly hack
      return resolvedLocation;
    }
  }
}