package com.bagri.xqj; import static com.bagri.xqj.BagriXQErrors.ex_expression_closed; import java.io.InputStream; import java.io.Reader; import java.util.Collection; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TimeZone; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamReader; import javax.xml.transform.Source; import javax.xml.xquery.XQDynamicContext; import javax.xml.xquery.XQException; import javax.xml.xquery.XQItem; import javax.xml.xquery.XQItemType; import javax.xml.xquery.XQSequence; import javax.xml.xquery.XQStaticContext; import org.w3c.dom.Node; public class BagriXQDynamicContext extends BagriXQCloseable implements XQDynamicContext { protected XQStaticContext context; protected BagriXQConnection connection; private TimeZone timeZone; private Set<QName> varNames = new HashSet<QName>(); private Map<QName, Object> bindings = new HashMap<QName, Object>(); BagriXQDynamicContext() { // timeZone = new GregorianCalendar().getTimeZone(); } BagriXQDynamicContext(XQStaticContext context) { this(); this.context = context; } BagriXQDynamicContext(BagriXQConnection connection) { this(); this.connection = connection; try { this.context = connection.getStaticContext(); } catch (XQException ex) { connection = null; } } BagriXQDynamicContext(BagriXQConnection connection, XQStaticContext context) { this(); this.connection = connection; this.context = context; } public void cancel() throws XQException { checkState(ex_expression_closed); connection.cancel(); } @Override public boolean isClosed() { if (closed) { return true; } if (connection != null) { return connection.isClosed(); } return false; } @Override public void close() throws XQException { // close expression when it is created by DataFactory for (QName varName: bindings.keySet()) { connection.unbindVariable(varName); } bindings.clear(); closed = true; } @Override public void bindAtomicValue(QName varName, String value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromAtomicValue(value, type)); } @Override public void bindString(QName varName, String value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromString(value, type)); } protected void bindXQItemAccessor(QName varName, BagriXQItemAccessor value) throws XQException { checkState(ex_expression_closed); if (varName == null) { throw new XQException("varName is null"); } if (value.isClosed()) { throw new XQException("Item is closed"); } bindings.put(varName, value); connection.bindVariable(varName, value); } @Override public void bindItem(QName varName, XQItem value) throws XQException { bindXQItemAccessor(varName, (BagriXQItemAccessor) value); } @Override public void bindSequence(QName varName, XQSequence value) throws XQException { bindXQItemAccessor(varName, (BagriXQItemAccessor) value); } @Override public void bindObject(QName varName, Object value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromObject(value, type)); } @Override public void bindBoolean(QName varName, boolean value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromBoolean(value, type)); } @Override public void bindByte(QName varName, byte value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromByte(value, type)); } @Override public void bindDocument(QName varName, XMLStreamReader value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDocument(value, type)); } @Override public void bindDocument(QName varName, Source source, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDocument(source, type)); } @Override public void bindDocument(QName varName, String value, String baseURI, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDocument(value, baseURI, type)); } @Override public void bindDocument(QName varName, Reader value, String baseURI, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDocument(value, baseURI, type)); } @Override public void bindDocument(QName varName, InputStream value, String baseURI, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDocument(value, baseURI, type)); } @Override public void bindDouble(QName varName, double value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromDouble(value, type)); } @Override public void bindFloat(QName varName, float value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromFloat(value, type)); } @Override public void bindInt(QName varName, int value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromInt(value, type)); } @Override public void bindLong(QName varName, long value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromLong(value, type)); } @Override public void bindNode(QName varName, Node value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromNode(value, type)); } @Override public void bindShort(QName varName, short value, XQItemType type) throws XQException { bindItem(varName, connection.createItemFromShort(value, type)); } protected Map<QName, Object> getBindings() { return bindings; } @Override public TimeZone getImplicitTimeZone() throws XQException { checkState(ex_expression_closed); return timeZone; } public XQStaticContext getStaticContext() throws XQException { checkState(ex_expression_closed); return new BagriXQStaticContext(context); } @Override public void setImplicitTimeZone(TimeZone implicitTimeZone) throws XQException { checkState(ex_expression_closed); this.timeZone = implicitTimeZone; connection.getProcessor().setTimeZone(implicitTimeZone); } protected Set<QName> getVarNames() { return varNames; } void setVarNames(Collection<QName> qNames) { // varNames.addAll(qNames); } }