/******************************************************************************* * Copyright (c) 2006 Oracle Corporation. * 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: * Cameron Bateman/Oracle - initial API and implementation * ********************************************************************************/ package org.eclipse.jst.jsf.context.resolver.structureddocument.internal.impl; import org.eclipse.wst.sse.core.StructuredModelManager; import org.eclipse.wst.sse.core.internal.provisional.IModelManager; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; /** * @author cbateman * * Defines common utility methods for document resolvers */ final class StructuredDocumentResolverUtil { static IDOMDocument getDOMDocument(IStructuredDocument document) { IStructuredModel model = getStructuredModel(document); try { if (model instanceof IDOMModel) { return ((IDOMModel)model).getDocument(); } } finally { if (model != null) { model.releaseFromRead(); } } return null; } static IndexedRegion getIndexedRegion(final IStructuredDocument document, final int documentOffset) { // C.B: most of this logic was copied from ContentAssistUtils.getNodeAt // I chose to copy rather than just call that because ContentAssistUtils is // internal IStructuredModel model = getStructuredModel(document); IndexedRegion region = null; if (model != null) { try { int lastOffset = documentOffset; region = model.getIndexedRegion(documentOffset); while (region == null && lastOffset >= 0) { lastOffset--; region = model.getIndexedRegion(lastOffset); } // now we assume we have an element. But our context may be // on an attribute in that node, so we need to check if (region instanceof IDOMElement) { IDOMElement domElement = (IDOMElement) region; NamedNodeMap attributes = domElement.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { Node attrNode = attributes.item(i); if (attrNode instanceof IDOMAttr) { IDOMAttr attr = (IDOMAttr) attrNode; if (documentOffset >= attr.getStartOffset() && documentOffset < attr.getEndOffset()) { region = attr; break; } } } } } finally { model.releaseFromRead(); } } return region; } /** * @param document * @return a structured model or null if one cannot be opened for document. * Note: the caller is responsible for releasing the instance of structured * model that gets returned. */ private static IStructuredModel getStructuredModel(IStructuredDocument document) { IModelManager modelManager = StructuredModelManager.getModelManager(); if (modelManager != null) { return StructuredModelManager.getModelManager().getModelForRead(document); } return null; } }