blob: ea06ff8e5f3bbf82277a67a27df967d6e8ba3daf [file] [log] [blame]
package org.eclipse.wst.xsd.ui.internal.text;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaLocationResolverAdapterFactory;
import org.eclipse.xsd.XSDFactory;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.impl.XSDSchemaImpl;
import org.eclipse.xsd.util.XSDResourceImpl;
import org.w3c.dom.Element;
public class XSDModelAdapter implements INodeAdapter
{
protected ResourceSet resourceSet;
protected XSDSchema schema;
public XSDSchema getSchema()
{
return schema;
}
public void setSchema(XSDSchema schema)
{
this.schema = schema;
}
public boolean isAdapterForType(Object type)
{
return type == XSDModelAdapter.class;
}
public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
{
}
public XSDSchema createSchema(Element element)
{
try
{
IDOMNode domNode = (IDOMNode)element;
String baseLocation = domNode.getModel().getBaseLocation();
// System.out.println("XSDSchemalNodeAdapter.baseLocation=" + baseLocation);
schema = XSDFactory.eINSTANCE.createXSDSchema();
// Force the loading of the "meta" schema for schema instance instance.
//
String schemaForSchemaNamespace = element.getNamespaceURI();
XSDSchemaImpl.getSchemaForSchema(schemaForSchemaNamespace);
resourceSet = XSDSchemaImpl.createResourceSet();
resourceSet.getAdapterFactories().add(new XSDSchemaLocationResolverAdapterFactory());
// TODO... gotta pester SSE folks to provide 'useful' baseLocations
//
URI uri = null;
if (baseLocation.startsWith("/"))
{
uri = URI.createPlatformResourceURI(baseLocation);
}
else
{
uri = URI.createFileURI(baseLocation);
}
//System.out.println("uri=" + uri.toString());
Resource resource = new XSDResourceImpl();
resource.setURI(uri);
schema = XSDFactory.eINSTANCE.createXSDSchema();
resource.getContents().add(schema);
resourceSet.getResources().add(resource);
schema.setElement(element);
// attach an adapter to keep the XSD model and DOM in sync
//
new XSDModelReconcileAdapter(element.getOwnerDocument(), schema);
}
catch (Exception ex)
{
ex.printStackTrace();
}
return schema;
}
}