blob: 108c163373bcf90663c1540e53f843f1a1e380cd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 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.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:"; //$NON-NLS-1$
if (resolvedLocation.startsWith(fileProtocol) && !resolvedLocation.startsWith(fileProtocol + "/")) //$NON-NLS-1$
{
resolvedLocation = resolvedLocation.substring(fileProtocol.length());
}
resolvedLocation = URIHelper.addImpliedFileProtocol(resolvedLocation);
}
// end ugly hack
return resolvedLocation;
}
}
}