/* * Copyright (c) 2006 Borland Software Corporation * * 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: * Michael Golubev (Borland) - initial API and implementation */ package org.eclipse.uml2.diagram.parser; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyReferenceCommand; import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand; import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyReferenceRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest; public class BasicApplyStrategy implements ApplyStrategy { public List/*1.5 <ICommand>*/apply(EObject modelObject, EObject parsedObject) { List result = new LinkedList(); for (Iterator it = parsedObject.eClass().getEAllStructuralFeatures().iterator(); it.hasNext();) { EStructuralFeature next = (EStructuralFeature) it.next(); if (parsedObject.eIsSet(next) && !next.isDerived()) { transferValue(result, modelObject, parsedObject, next); } } return result.isEmpty() ? NOT_EXECUTABLE : result; } protected final void transferValue(List output, EObject model, EObject parsed, EStructuralFeature feature) { if (feature.isDerived() || !parsed.eIsSet(feature)) { return; } Object parsedValue = parsed.eGet(feature); Object actualValue = model.eGet(feature); if (safeEquals(parsedValue, actualValue)) { return; } //XXX: workaround for : #152080 //XXX: can not set multi-valued properties using SetValueCommand, //XXX: see https://bugs.eclipse.org/bugs/show_bug.cgi?id=152080 if (feature instanceof EReference && feature.isMany()) { transferValuesList(output, model, parsed, (EReference) feature); return; } SetRequest request = new SetRequest(model, feature, parsedValue); output.add(new SetValueCommand(request)); } private void transferValuesList(List output, EObject model, EObject parsed, EReference isManyReference) { assert isManyReference.isMany(); List<EObject> actualValues = (List<EObject>) model.eGet(isManyReference); List<EObject> parsedValues = (List<EObject>) parsed.eGet(isManyReference); for (EObject nextActual : actualValues) { DestroyReferenceRequest nextRequest = new DestroyReferenceRequest(model, isManyReference, nextActual, false); output.add(new DestroyReferenceCommand(nextRequest)); } for (EObject nextParsed : parsedValues) { SetRequest nextRequest = new SetRequest(model, isManyReference, nextParsed); output.add(new SetValueCommand(nextRequest)); } } protected static <T> boolean safeEquals(T o1, T o2) { return o1 == null ? o2 == null : o1.equals(o2); } }