blob: a60839602d62d767ee5d880d53224368718ccb49 [file] [log] [blame]
package org.eclipse.jpt.jaxb.core.internal;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jaxb.core.SchemaEntry;
import org.eclipse.jpt.jaxb.core.xsd.XsdSchema;
import org.eclipse.jpt.jaxb.core.xsd.XsdUtil;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.util.XSDResourceImpl;
public class SchemaEntryImpl
implements SchemaEntry {
private final String location;
private String namespace;
private XSDResourceImpl schemaResource;
private boolean unloaded = false;
private SchemaResourceAdapter schemaResourceAdapter;
SchemaEntryImpl(String location) {
this.location = location;
this.schemaResourceAdapter = new SchemaResourceAdapter();
refresh();
}
public String getLocation() {
return this.location;
}
public String getNamespace() {
return this.namespace;
}
public boolean isLoaded() {
return this.schemaResource != null;
}
public XsdSchema getXsdSchema(String namespace) {
if (this.unloaded) {
refresh();
this.unloaded = false;
}
if (! StringTools.stringsAreEqual(this.namespace, namespace)) {
return null;
}
if (this.schemaResource != null) {
return XsdUtil.getSchema(this.schemaResource.getSchema());
}
return null;
}
public void refresh() {
unload();
String resolvedUri = XsdUtil.getResolvedUri(this.location);
if (resolvedUri == null) {
return;
}
XSDSchema schema = XsdUtil.buildXSDModel(resolvedUri);
XSDResourceImpl schemaResource = (schema == null) ? null : (XSDResourceImpl) schema.eResource();
if (schemaResource != null) {
schemaResource.eAdapters().add(this.schemaResourceAdapter);
this.schemaResource = schemaResource;
String namespace = schema.getTargetNamespace();
this.namespace = (namespace == null) ? "" : namespace;
}
}
void unload() {
if (this.schemaResource != null) {
this.schemaResource.eAdapters().remove(this.schemaResourceAdapter);
}
this.unloaded = true;
this.schemaResource = null;
}
void dispose() {
if (this.schemaResource != null) {
this.schemaResource.eAdapters().remove(this.schemaResourceAdapter);
}
}
private class SchemaResourceAdapter
extends AdapterImpl {
@Override
public void notifyChanged(Notification msg) {
if (msg.getFeatureID(Resource.class) == Resource.RESOURCE__IS_LOADED
&& msg.getNewBooleanValue() == false) {
SchemaEntryImpl.this.unload();
}
}
}
}