Перебор списка агентов выдает ошибку

У меня есть этот код на кнопке действия, которая должна просто запускать агентов и отключать все запланированные агенты:

   var agentList:Array = database.getAgents();
   3: for (var n=0 ; n < agentList.length; ++n ){
   4:   var name:string = agentList[n];
   5:   dBar.info(name,"Agent Name ");
   6:   var ag:NotesAgent = database.getAgent(name);
   7:   dBar.info(ag.getName());
   8:   if (ag.isEnabled()){
   9:       dBar.info(ag.getName(),"Is Enabled ");
  10:       ag.isEnabled() = false;
  11:   }
  12: }

Проблема в том, что когда я запускаю его, я получаю эту ошибку:

Ошибка при выполнении выражения действия JavaScript Ошибка интерпретатора сценария, строка = 6, столбец = 38: [TypeError] Метод NotesDatabase.getAgent(lotus.domino.local.Agent) не найден или недопустимые параметры

Я знаю из dBar, что имя на самом деле является именем первого агента в списке и представляет собой строку. Но может показаться, что он обрабатывает строку имени как lotus.domino.local.agent.

Я упускаю что-то действительно очевидное? У меня есть доступ менеджера к базе данных, и я даже установил максимальный доступ в Интернет для менеджера.


person Bill F    schedule 11.04.2014    source источник


Ответы (4)


@BillF: ссылаясь на ваши комментарии к ответу @TimTripcony:

а) Структуру языка LotusScript нельзя сравнивать с тем, что мы имеем с SSJS: LS является близким родственником VisualBasic, допускающим чтение/запись свойств, тогда как SSJS имеет более близкое отношение к Java, где у нас обычно есть отдельные методы для чтения и изменения свойств.

б) Я думаю, вы правы, сомневаясь в своем подходе к разрешению манипулирования элементом дизайна через http. Возможным подходом может быть написание агента LS на стороне сервера для выполнения вашей задачи, которая затем может быть запущена из вашего кода SSJS. Возможно, потребуется использовать sessionAsSigner, чтобы правильно запустить агент, и, конечно же, вам нужно убедиться, что это может сделать только администратор.

person Lothar Mueller    schedule 13.04.2014
comment
На самом деле у меня есть довольно много библиотек LS, которые я вызываю и запускаю из SSJS, используя запуск на сервере, потому что процесс должен работать с высоким уровнем доступа, а также с возможностью удаления документа. Так что ваше предложение, вероятно, является ответом. Я просто не ставил его вместе с этой функцией. - person Bill F; 13.04.2014
comment
Я создал агент LS, который делает это, и я вызываю его через runOnServer, и он отлично работает. - person Bill F; 17.04.2014

database.getAgents() возвращает список агентов, а не список имен агентов. Принуждая name к string, вы можете убедить панель инструментов отладки сообщить вам, что это строка, но это не должно быть так.

Попробуй это:

var agentList = database.getAgents();
for (var n = 0; n < agentList.length; n++) {
    var eachAgent = agentList[n];
    if (eachAgent.isEnabled() {
        dBar.info(eachAgent.getName(), "Is Enabled");
        eachAgent.setEnabled(false);
    }
}

Обратите особое внимание на замену setEnabled() в последней строке if...

person Tim Tripcony    schedule 11.04.2014
comment
В gelp написано, что isEnabled доступен для чтения-записи, но это не так. Когда я изменяю JS на указанное выше, он терпит неудачу в eachAgent.setEnabled(false) с ошибкой Ошибка интерпретатора сценария, строка = 5, столбец = 27: [TypeError] Возникло исключение, вызывая метод NotesAgent.setEnabled (boolean) null - у меня есть Менеджер прямо в БД, так что я действительно запутался сейчас. - person Bill F; 13.04.2014
comment
Свойство enabled доступно для чтения и записи: isEnabled() — чтение, setEnabled(boolean) — запись. Однако для переключения свойства enabled требуется как минимум доступ Designer... по умолчанию максимальным уровнем ACL при доступе к приложению из браузера является Editor. Проверьте расширенный раздел списка управления доступом приложения, чтобы убедиться, что максимальный уровень — не ниже Designer. - person Tim Tripcony; 13.04.2014
comment
Написал это в LS, и он работает isEnabled в LS для чтения / записи: Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase If IsArray(db.Agents) Then ForAll a In db.Agents If a.trigger = 1 then If a.isEnabled Then a.isEnabled = false a.save End If End if End ForAll End If End Sub Мне нужно было сначала проверить свойство триггера, иначе он потерпел неудачу на паре агентов в списке. - person Bill F; 13.04.2014
comment
Поэтому я изменил код JS на это, но он даже не будет выполняться: var agents = database.getAgents().iterator(); while (agents.hasNext()) { var thisAgent:NotesAgent = agent.next(); если (thisAgent.TRIGGER_SCHEDULED){ если (thisAgent.isEnabled()){ thisAgent.setEnabled(false); этотАгент.сохранить(); } } thisAgent.recycle(); } - person Bill F; 13.04.2014
comment
пс. У меня есть права менеджера на БД, и Интернет Макса также является менеджером. Когда я запускал агент LS, конечно, я работал как клиент Notes. Я не считаю, что это хорошая безопасность, если для доступа в Интернет задано значение Designer или Manager, поэтому я не уверен, как обойти эту часть проблемы. - person Bill F; 13.04.2014

В языке LotusScript Notesdatabase.Agents возвращает массив объектов NotesAgent.

Я никогда раньше не пробовал работать с SSJS, но в справке SSJS Domino Designer для метода database.getAgents() сказано следующее (см. Справочник IBM Domino Designer XPages > Domino > NotesDatabase (JavaScript)):

Синтаксис
getAgents() : java.util.Vector

Использование Элементы возвращаемого вектора имеют тип NotesAgent.

и в следующем примере итератор java используется для циклического просмотра списка возвращаемых объектов агента (на самом деле выглядит точно так же, как ваша задача):

var agents = database.getAgents().iterator();
var list = "";
while (agents.hasNext()) {
    list = list + agents.next().getName() + "\n";
}
return list

Помощь дизайнера не так уж и плоха, на самом деле ;)

person Lothar Mueller    schedule 11.04.2014

КАК Тим написал, что вам нужно настроить, чтобы максимальное имя и пароль в Интернете ACL были установлены как минимум на Designer, иначе это не удастся.

Максимальный уровень безопасности в Интернете

person Fredrik Norling    schedule 13.04.2014
comment
Я не уверен, что это хороший вариант. Я предполагаю, что это открывает ряд возможных проблем с безопасностью. На самом деле для моего приложения я предпочитаю, чтобы доступ по умолчанию был не выше, чем Author, а затем я манипулирую полем авторов в зависимости от состояния документа. - person Bill F; 13.04.2014