package lux.xquery;
import lux.xpath.AbstractExpression;
import lux.xpath.FunCall;
import lux.xpath.LiteralExpression;
import lux.xpath.Namespace;
import org.apache.commons.lang.StringUtils;
/**
* represents an XQuery module, its static context (not counting any definitions in the enclosing context),
* variables, function definitions, and optional body.
*/
public class XQuery {
private final FunctionDefinition[] functionDefinitions;
private final Namespace[] namespaceDeclarations;
private final String defaultElementNamespace, defaultFunctionNamespace, defaultCollation;
private final VariableDefinition[] externalVariables;
private final ModuleImport[] importedModules;
private final AbstractExpression body;
private final String baseURI;
private final Boolean preserveNamespaces;
private final Boolean inheritNamespaces;
private final boolean emptyLeast;
public XQuery (String defaultElementNamespace, String defaultFunctionNamespace, String defaultCollation,
ModuleImport[] importedModules, Namespace[] namespaceDeclarations, VariableDefinition[] variableDefinitions, FunctionDefinition[] defs,
AbstractExpression body, String baseURI, Boolean copyNamespacesPreserve, Boolean copyNamespacesInherit, boolean emptyLeast) {
this.namespaceDeclarations = namespaceDeclarations;
this.externalVariables = variableDefinitions;
this.defaultCollation = defaultCollation;
this.defaultElementNamespace = defaultElementNamespace;
this.defaultFunctionNamespace = defaultFunctionNamespace;
this.functionDefinitions = defs;
this.body = body;
this.baseURI = baseURI;
this.inheritNamespaces = copyNamespacesInherit;
this.preserveNamespaces = copyNamespacesPreserve;
this.emptyLeast = emptyLeast;
this.importedModules = importedModules;
}
@Override
public String toString () {
StringBuilder buf = new StringBuilder();
toString (buf);
return buf.toString();
}
public void toString (StringBuilder buf) {
if (inheritNamespaces != null || preserveNamespaces != null) {
buf.append ("declare copy-namespaces ");
if (preserveNamespaces == null || preserveNamespaces == false) {
buf.append ("no-preserve, ");
} else {
buf.append ("preserve, ");
}
if ((inheritNamespaces == null) || (inheritNamespaces == true)) {
buf.append ("inherit");
} else {
buf.append ("no-inherit");
}
buf.append (";\n");
}
if (baseURI != null) {
buf.append ("declare base-uri ");
LiteralExpression.quoteString(baseURI, buf);
buf.append(";\n");
}
if (StringUtils.isNotBlank(defaultCollation)) {
buf.append("declare default collation ");
LiteralExpression.quoteString(defaultCollation, buf);
buf.append(";\n");
}
if (! emptyLeast) {
buf.append ("declare default order empty greatest;\n");
}
if (StringUtils.isNotBlank(defaultElementNamespace)) {
buf.append("declare default element namespace ");
LiteralExpression.quoteString(defaultElementNamespace, buf);
buf.append(";\n");
}
if (StringUtils.isNotBlank(defaultFunctionNamespace) && !defaultFunctionNamespace.equals(FunCall.FN_NAMESPACE)) {
buf.append("declare default function namespace ");
LiteralExpression.quoteString(defaultFunctionNamespace, buf);
buf.append(";\n");
}
if (namespaceDeclarations != null) {
OUTER:
for (Namespace ns : namespaceDeclarations) {
if (ns.getPrefix().isEmpty() || "xml".equals (ns.getPrefix())) {
// handle this using specific mappings for element/function default namespaces
continue;
//buf.append("declare default element namespace ").append('=');
}
for (ModuleImport importedModule : importedModules) {
if (importedModule.getPrefix().equals(ns.getPrefix())) {
continue OUTER;
}
}
buf.append("declare namespace ").append(ns.getPrefix()).append('=');
LiteralExpression.quoteString (ns.getNamespace(), buf);
buf.append(";\n");
}
}
if (importedModules != null) {
for (ModuleImport importedModule : importedModules) {
importedModule.toString(buf);
}
}
if (externalVariables != null) {
for (VariableDefinition def : externalVariables) {
def.toString(buf);
}
}
if (functionDefinitions != null) {
for (FunctionDefinition def : functionDefinitions) {
def.toString(buf);
}
}
body.toString(buf);
}
public AbstractExpression getBody() {
return body;
}
public FunctionDefinition[] getFunctionDefinitions() {
return functionDefinitions;
}
public Namespace[] getNamespaceDeclarations() {
return namespaceDeclarations;
}
public VariableDefinition[] getVariableDefinitions() {
return externalVariables;
}
public String getDefaultCollation () {
return defaultCollation;
}
public String getDefaultElementNamespace () {
return defaultElementNamespace;
}
public String getDefaultFunctionNamespace () {
return defaultFunctionNamespace;
}
public Boolean isPreserveNamespaces() {
return preserveNamespaces;
}
public Boolean isInheritNamespaces() {
return inheritNamespaces;
}
public String getBaseURI() {
return baseURI;
}
public boolean isEmptyLeast() {
return emptyLeast;
}
public ModuleImport[] getModuleImports() {
return importedModules;
}
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */