package org.basex.query.item;
import java.io.IOException;
import org.basex.io.IO;
import org.basex.io.in.NewlineInput;
import org.basex.query.QueryException;
import org.basex.query.util.Err;
import org.basex.util.InputInfo;
import org.basex.util.Token;
import org.basex.util.Util;
/**
* Streamable string item.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class StrStream extends Item {
/** Input reference. */
private final IO input;
/** Encoding (optional). */
private final String encoding;
/** Error message. */
private final Err error;
/** String representation. */
private byte[] val;
/**
* Constructor.
* @param io input
* @param enc encoding (may be null)
* @param err error message to be thrown
*/
public StrStream(final IO io, final String enc, final Err err) {
super(AtomType.STR);
input = io;
encoding = enc;
error = err;
}
@Override
public byte[] string(final InputInfo ii) throws QueryException {
if(val == null) {
try {
val = input(ii).content();
} catch(final IOException ex) {
throw error.thrw(ii, ex);
}
}
return val;
}
@Override
public boolean bool(final InputInfo ii) throws QueryException {
return string(ii).length != 0;
}
@Override
public boolean eq(final InputInfo ii, final Item it) throws QueryException {
return Token.eq(string(ii), it.string(ii));
}
@Override
public int diff(final InputInfo ii, final Item it) throws QueryException {
return Token.diff(string(ii), it.string(ii));
}
@Override
public String toJava() throws QueryException {
return Token.string(string(null));
}
@Override
public NewlineInput input(final InputInfo ii) throws QueryException {
try {
return new NewlineInput(input, encoding);
} catch(final IOException ex) {
throw error.thrw(ii, ex);
}
}
@Override
public String toString() {
return Util.info("\"%\"", input.name());
}
}