Lotus Script+java Agent

Тема в разделе "Lotus - Программирование", создана пользователем Xalet, 14 янв 2009.

  1. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Никогда не имел дела с агентами и с джавой в лотусе, но жизнь заставила... И время поджимает, потому копаться по манам нет возможности. Так что заранее прошу извинить за ламерскую тему.

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

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

    Спасибо.
     
  2. Yakov

    Yakov Гость

    См. Help notesAgent.Run( [ noteID$ ] )
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    2. непонятно - зачем агент
    3. есть бридж LS2J - можно обмениваться инфой, хотя и с ограничениями (String, целочисленные типы, с плав. точкой)
     
  4. Extraterrestrial

    Extraterrestrial Well-Known Member

    Регистрация:
    28 фев 2008
    Сообщения:
    267
    Симпатии:
    0
    Видимо, web-сервисы Вам в этом помогут.
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну это совсем издевательство :(
    человек хочет в одной сессии обработать данные с пом. LS и Java, а ты его толкаешь на веб-сервисы!
     
  6. vincent_vega

    vincent_vega Lotus team
    Lotus team

    Регистрация:
    2 апр 2005
    Сообщения:
    165
    Симпатии:
    1
    Простенький пример:

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

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

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

    Код (Text):
    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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    в 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]
     
  8. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Спасибо всем за советы. LS2J мне полностью подходит. Единственный камень, в который сейчас уткнулся это создание из джавы лотусовской сессии. Можно ли ее как-то создать без параметров. т.е. пароля, имени пользователя и хоста.

    Просто:

    session = NotesFactory.createSession();

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    если работа через бридж и не вызывает агентов (или это не внешняя ЖВМ) ничего не надо
    зачем вам сессия?
     
  10. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    все просто: есть джавовский класс

    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
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    мил человек - в агентах все по-другому (и ЗАЧЕМ ОНИ ВАМ)
    в агентах вот начало:
    public class JavaAgent extends AgentBase {
    public void NotesMain() {

    try {
    session = getSession();
     
  12. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Я подредактировал... Просто изначально кусок кода из агента скопировал и не заметил. А в агенте да, с сессией все порядке.
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    я не понял - где агент?
    Вы в LS агенте создаёте? - вы неправы
     
  14. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Нету агента. Изначально я хотел из ЛС запустить агента на джаве. Но идея с LS2J бриджем мне больше понравилась. Я переделал агент в обычный класс и пытаюсь в этом классе открыть сессию. В результате чего получаю ошибку.
    Порыл по ней в сети и наткнулся на

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.080
    Симпатии:
    300
    код, кот. у вас на джава вызывает внешние библы, ничего не знает о Домине...
    так и зачем ему это знать?
    общайтесь с ним стрингами и массивами стрингов (если надо будет)

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

    Yakov Гость

    Если нужен доступ к NotesSession в коде Java, можно использовать Java-агент и вызывать его из LotusScript кода примерно так.
    Код (Text):
    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 получаете документ, из него берете нужные данные. И в него же пишите результаты. Все предельно просто.
     
  17. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Спасибо за совет, так и сделал. Вроде всё работает. А сессию из джавы открыть хотел, чтобы переделываний из агента получилось по минимуму.
     
Загрузка...

Поделиться этой страницей