Помогите С Чтением Стэка, Пож-та...

savl

Lotus team
28.10.2011
2 136
105
#1
Доброго времени суток...

Надо было нам сделать popup меню для лотуса на основе Java, из-за ее кроссплатформенности. Только Windows есть, но этого мало.
Сделал класс на Java, все работает через Eclipse, вставил данный класс в лотус библиотеку, которую положил в базу.
Сделал класс-прослойку на лотусе, который написан на LS с использываением обращений к Java, что и есть LS2J.
Сделал кнопку во вьюшке, на которую повесил создание класса и вызов метода Show.

Ошибка при нажатии на кнопку:
java.security.AccessControlException: Access denied (java.awt.AWTPermission watchMousePointer)
Java:
at java.security.AccessController.checkPermission(AccessController.java:108)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:544)
at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.java:1449)
at COM.ibm.JEmpower.applet.AppletSecurity.checkAWTPermission(AppletSecurity.java:1191)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1605)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
at java.awt.MouseInfo.getPointerInfo(MouseInfo.java:73)
at menu.Show(menu.java:144)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectInvoker.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:611)
at lotus.domino.JavaConnectLoader.invoke(Unknown Source)
Я так понимаю, что ошибка происходит при получении координат указателя мыши. У меня это в классе есть, из eclipsa работает, что полагаю совершенно нормально...
по этой строке: at menu.Show(menu.java:144) вызывается:
Java:
Point location = MouseInfo.getPointerInfo().getLocation();
Как мне прописать "доверенность" этому методу для лотуса?
И как мне правильно сделать вызов метода через LS2J? сейчас я использую Invoke, для предварительно полученного метода.
 

Кирилл Шваб

Well-known member
30.06.2006
145
4
#2
Привет, тебе надо добавить разрешение на данный метод в java.policy.

Ознакомься с этим:
IBM Technote: Security exceptions are encountered when developing Java agents

Если захочешь изучить более подробно, то почитай про модель безопасности в Java:
Java - Security and Permissions


Кстати, вопрос знатокам. В Лотусе есть два файла java.policy:

1. {notes.home}\java.policy
2. {notes.home}\jvm\lib\security\java.policy

По идее тот, который в jvm\lib\security - это системный файл (а ля общие настройки), а который в корне лотусовой директории - пользовательские разрешения.

Вопрос, загружаются ли по умолчанию пользовательские разрешения при старте клиента, или надо чтобы обязательно в командной строке (в свойствах ярлыка, запускающего клиент) было указано ...java.policy=${notes.home}/java.policy?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#3
как оно ругаецо так и...
добавить в секцию grant
java.awt.AWTPermission watchMousePointer
где искать Кирилл Шваб ответил
 

savl

Lotus team
28.10.2011
2 136
105
#4
Так и думал, но не знал где именно прописать.
Спасибо, помогло.

Кирилл Шваб:
Судя из содержания файла 1. {notes.home}\java.policy там прописываются разрешения только для eclipse плагина, а все остальные прописаны в 2. {notes.home}\jvm\lib\security\java.policy. Предполагаю, что пользовательский файл не даст сильного эффекта, но я в этом деле новичок могу ошибаться.
 

savl

Lotus team
28.10.2011
2 136
105
#5
Создание файла по пути, с содержанием как в java.policy + свои модификации, решает проблему разрешений.
После апдейта не затирается, разворачивать гораздо удобнее на клиентах.
${user.home}/.java.policy
Имя файла именно такое, с точкой вначале
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#6
user.home - этож реальный профайл пользователя, нотусня туды смотрит?
 

savl

Lotus team
28.10.2011
2 136
105
#7
@lmike, проверил на 7-ке и MacOS.
Как показала практика - смотрит,
Для просмотра контента необходимо: Войти или зарегистрироваться

Кстати, знаю есть переменная в notes.ini для указания java классов пользователя.
Если их так же развернуть в "профайл" и затем прописать в ini пути, то возможно тоже будет работать, но пока еще не проверял.
 
Симпатии: Понравилось lmike

savl

Lotus team
28.10.2011
2 136
105
#8
Если их так же развернуть в "профайл" и затем прописать в ini пути, то возможно тоже будет работать, но пока еще не проверял.
@lmike, проверил
Если в ${user.home}/ создать папку и положить туда jar, затем прописать в Notes.ini путь к этой папке, то все jar подгрузятся в лотус.
Я делал так:
сделал папку LotusJavaLibs, полный путь: ${user.home}/LotusJavaLibs
Сделал 2 записи в notes.ini:
XOM_JAR_DIR=C:\Users\dcs-alesh\LotusJavaLibs\xom-1.2.10.jar
JavaUserClassesExt=XOM_JAR_DIR

Перезагрузил клиента
Библиотеки подтянулись.

Почему я использовал JavaUserClassesExt вместо JavaUserClasses?
Чтобы стандартный путь к \java\lib\ext не терялся

Так же зачем писать отдельно путь к JAR?
Потому что длина сроки в ini ограничена, а путем отдельных переменных можно писать сразу несколько пакетов:
Пример:
XOM_JAR_DIR=C:\Users\dcs-alesh\LotusJavaLibs\xom-1.2.10.jar
JXL_JAR_DIR=C:\Users\dcs-alesh\LotusJavaLibs\jxl.jar
JavaUserClassesExt=XOM_JAR_DIR; JXL_JAR_DIR
На *nix разделитель будет : а не ;
Минус использования JavaUserClassesExt : необходимо указывать путь и имя jar иначе не сработает (по крайней мере я не смог найти решение)
С другой стороны очень удобно проверять версии пакетов.
Еще минус такой конструкции: нельзя задать путь к профайлу через системную переменную:(
на Win вот так не сработало: JXL_JAR_DIR=%UserProfile%\LotusJavaLibs\jxl.jar
Что логично, платформа может быть разной...
Надо указывать полный путь.
Но, опять же, можно задать переменную в ini и так же её использовать. (простите не проверял, но думаю что работает)
Итого:
1. Можно разворачивать пакеты jar на клиентах, помещая их в папку в профайле пользователя.
Доступ на запись в папку есть всегда.
2. Можно менять разрешение для выполнения java кода, опять же создавая/копируя файл в профайл пользователя
3. Можно отслеживать версии пакетов.
4. Написать Java агент для развертывания очень просто.
5. ...
6. PROFIT!!!
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#9
XOM_JAR_DIR=C:\Users\dcs-alesh\LotusJavaLibs\xom-1.2.10.jar
JavaUserClassesExt=XOM_JAR_DIR
я этим давно пользовался, но указание jar меня коробит...

и все-таки я склоняюсь к использование плагинов, но пока еще не занялся
 

savl

Lotus team
28.10.2011
2 136
105
#11
Еще фишка, поставил на чистого клиента FP4 - папку jvm снесло подчистую
 

garrick

Lotus team
26.10.2009
899
61
#12
Еще фишка, поставил на чистого клиента FP4 - папку jvm снесло подчистую
Что-то где-то покривилось, такого быть не должно, JVM обновляется, но не удаляется совсем. Видать в процессе обновления JVM что-то сломалось. После FP4 Java становится 1.8.0_45.
 

savl

Lotus team
28.10.2011
2 136
105
#13
@garrick,
Со второго раза встал нормально.
хм.. как проверить версию?
я пока нашел только:
java.fullversion=JRE 1.6.0 IBM J9 2.4 Windows 7 x86-32 jvmwi3260sr16fp4-20150406_242976 (JIT enabled, AOT enabled)
J9VM - 20150406_242976
JIT - r9_20150402_88984
GC - GA24_Java6_SR16_20150406_1410_B242976

java.vm.info=JRE 1.6.0 IBM J9 2.4 Windows 7 x86-32 jvmwi3260sr16fp4-20150406_242976 (JIT enabled, AOT enabled)
J9VM - 20150406_242976
JIT - r9_20150402_88984
GC - GA24_Java6_SR16_20150406_1410_B242976

java.runtime.version=pwi3260sr16fp4-20150414_01 (SR16 FP4)
[DOUBLEPOST=1435142466,1435142444][/DOUBLEPOST]а настройка JavaUserClassesExt так и не заработала
 

garrick

Lotus team
26.10.2009
899
61
#14
Обманул. У меня на java -version не та Java отозвалась. :(
Вот правильный вариант.

Код:
java version "1.6.0"
Java(TM) SE Runtime Environment (build pwi3260sr16fp4-20150414_01(SR16 FP4))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Windows 7 x86-32 jvmwi3260sr16fp4-20150406_242976 (JIT enabled, AOT enabled)
J9VM - 20150406_242976
JIT - r9_20150402_88984
GC - GA24_Java6_SR16_20150406_1410_B242976)
JCL - 20150413_01
Но так даже и лучше, а то ломай потом голову будет оно работать на 8.5 или нет.
 

savl

Lotus team
28.10.2011
2 136
105
#15
Кто-нибудь может помочь по поводу JavaUserClassesExt и JavaUserClasses?
У меня не работает ни одна из настроек.
В чем может быть дело?
[DOUBLEPOST=1435219190,1435219154][/DOUBLEPOST]Может я не один такой и это отключили?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#16
м.б. в доступе к нек. частям винды
у виндядки нек каталоги не совсем каталоги ;), что может воспринимается не правильно сторонними приложениями
причем они это ломают от версии винды (патчи)
[DOUBLEPOST=1435228451,1435228350][/DOUBLEPOST]+ может оказаться что ини файл берется не тот, кот. правишь ;) (тоже из-за виндяткиных закидонов, с виртуалсторадж)
 

savl

Lotus team
28.10.2011
2 136
105
#17
@lmike, ini тот, это проверил.
на этот каталог есть доступ - могу туда писать и читать оттуда.
Если менять на C:\Java\ тоже не фурычит... будто отключили настройку.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#18
могу туда писать и читать оттуда
пользователь - это не программа
читать чере проводник - это не = читать и из программы

Если менять на C:\Java\ тоже не фурычит... будто отключили настройку.
а это уже странно
может в java секурити что-то случилось?
[DOUBLEPOST=1435236578,1435236506][/DOUBLEPOST]в консоле жвм есть что-то странное? кроме как не нашла класс...
[DOUBLEPOST=1435236612][/DOUBLEPOST]ну и еще момент - если на др. компе и с др. версией нотусни?
[DOUBLEPOST=1435236902][/DOUBLEPOST]
Сейчас поставил чистый клиент - аналогично, не подтянулись библиотеки.
это в рантайме не работает или и в сборке проекта? Может пересобрать?
 

savl

Lotus team
28.10.2011
2 136
105
#19
это в рантайме не работает или и в сборке проекта?
Итак и эдак, файлов не видит.
Проверял через ProcessExplorer - библиотеки не загружены, хэндлов нет.

может в java секурити что-то случилось
в FP4 что-то включено было, но на чистом 901 тоже не заработала переменная.