blob: d3f29d71fd20ce2ae126553157fa3f0a3e2b7d51 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 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.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.ssemodelquery.ModelQueryAdapter;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class JSPModelQueryImpl extends ModelQueryImpl {
protected IStructuredModel jspModel = null;
private HashMap embeddedModelQueries = new HashMap();
public JSPModelQueryImpl(IStructuredModel model, URIResolver resolver) {
super(new JSPModelQueryAssociationProvider());
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);
}
protected ModelQuery getEmbeddedModelQuery(Node node) {
ModelQuery emq = null;
if (node instanceof INodeNotifier) {
Node ownerNode = node.getOwnerDocument();
if (ownerNode == null) {
// then must be the document itself
ownerNode = node;
}
PageDirectiveAdapter typeadapter = (PageDirectiveAdapter) ((INodeNotifier) ownerNode).getAdapterFor(PageDirectiveAdapter.class);
if (typeadapter != null) {
String contentType = typeadapter.getContentType();
Object o = embeddedModelQueries.get(contentType);
if(o == null) {
ModelQueryAdapter embeddedAdapter = (ModelQueryAdapter) typeadapter.adapt((INodeNotifier) node, ModelQueryAdapter.class);
if (embeddedAdapter != null) {
// we will cache one model query per content type
emq = embeddedAdapter.getModelQuery();
embeddedModelQueries.put(contentType, emq);
}
}
else {
emq = (ModelQuery)o;
}
}
}
return emq;
}
/* (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;
}
}