/******************************************************************************* 
 * Copyright (c) 2007 Red Hat, Inc. 
 * Distributed under license by Red Hat, Inc. All rights reserved. 
 * This program is 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: 
 * Red Hat, Inc. - initial API and implementation 
 ******************************************************************************/ 
package org.jboss.tools.seam.internal.core;

import java.util.List;
import java.util.Properties;

import org.jboss.tools.common.model.project.ext.event.Change;
import org.jboss.tools.common.xml.XMLUtilities;
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.event.ISeamValueMapEntry;
import org.jboss.tools.seam.core.event.ISeamValueString;
import org.w3c.dom.Element;

/**
 * @author Viacheslav Kabanovich
 */
public class SeamValueMapEntry extends SeamObject implements ISeamValueMapEntry {
	SeamValueString key;
	SeamValueString value;
	
	public SeamValueMapEntry() {}

	public ISeamValueString getKey() {
		return key;
	}

	public ISeamValueString getValue() {
		return value;
	}
	
	public void setKey(SeamValueString key) {
		this.key = key;
		adopt(key);
	}

	public void setValue(SeamValueString value) {
		this.value = value;
		adopt(value);
	}

	@Override
	public List<Change> merge(ISeamElement s) {
		List<Change> changes = super.merge(s);
		
		SeamValueMapEntry e = (SeamValueMapEntry)s;
		
		List<Change> keyChanges = key.merge(e.key);
		if(keyChanges != null && !keyChanges.isEmpty()) {
			Change keyChange = new Change(this, "key", key, key); //$NON-NLS-1$
			keyChange.addChildren(keyChanges);
			changes = Change.addChange(changes, keyChange);
		}
		
		List<Change> valueChanges = value.merge(e.value);
		if(valueChanges != null && !valueChanges.isEmpty()) {
			Change valueChange = new Change(this, "value", value, value); //$NON-NLS-1$
			valueChange.addChildren(valueChanges);
			changes = Change.addChange(changes, valueChange);
		}

		return changes;
	}

	public SeamValueMapEntry clone() throws CloneNotSupportedException {
		SeamValueMapEntry c = (SeamValueMapEntry)super.clone();
		c.key = key == null ? null : key.clone();
		c.value = value == null ? null : value.clone();
		return c;
	}

	public String getXMLName() {
		return TAG_ENTRY;
	}
	
	public String getXMLClass() {
		return null;
	}
	
	static String TAG_ENTRY = "entry";
	static String TAG_KEY = "key";
	static String TAG_VALUE = "value";

	public Element toXML(Element parent, Properties context) {
		Element element = super.toXML(parent, context);
		if(key != null) {
			Element e_key = XMLUtilities.createElement(element, TAG_KEY);
			key.toXML(e_key, context);
		}
		if(value != null) {
			value.toXML(element, context);
		}

		return element;
	}
	
	public void loadXML(Element element, Properties context) {
		super.loadXML(element, context);
		Element c = XMLUtilities.getUniqueChild(element, SeamXMLConstants.TAG_VALUE);
		if(c != null) {
			value = new SeamValueString();
			value.loadXML(c, context);
			adopt(value);
		}
		c = XMLUtilities.getUniqueChild(element, TAG_KEY);
		if(c != null) {
			c = XMLUtilities.getUniqueChild(c, SeamXMLConstants.TAG_VALUE);
			if(c != null) {
				key = new SeamValueString();
				key.toXML(c, context);
				adopt(key);
			}
		}
	}

}
