/** * Copyright (c) 2002-2006 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.ecore.util; import java.util.List; import java.util.ListIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.impl.EClassImpl; /** * A virtual list of all the cross references of an EObject. */ public class ECrossReferenceEList<E> extends EContentsEList<E> { public static final ECrossReferenceEList<?> EMPTY_CROSS_REFERENCE_ELIST = new ECrossReferenceEList<Object>(null, (EStructuralFeature [])null) { @Override public List<Object> basicList() { return this; } }; @SuppressWarnings("unchecked") public static <T> ECrossReferenceEList<T> emptyCrossReferenceEList() { return (ECrossReferenceEList<T>)EMPTY_CROSS_REFERENCE_ELIST; } public static <T> ECrossReferenceEList<T> createECrossReferenceEList(EObject eObject) { EStructuralFeature [] eStructuralFeatures = ((EClassImpl.FeatureSubsetSupplier)eObject.eClass().getEAllStructuralFeatures()).crossReferences(); return eStructuralFeatures == null ? ECrossReferenceEList.<T>emptyCrossReferenceEList() : new ECrossReferenceEList<T>(eObject, eStructuralFeatures); } public ECrossReferenceEList(EObject eObject) { super (eObject, ((EClassImpl.FeatureSubsetSupplier)eObject.eClass().getEAllStructuralFeatures()).crossReferences()); } protected ECrossReferenceEList(EObject eObject, EStructuralFeature [] eStructuralFeatures) { super(eObject, eStructuralFeatures); } public static class FeatureIteratorImpl<E> extends EContentsEList.FeatureIteratorImpl<E> { protected static final EStructuralFeature[] NO_FEATURES = new EStructuralFeature [0]; public FeatureIteratorImpl(EObject eObject) { this(eObject, ((EClassImpl.FeatureSubsetSupplier)eObject.eClass().getEAllStructuralFeatures()).crossReferences()); } public FeatureIteratorImpl(EObject eObject, EStructuralFeature [] eStructuralFeatures) { super(eObject, eStructuralFeatures == null ? NO_FEATURES : eStructuralFeatures); } @Override protected boolean isIncludedEntry(EStructuralFeature eStructuralFeature) { if (eStructuralFeature instanceof EReference) { EReference eReference = (EReference)eStructuralFeature; return !eReference.isContainment() && !eReference.isContainer(); } else { return false; } } } public static class ResolvingFeatureIteratorImpl<E> extends FeatureIteratorImpl<E> { public ResolvingFeatureIteratorImpl(EObject eObject) { super(eObject); } public ResolvingFeatureIteratorImpl(EObject eObject, EStructuralFeature [] eStructuralFeatures) { super(eObject, eStructuralFeatures); } @Override protected boolean resolve() { return true; } } @Override protected boolean isIncluded(EStructuralFeature eStructuralFeature) { if (FeatureMapUtil.isFeatureMap(eStructuralFeature)) { return true; } else { EReference eReference = (EReference)eStructuralFeature; return !eReference.isContainment() && !eReference.isContainer(); } } @Override protected boolean isIncludedEntry(EStructuralFeature eStructuralFeature) { if (eStructuralFeature instanceof EReference) { EReference eReference = (EReference)eStructuralFeature; return !eReference.isContainment() && !eReference.isContainer(); } else { return false; } } @Override protected ListIterator<E> newResolvingListIterator() { return new ResolvingFeatureIteratorImpl<E>(eObject, eStructuralFeatures); } @Override protected ListIterator<E> newNonResolvingListIterator() { return new FeatureIteratorImpl<E>(eObject, eStructuralFeatures); } @Override public List<E> basicList() { return new ECrossReferenceEList<E>(eObject, eStructuralFeatures) { @Override protected boolean resolve() { return false; } }; } }