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

import java.util.Iterator;
import java.util.Map;

import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;

/**
 * This command is for change an single attribute of an IDOMElement. Normally
 * used by the properties view.
 * 
 * @author mengbo
 */
public class ChangeAttributeCommand extends SingleNodeCommand {
	private IDOMElement _element;

	private String _attrValue;

	private String _attrName;

	private Map _attributes;

	private boolean _keepEmptyAttribute = false;

	/**
	 * 
	 * @param label
	 * @param node
	 * @param attrName
	 * @param attrValue
	 *            if null means remove the specified attribute
	 */
	public ChangeAttributeCommand(String label, IDOMElement node,
			String attrName, String attrValue) {
		super(label, node);
		_element = node;
		_attrName = attrName;
		_attrValue = attrValue;
		_attributes = null;
	}

	public ChangeAttributeCommand(String label, IDOMElement node, Map attributes) {
		super(label, node);
		_element = node;
		_attributes = attributes;
		_attrName = null;
		_attrValue = null;
	}

	protected void doExecute() {
		if (_attrName != null) {
			updateElement(_attrName, _attrValue);
		} else if (_attributes != null) {
			for (Iterator iterator = _attributes.keySet().iterator(); iterator
					.hasNext();) {
				String name = (String) iterator.next();
				String value = (String) _attributes.get(name);
				if (isSameValue(value, _element.getAttribute(name))) {
					continue;
				}
				updateElement(name, value);
			}
		}
	}

	private void updateElement(String name, String value) {
		if (_element.hasAttribute(name) && isEmptyString(value)
				&& !_keepEmptyAttribute) {
			_element.removeAttribute(name);
		}
		if (!isEmptyString(value) || _keepEmptyAttribute) {
			_element.setAttribute(name, value);
		}
	}

	private boolean isSameValue(String value1, String value2) {
		value1 = value1 == null ? "" : value1;
		value2 = value2 == null ? "" : value2;
		return value1.equals(value2);
	}

	private boolean isEmptyString(String str) {
		if (str == null || str.equals("")) {
			return true;
		}
        return false;
	}

	/**
	 * @return Returns the keepEmptyAttribute.
	 */
	public boolean isKeepEmptyAttribute() {
		return _keepEmptyAttribute;
	}

	/**
	 * @param keepEmptyAttribute
	 *            The keepEmptyAttribute to set.
	 */
	public void setKeepEmptyAttribute(boolean keepEmptyAttribute) {
		this._keepEmptyAttribute = keepEmptyAttribute;
	}
}
