package org.basex.query.func;
import static org.basex.util.Token.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.basex.io.IO;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.expr.Expr;
import org.basex.query.item.DTd;
import org.basex.query.item.Dat;
import org.basex.query.item.Dtm;
import org.basex.query.item.Item;
import org.basex.query.item.Tim;
import org.basex.query.item.Uri;
import org.basex.util.InputInfo;
/**
* Context functions.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class FNContext extends StandardFunc {
/**
* Constructor.
* @param ii input info
* @param f function definition
* @param e arguments
*/
public FNContext(final InputInfo ii, final Function f, final Expr... e) {
super(ii, f, e);
}
@Override
public Item item(final QueryContext ctx, final InputInfo ii)
throws QueryException {
switch(sig) {
case CURRENT_DATE:
return currDate(ctx);
case CURRENT_DATETIME:
return currDTM(ctx);
case CURRENT_TIME:
return currTIM(ctx);
case IMPLICIT_TIMEZONE:
return implZone();
case DEFAULT_COLLATION:
return ctx.sc.baseURI().resolve(ctx.sc.collation);
case STATIC_BASE_URI:
final IO base = ctx.sc.baseIO();
return base == null ? null : Uri.uri(token(ctx.sc.baseIO().url()));
default:
return super.item(ctx, ii);
}
}
/**
* Returns the current date.
* @param ctx query context
* @return current date
* @throws QueryException query exception
*/
private Item currDate(final QueryContext ctx) throws QueryException {
if(ctx.date == null) initDateTime(ctx);
return ctx.date;
}
/**
* Returns the current DateTime.
* @param ctx query context
* @return current date
* @throws QueryException query exception
*/
private Item currDTM(final QueryContext ctx) throws QueryException {
if(ctx.dtm == null) initDateTime(ctx);
return ctx.dtm;
}
/**
* Returns the current DateTime.
* @param ctx query context
* @return current date
* @throws QueryException query exception
*/
private Item currTIM(final QueryContext ctx) throws QueryException {
if(ctx.time == null) initDateTime(ctx);
return ctx.time;
}
/**
* Initializes the static date and time context of a query.
* @param ctx query context
* @throws QueryException query exception
*/
private void initDateTime(final QueryContext ctx) throws QueryException {
final Date d = Calendar.getInstance().getTime();
final String zon = new SimpleDateFormat("Z").format(d);
final String ymd = new SimpleDateFormat("yyyy-MM-dd").format(d);
final String hms = new SimpleDateFormat("HH:mm:ss.S").format(d);
final String zone = zon.substring(0, 3) + ':' + zon.substring(3);
ctx.date = new Dat(token(ymd + zone), input);
ctx.time = new Tim(token(hms + zone), input);
ctx.dtm = new Dtm(token(ymd + 'T' + hms + zone), input);
}
/**
* Returns the current DateTime.
* @return current date
*/
private static Item implZone() {
final Date d = Calendar.getInstance().getTime();
final String zone = new SimpleDateFormat("Z").format(d);
final byte[] z = token(zone);
final int cshift = toInt(substring(z, 0, 3)) * 60 + toInt(substring(z, 3));
return new DTd(cshift);
}
}