/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.types.iterator;
import Sirius.navigator.types.treenode.*;
import Sirius.server.middleware.types.*;
import java.util.*;
/**
* DOCUMENT ME!
*
* @author pascal
* @version $Revision$, $Date$
*/
public class MultipleAttributeIterator implements AttributeIterator {
//~ Instance fields --------------------------------------------------------
private final SingleAttributeIterator attributeIterator;
private final HashSet hashSet;
private TreeNodeIterator treeNodeIterator = null;
private Sirius.server.localserver.attribute.Attribute nextElement = null;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new MultipleAttributeIterator object.
*
* @param treeNodeIterator DOCUMENT ME!
*/
public MultipleAttributeIterator(final TreeNodeIterator treeNodeIterator) {
this(treeNodeIterator, new SimpleAttributeRestriction(), false);
}
/**
* Creates a new MultipleAttributeIterator object.
*
* @param restriction DOCUMENT ME!
* @param distinct DOCUMENT ME!
*/
public MultipleAttributeIterator(final AttributeRestriction restriction, final boolean distinct) {
this(null, restriction, distinct);
}
/**
* Creates a new MultipleAttributeIterator object.
*
* @param treeNodeIterator DOCUMENT ME!
* @param restriction DOCUMENT ME!
* @param distinct DOCUMENT ME!
*/
public MultipleAttributeIterator(final TreeNodeIterator treeNodeIterator,
final AttributeRestriction restriction,
final boolean distinct) {
this.attributeIterator = new SingleAttributeIterator(restriction, false);
if (distinct) {
this.hashSet = new HashSet();
} else {
this.hashSet = null;
}
this.init(treeNodeIterator);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param object DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean init(final Object object) {
this.treeNodeIterator = null;
this.nextElement = null;
if ((object != null) && (object instanceof TreeNodeIterator)) {
return this.init((TreeNodeIterator)object);
}
return false;
}
/**
* DOCUMENT ME!
*
* @param treeNodeIterator DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean init(TreeNodeIterator treeNodeIterator) {
this.treeNodeIterator = treeNodeIterator;
this.nextElement = null;
if ((treeNodeIterator != null) && treeNodeIterator.hasNext()) {
attributeIterator.init(treeNodeIterator.next());
return true;
} else {
treeNodeIterator = null;
return false;
}
}
@Override
public boolean hasNext() {
if (treeNodeIterator == null) {
return false;
}
if ((nextElement == null) && attributeIterator.hasNext()) {
nextElement = attributeIterator.next();
// return true;
}
if ((nextElement == null) && treeNodeIterator.hasNext()) {
attributeIterator.init(treeNodeIterator.next());
this.hasNext();
}
if ((nextElement != null) && this.isDistinct() && !hashSet.add(nextElement)) {
nextElement = null;
this.hasNext();
}
return (nextElement != null) ? true : false;
}
@Override
public Sirius.server.localserver.attribute.Attribute next() throws NoSuchElementException {
if (this.hasNext()) {
final Sirius.server.localserver.attribute.Attribute next = nextElement;
nextElement = null;
return next;
} else {
throw new NoSuchElementException();
}
}
@Override
public boolean isDistinct() {
return (hashSet != null) ? true : false;
}
}