Ошибки обработки java-библиотек

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
создам топик для объединения ошибок связанных с обработкой библиотек (java) для платформы
в качестве затравки предлагаю рассмотреть библиотеку ICU
есть такая библиотека
а вот странное поведение её меня смущает...
возможно (я еще не тестил, сейчас - в библиотеке подключена) её надо помещать jvm/lib/ext...
но есть смутные воспоминания (да и по логике) - она уже д.б. в составе ibm jvm
теперь вопрос - как мне использовать именно её, ибо при использовании кода в дизайнере (запуска кода прям в нем) я получаю корректный результата, а вот из клиента (в варианте JS2J и java agent) - результат расстраивает
код
Java:
package org.icu.utils;

import java.util.Locale;

import com.ibm.icu.text.*;
//import com.ibm.icu.text.RuleBasedNumberFormat;
public class Conversion {
    private static final RuleBasedNumberFormat nf = new RuleBasedNumberFormat(new Locale("ru"),RuleBasedNumberFormat.SPELLOUT);
    public static String numberInFull(int num) {
        //NumberFormat nf = new RuleBasedNumberFormat(RuleBasedNumberFormat.SPELLOUT);
        String result = nf.format(num);
        System.out.println(result);
        return result;
    }
    public static String numberInFull(String snum) {
        int num=new Integer(snum);
        String result = nf.format(num);
        result = nf.format(num);
        System.out.println(result);
        return result;
    }

    public static void main(String[] args) {
        numberInFull(12342);
        numberInFull("42342");
    }
}
результат в дизайнере (по Run)
двенадцать тысяч триста сорок два
сорок две тысячи триста сорок два
в клиенте
двеннадцать тысяча три сто сорок два
сорок два тысяча три сто сорок два
код агента (LS2J дает все тоже)
Java:
import lotus.domino.*;
import org.icu.utils.*;
public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();

          // (Your code goes here)
          Conversion.main(new String[]{""});
      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}
[doublepost=1503495315,1503338421][/doublepost]таки положил jvm/lib/ext - и стало работать "правильно"
НО заметил еще одну особенность - LS2J будет работать при отсут. (в jvm/lib/ext) либе (если уже скомпилирована нотусовая библиотека, в присутствии оной), а вот агент - нет
что наводит на прежде высказанную мысль в нотусятине есть эта библиотека, но только лохматой версии
и таки есть в Notes\osgi\rcp\eclipse\plugins
com.ibm.icu.base_3.8.1.v20080530.jar
com.ibm.icu_3.8.1.v20120530.jar
почему отрабатывается путь в LS2J, но не отрабатывается в агенте - вопрос
проверять, оно ли вызывается, не стал
 
K

Kee_Keekkenen

вероятно, есть разница в связывании кода с внешними библиотеками..
в LS2J это связывание, вероятно, статическое (соответственно и java байт код внешней библиотеки вставляется в LS2J агент/библиотеку), а в агенте это связывание динамическое, и не важно, где находится внешняя библиотека (в базе или на сервере)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
в LS2J это связывание, вероятно
схема выглядит так:
-есть библиотека в нотусне, java
-есть внешняя библиотека
-библиотека компилировалась при присутствии внешней
-внешняя была удалена
т.о. код перестанет работать вообще, если в classpath не найдется замещения, НО замещение находится только в случае с LS2J
т.е. пути поиска отличаются и класслоадеры (а они точно разные) отрабатывает ситуацию по-разному
возможно, подобным хаком можно устанавливать либы через upateSite и юзать из агентов, через LS2J
т.е. мечта писать код один раз (для хэпагов/osgi/агентов) нет так далека...
вот в чем фокус ;)
хотя - все еще надо проверять и проверять
и да - у java нет статического связывания ;), если я правильно понял вашу интерпретацию этого термина
[doublepost=1503569732,1503569297][/doublepost]чтобы развеять ваш "возможно" окончательно:
Visual Basic:
%REM
*********************************************
    Library LS2Jutils
    Created Aug 21, 2017 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Library
%END REM
Option Public
Option Declare
Use "ErrorHandling"
Use "ICU"
%REM
http://site.icu-project.org/download/59#TOC-ICU4J-Download
RuleBasedNumberFormat nf = New RuleBasedNumberFormat(Locale.forLanguageTag("ru"),
        RuleBasedNumberFormat.SPELLOUT);
System.out.println(nf.format(1234567));
%END REM
Const JCONVERSION_CLASS={org/icu/utils/Conversion}

%REM
*********************************************
    Class Conversion
    Description: Comments for Class
%END REM
Class Conversion As ErrorHandlerWJ
    jclass As Javaclass
    jobject As Javaobject
    %REM
    *--------------------------------------------
        Sub New
        Description: Comments for Sub
    %END REM
    Sub New()
        Dim routineName As String
        routineName="New"
        On Error GoTo ErrH
        'your code here
        Set jclass=jsession.Getclass(JCONVERSION_CLASS)
        Dim sarr(1) As String
        sarr(0)={}
        Call jclass.main(sarr)
        'Set me.jobject=jclass.Createobject()
Quit:
    Exit Sub
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Sub
    %REM
    *--------------------------------------------
        Property Get Convert
        Description: Comments for Property Get
    %END REM
    Property Get Convert(num As String) As String
        Dim routineName As String
        routineName="Convert"
        On Error GoTo ErrH
        'your code here
        Convert=me.jclass.numberInFull(num)
Quit:
        Exit Property
ErrH:
        Error Err, RaiseError
        Resume Quit
    End Property
End Class
сплошной рантайм и даже намека нет на к-л статическое связывание
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
Этот файл icu4j.jar лежит в папке Notes\ndext. Всё, что лежит в этой папке доступно клиенту в run-time, но недоступно дизайнеру. Фот такая фигня... Зато я всегда знаю, что у каждого клиента есть своя правильная версия SWT :)
[doublepost=1503582859,1503581940][/doublepost]Да... беда...
двеннадцать тысяча три сто сорок пять
o_O
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
вот не доступна, как оказалось, в агенте, а в LS2J - доступно
но я грешил на др. локацию и уже размечтался ;), но не тут-то было
[doublepost=1503597405,1503597308][/doublepost]
возможно, подобным хаком можно устанавливать либы через upateSite и юзать из агентов, через LS2J
т.е. мечта писать код один раз (для хэпагов/osgi/агентов) нет так далека...
опровержение
 

garrick

Lotus Team
26.10.2009
1 367
152
BIT
364
вот не доступна, как оказалось, в агенте, а в LS2J - доступно
Странно... у моих клиентов swt в агентах работает без проблем, а она лежит там же.
[doublepost=1503645296,1503644173][/doublepost]
[doublepost=1503582859,1503581940][/doublepost]Да... беда...o_O
А вот тут оно нормально всё переводит. Может версия какая-то старая, кривая в Лотусе? Тут https://github.com/multi-os-engine/icu/tree/master/icu4j есть исходники, можно поковырять.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
кривая в Лотусе?
именно про это и разговор, просто она не перешибается если использовать загрузку jar в проект (java библиотеку нотусни) и используется вместо загруженной
а вот когда кладешь в jvm/lib/ext - все норм
в этом и тонкость + различия в обработке JS2J и агентами (java) путей
 
Мы в соцсетях:

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