/*******************************************************************************
 * 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.domdocument;

import org.eclipse.wst.html.core.internal.document.DocumentStyleImpl;
import org.eclipse.wst.sse.core.internal.model.FactoryRegistry;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
import org.eclipse.wst.sse.ui.internal.IReleasable;
import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

public class DOMDocumentForJSP extends DocumentStyleImpl {

	/**
	 * 
	 */
	public DOMDocumentForJSP() {
		super();
	}

	/**
	 * Default behavior for getting an adapter.
	 * Overridden in case embedded type provides a different adapter
	 * we don't want to use a cached one.
	 */
	public INodeAdapter getAdapterFor(Object type) {

		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85484

		// just always create a new one for JSP
		// need to investigate if this is a performance hit...
		// seems to make HTML Validator (even) slower
		
		INodeAdapter oldAdapter = getExistingAdapter(type);
		if(oldAdapter != null) {
			if(oldAdapter instanceof IReleasable) {
				((IReleasable)oldAdapter).release();
			}
			removeAdapter(oldAdapter);
		}
		
		INodeAdapter result = null;
		
		// if we didn't find one in our list already,
		// let's create it
		FactoryRegistry reg = getFactoryRegistry();
		if (reg != null) {
			INodeAdapterFactory factory = reg.getFactoryFor(type);
			if (factory != null) {
				INodeAdapter newAdapter = factory.adapt(this);
				result = newAdapter;
			}
		}
		// We won't prevent null from being returned, but it would be
		// unusual.
		// It might be because Factory is not working correctly, or
		// not installed, so we'll allow warning message.
		if ((result == null) && (org.eclipse.wst.sse.core.internal.util.Debug.displayWarnings)) {
			System.out.println("Warning: no adapter was found or created for " + type); //$NON-NLS-1$
		}
		return result;
	}
	
	/**
	 * @param that
	 */
	protected DOMDocumentForJSP(DocumentImpl that) {
		super(that);
	}
	/**
	 * cloneNode method
	 * @return org.w3c.dom.Node
	 * @param deep boolean
	 */
	public Node cloneNode(boolean deep) {
		DOMDocumentForJSP cloned = new DOMDocumentForJSP(this);
		if (deep)
			cloned.importChildNodes(this, true);
		return cloned;
	}
	/**
	 * createElement method
	 * 
	 * @return org.w3c.dom.Element
	 * @param tagName
	 *            java.lang.String
	 */
	public Element createElement(String tagName) throws DOMException {
		checkTagNameValidity(tagName);

		ElementImplForJSP element = new ElementImplForJSP();
		element.setOwnerDocument(this);
		element.setTagName(tagName);
		return element;
	}
	/**
	 * createComment method
	 * 
	 * @return org.w3c.dom.Comment
	 * @param data
	 *            java.lang.String
	 */
	public Comment createComment(String data) {
		CommentImplForJSP comment = new CommentImplForJSP();
		comment.setOwnerDocument(this);
		if (data != null)
			comment.setData(data);
		return comment;
	}

	/**
	 * createAttribute method
	 * 
	 * @return org.w3c.dom.Attr
	 * @param name
	 *            java.lang.String
	 */
	public Attr createAttribute(String name) throws DOMException {
		AttrImplForJSP attr = new AttrImplForJSP();
		attr.setOwnerDocument(this);
		attr.setName(name);
		return attr;
	}

	/**
	 */
	public Attr createAttributeNS(String uri, String name) throws DOMException {
		AttrImplForJSP attr = new AttrImplForJSP();
		attr.setOwnerDocument(this);
		attr.setName(name);
		attr.setNamespaceURI(uri);
		return attr;
	}
	/**
	 * createTextNode method
	 * 
	 * @return org.w3c.dom.Text
	 * @param data
	 *            java.lang.String
	 */
	public Text createTextNode(String data) {
		TextImplForJSP text = new TextImplForJSP();
		text.setOwnerDocument(this);
		text.setData(data);
		return text;
	}
	protected void setModel(IDOMModel model) {
		super.setModel(model);
	}
}
