/**
* Copyright (c) 2007 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 - Initial API and implementation
*/
package org.eclipse.emf.test.core.change;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.change.FeatureChange;
import org.eclipse.emf.ecore.change.ResourceChange;
import org.eclipse.emf.ecore.change.util.BasicChangeRecorder;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.InternalEList;
/**
* Implementation of the {@link BasicChangeRecorder} that provides methods
* to describe changes on objects.
* @since 2.3
*/
public class ChangeDescriptionBuilder extends BasicChangeRecorder
{
public ChangeDescriptionBuilder()
{
super();
setChangeDescription(createChangeDescription());
setRecording(true);
}
public void recordUnsetFeature(EObject eObject, EStructuralFeature feature)
{
recordFeature(eObject, feature, null, false);
}
public void recordSetFeature(EObject eObject, EStructuralFeature feature, Object value)
{
recordFeature(eObject, feature, value, true);
}
protected void recordFeature(EObject eObject, EStructuralFeature feature, Object value, boolean isSet)
{
if (shouldRecord(feature, eObject))
{
List<FeatureChange> changes = getFeatureChanges(eObject);
FeatureChange change = getFeatureChange(changes, feature);
if (change == null)
{
if (feature.isMany() && !(value instanceof EList<?>))
{
if (value instanceof Collection<?>)
{
value = new BasicEList<Object>((Collection<?>)value);
}
else
{
EList<Object> list = new BasicEList<Object>();
list.add(value);
value = list;
}
}
change = createFeatureChange(eObject, feature, value, isSet);
((InternalEList<FeatureChange>)getFeatureChanges(eObject)).addUnique(change);
}
}
}
public void recordResourceContents(Resource resource, List<? extends EObject> contents)
{
if (isRecording())
{
ResourceChange change = getResourceChange(resource);
if (change == null)
{
@SuppressWarnings("unchecked") EList<Object> oldValue = contents == null ?
new BasicEList<Object>(0) :
contents instanceof EList<?> ?
(EList<Object>)(EList<?>)contents :
new BasicEList<Object>(contents);
change = createResourceChange(resource, oldValue);
getResourceChanges().add(change);
}
}
}
}