/**
*
*/
package org.openntf.domino.iterators;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Set;
import java.util.Vector;
import java.util.logging.Logger;
import org.openntf.domino.Document;
import org.openntf.domino.Item;
import org.openntf.domino.exceptions.UnimplementedException;
import org.openntf.domino.utils.DominoUtils;
/**
* @author nfreeman
*
*/
public class ItemVector extends Vector<Item> {
@SuppressWarnings("unused")
private static final Logger log_ = Logger.getLogger(ItemVector.class.getName());
private static final long serialVersionUID = 1L;
private Document doc_;
private final List<String> itemNames_ = new ArrayList<String>();
private int size_ = 0;
/**
*
*/
public ItemVector(final Document doc) {
super();
doc_ = doc;
initialize();
}
private ItemVector(final Document doc, final boolean initialize) {
super();
doc_ = doc;
if (initialize)
initialize();
}
private void initialize() {
try {
Set<String> keys = doc_.keySet();
if (!keys.isEmpty()) {
for (String key : doc_.keySet()) {
itemNames_.add(key);
}
size_ = itemNames_.size();
}
// boolean convertMime = session.isConvertMIME();
// session.setConvertMIME(false);
// java.util.Vector<?> lotusItems = doc_.getDelegate().getItems();
// if (!lotusItems.isEmpty()) {
// String lastName = null;
// for (Object o : lotusItems) {
// String name = null;
// if (o instanceof lotus.domino.Item) {
// try {
// name = ((lotus.domino.Item) o).getName();
// itemNames_.add(name);
// lastName = name;
// } catch (NotesException ne1) {
// log_.log(Level.WARNING, "Problem iterating over item following " + String.valueOf(lastName) + ". Skipping...");
// }
// } else {
// log_.log(Level.WARNING, "Object from Document.getItems() Vector is not an Item. It is a "
// + (o == null ? "null" : o.getClass().getName()));
// }
// }
// size_ = itemNames_.size();
// }
// session.setConvertMIME(convertMime);
} catch (Exception ne) {
DominoUtils.handleException(ne);
}
}
@Override
public boolean add(final Item arg0) {
size_++;
return itemNames_.add(arg0.getName());
}
public boolean add(final String arg0) {
size_++;
return itemNames_.add(arg0);
}
@Override
public void add(final int arg0, final Item arg1) {
size_++;
itemNames_.add(arg0, arg1.getName());
}
@Override
public boolean addAll(final Collection<? extends Item> arg0) {
List<String> names = new ArrayList<String>();
for (Item i : arg0) {
names.add(i.getName());
}
return itemNames_.addAll(names);
}
protected boolean addAllStrings(final Collection<? extends String> arg0) {
return itemNames_.addAll(arg0);
}
@Override
public boolean addAll(final int arg0, final Collection<? extends Item> arg1) {
List<String> names = new ArrayList<String>();
for (Item i : arg1) {
names.add(i.getName());
}
return itemNames_.addAll(arg0, names);
}
@Override
@Deprecated
public void addElement(final Item arg0) {
add(arg0);
}
@Override
public void clear() {
itemNames_.clear();
}
@Override
public Object clone() {
ItemVector iv = new ItemVector(doc_, false);
iv.addAllStrings(itemNames_);
return iv;
}
@Override
public boolean contains(final Object arg0) {
if (arg0 instanceof Item) {
return itemNames_.contains(((Item) arg0).getName());
} else if (arg0 instanceof String) {
return itemNames_.contains(arg0);
}
return false;
}
@Override
public boolean containsAll(final Collection<?> arg0) {
boolean result = true;
for (Object o : arg0) {
result = contains(o);
if (!result)
return result;
}
return result;
}
@Override
@Deprecated
public void copyInto(final Object[] arg0) {
throw new UnimplementedException("copyInto not yet implemented because it's a deprecated call anyway!");
}
@Override
@Deprecated
public Item elementAt(final int arg0) {
return get(arg0);
}
@Override
@Deprecated
public Enumeration<Item> elements() {
throw new UnimplementedException("elements not yet implemented because it's a deprecated call anyway!");
}
@Override
public Item firstElement() {
return get(0);
}
@Override
public Item get(final int arg0) {
if (arg0 >= size_) {
throw new IndexOutOfBoundsException();
}
String itemName = itemNames_.get(arg0);
return doc_.getFirstItem(itemName);
}
public String[] getNames() {
return itemNames_.toArray(new String[itemNames_.size()]);
}
@Override
@Deprecated
public int indexOf(final Object arg0, final int arg1) {
throw new UnimplementedException("indexOf with two arguments not yet implemented because it's a deprecated call anyway!");
}
@Override
public int indexOf(final Object arg0) {
if (arg0 instanceof Item) {
return itemNames_.indexOf(((Item) arg0).getName());
} else if (arg0 instanceof String) {
return itemNames_.indexOf(arg0);
}
return -1;
}
@Override
@Deprecated
public void insertElementAt(final Item arg0, final int arg1) {
add(arg1, arg0);
}
/*
* (non-Javadoc)
*
* @see org.openntf.domino.impl.Vector#isEmpty()
*/
@Override
public boolean isEmpty() {
return itemNames_.isEmpty();
}
/*
* (non-Javadoc)
*
* @see org.openntf.domino.impl.Vector#size()
*/
@Override
public int size() {
return itemNames_.size();
}
/*
* (non-Javadoc)
*
* @see org.openntf.domino.impl.Vector#capacity()
*/
@Override
public int capacity() {
return itemNames_.size();
}
@Override
public Iterator<Item> iterator() {
return new ItemVectorIterator(doc_, this);
}
@Override
@Deprecated
public Item lastElement() {
return doc_.getFirstItem(itemNames_.get(itemNames_.size() - 1));
}
@Override
@Deprecated
public int lastIndexOf(final Object arg0, final int arg1) {
throw new UnimplementedException("lastIndexOf with two arguments not yet implemented because it's a deprecated call anyway!");
}
@Override
public int lastIndexOf(final Object arg0) {
if (arg0 instanceof Item) {
return itemNames_.lastIndexOf(((Item) arg0).getName());
} else if (arg0 instanceof String) {
return itemNames_.lastIndexOf(arg0);
}
return -1;
}
@Override
public ListIterator<Item> listIterator() {
return new ItemVectorIterator(doc_, this);
}
@Override
public ListIterator<Item> listIterator(final int arg0) {
return new ItemVectorIterator(doc_, this);
}
@Override
public Item remove(final int arg0) {
String name = itemNames_.remove(arg0);
return doc_.getFirstItem(name);
}
@Override
public boolean remove(final Object arg0) {
if (arg0 instanceof Item) {
String name = ((Item) arg0).getName();
return itemNames_.remove(name);
} else if (arg0 instanceof String) {
return itemNames_.remove(arg0);
}
return itemNames_.remove(arg0);
}
@Override
public boolean removeAll(final Collection<?> arg0) {
List<String> names = new ArrayList<String>();
for (Object o : arg0) {
if (o instanceof Item) {
names.add(((Item) o).getName());
} else if (o instanceof String) {
names.add((String) o);
}
}
return itemNames_.removeAll(names);
}
@Override
public void removeAllElements() {
clear();
}
@Override
public boolean removeElement(final Object arg0) {
return remove(arg0);
}
@Override
public void removeElementAt(final int arg0) {
remove(arg0);
}
@Override
public boolean retainAll(final Collection<?> arg0) {
List<String> names = new ArrayList<String>();
for (Object o : arg0) {
if (o instanceof Item) {
names.add(((Item) o).getName());
} else if (o instanceof String) {
names.add((String) o);
}
}
return itemNames_.retainAll(names);
}
@Override
public Item set(final int arg0, final Item arg1) {
itemNames_.set(arg0, arg1.getName());
return arg1;
}
@Override
@Deprecated
public void setElementAt(final Item arg0, final int arg1) {
set(arg1, arg0);
}
@Override
public List<Item> subList(final int arg0, final int arg1) {
ItemVector result = new ItemVector(doc_, false);
for (int i = arg0; i <= arg1; i++) {
result.add(itemNames_.get(i));
}
return result;
}
}