configuration.setHostLanguage(Configuration.XQUERY);
XQStaticContext staticContext = xqconn.getStaticContext();
JaxpFunctionResolver funcResolver = new JaxpFunctionResolver(
_compilerContext, out, source.getNamespaceContext(), _bpelNS);
JaxpVariableResolver variableResolver = new JaxpVariableResolver(
_compilerContext, out);
XQueryDeclarations declarations = new XQueryDeclarations();
NSContext nsContext = source.getNamespaceContext();
Set<String> prefixes = nsContext.getPrefixes();
if (!nsContext.getUriSet().contains(Namespaces.ODE_EXTENSION_NS)) {
nsContext.register("ode", Namespaces.ODE_EXTENSION_NS);
}
for (String prefix : prefixes) {
String uri = nsContext.getNamespaceURI(prefix);
staticContext.declareNamespace(prefix, uri);
if ("".equals(prefix)) {
declarations.declareDefaultElementNamespace(uri);
} else if ("bpws".equals(prefix)) {
declarations.declareNamespace("bpws", "java:" + Constants.XQUERY_FUNCTION_HANDLER_COMPILER);
} else {
declarations.declareNamespace(prefix, uri);
}
}
declarations.declareVariable(
getQName(nsContext, Namespaces.ODE_EXTENSION_NS, "pid"),
getQName(nsContext, Namespaces.XML_SCHEMA, "integer"));
// Map<URI, Source> schemaDocuments = _compilerContext.getSchemaSources();
// for (URI schemaUri : schemaDocuments.keySet()) {
// Source schemaSource = schemaDocuments.get(schemaUri);
// // Don't add schema sources, since our Saxon library is not schema-aware.
// // configuration.addSchemaSource(schemaSource);
// }
configuration.setSchemaValidationMode(Validation.SKIP);
List<OScope.Variable> variables = _compilerContext.getAccessibleVariables();
Map<QName, QName> variableTypes = new HashMap<QName, QName>();
for (String variableName : getVariableNames(xqueryStr)) {
OScope.Variable variable = getVariable(variables, variableName);
if (variable == null) {
continue;
}
OVarType type = variable.type;
QName nameQName = getNameQName(variableName);
QName typeQName = getTypeQName(variableName, type);
variableTypes.put(nameQName, typeQName);
String prefix = typeQName.getPrefix();
if (prefix == null || "".equals(prefix.trim())) {
prefix = getPrefixForUri(nsContext, typeQName.getNamespaceURI());
}
// don't declare typed variables, as our engine is not schema-aware
// declarations.declareVariable(variable.name, typeQName);
declarations.declareVariable(variableName);
}
// Add implicit declarations as prolog to the user-defined XQuery
out.xquery = declarations.toString() + xqueryStr;
// Check the XQuery for compilation errors
xqconn.setStaticContext(staticContext);
XQPreparedExpression exp = xqconn.prepareExpression(out.xquery);
// Pre-evaluate variables and functions by executing query
node.setUserData(XQuery10BpelFunctions.USER_DATA_KEY_FUNCTION_RESOLVER,
funcResolver, null);
exp.bindItem(XQConstants.CONTEXT_ITEM,
xqconn.createItemFromNode(node, xqconn.createNodeType()));
// Bind external variables to dummy runtime values
for (QName variable : exp.getAllUnboundExternalVariables()) {
QName typeQName = variableTypes.get(variable);
Object value = variableResolver.resolveVariable(variable);
if (typeQName != null) {
if (value.getClass().getName().startsWith("java.lang")) {
exp.bindAtomicValue(variable, value.toString(),
xqconn.createAtomicType(XQItemType.XQBASETYPE_ANYATOMICTYPE));
} else if (value instanceof Node) {