ActiveMQ and Lotus Notes


Использование сервиса очередей в приложениях Lotus Notes и Lotus Domino значительно упрощают жизнь разработчикам.

Это позволяет изолировать приложения друг от друга, а так же интегрировать с другими платформами. Надежность и отказоустойчивость тоже играют большое значение, вы перекладываете на очереди заботу о доставке и сохранности вашего послания/транзакции или факта наступления события.

Ниже я приведу пример демонстрационного приложения которое имитирует работу универсального нумератора. Предположим, у Вас есть три приложения которым требуется уникальная нумерация своих событий (регистрация писем, событий в логе и т.д.). Приложение, делает запрос в очередь со своим идентификатором, это сообщение считывается программой нумератором, она обрабатывает запрос и выдает номер, размещая ответ в другой очереди, приложение уже ждет ответа и слушает эту очередь, как только в нее появится ответ, приложение считывает его и использует для своих нужд.

Кажется, что это все сложно, но вы изолируете друг от друга две системы, приложению не требуется права на запись в файл не надо заботиться о миграции подсистем, вы всегда можете переместить нумератор на другой сервер изменив запись в DNS.

Рецепт быстрого приготовления:

Скачайте ActiveMQ и установите на свой компьютер или сервер.

В настройках Lotus Notes необходимо разрешить выполнять java приложения в файле C:\Program Files\IBM\Lotus\Notes\jvm\lib\security\java.policy в самый конец файла добавьте:

grant { permission java.security.AllPermission; };

Скопируйте библиотеку C:\activemq\activemq-all-5.15.3.jar в C:\Program Files\IBM\Lotus\Notes\jvm\lib\ext

Перезапустите Lotus Notes, для того, чтобы заработала новая политика и загрузилась библиотека

Скачайте пример на Lotus Notes numerator

  1. Откройте приложение
  2. Перейдите в представление «Apps»
  3. Выделите настройку приложения «App2»
  4. Запустите агента «Actions->App->set app.in» для загрузки запроса номера из центрального «нумератора»
  5. Запустите агента «Actions->GetAgent» — он считывает запрос из очереди «app.in» находит по идентификатору приложения настройку в которой храниться последний выданный номер, получает следующий номер и размещает его в очереди «app.out»
  6. Выделите настройку «App2» и запустите агента «Actions->App->get app.out» который  считывает из очереди запись и записывает полученный номер в настройку.

http://activemq.apache.org/

Convert Lotus Document to HTML vs RTF


Как получить HTML из Lotus Notes документа не используя HTTP сервер.

Первое, мы создаем форму с одним полем «body» формата NotesRichtextItem в эту форму бы будем помещать образ документа командой  doc.Rendertortitem(rtRTF), а потом преобразуем полученный документ в HTML используя класс NotesMIMEEntity.

Очень важно, перед конвертацией отключить преобразование в MIME командой session.Convertmime = false

Ниже приводится часть кода по преобразованию и записи документа Lotus Notes в файл HTML.

Если вы используете в документе вычисляемые поля, то перед рендерингом, необходимо вычислить эти поля и вписать в документ переменные с готовым результатом. Порядок такой:

  1. Создаем временный документ
  2. Переносим все поля
  3. Вычисляем все временные переменные и записываем результат во временный документ
  4. Преобразуем документ командой doc.Rendertortitem

 

Dim session As New NotesSession

Dim doc As NotesDocument

session.Convertmime = False

 

Dim RTF As NotesDocument

Set RTF = session.Currentdatabase.Createdocument()

Dim rtRTF As NotesRichTextItem

Set rtRTF = New NotesRichTextItem(RTF,<em>"Body"</em>)

Call doc.Rendertortitem(rtRTF)

Call doc.Copyallitems(RTF, false) 'копировать все пересенные

Call RTF.Converttomime(<em>2</em>) 'конвертируем документв в HTML

Call RTF.Computewithform(False, False)

Call RTF.save(True,False)

Dim mime As NotesMIMEEntity

Set mime = RTF.Getmimeentity()

If Not mime Is Nothing Then

If mime.Contenttype=<em>"multipart"</em> Then

Dim out As NotesStream

Set out = session.Createstream()

Dim sFile1 As String

sFile1 = <em>"c:\\temp\\"</em>+RTF.Universalid+<em>".txt"</em>

If Not out.Open(sFile1) Then

Print <em>"Не могу создать файл"</em>

Exit Sub

End If

Dim sFile2 As String

sFile2 = <em>"c:\\temp\\"</em>+RTF.Universalid+<em>".html"</em>

Dim child1 As NotesMIMEEntity

Dim child2 As NotesMIMEEntity

Set child1 = mime.Getfirstchildentity()

While (Not child1 Is Nothing)

Call out.Writetext(child1.Contentastext(), <em>0</em>)

If child2 Is Nothing Then

Set child2 = child1.getNextSibling()

If Not child2 Is Nothing Then

Set child2 = child2.getNextSibling()

End If

End If

Set child1 = child2

Wend

Call out.Close()

Call DecodeFile(sFile1, sFile2)

End If

End If

session.Convertmime = True

В коде используется вызов  Call DecodeFile(sFile1, sFile2) из библиотеки. libMD5

Save Lotus Notes Document to HTML


Сохранить документ Lotus Notes в формат HTML не открывая документ на просмотр оказалось задачей нетривиальной.

Первая очевидная проблема — наличие вычисляемого текста и полей вычисляемых при открытии документа. Имеется несколько способов конвертации документа стандартными средствами:

  1. Использовать DXL преобразование;
  2. Использовать команду notesDocument .RenderToRTItem( notesRichTextItem )
  3.  Использовать Domino сервер скачав документ по HTTP

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

Рассмотрим третий вариант, при доступе к документу по HTTP выполняются все вычисления, но тут тоже есть момент, агент выполняется от имени того, кто его подписал, а следовательно если есть секции или поля вычисляемые на основании роли пользователя, то документ будет отображать неверно. Обычно, если планируют использовать архивирование, то при проектировании закладывают роль [AdminArchiv] для разрешения этой проблемы.

Для решения задачи получения документа по HTTP мы пишем java библиотеку. Одним из плюсов, это возможность использовать логин и пароль, что позволяет получить документ под разными уровнями доступа.

import java.io.*;
import java.net.*;
import sun.misc.BASE64Encoder;

public class GetHTML {

public String getHTML(String urlToRead, String username, String password) {
URL url; // The URL to read
HttpURLConnection conn; // The actual connection to the web page
BufferedReader rd; // Used to read results from the web page
String line; // An individual line of the web page HTML
String result = ""; // A long string containing all the HTML
try {
url = new URL(urlToRead);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

String userpass = username + ":" + password;

BASE64Encoder encoder = new BASE64Encoder();
String encodedStr = encoder.encode(userpass.getBytes());

String basicAuth = "Basic " + encodedStr;
conn.setRequestProperty ("Authorization", basicAuth);

rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
result += line;
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}

Далее пишем LotusScript агент

Use "GetHTML"

Sub Initialize
Dim js As JAVASESSION
Dim getHTMLClass As JAVACLASS
Dim getHTMLObject As JavaObject
Dim html As String
Dim url As String
Set js = New JAVASESSION
Set getHTMLClass = js.GetClass("GetHTML")
Set getHTMLObject = getHTMLClass.CreateObject

url = "http://server/replicid/0/" & doc.Universalid
html = getHTMLObject.getHTML(url, "UserName", "Password")

Dim fileNum As Integer
Dim fileName As String
fileName = "c:\\temp\\demo.html"
fileNum% = FreeFile()
Open fileName$ For Output As fileNum%
Print #fileNum%, html
Close fileNum%
End Sub

После получения HTML файла можно его преобразовать в PDF или отправить на хранение в архив.

Lotus и Anviz СКД


Для тех у кого на предприятии используется Lotus Notes и есть потребность в организации учета рабочего времени или контроле доступа в помещения.

Нам потребуется:

  1. биометрический датчик Anviz T5 стоимостью 7800 рублей
  2. контроллер управления дверными магнитами и задвижками SC011 стоимостью 2200 рублей
  3. магнит на дверь, ориентировочно 3000 рублей
  4. блок питания Uвх=220В AC, Uвых=12V DC(стабилизир.), Iвых =5.0 A примерно 2500 рублей
  5. кабель для соединения всего этого хозяйства и подключения датчика в вашу локальную сеть

Если устанавливать магнит нет необходимости, тогда все значительно упрощается. Магнит, контроллер и блок питания нам не потребуются.

После установки датчика мы добавляем пользователей с помощью мастер-карты или бесплатного ПО, поставляемого с датчиком.

Остается решить вопрос со сбором информации. Я написал приложение на Lotus с использованием Java API которое позволяет подключаться к датчику по локальной сети и скачивать информации о событиях, а потом стоить отчеты по каждому пользователю.

Для корректной работы Java агентов требуется внести изменения в java.policy который располагается по пути Lotus\Notes\jvm\lib\security

grant{
permission java.security.AllPermission;
};

Приложение рассчитано для работы с несколькими датчиками.

Скачать приложение

 

Интеграция Domino и сервис Яндекс.Касса


Для интеграции сервиса Яндекс.Касса с Lotus Domino я выбрал метод EMAIL, суть которого заключается в получении на электронную почту сообщений о поступлении денежных средств.

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

Агент, расшифровывает сообщение, потом разбирает его и создает документ в базе pays.nsf

Скачать текст агента