Соедините XPage с OpenOffice

У меня есть кнопка на XPage, где я хочу подключиться к удаленному экземпляру OpenOffice. OpenOffice запускается и ожидает подключения через сокет.

Событие onclick кнопки запускается следующим SSJS:

    oo = new com.test.OpenOffice();
    oo.init("host=127.0.0.1,port=8107");
    oo.openFile("C:\\TEMP\\Test.odt");

Код вызывает исключение jva.lang.IlleagalStateException: NotesContext not initialized for the thread

Исключение возникает в методе initкласса OpenOffice.

Соответствующими частями класса OpenOffice является следующий код:

public class DHOpenOffice implements Serializable {
    private static final long serialVersionUID = -7443191805456329135L;
    private XComponentContext xRemoteContext;
    private XMultiComponentFactory xMCF;
    private XTextDocument oTextDocument;

    public DHOpenOffice() {
        xRemoteContext = null;
        xMCF = null;
        oTextDocument = null;
    }   

    public void init(String hostAdr) throws java.lang.Exception {
        xRemoteContext = null;

        XComponentContext xLocalContext = Bootstrap.createInitialComponentContext(null);
        XUnoUrlResolver xUrlResolver = UnoUrlResolver.create(xLocalContext);

        String sConnect = "uno:socket," + hostAdr + ",tcpNoDelay=0;urp;StarOffice.ServiceManager";

        Object context = xUrlResolver.resolve(sConnect);
        xRemoteContext = UnoRuntime.queryInterface(XComponentContext.class, context);  
        xMCF = xRemoteContext.getServiceManager();  
    }

Строка кода Object context = xUrlResolver.resolve(sConnect); вызывает исключение.

Почему это происходит? В чем причина этого исключения и как я могу разрешить ситуацию?

N.B.: Код класса без проблем работает в отдельном приложении. Ошибка возникает только тогда, когда код запускается кодом SSJS.


person Detlef Birkholz    schedule 10.03.2014    source источник


Ответы (2)


Похоже на проблему с потоками. Есть несколько вещей, которые вы можете попробовать:

  • Оберните все взаимодействие в пользовательский класс и используйте его из управляемого компонента вместо вызова из SSJS.
  • Убедитесь, что в пользовательский класс не переданы никакие объекты Notes, только ваши собственные.
  • Убедитесь, что Open Document Toolkit достаточно для выполнения интересующих вас операций, поэтому не нужно запускать ОО

дайте нам знать, как это происходит

Обновление
Попробуйте выйти за рамки стандартного цикла XPages. Один из способов — развернуть собственный подключаемый сервлет:

 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;

public class OpenOfficeServlet extends HttpServlet {
   // Your code goes here
}

Вам нужно правильно настроить plugin.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension point="org.eclipse.equinox.http.registry.servlets">
         <servlet alias="/ooproxy" class="com.yourcompany.OpenOfficeServlet" />
   </extension>
</plugin>

Тогда вы могли бы, например. отправьте структуру JSON или сериализуемый объект Java в сервлет с данными и обработайте их там (при необходимости асинхронно). Вы развертываете такой подключаемый модуль с помощью updatesite.nsf.

person stwissel    schedule 10.03.2014
comment
Я поместил класс DHOpenOffice в управляемый компонент и вызвал методы управляемого компонента. Результат тот же: исключение, указывающее, что NotesContext не инициализирован. Объекты Notes не передаются. ODFToolkit не подходит, потому что в нем отсутствуют некоторые функции, которые я должен использовать. Возможно, эта информация помогает отследить проблему: исключения возникают в потоке MessageDispatcher - person Detlef Birkholz; 10.03.2014
comment
Пакет OO Java использует потоки, которые мешают жизненному циклу XPages. Кажется, вам нужно отделить это дальше. Я обнаружил, что сервлет XPages или настраиваемая служба Rest XPages не наследует сеанс/контекст, поэтому вы можете добиться успеха. Не красиво - person stwissel; 10.03.2014
comment
Обход жизненного цикла XPages с помощью запуска сервлета в подключаемом модуле. - person stwissel; 12.03.2014
comment
Я попробую сервлет и сообщу, как он идет. - person Detlef Birkholz; 15.03.2014
comment
Я создал сервлет и развернул его на сервере. Все в порядке, пока я не создам свой собственный класс для подключения к OO. Конструктор просто инициализирует некоторые свойства класса. Но вызов конструктора приводит к ошибке HTTP 500. В журнале ошибок я могу найти следующее java.lang.NoClassDefFoundError: com.sun.star.connection.NoConnectException. Любые подсказки, что происходит не так? - person Detlef Birkholz; 21.03.2014
comment
Классы внутри вашего плагина - person stwissel; 21.03.2014

Благодаря ответу @stwissel я смог решить проблему (он указал мне правильное направление).

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

Итак, это шаги для создания плагина

  • начать новый проект плагина
  • скопируйте файлы open office jar в проект и включите их в путь сборки
  • скопируйте пользовательский класс, использующий UNO API, в подключаемый модуль
  • создать функциональный проект для плагина
  • создать сайт обновлений
  • развернуть плагин через сайт обновлений

Следующий сайт также весьма полезен:

person Detlef Birkholz    schedule 26.03.2014