private synchronized void addPathObjectsRecursively(PathObject pathObject, List<PathObject> pathObjects, Class<? extends PathObject> cls) { // Prefer to iterate through long lists and process as we go, rather than handle one object per method call addPathObjectsRecursively(Collections.singleton(pathObject), pathObjects, cls); }
private static void addPathObjectsRecursively(Collection<PathObject> pathObjectsInput, List<PathObject> pathObjects, Class<? extends PathObject> cls) { for (PathObject childObject : pathObjectsInput) { if (cls == null || cls.isInstance(childObject)) { pathObjects.add(childObject); } if (childObject.hasChildren()) addPathObjectsRecursively(childObject.getChildObjects(), pathObjects, cls); } }
public List<PathObject> getObjects(List<PathObject> pathObjects, Class<? extends PathObject> cls) { if (pathObjects == null) pathObjects = new ArrayList<>(); // If we want annotations, it can be much faster to get them from the tile cache than to sift through a potentially large number of detections if (PathAnnotationObject.class == cls && tileCache != null && tileCache.isActive()) { pathObjects.addAll(tileCache.getObjectsForRegion(cls, null, null, true)); return pathObjects; } addPathObjectsRecursively(getRootObject(), pathObjects, cls); return pathObjects; }
/** * Get all descendant objects with a specified type * * @param pathObject * @param pathObjects * @param type * @return */ public synchronized List<PathObject> getDescendantObjects(PathObject pathObject, List<PathObject> pathObjects, Class<? extends PathObject> cls) { if (pathObjects == null) pathObjects = new ArrayList<>(); if (pathObject == null || !pathObject.hasChildren()) return pathObjects; addPathObjectsRecursively(pathObject.getChildObjects(), pathObjects, cls); return pathObjects; }