Летающая тарелка в Lotus Notes

Я пытался конвертировать простые XHTML-файлы в PDF и использовал для этого Flying Saucer и iText. В Java это работало без проблем, однако, когда я попытался создать агент Lotus Notes с тем же кодом, я получил исключение, с которым не знаю, как поступить.

Код:

import lotus.domino.*;
import java.io.*;
import com.lowagie.text.DocumentException;
import org.xhtmlrenderer.pdf.ITextRenderer; 
import org.xhtmlrenderer.util.XRLog;
import java.util.*;

public class JavaAgent extends AgentBase {

    public void NotesMain() {

      try {
        Session session = getSession();
        AgentContext agentContext = session.getAgentContext();
        String received = agentContext.getDocumentContext().
             getItemValueString("Query_String");
        String[] split;
        split = received.split("&");
        String url = split[1];
        split = url.split("/");
        String outputFile = split[split.length-1];
        String direc = session.getEnvironmentString("Directory", true);
        outputFile = direc + "\\" + outputFile + ".pdf"; 
        OutputStream os = new FileOutputStream(outputFile);
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(os);
        os.close();
        System.exit(0);

      } catch(Exception e) {
        e.printStackTrace();
      }
   }
}

Это дает следующее:

05.09.2011 13:33:29 HTTP JVM: не удалось инициализировать конфигурацию библиотеки Flying Saucer. Сообщение: не удается найти ресурс для пакета java.util.PropertyResourceBundle, ключ access_properties_not_allowed

05.09.2011 13:33:29 HTTP JVM: java.util.MissingResourceException: не удается найти ресурс для пакета java.util.PropertyResourceBundle, ключ access_properties_not_allowed

05.09.2011 13:33:29 HTTP JVM: в java.util.MissingResourceException.(MissingResourceException.java:50)

05.09.2011 13:33:29 HTTP JVM: в java.util.ResourceBundle.getObject(ResourceBundle.java:400)

05.09.2011 13:33:29 HTTP JVM: в java.util.ResourceBundle.getString(ResourceBundle.java:421)

05.09.2011 13:33:29 HTTP JVM: в lotus.notes.JavaString.getString (неизвестный источник)

05.09.2011 13:33:29 HTTP JVM: в lotus.notes.AgentSecurityManager.checkPropertiesAccess (неизвестный источник)

05.09.2011 13:33:30 HTTP JVM: в java.lang.System.getProperties(System.java:323)

05.09.2011 13:33:30 HTTP JVM: в org.xhtmlrenderer.util.Configuration.loadSystemProperties(Configuration.java:419)

05.09.2011 13:33:30 HTTP JVM: в org.xhtmlrenderer.util.Configuration.(Configuration.java:147)

05.09.2011 13:33:30 HTTP JVM: в org.xhtmlrenderer.util.Configuration.instance(Configuration.java:742)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.Configuration.valueFor(Configuration.java:463)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.Configuration.isTrue(Configuration.java:709)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.XRLog.init(XRLog.java:250)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.XRLog.log(XRLog.java:203)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.XRLog.render(XRLog.java:194)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.util.XRLog.render(XRLog.java:190)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.layout.SharedContext.(SharedContext.java:107)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.pdf.ITextRenderer.(ITextRenderer.java:111)

05.09.2011 13:33:31 HTTP JVM: в org.xhtmlrenderer.pdf.ITextRenderer.(ITextRenderer.java:102)

05.09.2011 13:33:31 HTTP JVM: в JavaAgent.NotesMain(неизвестный источник)

05.09.2011 13:33:31 HTTP JVM: в lotus.domino.AgentBase.runNotes (неизвестный источник)

05.09.2011 13:33:31 HTTP JVM: в lotus.domino.NotesThread.run (неизвестный источник)

Оскорбительная линия

ITextRenderer renderer = new ITextRenderer();

Поиск в Google access_properties_not_allowed буквально ничего не дает.


person jmhajek    schedule 09.05.2011    source источник


Ответы (2)


1) Агенты в Notes/Domino имеют дополнительную функцию безопасности в свойствах агента, которая устанавливает уровень безопасности агента. По умолчанию этот параметр настроен на запрет операций с ограниченным доступом (значение по умолчанию — «Не разрешать операции с ограниченным доступом»).

Чтобы агент мог запустить свойство, для него должен быть задан один из следующих параметров:

«Разрешить ограниченные операции» «Разрешить ограниченные операции с полными правами администратора»

Свойство находится на второй вкладке, ключевой вкладке диалогового окна «Свойства агента».

2) Как уже объяснялась «дорога в ямбург», диспетчер безопасности JVM не разрешает доступ к свойствам системы, поскольку политика безопасности не разрешает это действие. Вы должны изменить политику безопасности виртуальной машины Java (JVM), чтобы разрешить доступ к системным свойствам. Для этого можно добавить строку "permission java.security.AllPermission;" в файл "/jvm/lib/security/java.policy" в каталоге Notes/Domino.

После внесения изменений файл java.policy будет выглядеть примерно так:

grant { 
    permission java.security.AllPermission;
    permission java.util.PropertyPermission "java.version", "read";
    permission java.util.PropertyPermission "java.vendor", "read";
    permission java.util.PropertyPermission "java.vendor.url", "read";
    permission java.util.PropertyPermission "java.class.version", "read";
    permission java.util.PropertyPermission "os.name", "read";
        // ... and so on ...
}

После перезапуска клиента/сервера любая программа Java, требующая доступа к System.getProperties(), теперь получит доступ.

person leyrer    schedule 10.05.2011
comment
Свойства агента были уже правы, но изменение политики данных сделало свое дело - спасибо (и дорога в yamburg) за совет. (Хотя каталог файла назывался Lotus/Domino) - person jmhajek; 10.05.2011
comment
@jmhajek Поэтому, пожалуйста, примите этот ответ как правильный, чтобы мы могли легко увидеть, что проблема решена. См. принятие ответов. ;) - person bluish; 24.05.2013
comment
разрешение java.security.AllPermission; собирается остановить всю безопасность на сервере. Насколько я знаю, самое меньшее, что вы могли бы сделать, это ограничить это одной базой данных. - person Andrew Magerman; 03.10.2013

Вероятно, это конфигурация безопасности:

XhtmlRenderer пытается прочитать свою конфигурацию из свойств системы:

09-05-2011 13:33:30 HTTP JVM: at java.lang.System.getProperties(System.java:323)
09-05-2011 13:33:30 HTTP JVM: at org.xhtmlrenderer.util.Configuration.loadSystemProperties(Configuration.java:419)

Но это не разрешено (SecurityManager),

09-05-2011 13:33:29 HTTP JVM: at lotus.notes.AgentSecurityManager.checkPropertiesAccess(Unknown Source)

Должно быть создано, перехвачено исключение и должно быть создано сообщение об ошибке. Это сообщение об ошибке должно быть загружено из пакета ресурсов, но пакет не найден.

09-05-2011 13:33:29 HTTP JVM: Could not initialize configuration for Flying Saucer library. Message is: Can't find resource for bundle java.util.PropertyResourceBundle, key access_properties_not_allowed

Решение:

  • Попробуйте найти свойства безопасности для Lotus Domino JVM (не знаю, где они могут быть или должны быть), и пусть код читает системные свойства

Or

  • Сделайте патч для пакета org.xhtmlrenderer, чтобы перехватывать исключения безопасности и обрабатывать их самостоятельно.
person Vladimir Dyuzhev    schedule 09.05.2011
comment
Я видел этот тип ошибки раньше во внешних библиотеках, использующих отражение, и я думаю, что путь к Ямбургу правильный. Я предполагаю, что вы используете это как java-агент, который отвечает на сообщение (вызывается из webquerysave?). Вы можете получить доступ к более тонкой системе безопасности, если сохраните внешние jar-файлы в файловой системе сервера в /jvm/lib/ext, а не в базе данных, а затем измените разрешения с помощью файла java.policy. В этом сообщении содержится дополнительная информация о безопасности Java в Domino. - person Jon McAuliffe; 09.05.2011