}
Iterator<QPathEntryFilter> patternIterator = uncachedPatterns.iterator();
while (patternIterator.hasNext())
{
QPathEntryFilter pattern = patternIterator.next();
if (pattern.isExactName())
{
DataRequest exactNameRequest = new DataRequest(parentData.getIdentifier(), pattern.getQPathEntry());
exactNameRequest.start();
requests.add(exactNameRequest);
ItemData data = getCachedItemData(parentData, pattern.getQPathEntry(), ItemType.NODE);
if (data != null)
{
if (!(data instanceof NullItemData))
{
childNodesMap.put(data.getIdentifier(), (NodeData)data);
}
patternIterator.remove();
}
}
else
{
// get node list by pattern
List<NodeData> cachedItemList = cache.getChildNodes(parentData, pattern);
if (cachedItemList != null)
{
//merge results
for (int j = 0, length = cachedItemList.size(); j < length; j++)
{
childNodesMap.put(cachedItemList.get(j).getIdentifier(), cachedItemList.get(j));
}
patternIterator.remove();
}
}
}
patternIterator = null;
// execute all patterns and put result in cache
if (!uncachedPatterns.isEmpty())
{
executeAction(new PrivilegedExceptionAction<Void>()
{
public Void run() throws RepositoryException
{
List<NodeData> persistedItemList =
CacheableWorkspaceDataManager.super.getChildNodesData(parentData,
new ArrayList<QPathEntryFilter>(uncachedPatterns));
if (persistedItemList.size() > 0)
{
NodeData parent = (NodeData)getItemData(parentData.getIdentifier());
if (parent != null)
{
// filter nodes list for each exact name
Iterator<QPathEntryFilter> patternIterator = uncachedPatterns.iterator();
while (patternIterator.hasNext())
{
QPathEntryFilter pattern = patternIterator.next();
@SuppressWarnings("unchecked")
List<NodeData> persistedNodeData = (List<NodeData>)pattern.accept(persistedItemList);
if (pattern.isExactName())
{
if (persistedNodeData.isEmpty())
{
cache.put(new NullNodeData(parentData, pattern.getQPathEntry()));
}
else
{
cache.put(persistedNodeData.get(0));
}