Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 365628

Summary: [EMF Compare] ReferenceOrderChangeMerger creates invalid values
Product: [Modeling] EMFCompare Reporter: Alex Lagarde <alex.lagarde>
Component: CoreAssignee: EMF Compare <emf.compare-inbox>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: 1.3   
Target Milestone: ---   
Hardware: PC   
OS: Windows 7   
Whiteboard:

Description Alex Lagarde CLA 2011-12-05 11:27:28 EST
When merging changes, the org.eclipse.emf.compare.diff.internal.merge.impl.ReferenceOrderChangeMerger computes the new value to set (which is a collection) using Google collections (in the doUndoInTarget() and doApplyInOrigin() methods).

But when calling EFactory.eSet with this value, this may cause a class cast exception, as if the DelegatingEcoreEList.set(Object newValue) method is called, it casts the new value as a list (although the ReferenceORderChangeMerger created a com.google.common.collect.Collections2$FilteredCollection).

Issue can be easilly resolved by creating a list out of the filtered collection (for example with Lists.newArrayList(Collections2.filter(...)).

Caused by: java.lang.ClassCastException: com.google.common.collect.Collections2$FilteredCollection cannot be cast to java.util.List
	at org.eclipse.emf.ecore.util.DelegatingEcoreEList.set(DelegatingEcoreEList.java:564)
	at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl$InternalSettingDelegateMany.dynamicSet(EStructuralFeatureImpl.java:1734)
	at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eDynamicSet(BasicEObjectImpl.java:1137)
	at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eSet(BasicEObjectImpl.java:1111)
	at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eSet(BasicEObjectImpl.java:1081)
	at org.eclipse.emf.compare.util.EFactory.eSet(EFactory.java:335)
	at org.eclipse.emf.compare.diff.internal.merge.impl.ReferenceOrderChangeMerger.doUndoInTarget(ReferenceOrderChangeMerger.java:76)
	at org.eclipse.emf.compare.diff.merge.DefaultMerger.undoInTarget(DefaultMerger.java:174)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.doMerge(MergeService.java:176)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.merge(MergeService.java:140)
	at org.eclipse.emf.compare.diff.internal.merge.impl.DiffGroupMerger.undoInTarget(DiffGroupMerger.java:47)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.doMerge(MergeService.java:176)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.merge(MergeService.java:140)
	at org.eclipse.emf.compare.diff.internal.merge.impl.DiffGroupMerger.undoInTarget(DiffGroupMerger.java:47)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.doMerge(MergeService.java:176)
	at org.eclipse.emf.compare.diff.merge.service.MergeService.merge(MergeService.java:140)
Comment 1 Cedric Brun CLA 2011-12-12 05:08:26 EST
Fixed in commit c308a0e015525ed83903914dafb6a0b1c50f544d
Comment 2 Laurent Goubet CLA 2013-01-17 08:32:09 EST
batch-closing a bunch of "RESOLVED" bugs.