package org.basex.tests.w3c;
import static org.basex.tests.w3c.QT3Constants.*;
import java.util.*;
import javax.xml.namespace.*;
import org.basex.core.*;
import org.basex.query.value.item.*;
import org.basex.tests.bxapi.*;
import org.basex.tests.bxapi.xdm.*;
import org.basex.util.*;
import org.basex.util.list.*;
/**
* Driver environment for the {@link QT3TS} test suite driver.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
final class QT3Env {
/** Namespaces: prefix, uri. */
final ArrayList<HashMap<String, String>> namespaces;
/** Sources: role, file, validation, uri, xml:id. */
final ArrayList<HashMap<String, String>> sources;
/** Resources. */
final ArrayList<HashMap<String, String>> resources;
/** Parameters: name, as, select, declared. */
final ArrayList<HashMap<String, String>> params;
/** Schemas: uri, file, xml:id. */
final HashMap<String, String> schemas;
/** Collations: uri, default. */
final HashMap<String, String> collations;
/** Decimal Formats: decimal-separator, grouping-separator,
digit, pattern-separator, infinity, NaN, per-mille,
minus-sign, name, percent, zero-digit. */
final HashMap<QName, HashMap<String, String>> decFormats;
/** Static Base URI: uri. */
final String baseURI;
/** Name. */
final String name;
/** Collection uri. */
final String collURI;
/** Initial context item. */
final XdmValue context;
/** Collection context flag. */
final boolean collContext;
/** Collection sources. */
final StringList collSources;
/**
* Constructor.
* @param ctx database context
* @param env environment item
*/
QT3Env(final Context ctx, final XdmValue env) {
name = XQuery.string('@' + NNAME, env, ctx);
sources = list(ctx, env, SOURCE);
resources = list(ctx, env, RESOURCE);
params = list(ctx, env, PARAM);
namespaces = list(ctx, env, NAMESPACE);
ArrayList<HashMap<String, String>> al = list(ctx, env, SCHEMA);
schemas = al.isEmpty() ? null : al.get(0);
al = list(ctx, env, COLLATION);
collations = al.isEmpty() ? null : al.get(0);
final String uri = string(STATIC_BASE_URI, ctx, env);
baseURI = uri;
// collections
collURI = XQuery.string("*:collection/@uri", env, ctx);
collContext = new XQuery("*:collection/*:source/@role = '.'", ctx).
context(env).value().getBoolean();
collSources = new StringList();
for(final XdmItem iatt : new XQuery("*:collection/*:source/@file", ctx).context(env))
collSources.add(iatt.getString());
decFormats = new HashMap<>();
for(final XdmItem it : new XQuery("*:decimal-format", ctx).context(env)) {
final XdmValue it1 = new XQuery(
"for $n in @name " +
"let $b := substring-before($n, ':') " +
"return QName(if($b) then namespace-uri-for-prefix($b, .) else '', $n)",
ctx).context(it).value();
final HashMap<String, String> hm = new HashMap<>();
final QNm qnm = it1.size() != 0 ? (QNm) it1.internal() : new QNm(Token.EMPTY);
decFormats.put(qnm.toJava(), hm);
for(final XdmItem it2 : new XQuery("@*[name() != 'name']", ctx).context(it)) {
hm.put(it2.getName().getLocalPart(), it2.getString());
}
}
final String c = XQuery.string("*:context-item/@select", env, ctx);
context = c.isEmpty() ? null : new XQuery(c, ctx).value();
}
/**
* Returns a list of all attributes of the specified element in a map.
* @param ctx database context
* @param env root element
* @param elem element to be parsed
* @return map list
*/
static ArrayList<HashMap<String, String>> list(final Context ctx, final XdmValue env,
final String elem) {
final ArrayList<HashMap<String, String>> list = new ArrayList<>();
for(final XdmItem it : new XQuery("*:" + elem, ctx).context(env)) {
list.add(map(ctx, it));
}
return list;
}
/**
* Returns all attributes of the specified element in a map.
* @param ctx database context
* @param env root element
* @return map
*/
static HashMap<String, String> map(final Context ctx, final XdmValue env) {
final HashMap<String, String> map = new HashMap<>();
for(final XdmItem it : new XQuery("@*", ctx).context(env))
map.put(it.getName().getLocalPart(), it.getString());
return map;
}
/**
* Returns a single attribute string.
* @param elm name of element
* @param ctx database context
* @param env root element
* @return map
*/
static String string(final String elm, final Context ctx, final XdmValue env) {
final XdmItem it = new XQuery("*:" + elm, ctx).context(env).next();
return it == null ? null :
new XQuery("string(@*)", ctx).context(it).next().getString();
}
}