Ls2j не находит метод

Тема в разделе "Lotus - Программирование", создана пользователем SkinGreek, 20 май 2008.

  1. SkinGreek

    SkinGreek Гость

    Всем привет, уже второй день воюю с лотусом. Силы на исходе...
    Сначала общая модель зависимостей
    - расшариная Java библиотека в которой определен набор необходимых Java классов
    - расшариная LS библиотека, выполняющая роль адаптора API Java классов и удобного для вызова из формы
    - собственно форма с обработчиком события нажатия на кнопку и вызовом адаптора
    Соотвественно инклуды идут снизу вверх
    В общем проблема в следующем на Java написан ряд классов для парсинга email строки в различных форматах InternetAddress ("Full Name" <email@test.ru>), X.400, etc. У них есть общий базовый абстрактный класс ContactParse.
    Код (Text):
    public abstract class ContactParser {
    static public ContactParser getInstance(String type) {
    if ("email".equals(type)) {
    return new EmailAddressParser();
    }
    return null;
    }

    public abstract Contact[] parse(String contact) throws AddressException;

    static public Contact[] parse(String contact, String type) throws AddressException  {
    ContactParser parser = ContactParser.getInstance(type);
    return parser.parse(contact);
    }
    }
    Сначало я собирался из LS вызывать getInstance и дальше парсить с помощью инстанции конкретного класса, но он пишет что объект не является классом ContactParser, хотя конкретный класс является наследником от ContactParser. Ну да ладно на это я забил, решил создавать конкретную инстанцию тоже в Java поэтому написал второй метод static public Contact[] parse(String contact, String type), но теперь он вообще не видит ни одного моего метода(выводит только методы класса Object). Причем объективных причин для этого нет.
    Под "не видит" я имею ввиду то, что метод не появляется в списке при выполнении следующего кода
    Код (Text):
    Set jParserClass = jSess.GetClass("parsers.ContactParser")
    Dim myMCollection As JavaMethodCollection
    Set myMCollection = jParserClass.getClassMethods()
    Print "--------------------------------------------------------------------"
    Forall m In myMCollection
    Print m.MethodName
    End Forall
    Вчера так же были странности с подключением библиотек. Как я понимаю лотус гдето чтото кеширует, но каким образом не ясно, в общем удаляю для теста из Options в LS библиотеки
    Код (Text):
    Use "my_java_classes"
    Uselsx "*javacon"
    и редактирую
    Код (Text):
    Print "---"
    он работает! и выводит измененный Print хотя до этого используются такие типы как JavaClass то есть по идее он должен был заругаться на стадии компиляции(что чаще всего и бывает), а вот вчера такого не происходило. К утру след дня у него это прошло, но появились новые задвиги
    Например неведомым образом появилась и исчезла ошибка "Type mismatch on external name: CONTACTPARSER" при следующем коде:
    при коде
    Код (Text):
    Dim parser As ContactParser
    ...
    Set parser = New ContactParser("email")
    С чем это связанно до сих пор не понятно...

    Скажите плз как с этой "слепостью" и подключенными "фантомами" бороться?
    Заранее спасибо за помощь
     
  2. SkinGreek

    SkinGreek Гость

    после глупых манипуляций.(удалением, переименованием библиотек и классов и прочими танцами с бубном, метод он всеж находит). но работать он всеж не хочет...
    Код (Text):
    jSess As JavaSession
    jParserClass As JavaClass
    jParseMethod As JavaMethod
    jContacts As Variant

    Set jParserClass = jSess.GetClass("parsers.ContactParser")
    Set jParseMethod = jParserClass.GetMethod("parse","(Ljava/lang/String;Ljava/lang/String;)[Lparsers/Contact;")      

    Set jContacts = jParseMethod.Invoke(, "test@test.ru", "email")
    на последней строке выдает ошибку Type mismatch
    Datatype возвращает 8739 то есть динамический массив элемент которого имеет тип - "Product object"
    Typename возвращает "Javaobject()"
    пробовал определить переменную jContacts и как "jContacts() As Javaobject" и как "jContacts List As Javaobject"
    Не ясно зачем введена типизация, если она так коряво работает

    Помогите плз, у меня уже фантазия кончается:)((
     
  3. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    посмотри хелп, например, по ключу LS2J extended example
    обрати внимание на порядок создания объектов
     
  4. SkinGreek

    SkinGreek Гость

    нет дело не в том как я не правельно работаю с LS2J.я прочитал доки, понял всю логику работы с ним, но такие задвиги как кеширование на каком то не понятном уровне мне совершенно не ясно.приведу еще пример.перемиенвал в Java класс ContactParser,смо собой все изменил в зависимых Java слассах.импортирую библиотеку подключаю - но вызывающий код
    Код (Text):
    Set jParserClass = jSess.GetClass("parsers.ContactParser")
    оставлю прежним.он работает как было, хотя такого класса уже нет. Причем если я как уже писал изменить внутри скрипта какой нить print, то он применит изменения(только LS скрипта старый Java класс он все так же будет находить)
    после неясных манипуляцый таких как:
    - нажал на кнопочку Sign
    - на библотеке Java потом подписал всю БД под серверным ID
    - закрыл все и нотес и админ и дизайнер.
    - переоткрыл
    изменения применились. как это понимать???:'((
    Где происходит кеширование? как сбросить закешированный use? или более того как сбросить закешированные настройки в секции лотусскрипта "Options"?
     
  5. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    конечно, только лохи читаю маны.. извините за оффтоп
    тестирование нужно производить в тех условиях, в которых работает обычный пользователь..
    никакого открытого дизайнера и хелпа.. библиотеки подгружаются при открытии баз
     
  6. SkinGreek

    SkinGreek Гость

    то есть при каждом изменении в библиотеке, если я хочу увидеть изменения мне надо все по закрывать? очень интересная логика...я встречал что надо сново откомпелировать и/или продеплоить, но чтобы переоткрывать клиента(Notes), который открывает в свою очередь БД чтобы обновить базу это уже не ясно...Еслибы он обновлял/загружал библиотеки хотябы при открытии БД(через меню File->DB->Open) это еще можно было понять...
    Признаюсь честно маны читаю не запоем, а как справочником пользуюсь, некоторых особенностей общей работы домино таким образом не знаю.про LS2J почитал, о логике его работы выяснил все - или может быть почти все, по данной трабле такого самом-собой не нашел, потому что это не в той тематике трабла. Но мне кажеться это не повод резюмировать мое незнание такой манипуляции как - "только лохи читаю маны":)
    Но всеж большое спасибо за помощь, и последняя просьба... не могли бы вы сказать как вы разрабатываете и отлаживаете код в LS библиотеке? неужели через удаленный раб стол перезапускаете Notes?
     
  7. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    клиент необязательно перезапускать.. но нередко бывают проблемы с библиотеками, поэтому приходится переоткрывать базу, если код библиотек используется в событиях в Other--Database resources--Database script, то 100% измененный там код будет работать только после переоткрытия бд..
    а причем тут удаленный рабочий стол ? стоит сделать копию с боевой бд на сервер или локально, где и отлаживать код на реальных данных..
    про отладку все как обычно..
    в каждой процедуре/функции включается обработчик ошибок, например в библиотеке
    Код (Text):
    Sub Initialize
    dim procID as string
    try:
    On Error Goto catch
    procID = "супер-либа"
    msgbox ReplaceSubstring("sdasdjaij", "j","W", procID )
    Exit sub
    catch:
    call errh(Getthreadinfo(1), procID, False)
    Exit sub
    end sub

    Function ReplaceSubstring(source As String, subString As String, newString As String, procID As String) As String  
    try:
    On Error Goto catch
    ReplaceSubstring = Implode(Split(source, subString ), newString )
    Exit Function
    catch:
    Call errh(Getthreadinfo(1), procID, False)
    ReplaceSubstring = source
    Exit Function
    End Function

    Sub ErrH(thread As String, procID As String, condition As Boolean) 
    %REM
    Вывод сообщения об ошибке    
    %END REM
    Dim msg As String
    msg = "Ошибка " + Cstr(Err) + ": " + Error + ", в строке " + Cstr(Erl) + " в процессе " + thread + " (" + procID  + ")"
    If condition Then
    Msgbox msg, 16, "Lotus Notes error"    
    Else
    Print msg      
    End If 
    End Sub
    после создания новой функциональности можно создать шаблон, с которого можно обновлять/заменять дизайн в боевой бд.. корректно обновлять дизайн можно только после того как в шаблоне было указано название шаблона и один раз дизайн был заменен с наследованием изменений с данного шаблона, в дальнейшем изменения можно обновлять
     
  8. SkinGreek

    SkinGreek Гость

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

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