[119084] Enable external schemas for HTML content model
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
index 53ac1d9..1241871 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryCMProvider.java
@@ -28,7 +28,13 @@
 
 /**
  * CMDocument provider for HTML and XHTML documents.
+ * 
+ * This added and/or made public specifically for experimentation. It will
+ * change as this functionality becomes API. See
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=119084
  */
+
+
 public class HTMLModelQueryCMProvider implements ModelQueryCMProvider {
 
 
@@ -45,8 +51,8 @@
 	}
 
 	/**
-	 * Returns the CMDocument that corresponds to the DOM Node.
-	 * or null if no CMDocument is appropriate for the DOM Node.
+	 * Returns the CMDocument that corresponds to the DOM Node. or null if no
+	 * CMDocument is appropriate for the DOM Node.
 	 */
 	public CMDocument getCorrespondingCMDocument(Node node) {
 		IDOMDocument owner = getOwnerXMLDocument(node);
@@ -62,7 +68,9 @@
 			return staticHTML;
 
 		pid = entry.getPublicId();
-		CMDocument dtdcm = xhtmlassoc.getXHTMLCMDocument(pid, entry.getSystemId());
+		String sid = entry.getSystemId();
+
+		CMDocument dtdcm = xhtmlassoc.getXHTMLCMDocument(pid, sid);
 		if (dtdcm == null) {
 			if (pid != null && pid.equals(HTMLDocumentTypeRegistry.CHTML_PUBLIC_ID)) {
 				return staticCHTML;
@@ -70,12 +78,13 @@
 			return staticHTML;
 		}
 
-		CMDocument buddycm = (CMDocument) buddyCache.get(pid);
+		String grammarURI = xhtmlassoc.getCachedGrammerURI();
+		CMDocument buddycm = (CMDocument) buddyCache.get(grammarURI);
 		if (buddycm != null)
 			return buddycm;
 
 		buddycm = new CMDocumentForBuddySystem(dtdcm, entry.isXMLType());
-		buddyCache.put(pid, buddycm);
+		buddyCache.put(grammarURI, buddycm);
 		return buddycm;
 	}
 
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
index 8786484..ad1d8d1 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/HTMLModelQueryImpl.java
@@ -21,19 +21,27 @@
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
 import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
+import org.eclipse.wst.xml.core.internal.modelquery.XMLModelQueryAssociationProvider;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
 import org.eclipse.wst.xml.core.internal.ssemodelquery.MovableModelQuery;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-
+/**
+ * This added and/or made public specifically for experimentation. It
+ * will change as this functionality becomes API. See
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=119084
+ */
+ 
 public class HTMLModelQueryImpl extends ModelQueryImpl implements MovableModelQuery {
 
 	protected CMDocumentCache fCache = null;
+	protected XMLModelQueryAssociationProvider xmlAssocProv = null;
 
 	public HTMLModelQueryImpl(CMDocumentCache cache, URIResolver idResolver) {
 		super(new HTMLModelQueryAssociationProvider(cache, idResolver));
 		fCache = cache;
+		xmlAssocProv = new XMLModelQueryAssociationProvider(cache, idResolver);
 	}
 
 	public List getAvailableContent(Element element, CMElementDeclaration ed, int includeOptions) {
@@ -137,4 +145,12 @@
 		return null;
 	}
 
+	public CMElementDeclaration getCMElementDeclaration(Element element) {
+		CMElementDeclaration result = super.getCMElementDeclaration(element);
+		if (null != result)
+			return result;
+		
+		return xmlAssocProv.getCMElementDeclaration(element);
+	}
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
index ac0278f..de50ef2 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/XHTMLAssociationProvider.java
@@ -116,4 +116,13 @@
 		}
 		return result;
 	}
+
+	/**
+	 * This added and/or made public specifically for experimentation. It
+	 * will change as this functionality becomes API. See
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=119084
+	 */
+	public String getCachedGrammerURI() {
+		return fCachedGrammerURI;
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelquery/XMLModelQueryAssociationProvider.java b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelquery/XMLModelQueryAssociationProvider.java
index fd3087f..da470ad 100644
--- a/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelquery/XMLModelQueryAssociationProvider.java
+++ b/bundles/org.eclipse.wst.xml.core/src/org/eclipse/wst/xml/core/internal/modelquery/XMLModelQueryAssociationProvider.java
@@ -21,8 +21,13 @@
 
 /**
  * XMLModelQueryAssociationProvider
+ * 
+ * This added and/or made public specifically for experimentation. It will
+ * change as this functionality becomes API. See
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=119084
+ * 
  */
-class XMLModelQueryAssociationProvider extends XMLAssociationProvider {
+public class XMLModelQueryAssociationProvider extends XMLAssociationProvider {
 
 	protected URIResolver idResolver;