LibreOffice5(32)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その4

ラベル: , ,

前の関連記事:LibreOffice5(31)xcsファイルとxcuファイルとxcdファイル:その2


LibreOffice5(31)xcsファイルとxcuファイルとxcdファイル:その2でxcuファイルについて学習してLibreOffice5(17)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その2にでてきたJobs.xcuについてようやく理解できました。linuxBean14.04(83)LibreOfiice5.0.2のインストールでビルドした拡張機能AsyncJob.oxtを~/libreoffice5.0_sdk/LINUXexample.out/binからLibreOfficeの拡張機能マネージャーに登録した状態で動作確認しています。

Jobs.xcuに対応するコンポーネントスキーマノードを見る


LibreOffice5(30)xcsファイルとxcuファイルとxcdファイル:その1で学習した結果コンポーネントデータノードに対応するコンポーネントスキーマノードが存在するはずなのでそれを探します。
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

</oor:component-data>
Jobs.xcuのコンポーネントデータタグの属性からパッケージ名org.openoffice.Office、コンポーネント名Jobsとわかります。

まず/opt/libreoffice5.0/share/registryフォルダ内をoor:name="Jobs"を含む内容で検索してみるとimpress.xcd、main.xcd、onlineupdate.xcdの3つのファイルがでてきました。

このうちコンポーネントスキーマノードが存在するのはmain.xcdのみでした。
<oor:component-schema oor:name="Jobs" oor:package="org.openoffice.Office" xml:lang="en-US"><!-- パッケージ名org.openoffice、コンポーネント名Jobs、言語en-US、のコンポーネントスキーマ -->
 <templates><!-- テンプレートノード -->
  <group oor:name="Job"><!-- グループノードJob -->
   <prop oor:name="Service" oor:type="xs:string"/><!-- グループノードJobのプロパティService -->
   <prop oor:name="Context" oor:type="xs:string"/><!-- グループノードJobのプロパティContext -->
   <group oor:name="Arguments" oor:extensible="true"/><!-- グループノードJobのサブノードであるextensibleノードArguments -->
  </group>
  <group oor:name="TimeStamp"><!-- グループノードTimeStamp -->
   <prop oor:name="AdminTime" oor:type="xs:string" oor:nillable="false"><!-- グループノードTimeStampのプロパティAdminTime -->
    <value>2003-01-01T00:00:00+00:00</value><!-- プロパティAdminTimeのデフォルト値。string型。nil不可。 -->
   </prop>
   <prop oor:name="UserTime" oor:type="xs:string" oor:nillable="false"><!-- グループノードTimeStampのプロパティUserTime -->
    <value>2003-01-01T00:00:00+00:00</value><!-- プロパティUserTimeのデフォルト値。string型。nil不可。 -->
   </prop>
  </group>
  <group oor:name="Event"><!-- グループノードEvent -->
   <set oor:name="JobList" oor:node-type="TimeStamp"/><!-- ノードタイプTimeStampのセットノードJobList -->
  </group>
 </templates>
 <component><!-- コンポーネントノード -->
  <set oor:name="Jobs" oor:node-type="Job"/><!-- ノードタイプJobのセットノードJobs -->
  <set oor:name="Events" oor:node-type="Event"/><!-- ノードタイプEventのセットノードEvents -->
 </component>
</oor:component-schema>
これとJobs.xcuを対応させてコメントをつけてみました。
<oor:component-data oor:name="Jobs" oor:package="org.openoffice.Office" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- パッケージ名org.openoffice、コンポーネント名Jobsのコンポーネントデータノード -->
    <node oor:name="Jobs"><!-- セットノードJobs -->
        <node oor:name="AsyncJob" oor:op="replace"><!-- セットノードJobsのサブノードであるノードタイプJobのノードAsyncJob -->
            <prop oor:name="Service" oor:type="xs:string"><!-- AsyncJobノードのServiceプロパティ -->
                <value>com.sun.star.comp.framework.java.services.AsyncJob</value><!-- string型のデータ -->
            </prop>
            <!-- AsyncJobノードのContextプロパティは設定なし -->
            <node oor:name="Arguments"><!-- AsyncJobノードのサブノードであるextensibleノードArguments -->
                <prop oor:name="arg_1" oor:type="xs:string" oor:op="replace"><!-- Argumentsノードのプロパティ -->
                    <value>val_1</value><!-- string型のデータ -->
                </prop>
            </node>
        </node>
    </node>
    <node oor:name="Events"><!-- セットノードEvents -->
        <node oor:name="onFirstVisibleTask" oor:op="fuse"><!-- セットノードEventsのサブノードであるノードタイプEventのノードonFirstVisibleTask -->
            <node oor:name="JobList"><!-- onFirstVisibleTaskノードのサブノードであるセットノードJobList -->
                <node oor:name="AsyncJob" oor:op="replace"/><!-- セットノードJobListのサブノードであるノードタイプTimeStampのノードAsyncJob -->
     <!-- AsyncJobノードのAdminTimeプロパティはtemplateノードのデフォルト値2003-01-01T00:00:00+00:00。string型。nil不可。 -->
     <!-- AsyncJobノードのUserTimeプロパティはtemplateノードのデフォルト値2003-01-01T00:00:00+00:00。string型。nil不可。 -->
            </node>
        </node>
        <node oor:name="onMyOwnJobEvent" oor:op="replace"><!-- セットノードEventsのサブノードであるノードタイプEventのノードonMyOwnJobEvent -->
            <node oor:name="JobList"><!-- onMyOwnJobEventノードのサブノードのであるセットノードJobList -->
                <node oor:name="AsyncJob" oor:op="replace"/><!-- セットノードJobListのサブノードであるノードタイプTimeStampのノードAsyncJob -->
     <!-- AsyncJobノードのAdminTimeプロパティはtemplateノードのデフォルト値2003-01-01T00:00:00+00:00。string型。nil不可。 -->
     <!-- AsyncJobノードのUserTimeプロパティはtemplateノードのデフォルト値2003-01-01T00:00:00+00:00。string型。nil不可。 -->
            </node>
        </node>
    </node>
</oor:component-data>
オリジナルのJobs.xcuの2箇所を修正しました。

9行目のプロパティarg_1はextensibleノードArgumentsにプロパティを追加しているのでoor:op="replace"が必要です。

16行目ではセットノードEventsにノードタイプEventのノードonFirstVisibleTaskを追加しています。

すでにどこかでノードonFirstVisibleTaskが追加されている場合はそこにサブノードのAsyncJobを追加するように変更すればよいのでoor:op="modify"(変更)でよいのですが、そうでない場合はreplace(サブノードが既存でなければ追加、既存であれば置換)かfuse(modifyできなければreplace)にする必要があります。

23行目でもセットノードEventsにノードタイプEventのノードonMyOwnJobEventをサブノードに追加していますが、これは自作ノード名なのですでに存在していることはないはずなのでoor:op="replace"(既存のサブノードがないので追加)で問題ありません。

ところが16行目のonFirstVisibleTaskはList of Supported Events - Apache OpenOffice Wikiに載っているLibreOffice固有のイベント名なのですでに他の拡張機能などで使用され既にそこでサブノードが追加されている可能性があります。

oor:op="replace"としているとすでに追加されているサブノードが置換されてしまい消えてしまいます。

そこでoor:op="replace"を使うよりもoor:op="fuse"(modifyできなければreplace)を使用することが推奨されています。(Configuration - Apache OpenOffice Wiki)

AdminTimeとUserTimeでイベント名から呼び出すジョブを抑制する


main.xcdのコンポーネントスキーマノードのグループノードTimeStampにはAdminTimeプロパティとUserTimeプロパティがあってデフォルト値はいずれも2003-01-01T00:00:00+00:00になっています。

Configuration - Apache OpenOffice Wiki

AdminTimeは管理者が作成するものでジョブを再活性化させる時間です。

UserTimeはジョブの最終実行時間が記録されます。

UserTimeがAdminTimeより新しいとそのジョブは実行されません。

Jobs.xcuでAdminTimeもUserTimeもプロパティに設定されていない時はこれらのプロパティは使われないのでそのジョブは常に実行されます。

Using the vnd.sun.star.jobs: URL Schema - Apache OpenOffice Wikiにある例のEventsノードだけ抜き出してみました。
      <node oor:name="Events">
          <node oor:name="onFirstVisibleTask" oor:op="fuse">
              <node oor:name="JobList">
                  <node oor:name="Job_1" oor:op="replace">
                      <prop oor:name="AdminTime">
                          <value>01.01.2003/00:00:00</value>
                      </prop>
                      <prop oor:name="UserTime">
                          <value>01.01.2003/00:00:01</value>
                      </prop>
                  </node>
                  <node oor:name="Job_2" oor:op="replace"/>
              </node>
          </node>
      </node>
この例ではJobs.xcuでAdminTimeより1秒進んだUserTimeを設定することによってonFirstVisibleTaskイベントで呼び出した場合にJob_1が動作させないようになっています。

Job_2はAdminTimeもUserTimeもプロパティに設定されていないので常に実行されます。

AdminTimeとUserTimeはジョブではなイベントのプロパティなので、LibreOffice5(19)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その3でみたように、「イベント名でジョブを呼び出す方法」ではこれらのプロパティが働いてJob_1を抑制できますが、それ以外の「エイリアス名で呼び出す方法」や「サービス名で呼び出す方法」ではJob_1を実行することができます。

registrymodifications.xcuファイルは設定ではなく結果が出力されているだけ


LibreOffice 5.2 SDK - Developer's Guide ExamplesAsyncJob.javaの例ではXAsyncJobインターフェイスを実装してそのexecuteAsync()メソッドの引数とで受け取ったXJobListenerjobFinished()メソッドの引数でReturning Resultsを返しています。

EnvTypeがEXECUTORのときはReturning ResultsのDeactivateをTrueで返しています。

LibreOffice5(17)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その2の結果をみるとメニューからJobを呼び出した時はEnvTypeはすべてDISPATCHになっており、EnvTypeがEXECUTORになるのはonFirstVisibleTaskイベントでJobを呼び出したときだけになっています。

このイベントはAsyncJob.oxtをインストールしてLibreOfficeを再起動した後の1回だけしか起動されません。

デフォルト値からユーザーが変更した値が保存されるのはLibreOffice5(30)xcsファイルとxcuファイルとxcdファイル:その1で~/.config/libreoffice/4/user/registrymodifications.xcuファイルとわかったのでそのファイルをみてみるとonFirstVisibleTaskイベントで実行したAsyncJobのUserTimeが記録されていました。
<item oor:path="/org.openoffice.Office.Jobs/Events/org.openoffice.Office.Jobs:Event['onFirstVisibleTask']/JobList/org.openoffice.Office.Jobs:TimeStamp['AsyncJob']">
 <prop oor:name="UserTime" oor:op="fuse">
  <value>2016-04-01T21:13:53Z</value>
 </prop>
</item>
このUserTimeがAdminTimeより新しいのでこのJobが実行されないようになっていると思われます。

ただこのregistrymodifications.xcuは結果が書き出されているだけでこのファイルの値を参照にしているわけではないようです。
(2017.6.25追記。他の値ではLibreOffice5(52)Javaの例:ConfigExamplesをPythonにする その5でregistrymodifications.xcuの値を書き換えて反映させることができました。)

registrymodifications.xcuのUserTimeを削除してもJobの起動は復活せず、registrymodifications.xcuにまた同じ値が書きだされていました。

Returning ResultsにはSaveArgumentsという引数を保存する項目があるのですが、これもどこに保存されているのか、どうやって保存した値を引き出すのかわかりませんでした。

参考にしたサイト


List of Supported Events - Apache OpenOffice Wiki
Jobs.xcuでジョブを起動させることができるLibreOffice固有のイベント名のリスト。

Configuration - Apache OpenOffice Wiki
LibreOffice固有のイベントのノードに追加するサブノードはreplaceよりfuseで追加したほうがよいです。

LibreOffice 5.2 SDK - Developer's Guide Examples
AsyncJobの例のJobs.xcuをみました。

Returning Results - Apache OpenOffice Wiki
Deactivateの使い方はわかりましたがSaveArgumentsの使い方がわかりませんでした。

次の関連記事:LibreOffice5(33)モードレスダイアログの例をPythonに翻訳する:その1

PR

0 件のコメント:

コメントを投稿