blob: 18ee57592e8a943975c2df2e89e912fc4151ab78 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 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.jst.jsp.core.internal.modelquery;
import java.util.HashMap;
import java.util.List;
import org.eclipse.jst.jsp.core.internal.document.PageDirectiveAdapter;
import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeFamilyForHTML;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.SimpleAssociationProvider;
import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class JSPModelQueryImpl extends ModelQueryImpl {
// ISSUE: jspModel doesn't seem used?
protected IStructuredModel jspModel = null;
private HashMap embeddedModelQueries = new HashMap();
public JSPModelQueryImpl(IStructuredModel model, URIResolver resolver) {
super(new SimpleAssociationProvider(new JSPModelQueryCMProvider()));
jspModel = model;
}
/*
* @see ModelQuery#getCMElementDeclaration(Element)
*/
public CMElementDeclaration getCMElementDeclaration(Element element) {
CMElementDeclaration result = super.getCMElementDeclaration(element);
if (result == null) {
ModelQuery query = getEmbeddedModelQuery(element);
if (query != null) {
result = query.getCMElementDeclaration(element);
}
}
return result;
}
/*
* @see ModelQuery#getCorrespondingCMDocument(Node)
*/
public CMDocument getCorrespondingCMDocument(Node node) {
CMDocument doc = super.getCorrespondingCMDocument(node);
if (doc == null) {
ModelQuery query = getEmbeddedModelQuery(node);
if (query != null) {
doc = query.getCorrespondingCMDocument(node);
}
}
return doc;
}
/*
* @see ModelQuery#getCMNode(Node)
*/
public CMNode getCMNode(Node node) {
CMNode result = super.getCMNode(node);
if (result == null) {
ModelQuery query = getEmbeddedModelQuery(node);
if (query != null) {
result = query.getCMNode(node);
}
}
return result;
}
public List getAvailableContent(Element element, CMElementDeclaration ed, int includeOptions) {
ModelQuery emq = getEmbeddedModelQuery(element);
if (emq != null)
return emq.getAvailableContent(element, ed, includeOptions);
else
return super.getAvailableContent(element, ed, includeOptions);
}
// ISSUE: shouldn't this be private?
protected ModelQuery getEmbeddedModelQuery(Node node) {
ModelQuery embeddedModelQuery = null;
if (node instanceof INodeNotifier) {
Node ownerNode = node.getOwnerDocument();
if (ownerNode == null) {
// then must be the document itself
ownerNode = node;
}
PageDirectiveAdapter pageDirectiveAdapter = (PageDirectiveAdapter) ((INodeNotifier) ownerNode).getAdapterFor(PageDirectiveAdapter.class);
if (pageDirectiveAdapter != null) {
String effectiveContentType = null;
ModelQuery potentialModelQueryObject = null;
String familyId = pageDirectiveAdapter.getEmbeddedType().getFamilyId();
if (ContentTypeFamilyForHTML.HTML_FAMILY.equals(familyId)) {
effectiveContentType = "text/html";
}
else {
effectiveContentType = pageDirectiveAdapter.getContentType();
}
potentialModelQueryObject = (ModelQuery) embeddedModelQueries.get(effectiveContentType);
if (potentialModelQueryObject == null) {
ModelQueryAdapter embeddedAdapter = (ModelQueryAdapter) pageDirectiveAdapter.adapt((INodeNotifier) node, ModelQueryAdapter.class);
if (embeddedAdapter != null) {
// we will cache one model query per content type
embeddedModelQuery = embeddedAdapter.getModelQuery();
embeddedModelQueries.put(effectiveContentType, embeddedModelQuery);
}
}
else {
embeddedModelQuery = potentialModelQueryObject;
}
}
}
return embeddedModelQuery;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery#getCMAttributeDeclaration(org.w3c.dom.Attr)
*/
public CMAttributeDeclaration getCMAttributeDeclaration(Attr attr) {
CMAttributeDeclaration result = super.getCMAttributeDeclaration(attr);
if (result == null) {
ModelQuery query = getEmbeddedModelQuery(attr);
if (query != null) {
result = query.getCMAttributeDeclaration(attr);
}
}
return result;
}
/**
* NOT API -- this is provided, and is public, only to make some JUnit testing
* more straightforward. It will be changed in future, and from release to release.
*
* @param node
* @return
*/
public ModelQuery internalTestOnly_getEmbeddedModelQuery(Node node) {
return getEmbeddedModelQuery(node);
}
}