Как найти все подпапки папки (просмотра) в Lotus Notes

Я использую Java-API для Lotus Notes / Domino. Мне нужно разместить документы Lotus внутри папок Lotus (представлений), которые организованы как папки в файловой системе.

Чтобы найти и при необходимости создать папку, я использую следующий код. Строка пути использует разделитель обратной косой черты (например, «TestFolder / SubFolder1 / SubSubFolder1». Папки создаются и отображаются в клиенте заметок, как и ожидалось.

View view = database.getView(path);
if (view == null) {
    db.enableFolder(path);
    view = db.getView(path);
}

Как мне найти все подпапки определенной папки?

Прямо сейчас я использую этот обходной путь. Имхо, это не очень приятно, потому что я всегда читаю ВСЕ каталоги. Когда структура станет больше, это, вероятно, повлияет на производительность.

List<View> result = new ArrayList<View>();
String prefix = getPath() + getSeparator();
for (Object obj : database.getViews()) {
    View view = (View)obj;
    if (view.isFolder()) {
        String path = view.getName();
        if (path.startsWith(prefix)) {
            String suffix = path.substring(prefix.length());
            if (suffix.indexOf(getSeparator()) == -1) {
                result.add(view);
            }
        }
    }
}

person christoph.keimel    schedule 26.03.2014    source источник
comment
Вложенные папки на самом деле не являются вложенными папками. На самом деле это просто плоская структура с соглашением об именах, которое создает иллюзию вложенных папок, поэтому способ, которым вы ее закодировали, является подходящим.   -  person Richard Schwartz    schedule 26.03.2014


Ответы (2)


К сожалению, действительно быстрого способа сделать это не существует. Если вам действительно нужна производительность, то единственный способ сделать ее значительно быстрее - это работать с NoteCollection-Class и получить все папки. Затем просмотрите NotesDocuments, представляющие папки, и прочтите элемент «$ Title». Вот пример кода для этого:

NoteCollection nc = database.createNoteCollection(false);
nc.setSelectFolders(true);
nc.buildCollection();
String id = nc.getFirstNoteID();
while (id.length() > 0) {
  String strFolderName = ""
  Document docFolder = database.getDocumentByID(strFolderId);
  strFolderName = docFolder.getItemValueString("$Title");
  if (strFolderName.startsWith(prefix)) {
     ....
  }
}

В моих тестах это было в 2-3 раза быстрее, чем при использовании метода getViews ().

person Torsten Link    schedule 26.03.2014
comment
Я согласен, что гораздо лучше использовать NoteCollection, но здесь есть пара проблем. Во-первых, вы можете использовать свойство SelectionFormula, чтобы найти папки с именами, соответствующими вашим критериям. Это избавляет вас от необходимости открывать каждую заметку при сканировании результатов, что дает вам большую скорость. Во-вторых, этот код неправильно называл Грузию подпапкой Geo. Вам нужны имена, начинающиеся с Geo \, а не только Geo. Примечание: при использовании формулы выбора старайтесь экранировать специальные символы \ и (двойные кавычки) дополнительным символом \. Имя папки, которое вы ищете, может содержать. - person Andre Guirard; 27.03.2014
comment
@AndreGuirard Как бы вы настроили SelectionFormula так, чтобы возвращались только папки с определенным префиксом? - person christoph.keimel; 28.06.2017

Код в OP в порядке, за исключением того, что разделителем всегда будет «\» - он не зависит от ОС, поэтому нет необходимости в вызове getSeparator. Вы также можете на всякий случай использовать сравнение имени папки без учета регистра.

МЕНЬШЕ эффективно использовать для этого NoteCollection, потому что он сканирует все заметки в базе данных, включая все документы, тогда как database.getViews использует коллекцию проектов, чтобы быстро сузить ее до простого просмотра заметок.

Раньше было неэффективно обращаться к свойствам объекта View только для того, чтобы проверить, является ли это представление, которое вас интересует, потому что это обновляло бы индекс представления. Но в последних версиях Notes это уже не так. Независимо от того, сколько у вас просмотров, просмотр коллекции, возвращаемой getViews, дает хорошую производительность.

person Andre Guirard    schedule 29.06.2017