/******************************************************************************* * Copyright (c) 2004, 2005 Sybase, Inc. 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: * Sybase, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.jst.jsf.common.ui.internal.logging.Logger; import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver; import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2; import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext; import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory; import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin; 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.text.IStructuredDocument; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.w3c.dom.Document; import org.w3c.dom.NodeList; /** * This class is defined as a simple adapter to JSP DOM model. User can get the * taglib prefix, and get the needed element by element tage name, and * namespace(prefix) Usage: User should initialize this class instance before * using it. Following is a typical example: JSPDomAdapter jspAdapter = new * JSPDomAdapter(); IFile jspFile = * ResourcesPlugin.getWorkspace().getRoot().getFile(jspPath); if * (_jspAdapter.initialize(jspFile)) { //the prefix of JSF HTML TagLib String * prefix = _jspAdapter.getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB); } * * @author Xiao-guang Zhang */ public class JSPDomAdapter { /** log instance */ private static final Logger log = EditorPlugin .getLogger(JSPDomAdapter.class); /** JSP Taglib's tag name */ public static String JSP_TAGLIB_TAG = "jsp:directive.taglib"; //$NON-NLS-1$ /** JSF HTML TagLib name */ public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html"; //$NON-NLS-1$ /** singleton model manager */ private static IModelManager modelManager; /** source jsp file */ private IFile jspFile; /** Structured Model of JSP File */ private IStructuredModel model; /** Root Document (Node) of JSP file */ private Document document; /** * */ public JSPDomAdapter() { super(); } /** * initialize this adapter to get the StructuredModel for the input file. * At last user should call releaseModel() method to release the Structured Model. * * @param file - * JSP file * @return - True means sucessfully load jsp file. */ public boolean initialize(final IFile file) { jspFile = file; if (jspFile != null && jspFile.exists()) { try { model = getModel(jspFile); } catch (final IOException e) { // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to // get the structured model log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e); //$NON-NLS-1$ } catch (final CoreException e) { // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to // get the structured model log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e);//$NON-NLS-1$ } if (model != null && model instanceof IDOMModel) { return true; } } return false; } /** * get the prefix for the input taglib URI, e.g., * http://java.sun.com/jsf/html -> "h" * * @param taglibURI * @return the prefix */ public String getTagLibPrefix(final String taglibURI) { String prefix = null; final IStructuredDocument sdocument = model.getStructuredDocument(); if (sdocument != null) { IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(sdocument, -1); ITaglibContextResolver resolver = IStructuredDocumentContextResolverFactory2.INSTANCE.getTaglibContextResolverFromDelegates(context); prefix = resolver.getTagPrefixForURI(taglibURI); } return prefix; } /** * get the elements by the namespace and its tag name, e.g., h and * commandButton. * * @param namespace - * namespace for the taglib, e.g., h for * http://java.sun.com/jsf/html * @param elementName - * element Tag Name, e.g., h * @return - Element Node list. */ public List getElementsByTagNameNS(final String namespace, final String elementName) { List nodes = null; if (getDocument() != null) { NodeList listNodes = null; if (namespace != null) { listNodes = getDocument().getElementsByTagName( namespace + ":" + elementName); //$NON-NLS-1$ } else { listNodes = getDocument().getElementsByTagName(elementName); } if (listNodes != null && listNodes.getLength() > 0) { nodes = new ArrayList(); for (int i = 0; i < listNodes.getLength(); i++) { nodes.add(listNodes.item(i)); } } } return nodes; } /** * get the singleton model manager. * * @return */ private IModelManager getModelManager() { if (modelManager == null) { modelManager = StructuredModelManager.getModelManager(); } return modelManager; } /** * get the structured model for the JSP file * * @param file - * JSP File * @return - IStructuredModel * @throws IOException * @throws CoreException */ private IStructuredModel getModel(final IFile file) throws IOException, CoreException { return getModelManager().getModelForRead(file); } /** * get the root docuement for the StructuredModel * * @return */ private Document getDocument() { if (document == null) { if (model != null && model instanceof IDOMModel) { document = ((IDOMModel) model).getDocument(); } } return document; } /** * signal we are done with the model */ public void releaseModel() { if (model != null) { model.releaseFromRead(); } } }