Tree - развернуть все родительские узлы искомого

Все добрый день.
Такой вопрос.

Как мне найти в дереве необходимую ветку?
Для этого нужно делать обход всего дерева или есть какое-то более подходящее решение?

Метод, который заполняет контейнер


	public void put(DBCursor data, TreeRec parent) {
		// карта для хранения записей с ключем rn,
		// для быстрого доступа к ним
		HashMap<String, TreeRec> dataMap = new HashMap<String, TreeRec>();

		for (int i = 0; i < data.getRecCount(); i++) {
			TreeRec rec = new TreeRec(data, i);
			dataMap.put(rec.getRn(), rec);
			this.addItem(rec);
			this.getItem(rec).getItemProperty("name").setValue(rec.getMnemo());
			// Если у записи есть rp, значит узел не корневой
			if (dataMap.containsKey(rec.getRp())) {
				// устанавливаем родителя записи
				this.setParent(rec, dataMap.get(rec.getRp()));
				// если rt = 1, значит это пользователь
				if (rec.getRt() > 0) {
					this.getContainerProperty(rec, "icon").setValue(new ThemeResource("../runo/icons/16/user.png"));
					// у пользователя не может быть дочерних узлов
					this.setChildrenAllowed(rec, false);
				} else { // иначе, каталог
					this.getContainerProperty(rec, "icon").setValue(new ThemeResource("../runo/icons/16/folder.png"));
				}
			} else { // иначе узел корневой
				this.setParent(rec, null);
				this.getContainerProperty(rec, "icon").setValue(new ThemeResource("../runo/icons/16/folder.png"));
			}
		}
	}

в TreeRec хранятся данные персоны (из БД)


	protected String rn;
	protected String rp;
	protected Integer rt;
	protected String mnemo;
	protected Integer level;

Дерево


	setContainerDataSource(container);
	setItemCaptionPropertyId("name");
	setItemIconPropertyId("icon");
	setImmediate(true);

В приложении у меня есть текущий пользователь. Я получаю его rn - Application.getUser().getRn().
Теперь мне в дереве нужно найти персону, с таким-же значением rn. Выбрать ее. И развернуть дерево до этой персоны.

Пока я вижу только вариант обхода всего дерева и поиска необходимой мне персоны. Затем повторный обход дерева, в котором всех родителей персоны я помещаю в LinkedList. Ну и напоследок цикл по коллекции и expandItem(TreeRec).

Интересует, как это можно сделать наименее затратно, т.к. дерево может быть очень большим.

Во вложении дерево, каким оно должно быть после всех этих действий.
12279.png

В общем, пока сделал так, как написал выше.



	// дерево
	TreeRec item = getItemIdByRn(app.getUser().getPersRN(), "_");
	LinkedList<TreeRec> list = getParentItemIds(item, null);
	select(item);

	Iterator iter = list.iterator();
	while (iter.hasNext()) {
		expandItem(iter.next());
	}


	/**
	 * Получить ItemId дерева по RN
	 * @param rn
	 * @param prefix - $-для каталогов, _-для персон, null-префмкс не используется
	 * @return ItemId или null
	 */
	public TreeRec getItemIdByRn(String rn, String prefix) {
		if (prefix != null) {
			rn = prefix + rn;
		}

		Iterator iter = ((Collection<TreeRec>) getItemIds()).iterator();
		while (iter.hasNext()) {
			TreeRec rec = (TreeRec) iter.next();
			if (rn.equals(rec.getRn())) {
				return rec;
			}
		}

		return null;
	}

	/**
	 * Получить список всех родителей текщего узла.
	 * Рекурсивная функция.
	 * @param itemId
	 * @param list
	 * @return
	 */
	public LinkedList<TreeRec> getParentItemIds(TreeRec itemId, LinkedList<TreeRec> list) {
		if (list == null) {
			list = new LinkedList<TreeRec>();
		}
		list.addFirst(itemId);

		if (itemId.getRp() != null) {
			TreeRec rec = getItemIdByRn(itemId.getRp(), null);
			getParentItemIds(rec, list);
		}

		return list;
	}

Все работает. Но работает нормально, пока дерево маленькое.

Дерево должно использовать иерархический контейнер, который ты заполняешь.
Для поиска айтема в виде сотрудника - используй фильтр.
Например:

сontainer.addContainerFilter(new Compare.Equal(propertyid, value));

При нахождении нужного айтема он раскроет все дерево вплоть до искомого.