Lotus Script+java Agent

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#1
Никогда не имел дела с агентами и с джавой в лотусе, но жизнь заставила... И время поджимает, потому копаться по манам нет возможности. Так что заранее прошу извинить за ламерскую тему.

Ситуация такая. В лотус скрипте не получается сделать определенных задачь. но есть джавовское апи. На джаве я написал агент, который в целом выполняет все, что мне нужно. Но его надо красиво вставить в лотус. В идеале было бы так:
1. запускается код на лотус скрипте, выполняет последовательность действий.
2. этот же код запускает агент (было бы неплохо параметры передать в него. Есть ли такая возможность?)
3. после того, как джавовский агент выполнит работу, нужно вернуться в тот же код на ЛС и доделать работу.

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

Спасибо.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#3
2. непонятно - зачем агент
3. есть бридж LS2J - можно обмениваться инфой, хотя и с ограничениями (String, целочисленные типы, с плав. точкой)
 

Extraterrestrial

Well-Known Member
28.02.2008
266
0
#4
Никогда не имел дела с агентами и с джавой в лотусе, но жизнь заставила... И время поджимает, потому копаться по манам нет возможности. Так что заранее прошу извинить за ламерскую тему.

Ситуация такая. В лотус скрипте не получается сделать определенных задачь. но есть джавовское апи. На джаве я написал агент, который в целом выполняет все, что мне нужно. Но его надо красиво вставить в лотус. В идеале было бы так:
1. запускается код на лотус скрипте, выполняет последовательность действий.
2. этот же код запускает агент (было бы неплохо параметры передать в него. Есть ли такая возможность?)
3. после того, как джавовский агент выполнит работу, нужно вернуться в тот же код на ЛС и доделать работу.

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

Спасибо.
Видимо, web-сервисы Вам в этом помогут.
 

vincent_vega

Well-Known Member
Lotus team
02.04.2005
168
1
Украина, Киев
#6
Простенький пример:

Есть java библиотека в которой находится класс вот с таким методом

Код:
public static void sendMail(String subject, String body, String[] recipients)

Вот его вызов из LS:

Код:
Use "jMail"
Uselsx "*javacon"

Dim jSession As JAVASESSION
Dim jClass As JAVACLASS
Dim jMethod As JAVAMETHOD
Set jSession = New JAVASESSION ()
Set jClass = jSession.GetClass ("ua.com.orgname.Mail")
Set jMethod = jClass.GetMethod("sendMail", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V")

Forall st In Recipients
Dim sendto(0) As String
sendto(0)=st
Call	jMethod.Invoke(,Subj, MsgBody, sendto)
End Forall

Самое геморное это определение типов параметров
Код:
jClass.GetMethod("sendMail", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V")
Но если внимательно почитать хелп то методом проб и ошибок можно все запустить
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#7
в LS2J не надо определять для методов переменные - гиморно это :(
будет работать и так (ежели без хитростей типа массивов):

[codebox]Dim Math As MathClass

Class MathClass As ErrorHandlerWJ
Private CalcClass As JavaClass
Private CalcObject As JavaObject

Sub New()
On Error Goto errorhandler
Set CalcClass = jSession.GetClass("org.calc.util.Calc")
Set CalcObject = CalcClass.CreateObject
ExitFunction:
Exit Sub
errorhandler:
Call Me.RaiseError()
Resume ExitFunction
End Sub

Function Round(d As Double, decimalPlace As Integer)
Me.Round=CalcObject.round(d, decimalPlace)
End Function

Function RoundUp(d As Double, decimalPlace As Integer)
Me.RoundUp=CalcObject.roundup(d, decimalPlace)
End Function

Function RoundDown(d As Double, decimalPlace As Integer)
Me.RoundDown=CalcObject.rounddown(d, decimalPlace)
End Function

Function Ceiling(d As Double, decimalPlace As Integer)
Me.Ceiling=CalcObject.ceiling(d, decimalPlace)
End Function

Function Floor(d As Double, decimalPlace As Integer)
Me.Floor=CalcObject.floor(d, decimalPlace)
End Function
End Class[/codebox]
 

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#8
Спасибо всем за советы. LS2J мне полностью подходит. Единственный камень, в который сейчас уткнулся это создание из джавы лотусовской сессии. Можно ли ее как-то создать без параметров. т.е. пароля, имени пользователя и хоста.

Просто:

session = NotesFactory.createSession();

сессии не создает.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#9
если работа через бридж и не вызывает агентов (или это не внешняя ЖВМ) ничего не надо
зачем вам сессия?
 

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#10
все просто: есть джавовский класс

public class TestLS2J{
public void Run(String arg){
Session session=null;

try {
session = NotesFactory.createSession();
(и т.д.)
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.toString());
}
}
}

и есть скрипт, который использует этот класс:

Dim mySession As JavaSession
Dim myClass As JavaClass
Dim myObject As JavaObject
Set mySession = New JavaSession ()
Set myClass = mySession.GetClass("TestLS2J")
Set myObject = myClass.CreateObject
Call myObject.Run
(и т.д.)

так вот для работы мне в джаве нужна сессия и еще куча джаров, чтобы выполнить задачу.
а после ее выполнения нужно еще кусок на ЛС выполнить...

Так вот
session = NotesFactory.createSession();
выкидывает эксепшн cannot create a session from an agent
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#11
мил человек - в агентах все по-другому (и ЗАЧЕМ ОНИ ВАМ)
в агентах вот начало:
public class JavaAgent extends AgentBase {
public void NotesMain() {

try {
session = getSession();
 

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#12
Я подредактировал... Просто изначально кусок кода из агента скопировал и не заметил. А в агенте да, с сессией все порядке.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#13
я не понял - где агент?
Вы в LS агенте создаёте? - вы неправы
 

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#14
Нету агента. Изначально я хотел из ЛС запустить агента на джаве. Но идея с LS2J бриджем мне больше понравилась. Я переделал агент в обычный класс и пытаюсь в этом классе открыть сессию. В результате чего получаю ошибку.
Порыл по ней в сети и наткнулся на

http://www-10.lotus.com/ldd/nd6forum.nsf/5...06?OpenDocument

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#15
код, кот. у вас на джава вызывает внешние библы, ничего не знает о Домине...
так и зачем ему это знать?
общайтесь с ним стрингами и массивами стрингов (если надо будет)

и вот инфа - чтобы избежать доп. вопросов :(
http://www.keysolutions.com/NotesFAQ/canobjects.html
 
Y

Yakov

Гость
#16
Если нужен доступ к NotesSession в коде Java, можно использовать Java-агент и вызывать его из LotusScript кода примерно так.
Код:
Dim session as New NotesSession
Dim database as NotesDatabase
Dim agent as NotesAgent
Dim parameterDocument as NotesDocument

Set database = session.CurrentDatabase
Set agent = database.GetAgent("(MyCoolJavaAgent)")
Set parameterDocument = database.CreateDocument
Call parameterDocument.ReplaceItemValue("Parameter1", parameter1)
...
Call agent.Run(parameterDocument.NoteID)

result = parameterDocument.GetItemValue("Result")(0)
...
Call parameterDocument.Remove(True)
В Java-агенте получаете NoteID документа-параметра (agentContext.getCurrentAgent().getParameterDocID()), по NoteID получаете документ, из него берете нужные данные. И в него же пишите результаты. Все предельно просто.
 

Xalet

Well-Known Member
08.08.2008
410
0
Вильнюс. Литва.
#17
код, кот. у вас на джава вызывает внешние библы, ничего не знает о Домине...
так и зачем ему это знать?
общайтесь с ним стрингами и массивами стрингов (если надо будет)
Спасибо за совет, так и сделал. Вроде всё работает. А сессию из джавы открыть хотел, чтобы переделываний из агента получилось по минимуму.