• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Изменялся Ли Документ

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Взять документ и сравнить с данными, которые есть в in-memory документе
 
D

Dragon108

Как определить перед записью документа изменялся ли он на сервере? Т.е. клиент открыл документ на редактирование и ушел, а в этот момент серверный агент его изменил. Как отказать в записи документа, когда юзер вернулся и жмет сохранить документ?


При сохранении брать текущий открытый док и бэкэндный по UNID и сравнить, не помогает?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
у Xpages основной документ - это in-memory. Т.е. это тот датасорс, который ты указываешь на странице.
Код:
document1
От этого датасорса берется докуметн, который на сервере.
Код:
document1.getDocument()
Т.е. document1 и document1.getDocument() могут отличаться.

Значит тебе можно сравнить
JavaScript:
if(document1.getItemValueString(item) != document1.getDocument().getItemValueString(item)){
...
}
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
А другого способа нет, не прогоняя все items?
getItemValueString не сравнит поля типа Data & Number. И как быть если поле в документ добавилось сервером? Т.е. придется прогонять все итемы и от документа у клиента и от документа на сервере, т.е. делать 2 цикла.
Хотя можно пойти другим путем, при открытии на редактирование запомнить @Modify, а при записи сравнить с @Modify на серваке. Если сошлись, то сохранять.

Во, точно.
В postOpenDocument пишем
Код:
viewScope["DateChange"] = currentDocument.getDocument().getLastModified()

В querySaveDocument
Код:
if (docMain.getDocument().getLastModified()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере.")
return false;
}

Конечно, стоит предусмотреть в названии переменной во viewScope UNID документа (если работаешь с несколькими датасоурсами), но это уже детали.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
не самое удачное решение.
Нужно копировать ключевые данные в память, а перед сохранением проверять.
Проверка по getLastModified ничего не решит.
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.
 
D

Dragon108

getLastModified изменяется. Проверил только что. Открыл xpages. В нем кнопка которая принтует на сервер currentDocument.getDocument().getLastModified()
Зашел тулзой (внешней) в этот же документ и пересохранил его. Нажал опять кнопку в xpages и отпринтовалось другое время.
Написать, то я написал, только не могу сохранить никуда getLastModified при открытии документа. Пока не понял почему.

А когда и куда пишете?

Data source мог еще не проинициализироваться - , но при записи в непроинициализрованный док вывалилась бы ошибка.

Если в бэкэндный док (document1.getDocument() или currentDocument().getDocument()), то не будет записываться, так как нужно сохранить док


Да и вообще, действительно, чем viewScope не устраивает?
 

KingGLEB

Active member
08.05.2008
30
0
BIT
0
Что то не захотел у меня viewScope в postOpenDocument сохранять NotesDateTime. Вернее сохранять сохранял, но значения его потом я так и не увидел.

Сделал так

postOpenDocument
Код:
viewScope.put("DateChange", currentDocument.getLastModified().toString())

querySaveDocument
Код:
if (currentDocument.getDocument().getLastModified().toString()!=viewScope["DateChange"]) {
print("Документ был изменен на сервере или другим пользователем.")
return false;
}
Вот так заработало как надо.

PS: вот почему как только напишешь на форум, так сразу и решение приходит?! :) А не пишешь, так в голову ничего не лезет. ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!