/*******************************************************************************
 * 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 java.util.ArrayList;
import java.util.List;

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.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNodeList;

public class CMGroupWrapperImpl extends CMContentWrapperImpl implements CMGroup {
	class CMNodeListImpl implements CMNodeList {
		private List nodes = null;

		/**
		 * CMNodeListImpl constructor comment.
		 */
		public CMNodeListImpl() {
			super();
			nodes = new ArrayList();
		}

		/**
		 * @return org.eclipse.wst.xml.core.internal.contentmodel.CMNode
		 * @param node
		 *            org.eclipse.wst.xml.core.internal.contentmodel.CMNode
		 */
		public void appendItem(CMNode node) {
			nodes.add(node);
		}

		/**
		 * getLength method
		 * 
		 * @return int
		 */
		public int getLength() {
			return nodes.size();
		}

		/**
		 * item method
		 * 
		 * @return CMNode
		 * @param index
		 *            int
		 */
		public CMNode item(int index) {
			if (index < 0 || index >= nodes.size()) {
				return null;
			}
			return (CMNode) nodes.get(index);
		}
	}

	private CMNodeList fChildNodes = null;
	private CMGroup fGroup = null;

	/**
	 * CMGroupWrapper constructor comment.
	 * 
	 * @param prefix
	 *            java.lang.String
	 * @param node
	 *            org.eclipse.wst.xml.core.internal.contentmodel.CMContent
	 */
	public CMGroupWrapperImpl(String prefix, CMGroup node) {
		super(prefix, node);
	}

	/**
	 * getChildNodes method
	 * 
	 * @return CMNodeList
	 * 
	 * Returns child CMNodeList, which includes ElementDefinition or CMElement.
	 */
	public CMNodeList getChildNodes() {
		if (fChildNodes == null) {
			CMNodeListImpl childNodes = new CMNodeListImpl();
			CMNodeList children = fGroup.getChildNodes();
			for (int i = 0; i < children.getLength(); i++) {
				CMNode child = children.item(i);
				if (child instanceof CMGroup) {
					childNodes.appendItem(new CMGroupWrapperImpl(fPrefix,
							(CMGroup) child));
				} else if (child instanceof CMElementDeclaration) {
					childNodes.appendItem(new CMElementDeclarationWrapperImpl(
							fPrefix, (CMElementDeclaration) child));
				} else {
					// error?
					childNodes
							.appendItem(new CMNodeWrapperImpl(fPrefix, child));
				}
			}
			fChildNodes = childNodes;
		}
		return fChildNodes;
	}

	/**
	 * getOperation method
	 * 
	 * @return int
	 * 
	 * Returns one of : ALONE (a), SEQUENCE (a,b), CHOICE (a|b), ALL (a&b).
	 */
	public int getOperator() {
		return fGroup.getOperator();
	}

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