/*******************************************************************************
 * Copyright (c) 2004, 2007 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.tld;



import java.util.Enumeration;

import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDAttributeDeclaration;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDataType;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;

public class CMAttributeDeclarationImpl implements TLDAttributeDeclaration {

	private CMDataType attrType = new CMDataTypeImpl(CMDataType.CDATA);
	private String fDescription;

	//
	private boolean fIsFragment = false;

	private CMDocument fOwnerDocument;
	// optional id
	private String id = null;

	// required name
	private String name = null;
	// optional "required" element present, defaults to not present
	private boolean required = false;

	// optional run-time (scriplet derived) value of attributes, defaults to
	// none/false
	private String rtexprvalue = null;

	private String type = null;

	/**
	 * CMAttributeDeclarationImpl constructor comment.
	 */
	public CMAttributeDeclarationImpl(CMDocument owner) {
		super();
		fOwnerDocument = owner;
	}

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

	/**
	 * getAttrType method
	 * 
	 * @return CMDataType
	 */
	public CMDataType getAttrType() {
		return attrType;
	}

	/**
	 * @deprecated in superclass
	 */
	public String getDefaultValue() {
		return ""; //$NON-NLS-1$
	}

	/**
	 * @return Returns the description.
	 */
	public String getDescription() {
		return fDescription;
	}

	/**
	 * @deprecated in superclass
	 */
	public Enumeration getEnumAttr() {
		return null;
	}

	/**
	 * 
	 * @return java.lang.String
	 */
	public String getId() {
		return id;
	}

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

	/**
	 * getNodeType method
	 * 
	 * @return int
	 * 
	 * Returns one of :
	 * 
	 */
	public int getNodeType() {
		return CMNode.ATTRIBUTE_DECLARATION;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.jsp.core.contentmodel.tld.TLDAttributeDeclaration#getOwnerDocument()
	 */
	public CMDocument getOwnerDocument() {
		return fOwnerDocument;
	}

	/**
	 * getProperty method
	 * 
	 * @return java.lang.Object
	 * 
	 * Returns the object property desciped by the propertyName
	 * 
	 */
	public Object getProperty(String propertyName) {
		if (propertyName != null && propertyName.equals(JSP12TLDNames.DESCRIPTION)) {
			return getDescription(); // return attribute description
		}
		else if (propertyName.equals(TLDDocument.CM_KIND)) {
			return TLDDocument.JSP_TLD;
		}
		else if (propertyName.equals(JSP12TLDNames.SMALL_ICON) || propertyName.equals(JSP12TLDNames.LARGE_ICON)) {
			return getOwnerDocument().getProperty(propertyName);
		}
		return null;
	}

	/**
	 * 
	 * @return java.lang.String
	 */
	public java.lang.String getRtexprvalue() {
		return rtexprvalue;
	}

	public String getType() {
		return type;
	}

	/**
	 * getUsage method
	 * 
	 * @return int OPTIONAL|REQUIRED
	 */
	public int getUsage() {
		return required ? REQUIRED : OPTIONAL;
	}

	/**
	 * @return Returns the isFragment.
	 */
	public boolean isFragment() {
		return fIsFragment;
	}

	/**
	 * 
	 * @return boolean
	 */
	public boolean isRequired() {
		return required;
	}

	/**
	 * @param description
	 *            The description to set.
	 */
	public void setDescription(String description) {
		fDescription = description;
	}

	/**
	 * @param isFragment
	 *            The isFragment to set.
	 */
	public void setFragment(boolean isFragment) {
		fIsFragment = isFragment;
	}

	/**
	 * 
	 * @param newId
	 *            java.lang.String
	 */
	public void setId(String newId) {
		id = newId;
	}

	public void setNodeName(String string) {
		name = string;
	}

	/**
	 * 
	 * @param newRequired
	 *            boolean
	 */
	public void setRequired(boolean newRequired) {
		required = newRequired;
	}

	/**
	 * 
	 * @param newRequired
	 *            boolean
	 */
	public void setRequiredString(String newRequired) {
		if (newRequired != null) {
			if (newRequired.equalsIgnoreCase(JSP12TLDNames.TRUE) || newRequired.equalsIgnoreCase(JSP12TLDNames.YES))
				setRequired(true);
			else if (newRequired.equalsIgnoreCase(JSP12TLDNames.FALSE) || newRequired.equalsIgnoreCase(JSP12TLDNames.NO))
				setRequired(false);
		}
	}

	/**
	 * 
	 * @param newRtexprvalue
	 *            java.lang.String
	 */
	public void setRtexprvalue(String newRtexprvalue) {
		rtexprvalue = newRtexprvalue;
	}

	public void setType(String type) {
		this.type = type;
	}

	/**
	 * supports method
	 * 
	 * @return boolean
	 * 
	 * Returns true if the CMNode supports a specified property
	 * 
	 */
	public boolean supports(String propertyName) {
		return propertyName == null || propertyName.equals(JSP12TLDNames.DESCRIPTION) || propertyName.equals(TLDDocument.CM_KIND) || propertyName.equals(JSP12TLDNames.SMALL_ICON) || propertyName.equals(JSP12TLDNames.LARGE_ICON);
	}

	public String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("\n\t " + super.toString()); //$NON-NLS-1$
		buffer.append("\n\t name:" + StringUtils.escape(getNodeName())); //$NON-NLS-1$
		// Boolean.toString(boolean) is introduced in 1.4
		// buffer.append("\n\t required:" +
		// StringUtils.escape(Boolean.toString(isRequired())));
		buffer.append("\n\t required:" + StringUtils.toString(isRequired())); //$NON-NLS-1$
		buffer.append("\n\t rtexpr:" + StringUtils.escape(getRtexprvalue())); //$NON-NLS-1$
		if (getId() != null)
			buffer.append("\n\t id:" + StringUtils.escape(getId())); //$NON-NLS-1$
		return buffer.toString();
	}
}
