package org.dresdenocl.standardlibrary.java.internal.library; import java.util.Iterator; import org.dresdenocl.essentialocl.EssentialOclPlugin; import org.dresdenocl.essentialocl.standardlibrary.OclAny; import org.dresdenocl.essentialocl.standardlibrary.OclBoolean; import org.dresdenocl.essentialocl.standardlibrary.OclCollection; import org.dresdenocl.essentialocl.standardlibrary.OclIterator; import org.dresdenocl.modelinstancetype.types.IModelInstanceElement; import org.dresdenocl.pivotmodel.Type; import org.dresdenocl.standardlibrary.java.factory.JavaStandardLibraryFactory; /** * * @author Michael Thiele * * @param <T> * the type of the collection */ public class JavaOclIterator<T extends OclAny> implements OclIterator<T> { protected Iterator<IModelInstanceElement> iterator; protected Throwable invalidReason; protected Type genericType; public JavaOclIterator(OclCollection<? extends OclAny> collection) { if (collection.oclIsInvalid().isTrue()) invalidReason = collection.getInvalidReason(); else if (collection.oclIsUndefined().isTrue()) invalidReason = new RuntimeException( "Iterator on undefined collection."); else this.iterator = collection.getModelInstanceCollection() .getCollection().iterator(); this.genericType = collection.getGenericType(); } /* * (non-Javadoc) * * @see * org.dresdenocl.essentialocl.standardlibrary.OclIterator#hasNext() */ public OclBoolean hasNext() { if (invalidReason != null) return JavaStandardLibraryFactory.INSTANCE.createOclInvalid( EssentialOclPlugin.getOclLibraryProvider().getOclLibrary().getOclBoolean(), invalidReason); return JavaStandardLibraryFactory.INSTANCE.createOclBoolean(iterator .hasNext()); } /* * (non-Javadoc) * * @see * org.dresdenocl.essentialocl.standardlibrary.OclIterator#next() */ @SuppressWarnings("unchecked") public T next() { if (invalidReason != null) return JavaStandardLibraryFactory.INSTANCE.createOclInvalid( genericType, invalidReason); IModelInstanceElement imiElement = iterator.next(); return (T) JavaStandardLibraryFactory.INSTANCE.createOclAny(imiElement); } }