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

import java.util.ArrayList;
import java.util.List;

import org.eclipse.wst.common.contentmodel.CMElementDeclaration;
import org.eclipse.wst.common.contentmodel.CMGroup;
import org.eclipse.wst.common.contentmodel.CMNode;
import org.eclipse.wst.common.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.common.contentmodel.CMNode
		 * @param node org.eclipse.wst.common.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.common.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();
	}

	public CMNode getOriginNode() {
		return fGroup;
	}
}