package com.sap.runlet.abstractinterpreter.operationaltransformation; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EObject; import com.sap.runlet.abstractinterpreter.repository.RepositoryChange; public class ChangeList<LinkMetaObject extends EObject, LinkEndMetaObject extends EObject, MetaClass extends EObject, TypeUsage extends EObject, ClassUsage extends TypeUsage> implements Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage> { private List<Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>> changes; public ChangeList(Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>[] changes) { this.changes = Arrays.asList(changes); } public ChangeList() { this.changes = new ArrayList<Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>>(); } public void add(Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage> change) { changes.add(change); } @Override public int totalSize() { int result = 0; for (Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage> c : changes) { result += c.totalSize(); } return result; } @Override public Iterator<RepositoryChange<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>> iterator() { return new Iterator<RepositoryChange<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>>() { private Iterator<Change<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>> iteratorOverChanges = changes.iterator(); private Iterator<RepositoryChange<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage>> localIterator = null; @Override public boolean hasNext() { if (localIterator == null || !localIterator.hasNext()) { if (iteratorOverChanges.hasNext()) { localIterator = iteratorOverChanges.next().iterator(); return hasNext(); // try again } else { return false; } } else { return true; } } @Override public RepositoryChange<LinkMetaObject, LinkEndMetaObject, MetaClass, TypeUsage, ClassUsage> next() { if (localIterator == null || !localIterator.hasNext()) { localIterator = iteratorOverChanges.next().iterator(); return next(); } else { return localIterator.next(); } } @Override public void remove() { throw new UnsupportedOperationException("remove not supported"); } }; } @Override public String toString() { return changes.toString(); } }