/*******************************************************************************
 * Copyright (c) 2005, 2009 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 implementation
 *******************************************************************************/
package org.eclipse.epf.library.edit.command;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;

import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.edit.util.MethodElementPropertyHelper;
import org.eclipse.epf.library.edit.util.MethodElementPropertyMgr;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodElementProperty;
import org.eclipse.epf.uma.UmaPackage;

public class MethodElementSetPropertyCommand extends AbstractCommand implements
		IResourceAwareCommand {
	
	protected MethodElement element;
	protected String key;
	protected String value;
	protected String oldValue;
	protected Collection<Resource> modifiedResources;
	
	public MethodElementSetPropertyCommand(MethodElement element, String key, String value) {
		this.element = element;
		this.key = key;
		this.value = value;
	}

	protected boolean prepare() {
		// check if this operation will modify the element in opposite feature
		// value
		//
		return UserInteractionHelper.checkModifyOpposite(element, UmaPackage.Literals.METHOD_ELEMENT__METHOD_ELEMENT_PROPERTY,
				element);
	}

	public Collection<Resource> getModifiedResources() {
		if (element != null && element.eResource() != null
				&& modifiedResources == null) {
			modifiedResources = new HashSet<Resource>();
			modifiedResources.add(element.eResource());
		}
		
		if (modifiedResources == null) {
			return Collections.emptyList();
		}
		return modifiedResources;
	}

	public void execute() {
		redo();
	}

	public void redo() {
		MethodElementProperty oldProperty = MethodElementPropertyMgr.getInstance().getProperty(element, key);
		if (oldProperty != null) {
			oldValue = oldProperty.getValue();
		} else {
			oldValue = null;
		}
		MethodElementPropertyMgr.getInstance().setProperty(element, key, value);

	}
	
	@Override
	public void undo() {
		if (oldValue != null) {
			MethodElementPropertyHelper.setProperty(element, key, oldValue);
		} else {
			MethodElementPropertyHelper.removeProperty(element, key);
		}
	}

}
