package com.bagri.xqj;
import static com.bagri.support.util.XQUtils.*;
import static com.bagri.xqj.BagriXQErrors.ex_sequence_closed;
import static com.bagri.xqj.BagriXQErrors.ex_sequence_not_scrollable;
import java.io.OutputStream;
import java.io.Writer;
import java.net.URI;
import java.util.Properties;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Result;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQItem;
import javax.xml.xquery.XQItemAccessor;
import org.w3c.dom.Node;
import org.xml.sax.ContentHandler;
import com.bagri.core.api.ResultCursor;
import com.bagri.core.api.BagriException;
import com.bagri.core.xquery.api.XQProcessor;
public class IterableXQSequence extends BagriXQSequence {
private ResultCursor cursor;
private boolean accessed;
IterableXQSequence(BagriXQDataFactory xqFactory, XQProcessor xqProcessor, ResultCursor cursor) {
super(xqFactory, xqProcessor);
this.cursor = cursor;
accessed = false;
}
protected void checkAccess(boolean checkPosition) throws XQException {
if (checkPosition && !positioned) {
throw new XQException("Not positioned on an Item");
}
if (accessed) {
throw new XQException("Item has been already accessed");
}
}
@Override
public void close() throws XQException {
super.close();
try {
cursor.close();
} catch (Exception ex) {
throw getXQException(ex);
}
}
@Override
public boolean absolute(int itempos) throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public void afterLast() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public void beforeFirst() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public int count() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean first() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean getBoolean() throws XQException {
checkAccess(true);
boolean result = super.getBoolean();
accessed = true;
return result;
}
@Override
public byte getByte() throws XQException {
checkAccess(true);
byte result = super.getByte();
accessed = true;
return result;
}
@Override
public double getDouble() throws XQException {
checkAccess(true);
double result = super.getDouble();
accessed = true;
return result;
}
@Override
public float getFloat() throws XQException {
checkAccess(true);
float result = super.getFloat();
accessed = true;
return result;
}
@Override
public int getInt() throws XQException {
checkAccess(true);
int result = super.getInt();
accessed = true;
return result;
}
@Override
public String getAtomicValue() throws XQException {
checkAccess(true);
String result = super.getAtomicValue();
accessed = true;
return result;
}
@Override
public long getLong() throws XQException {
checkAccess(true);
long result = super.getLong();
accessed = true;
return result;
}
@Override
public Node getNode() throws XQException {
checkAccess(true);
Node result = super.getNode();
accessed = true;
return result;
}
@Override
public URI getNodeUri() throws XQException {
boolean tmp = accessed;
accessed = false;
checkAccess(true);
URI result = super.getNodeUri();
accessed = tmp;
return result;
}
@Override
public Object getObject() throws XQException {
checkAccess(true);
Object result = super.getObject();
accessed = true;
return result;
}
@Override
public XQItem getItem() throws XQException {
checkAccess(true);
XQItem result = super.getItem();
accessed = true;
return result;
}
@Override
public XMLStreamReader getItemAsStream() throws XQException {
checkAccess(true);
XMLStreamReader result = super.getItemAsStream();
accessed = true;
return result;
}
@Override
public String getItemAsString(Properties props) throws XQException {
checkAccess(true);
String result = super.getItemAsString(props);
accessed = true;
return result;
}
@Override
public short getShort() throws XQException {
checkAccess(true);
short result = super.getShort();
accessed = true;
return result;
}
@Override
public int getPosition() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public XMLStreamReader getSequenceAsStream() throws XQException {
checkAccess(false);
XMLStreamReader result = super.getSequenceAsStream();
accessed = true;
return result;
}
@Override
public String getSequenceAsString(Properties props) throws XQException {
checkAccess(false);
String result = super.getSequenceAsString(props);
accessed = true;
return result;
}
@Override
public boolean isAfterLast() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean isBeforeFirst() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean isFirst() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean isLast() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean isOnItem() throws XQException {
checkState(ex_sequence_closed);
return positioned;
}
@Override
public boolean isScrollable() throws XQException {
checkState(ex_sequence_closed);
return false;
}
@Override
public boolean last() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean next() throws XQException {
checkState(ex_sequence_closed);
try {
if (cursor.next()) {
XQItemAccessor current = cursor.getXQItem();
//if (current instanceof BagriXQItemAccessor) {
setCurrent(((BagriXQItemAccessor) current).type, ((BagriXQItemAccessor) current).value);
//} else if (current instanceof XQItem) {
// setCurrent(((XQItem) current).getItemType(), ((XQItem) current).getObject());
//} else {
// setCurrent(getTypeForObject(xqFactory, current), current);
//}
accessed = false;
return true;
}
positioned = false;
return false;
} catch (BagriException ex) {
throw getXQException(ex);
}
}
@Override
public boolean previous() throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public boolean relative(int itempos) throws XQException {
throw new XQException(ex_sequence_not_scrollable);
}
@Override
public void writeItem(OutputStream os, Properties props) throws XQException {
checkAccess(true);
super.writeItem(os, props);
accessed = true;
}
@Override
public void writeItem(Writer ow, Properties props) throws XQException {
checkAccess(true);
super.writeItem(ow, props);
accessed = true;
}
@Override
public void writeItemToSAX(ContentHandler saxhdlr) throws XQException {
checkAccess(true);
super.writeItemToSAX(saxhdlr);
accessed = true;
}
@Override
public void writeItemToResult(Result result) throws XQException {
checkAccess(true);
super.writeItemToResult(result);
accessed = true;
}
@Override
public void writeSequence(OutputStream os, Properties props) throws XQException {
checkAccess(false);
super.writeSequence(os, props);
accessed = true;
}
@Override
public void writeSequence(Writer ow, Properties props) throws XQException {
checkAccess(false);
super.writeSequence(ow, props);
accessed = true;
}
@Override
public void writeSequenceToSAX(ContentHandler saxhdlr) throws XQException {
checkAccess(false);
super.writeSequenceToSAX(saxhdlr);
accessed = true;
}
@Override
public void writeSequenceToResult(Result result) throws XQException {
checkAccess(false);
super.writeSequenceToResult(result);
accessed = true;
}
}