/*******************************************************************************
 * 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.facesconfig.common.logging.Logger;
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.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";

	/** JSF HTML TagLib name */
	public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html";

	/** 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(IFile file) {
		jspFile = file;

		if (jspFile != null && jspFile.exists()) {
			try {
				model = getModel(jspFile);
			} catch (IOException e) {
				// PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
				// get the structured model
				log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e); //$NON-NLS-1$
			} catch (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
	 */
	public String getTagLibPrefix(String taglibURI) {
		String prefix = null;

		if (getDocument() != null) {
			prefix = JSPUtil.getPrefix((IDOMModel) model, 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(String namespace, 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); //$NON-NLS-1$
			}

			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(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;
	}
	
    
    public void releaseModel() {
		if (model != null) {
			model.releaseFromRead();
		}
	}
}
