/*******************************************************************************
 * Copyright (c) 2002, 2013 Object Factory Inc.
 * 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:
 *		Object Factory Inc. - Initial implementation
 *		IBM Corporation - fix for Bug 40951
 *******************************************************************************/
package org.eclipse.ant.internal.ui.dtd.schema;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.ant.internal.ui.dtd.IAttribute;
import org.eclipse.ant.internal.ui.dtd.IDfm;
import org.eclipse.ant.internal.ui.dtd.IElement;
import org.eclipse.ant.internal.ui.dtd.IModel;
import org.eclipse.ant.internal.ui.dtd.ParseError;

public class Element extends Atom implements IElement {
	private boolean fUndefined = true;
	private boolean fText;
	private IModel fModel;
	private Map<String, IAttribute> fMap = new HashMap<>(4);
	private Dfm fElementDfm;

	/**
	 * Constructor
	 * 
	 * @param name
	 *            QName of element.
	 */
	public Element(String name) {
		super(ELEMENT, name);
	}

	/**
	 * Set undefined property.
	 * 
	 * @param undefined
	 *            False if defined; otherwise true (default).
	 */
	public void setUndefined(boolean undefined) {
		fUndefined = undefined;
	}

	/**
	 * Set text property.
	 * 
	 * @param text
	 *            True if text only; otherwise false (default).
	 */
	public void setText(boolean text) {
		fText = text;
	}

	/**
	 * Set model property.
	 * 
	 * @param model
	 *            Dfm describing content model.
	 */
	public void setContentModel(IModel model) {
		fModel = model;
	}

	/**
	 * Add an attribute to the attribute map.
	 * 
	 * @param attribute
	 *            Attribute to add.
	 */
	public void addAttribute(IAttribute attribute) {
		fMap.put(attribute.getName(), attribute);
	}

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#getAttributes()
	 */
	@Override
	public Map<String, IAttribute> getAttributes() {
		return fMap;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#isMixed()
	 */
	@Override
	public IModel getContentModel() {
		return fModel;
	}

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#isText()
	 */
	@Override
	public boolean isText() {
		return fText;
	}

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#isUndefined()
	 */
	@Override
	public boolean isUndefined() {
		return fUndefined;
	}

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#getDfm()
	 */
	@Override
	public IDfm getDfm() {
		Dfm dfm = fElementDfm;
		if (dfm == null) {
			dfm = parseElementDfm();
			fElementDfm = dfm;
		}
		return dfm;
	}

	private Dfm parseElementDfm() {
		Dfm dfm;
		if (fAny) {
			dfm = Dfm.dfm(true);
			dfm.any = true;
		} else if (fEmpty || fText) {
			dfm = Dfm.dfm(true);
			dfm.empty = true;
		} else {
			dfm = parseModel(fModel);
		}
		return dfm;
	}

	private Dfm parseModel(IModel model) {
		Dfm dfm;
		Nfm nfm = model.toNfm();
		if (nfm != null) {
			try {
				dfm = fNfmParser.parse(nfm);
			}
			catch (ParseError e) {
				// ??? this would be the place to log the error
				dfm = Dfm.dfm(false);
			}
		} else {
			dfm = Dfm.dfm(false);
		}
		return dfm;
	}

	private static final NfmParser fNfmParser = new NfmParser();
	private boolean fAny;
	private boolean fEmpty;

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#isAny()
	 */
	@Override
	public boolean isAny() {
		return fAny;
	}

	/**
	 * @see org.eclipse.ant.internal.ui.dtd.IElement#isEmpty()
	 */
	@Override
	public boolean isEmpty() {
		return fEmpty;
	}

	/**
	 * Sets the any.
	 * 
	 * @param any
	 *            The any to set
	 */
	public void setAny(boolean any) {
		fAny = any;
	}

	/**
	 * Sets the empty.
	 * 
	 * @param empty
	 *            The empty to set
	 */
	public void setEmpty(boolean empty) {
		fEmpty = empty;
	}

}
