001 package com.hammurapi.review.util;
002
003 import java.util.Iterator;
004
005 import org.eclipse.emf.common.util.TreeIterator;
006 import org.eclipse.emf.ecore.EObject;
007
008 import com.hammurapi.convert.AtomicConverterBase;
009 import com.hammurapi.convert.Converter;
010 import com.hammurapi.util.Context;
011
012 /**
013 * Converts EObject to iterable which includes the object itself into iteration.
014 * @author Pavel Vlasov
015 *
016 */
017 public class EObjectToIterableConverter extends AtomicConverterBase<EObject, Iterable<EObject>> {
018
019 @SuppressWarnings("unchecked")
020 public EObjectToIterableConverter() {
021 super(EObject.class, (Class<Iterable<EObject>>) (Class) Iterable.class);
022 }
023
024 @Override
025 public Iterable<EObject> convert(final EObject source, Converter master, Context context, ClassLoader classLoader) {
026 return new Iterable<EObject>() {
027 @Override
028 public Iterator<EObject> iterator() {
029 return new TreeIterator<EObject>() {
030 private TreeIterator<EObject> master;
031 private boolean pruned;
032
033 @Override
034 public void prune() {
035 if (master==null) {
036 pruned=true;
037 } else {
038 master.prune();
039 }
040 }
041
042 @Override
043 public boolean hasNext() {
044 return master==null ? !pruned : master.hasNext();
045 }
046
047 @Override
048 public EObject next() {
049 if (master==null) {
050 if (pruned) {
051 throw new IllegalStateException();
052 } else {
053 master = source.eAllContents();
054 return source;
055 }
056 }
057
058 return master.next();
059 }
060
061 @Override
062 public void remove() {
063 if (master==null) {
064 throw new IllegalStateException();
065 } else {
066 master.remove();
067 }
068 }
069
070 };
071 }
072
073 };
074 }
075
076 }