/*******************************************************************************
 * 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.jsdt.web.core.internal.contentmodel;

import org.eclipse.wst.xml.core.internal.contentmodel.CMContent;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMGroup;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;

public class CMElementDeclarationWrapperImpl extends CMNodeWrapperImpl
		implements CMElementDeclaration {
	private CMContent fCMContent = null;

	protected CMElementDeclaration fElementDecl = null;

	/**
	 * CMElementDeclarationWrapper constructor comment.
	 * 
	 * @param prefix
	 *            java.lang.String
	 * @param node
	 *            org.eclipse.wst.xml.core.internal.contentmodel.CMNode
	 */
	public CMElementDeclarationWrapperImpl(String prefix,
			CMElementDeclaration node) {
		super(prefix, node);
		fElementDecl = node;
	}

	/**
	 * getAttributes method
	 * 
	 * @return CMNamedNodeMap
	 * 
	 * Returns CMNamedNodeMap of AttributeDeclaration
	 */
	public CMNamedNodeMap getAttributes() {
		return fElementDecl.getAttributes();
	}

	/**
	 * getCMContent method
	 * 
	 * @return CMContent
	 * 
	 * Returns the root node of this element's content model. This can be an
	 * CMElementDeclaration or a CMGroup
	 */
	public CMContent getContent() {
		if (fCMContent == null) {
			CMContent content = fElementDecl.getContent();
			if (content == null) {
				return null;
			}
			if (content instanceof CMGroup) {
				fCMContent = new CMGroupWrapperImpl(fPrefix, (CMGroup) content);
			} else {
				fCMContent = new CMContentWrapperImpl(fPrefix, content);
			}
		}
		return fCMContent;
	}

	/**
	 * getContentType method
	 * 
	 * @return int
	 * 
	 * Returns one of : ANY, EMPTY, ELEMENT, MIXED, PCDATA, CDATA.
	 */
	public int getContentType() {
		return fElementDecl.getContentType();
	}

	/**
	 * getDataType method
	 * 
	 * @return java.lang.String
	 */
	public CMDataType getDataType() {
		return fElementDecl.getDataType();
	}

	/**
	 * getElementName method
	 * 
	 * @return java.lang.String
	 */
	public String getElementName() {
		return getNodeName();
	}

	/**
	 * getLocalElements method
	 * 
	 * @return CMNamedNodeMap
	 * 
	 * Returns a list of locally defined elements.
	 */
	public CMNamedNodeMap getLocalElements() {
		return fElementDecl.getLocalElements();
	}

	/**
	 * getMaxOccur method
	 * 
	 * @return int
	 * 
	 * If -1, it's UNBOUNDED.
	 */
	public int getMaxOccur() {
		return fElementDecl.getMaxOccur();
	}

	/**
	 * getMinOccur method
	 * 
	 * @return int
	 * 
	 * If 0, it's OPTIONAL. If 1, it's REQUIRED.
	 */
	public int getMinOccur() {
		return fElementDecl.getMinOccur();
	}

	@Override
	public CMNode getOriginNode() {
		return fElementDecl;
	}
}