long b = 0;
long total = 0;
Map<String, AbstractPolicy> documents = new HashMap<String, AbstractPolicy>();
XmlQueryExpression qe = null;
XmlQueryContext context = null;
try {
// Get the query (query gets prepared if necesary)
a = System.nanoTime();
Map<String, Set<AttributeBean>> attributeMap =
getAttributeMap(eval);
context = m_dbXmlManager.manager.createQueryContext();
context.setDefaultCollection(m_dbXmlManager.CONTAINER);
for (String prefix : namespaces.keySet()) {
context.setNamespace(prefix, namespaces.get(prefix));
}
// 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");