// not clear why this is needed.... but it is used in hashing the queries
int resourceComponentCount = 0;
Map<String, String> variables = getXpathVariables(attributeMap);
for (String variable : variables.keySet()) {
context.setVariableValue(variable, new XmlValue(variables.get(variable)));
if (variable.equals(XACML_RESOURCE_ID)) {
resourceComponentCount++;
}
}
qe =
getQuery(attributeMap, context, resourceComponentCount);
} catch (XmlException xe) {
throw new PolicyIndexException("Error while constructing query", xe);
} catch (URISyntaxException e) {
throw new PolicyIndexException("Error while constructing query", e);
}
DbXmlManager.readLock.lock();
try {
b = System.nanoTime();
total += b - a;
if (log.isDebugEnabled()) {
log.debug("Query prep. time: " + (b - a) + "ns");
}
// execute the query
a = System.nanoTime();
XmlResults results = qe.execute(context);
b = System.nanoTime();
total += b - a;
if (log.isDebugEnabled()) {
log.debug("Query exec. time: " + (b - a) + "ns");
}
// process results
while (results.hasNext()) {
XmlValue value = results.next();
byte[] content = value.asDocument().getContent();
if (content.length > 0) {
documents.put(value.asDocument().getName(),
handleDocument(m_policyReader.readPolicy(content),policyFinder));
} else {
throw new PolicyIndexException("Zero-length result found");
}
}