use of org.polymap.core.runtime.cache.CacheLoader in project polymap4-core by Polymap4.
the class ContentManager method checkInitContent.
/**
* Initialize the content tree up to the given path, including the children of
* the last node.
*
* @param path
* @return
*/
private CachedNode checkInitContent(IPath path) {
assert path != null;
IPath initPath = rootNode.getPath();
CachedNode lastResult = null;
for (int i = -1; i < path.segmentCount(); i++) {
// first loop for the root
initPath = (i >= 0) ? initPath.append(path.segment(i)) : initPath;
// check cache expiration
if (lastResult != null) {
IContentNode node = lastResult.get(initPath.lastSegment());
if (node instanceof IContentFolder && !node.isValid()) {
invalidateFolder((IContentFolder) node);
}
}
// get/create
lastResult = nodes.get(initPath, new CacheLoader<IPath, CachedNode, RuntimeException>() {
private int memSize = 1024;
@Override
public CachedNode load(IPath key) throws RuntimeException {
CachedNode result = new CachedNode();
for (IContentProvider provider : providers) {
List<? extends IContentNode> children = provider.getChildren(key);
if (children != null) {
for (IContentNode child : children) {
IContentNode old = result.put(child.getName(), child);
if (old != null) {
log.warn("!!! Child node name already exists: " + child.getName() + "!!!");
}
memSize += child.getSizeInMemory();
}
}
}
return result;
}
@Override
public int size() throws RuntimeException {
return memSize;
}
});
}
return lastResult;
}
Aggregations