package org.wyona.yarep.impl.repo.vfs;
import org.wyona.yarep.core.Node;
import org.wyona.yarep.core.Revision;
import java.io.File;
import java.util.Date;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
* Iterator to access revisions by date
*/
public class VFSRevisionIterator implements java.util.Iterator {
private static Logger log = LogManager.getLogger(VFSRevisionIterator.class);
private Revision currentRevision;
private DateIndexerSearcher dis;
private Date pointInTime;
private boolean reverse;
/**
* @param dis Yarep node specific date indexer searche whuch is supposed to have revisions
* @param date Point in time (from where iteration shall start or stop)
* @param reverse Reversed order, if set to true, then oldest revision first and most recent (head) last
*/
public VFSRevisionIterator(DateIndexerSearcher dis, Date date, boolean reverse) throws Exception {
this.pointInTime = date;
this.dis = dis;
this.reverse = reverse;
if (reverse && pointInTime != null) {
log.warn("TODO: Finish reverse order implementation when using point in time!");
}
if (!dis.indexExists()) {
dis.buildDateIndex();
}
currentRevision = null;
}
/**
* @see java.util.Iterator#hasNext()
*/
public boolean hasNext() {
if (currentRevision == null) { // INFO: Iterator is still at the beginning
if (pointInTime != null) {
// TODO: What exactly means 'reverse' when using pointInTime?!
try {
if (dis.getRevision(pointInTime) != null) {
return true;
} else {
return false;
}
} catch(Exception e) {
log.error(e, e);
return false;
}
} else {
if (reverse) {
if (dis.getOldestRevision() != null) {
return true;
} else {
log.warn("No revisions at all.");
return false;
}
} else {
if (dis.getMostRecentRevision() != null) {
return true;
} else {
log.warn("No revisions at all.");
return false;
}
}
}
} else {
try {
log.debug("Check if there is another revision older than: " + format(currentRevision.getCreationDate()));
if (reverse) {
if (dis.getRevisionYoungerThan(currentRevision.getCreationDate()) != null) {
return true;
} else {
log.debug("No revision younger than '" + currentRevision.getCreationDate() + "', hence stop iteration.");
return false;
}
} else {
if (dis.getRevisionOlderThan(currentRevision.getCreationDate()) != null) {
return true;
} else {
log.debug("No revision older than '" + currentRevision.getCreationDate() + "', hence stop iteration.");
return false;
}
}
} catch(Exception e) {
log.error(e, e);
return false;
}
}
}
/**
* @see java.util.Iterator#next()
*/
public Object next() throws java.util.NoSuchElementException {
if (currentRevision == null) {
if (pointInTime != null) {
// TODO: Finish reverse implementation
try {
currentRevision = dis.getRevision(pointInTime);
//log.debug("First revision found '" + format(currentRevision.getCreationDate()) + "' for point in time: " + format(pointInTime));
} catch(Exception e) {
throw new java.util.NoSuchElementException(e.getMessage());
}
} else {
if (reverse) {
currentRevision = dis.getOldestRevision();
} else {
currentRevision = dis.getMostRecentRevision();
}
}
return currentRevision;
} else {
try {
if (reverse) {
log.debug("Get revision younger than: " + format(currentRevision.getCreationDate()));
currentRevision = dis.getRevisionYoungerThan(currentRevision.getCreationDate());
} else {
log.debug("Get revision older than: " + format(currentRevision.getCreationDate()));
currentRevision = dis.getRevisionOlderThan(currentRevision.getCreationDate());
}
if (currentRevision != null) {
return currentRevision;
} else {
throw new java.util.NoSuchElementException();
}
} catch(Exception e) {
throw new java.util.NoSuchElementException(e.getMessage());
}
}
}
/**
* @see java.util.Iterator#remove()
*/
public void remove() throws UnsupportedOperationException {
throw new UnsupportedOperationException("Not implemented.");
}
/**
* Format date
*/
private String format(java.util.Date date) {
return new java.text.SimpleDateFormat("yyyy.MM.dd'T'HH:mm:ss/SZ").format(date);
}
}