/**
* Copyright (c) 2015 committers of YAKINDU 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.simulation.core.sruntime.util;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.ecore.util.EContentsEList;
public class CrossDocumentContentAdapter extends EContentAdapter {
public CrossDocumentContentAdapter() {
super();
}
/**
* By default, all cross document references are followed. Usually this is
* not a great idea so this class can be subclassed to customize.
*
* @param feature
* a cross document reference
* @return whether the adapter should follow it
*/
protected boolean shouldAdapt(EStructuralFeature feature) {
return true;
}
@Override
protected void setTarget(EObject target) {
super.setTarget(target);
for (EContentsEList.FeatureIterator<EObject> featureIterator = (EContentsEList.FeatureIterator<EObject>) target
.eCrossReferences().iterator(); featureIterator.hasNext();) {
Notifier notifier = featureIterator.next();
EStructuralFeature feature = featureIterator.feature();
if (shouldAdapt(feature)) {
addAdapter(notifier);
}
}
}
@Override
protected void unsetTarget(EObject target) {
super.unsetTarget(target);
for (EContentsEList.FeatureIterator<EObject> featureIterator = (EContentsEList.FeatureIterator<EObject>) target
.eCrossReferences().iterator(); featureIterator.hasNext();) {
Notifier notifier = featureIterator.next();
EStructuralFeature feature = featureIterator.feature();
if (shouldAdapt(feature)) {
removeAdapter(notifier);
}
}
}
@Override
protected void selfAdapt(Notification notification) {
super.selfAdapt(notification);
if (notification.getNotifier() instanceof EObject) {
Object feature = notification.getFeature();
if (feature instanceof EReference) {
EReference eReference = (EReference) feature;
if (!eReference.isContainment() && shouldAdapt(eReference)) {
handleContainment(notification);
}
}
}
}
}