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



/**
 * Factory of ComplexTypeDefinition.
 */
final class ComplexTypeDefinitionFactory {

	private static ComplexTypeDefinitionFactory instance = null;
	private java.util.Hashtable definitions = null;
	// constants for complex type name
	/** for ADDRESS. */
	public final static String CTYPE_ADDRESS = "CTYPE_ADDRESS";//$NON-NLS-1$
	/** CDATA content. No ComplexTypeDefinition instance shuld be created. */
	public final static String CTYPE_CDATA = "CTYPE_CDATA";//$NON-NLS-1$
	/** col group content. COL* */
	public final static String CTYPE_COLUMN_GROUP = "CTYPE_COLUMN_GROUP";//$NON-NLS-1$
	/** for DL. */
	public final static String CTYPE_DEFINITION_LIST = "CTYPE_DEFINITION_LIST";//$NON-NLS-1$
	/** for EMBED. */
	public final static String CTYPE_EMBED = "CTYPE_EMBED";//$NON-NLS-1$
	/** empty content. No ComplexTypeDefinition instance should be created. */
	public final static String CTYPE_EMPTY = "CTYPE_EMPTY";//$NON-NLS-1$
	/** for FIELDSET. */
	public final static String CTYPE_FIELDSET = "CTYPE_FIELDSET";//$NON-NLS-1$
	/** for FRAMESET. */
	public final static String CTYPE_FRAMESET = "CTYPE_FRAMESET";//$NON-NLS-1$
	/** flow content. (%flow;)* */
	public final static String CTYPE_FLOW_CONTAINER = "CTYPE_FLOW_CONTAINER";//$NON-NLS-1$
	/** html content. HEAD, (FRAMESET|BODY) */
	public final static String CTYPE_HTML = "CTYPE_HTML";//$NON-NLS-1$
	/** head content. TITLE & ISINDEX? & BASE? */
	public final static String CTYPE_HEAD = "CTYPE_HEAD";//$NON-NLS-1$
	/** inline content. (%inline;)* */
	public final static String CTYPE_INLINE_CONTAINER = "CTYPE_INLINE_CONTAINER";//$NON-NLS-1$
	/** list item container. (LI)+ */
	public final static String CTYPE_LI_CONTAINER = "CTYPE_LI_CONTAINER";//$NON-NLS-1$
	/** for MAP. */
	public final static String CTYPE_MAP = "CTYPE_MAP";//$NON-NLS-1$
	/** noframes content. */
	public final static String CTYPE_NOFRAMES_CONTENT = "CTYPE_NOFRAMES_CONTENT";//$NON-NLS-1$
	/** for OPTGROUP. */
	public final static String CTYPE_OPTION_CONTAINER = "CTYPE_OPTION_CONTAINER";//$NON-NLS-1$
	/** param container. For OBJECT/APPLET. */
	public final static String CTYPE_PARAM_CONTAINER = "CTYPE_PARAM_CONTAINER";//$NON-NLS-1$
	/** PCDATA content. No ComplexTypeDefinition instance shuld be created. */
	public final static String CTYPE_PCDATA = "CTYPE_PCDATA";//$NON-NLS-1$
	/** for SELECT. */
	public final static String CTYPE_SELECT = "CTYPE_SELECT";//$NON-NLS-1$
	/** table content. CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+ */
	public final static String CTYPE_TABLE = "CTYPE_TABLE";//$NON-NLS-1$
	/** table cell contaier. (TH|TD)+ */
	public final static String CTYPE_TCELL_CONTAINER = "CTYPE_TCELL_CONTAINER";//$NON-NLS-1$
	/** table record container. (TR)+ */
	public final static String CTYPE_TR_CONTAINER = "CTYPE_TR_CONTAINER";//$NON-NLS-1$

	/**
	 * ComplexTypeDefinitionFactory constructor comment.
	 */
	private ComplexTypeDefinitionFactory() {
		super();
		definitions = new java.util.Hashtable();
	}

	/**
	 * Factory method for ComplexTypeDefinition.
	 * Each instance created in this method must be registered into
	 * the map with its name.
	 * @param definitionName java.lang.String
	 * @param elementCollection ElementCollection
	 */
	public ComplexTypeDefinition createTypeDefinition(String definitionName, ElementCollection elementCollection) {
		if (definitions.containsKey(definitionName)) {
			return (ComplexTypeDefinition) definitions.get(definitionName);
		}

		ComplexTypeDefinition def = null;
		if (definitionName == CTYPE_ADDRESS) {
			def = new CtdAddress(elementCollection);

		}
		else if (definitionName == CTYPE_COLUMN_GROUP) {
			def = new CtdColumnGroup(elementCollection);

		}
		else if (definitionName == CTYPE_DEFINITION_LIST) {
			def = new CtdDl(elementCollection);

		}
		else if (definitionName == CTYPE_EMBED) {
			def = new CtdEmbed(elementCollection);

		}
		else if (definitionName == CTYPE_FIELDSET) {
			def = new CtdFieldset(elementCollection);

		}
		else if (definitionName == CTYPE_FLOW_CONTAINER) {
			def = new CtdFlowContainer(elementCollection);

		}
		else if (definitionName == CTYPE_FRAMESET) {
			def = new CtdFrameset(elementCollection);

		}
		else if (definitionName == CTYPE_HEAD) {
			def = new CtdHead(elementCollection);

		}
		else if (definitionName == CTYPE_HTML) {
			def = new CtdHtml(elementCollection);

		}
		else if (definitionName == CTYPE_INLINE_CONTAINER) {
			def = new CtdInlineContainer(elementCollection);

		}
		else if (definitionName == CTYPE_LI_CONTAINER) {
			def = new CtdLiContainer(elementCollection);

		}
		else if (definitionName == CTYPE_MAP) {
			def = new CtdMap(elementCollection);

		}
		else if (definitionName == CTYPE_NOFRAMES_CONTENT) {
			def = new CtdNoframesContent(elementCollection);

		}
		else if (definitionName == CTYPE_OPTION_CONTAINER) {
			def = new CtdOptionContainer(elementCollection);

		}
		else if (definitionName == CTYPE_PARAM_CONTAINER) {
			def = new CtdParamContainer(elementCollection);

		}
		else if (definitionName == CTYPE_SELECT) {
			def = new CtdSelect(elementCollection);

		}
		else if (definitionName == CTYPE_TABLE) {
			def = new CtdTable(elementCollection);

		}
		else if (definitionName == CTYPE_TCELL_CONTAINER) {
			def = new CtdTableCellContainer(elementCollection);

		}
		else if (definitionName == CTYPE_TR_CONTAINER) {
			def = new CtdTrContainer(elementCollection);

		}
		else {
			def = null;
		}
		if (def == null)
			return null; // fail to create.
		definitions.put(definitionName, def);
		return def;
	}

	/**
	 * For singleton.
	 */
	public synchronized static ComplexTypeDefinitionFactory getInstance() {
		if (instance != null)
			return instance;
		instance = new ComplexTypeDefinitionFactory();
		return instance;
	}
}