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

import java.util.Iterator;

import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
import org.eclipse.wst.html.core.internal.contentmodel.ssi.SSICMDocumentFactory;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamespace;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.provisional.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;
	}
}