/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.meta;

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

import org.eclipse.jst.jsf.common.ui.internal.utils.StringUtil;

/**
 * @author mengbo
 */
public class AttributeDescriptor implements IAttributeDescriptor {
	private String _attributeName;

	private String _category;

	private String _valueType;

	private String _typeParameter;

	private String _labelString;

	private String _defaultValue;

	private String _description;

	private Map _parameterMap;

	private Map _options;

	private boolean _required;

	/**
	 * 
	 */
	public AttributeDescriptor() {
		super();
	}

	public AttributeDescriptor(String attrName) {
		this.setAttributeName(attrName);
	}

	public void setAttributeName(String attributeName) {
		this._attributeName = attributeName;
	}

	public void setCategory(String category) {
		this._category = category;
	}

	public void setValueType(String valueType) {
		this._valueType = valueType;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getAttributeName()
	 */
	public String getAttributeName() {
		return _attributeName;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getDescription()
	 */
	public String getDescription() {
		return _description;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getCategory()
	 */
	public String getCategory() {
		return _category;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getValueType()
	 */
	public String getValueType() {
		return _valueType;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getOptions()
	 */
	public Map getOptions() {
		return _options;
	}

	public void setDescription(String description) {
		_description = description;
	}

	public void setOptions(Map map, String defaultValue) {
		_options = map;
		_defaultValue = defaultValue;
	}

	/**
	 * @return Returns the typeParameter.
	 */
	public String getTypeParameter() {
		return _typeParameter;
	}

	/**
	 * @param typeParameter
	 *            The typeParameter to set.
	 */
	public void setTypeParameter(String typeParameter) {
		this._typeParameter = typeParameter;
		_parameterMap = null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getLabelString()
	 */
	public String getLabelString() {
		if (_labelString == null) {
			_labelString = StringUtil.splitVariable(getAttributeName());
		}
		return _labelString;
	}

	/**
	 * @param labelString
	 *            The labelString to set.
	 */
	public void setLabelString(String labelString) {
		this._labelString = labelString;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getParameterByName(java.lang.String)
	 */
	public String getParameterByName(String name) {
		if (_parameterMap == null) {
			parseParameter();
		}
		Object value = _parameterMap.get(name);
		return value == null ? "" : value.toString();
	}

	/**
	 * 
	 */
	private void parseParameter() {
		_parameterMap = new HashMap();
		if (_typeParameter == null) {
			return;
		}
		StringTokenizer tokenizer = new StringTokenizer(_typeParameter, "||");
		while (tokenizer.hasMoreTokens()) {
			String parameterEntry = tokenizer.nextToken();
			int index = parameterEntry.indexOf('=');
			if (index != -1) {
				_parameterMap.put(parameterEntry.substring(0, index),
						parameterEntry.substring(index + 1));
			}
		}
	}

	public String getDefaultValue() {
		return _defaultValue;
	}

	public void setDefaultValue(String value) {
		_defaultValue = value;
	}

	public boolean isRequired() {
		return _required;
	}

	public void setRequired(boolean required) {
		this._required = required;
	}
}
