/*******************************************************************************
 * 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.wst.html.core.modelquery;

import java.util.Iterator;

import org.eclipse.wst.common.contentmodel.CMDocument;
import org.eclipse.wst.common.contentmodel.CMElementDeclaration;
import org.eclipse.wst.common.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.common.contentmodel.CMNamespace;
import org.eclipse.wst.common.contentmodel.CMNode;
import org.eclipse.wst.html.core.contentmodel.HTMLCMDocumentFactory;
import org.eclipse.wst.html.core.contentmodel.ssi.SSICMDocumentFactory;
import org.eclipse.wst.sse.core.contentmodel.CMDocType;

/**
 */
class CMDocumentForBuddySystem extends CMNodeBuddySystem implements CMDocument {


	private static CMDocument getHTMLCMDocument() {
		return HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
	}

	class Elements extends CMNamedNodeMapForBuddySystem {
		public Elements(CMNamedNodeMap elements, boolean isXHTML) {
			super(isXHTML);
			makeBuddySystem(elements);
			addSSIDecls();
		}

		protected String getKeyName(CMNode original) {
			CMElementDeclaration edecl = getDecl(original);
			if (edecl == null)
				return null;
			return edecl.getElementName();
		}

		protected CMNode createBuddySystem(CMNode original) {
			CMElementDeclaration edecl = getDecl(original);
			return new CMElementDeclarationBuddySystem(edecl, isXHTML());
		}

		private CMElementDeclaration getDecl(CMNode cmnode) {
			if (cmnode == null)
				return null;
			if (cmnode.getNodeType() != CMNode.ELEMENT_DECLARATION)
				return null;
			return (CMElementDeclaration) cmnode;
		}

		private void addSSIDecls() {
			CMDocument ssi = SSICMDocumentFactory.getCMDocument();
			if (ssi == null)
				return;
			CMNamedNodeMap elements = ssi.getElements();
			Iterator i = elements.iterator();
			while (i.hasNext()) {
				CMElementDeclaration decl = (CMElementDeclaration) i.next();
				if (decl == null)
					continue;
				put(decl.getElementName(), decl);
			}
		}
	}

	private Elements elements = null;

	public CMDocumentForBuddySystem(CMDocument self, boolean isXHTML) {
		super(self, getHTMLCMDocument(), isXHTML);
	}

	/*
	 * @see CMDocument#getElements()
	 */
	public CMNamedNodeMap getElements() {
		if (elements != null)
			return elements;
		CMDocument cmdoc = getSelf();
		if (cmdoc == null)
			return null;
		elements = new Elements(cmdoc.getElements(), isXHTML);
		return elements;
	}

	/*
	 * @see CMDocument#getEntities()
	 */
	public CMNamedNodeMap getEntities() {
		CMDocument cmdoc = getSelf();
		if (cmdoc == null)
			return null;
		return cmdoc.getEntities();
	}

	/*
	 * @see CMDocument#getNamespace()
	 */
	public CMNamespace getNamespace() {
		CMDocument cmdoc = getSelf();
		if (cmdoc == null)
			return null;
		return cmdoc.getNamespace();
	}

	private CMDocument getSelf() {
		if (self.getNodeType() != CMNode.DOCUMENT)
			return null;
		return (CMDocument) self;
	}
}