package org.openntf.domino.graph2.impl; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import org.openntf.domino.big.NoteCoordinate; import com.tinkerpop.blueprints.Element; public class DElementIterable implements org.openntf.domino.graph2.DElementIterable, List<Element> { public static class DElementIterator implements org.openntf.domino.graph2.DElementIterable.DElementIterator { protected final DElementStore elementStore_; protected final List<NoteCoordinate> index_; protected ListIterator<NoteCoordinate> iterator_; public DElementIterator(final DElementStore store, final List<NoteCoordinate> index) { elementStore_ = store; index_ = index; } private ListIterator<NoteCoordinate> getIterator() { if (iterator_ == null) { iterator_ = index_.listIterator(); } return iterator_; } @Override public boolean hasNext() { return getIterator().hasNext(); } @Override public Element next() { Element result = null; NoteCoordinate nc = getIterator().next(); if (nc != null) { result = elementStore_.getElement(nc); } return result; } @Override public void remove() { getIterator().remove(); } @Override public void add(final Element e) { Object rawid = e.getId(); if (rawid instanceof String) { getIterator().add(NoteCoordinate.Utils.getNoteCoordinate((String) rawid)); } else if (rawid instanceof NoteCoordinate) { getIterator().add((NoteCoordinate) rawid); } else { throw new IllegalStateException("Cannot process an element with an id of type " + rawid.getClass().getName()); } } @Override public boolean hasPrevious() { return getIterator().hasPrevious(); } @Override public int nextIndex() { return getIterator().nextIndex(); } @Override public Element previous() { Element result = null; NoteCoordinate nc = getIterator().previous(); if (nc != null) { result = elementStore_.getElement(nc); } return result; } @Override public int previousIndex() { return getIterator().previousIndex(); } @Override public void set(final Element e) { Object rawid = e.getId(); if (rawid instanceof String) { getIterator().set(NoteCoordinate.Utils.getNoteCoordinate((String) rawid)); } else if (rawid instanceof NoteCoordinate) { getIterator().set((NoteCoordinate) rawid); } else { throw new IllegalStateException("Cannot process an element with an id of type " + rawid.getClass().getName()); } } } protected final List<NoteCoordinate> index_; protected final DElementStore store_; public DElementIterable(final DElementStore store, final List<NoteCoordinate> index) { store_ = store; index_ = index; } @Override public Iterator<Element> iterator() { return new DElementIterator(store_, index_); } @Override public boolean add(final Element e) { Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { return index_.add((NoteCoordinate) rawid); } return false; } @Override public void add(final int index, final Element element) { Object rawid = element.getId(); if (rawid instanceof NoteCoordinate) { index_.add(index, (NoteCoordinate) rawid); } } @Override public boolean addAll(final Collection<? extends Element> c) { List<NoteCoordinate> nclist = new ArrayList<NoteCoordinate>(); for (Element e : c) { Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { nclist.add((NoteCoordinate) rawid); } } return index_.addAll(nclist); } @Override public boolean addAll(final int index, final Collection<? extends Element> c) { List<NoteCoordinate> nclist = new ArrayList<NoteCoordinate>(); for (Element e : c) { Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { nclist.add((NoteCoordinate) rawid); } } return index_.addAll(index, nclist); } @Override public void clear() { index_.clear(); } @Override public boolean contains(final Object o) { if (o instanceof Element) { Object rawid = ((Element) o).getId(); if (rawid instanceof NoteCoordinate) { return index_.contains(rawid); } } return false; } @Override public boolean containsAll(final Collection<?> c) { List<NoteCoordinate> nclist = new ArrayList<NoteCoordinate>(); for (Object raw : c) { if (raw instanceof Element) { Element e = (Element) raw; Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { nclist.add((NoteCoordinate) rawid); } } } return index_.containsAll(nclist); } @Override public Element get(final int index) { return store_.getElement(index_.get(index)); } @Override public int indexOf(final Object o) { if (o instanceof Element) { Object rawid = ((Element) o).getId(); if (rawid instanceof NoteCoordinate) { return index_.indexOf(rawid); } } return 0; } @Override public boolean isEmpty() { return index_.isEmpty(); } @Override public int lastIndexOf(final Object o) { if (o instanceof Element) { Object rawid = ((Element) o).getId(); if (rawid instanceof NoteCoordinate) { return index_.lastIndexOf(rawid); } } return 0; } @Override public ListIterator<Element> listIterator() { return new DElementIterator(store_, index_); } @Override public ListIterator<Element> listIterator(final int index) { // TODO Auto-generated method stub return null; } @Override public Element remove(final int index) { Element result = store_.getElement(index_.remove(index)); return result; } @Override public boolean remove(final Object o) { if (o instanceof Element) { Object rawid = ((Element) o).getId(); if (rawid instanceof NoteCoordinate) { return index_.remove(rawid); } } return false; } @Override public boolean removeAll(final Collection<?> c) { List<NoteCoordinate> nclist = new ArrayList<NoteCoordinate>(); for (Object raw : c) { if (raw instanceof Element) { Element e = (Element) raw; Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { nclist.add((NoteCoordinate) rawid); } } } return index_.removeAll(nclist); } @Override public boolean retainAll(final Collection<?> c) { List<NoteCoordinate> nclist = new ArrayList<NoteCoordinate>(); for (Object raw : c) { if (raw instanceof Element) { Element e = (Element) raw; Object rawid = e.getId(); if (rawid instanceof NoteCoordinate) { nclist.add((NoteCoordinate) rawid); } } } return index_.retainAll(nclist); } @Override public Element set(final int index, final Element element) { Object rawid = element.getId(); if (rawid instanceof NoteCoordinate) { index_.set(index, (NoteCoordinate) rawid); } return element; } @Override public int size() { return index_.size(); } @Override public List<Element> subList(final int fromIndex, final int toIndex) { List<NoteCoordinate> subindex = index_.subList(fromIndex, toIndex); return new DElementIterable(store_, subindex); } @Override public Object[] toArray() { int size = index_.size(); Object[] result = new Object[size]; for (int i = 0; i < size; i++) { NoteCoordinate e = index_.get(i); result[i] = store_.getElement(e); } return result; } @Override public <T> T[] toArray(final T[] a) { System.err.println("ALERT: toArray is called on a DElementIterable with an argument of " + a.getClass().getName()); return null; } }