LibreOffice5(31)xcsファイルとxcuファイルとxcdファイル:その2

ラベル: ,

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


xcsファイル(コンポーネントスキーマノード)とxcuファイル(コンポーネントデータノード)の融合方法はいくつかあります。これらについてLayering and Mergingを読んで学習します。A merging exampleにはいくつかの例が載っていますが、自分で結果を確認する手段がまだ用意できなく理解できないところがいくつもありました。

Operation 'modify': すでにあるノードを変更する


方法の指定がない場合はoor:op="modify"がデフォルトになります。

ノードだけでなくプロパティの属性にも指定できます。

これは単純に同じ構成のノードを上書きします。
<oor:component-schema oor:name="DataAccess" oor:package="org.openoffice.Office" xml:lang="en-US">
 <templates>
 </templates>
 <component>
  <group oor:name="Bibliography">
   <group oor:name="CurrentDataSource">
    <prop oor:name="DataSourceName" oor:type="xs:string"/>
    <prop oor:name="Command" oor:type="xs:string"/>
    <prop oor:name="CommandType" oor:type="xs:short"/>
   </group>
  </group>
 </component>
</oor:component-schema>
xcsファイルにこのようなBibliographyグループノードがあるときに、このプロパティをxcuファイルで設定します。
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DataAccess" oor:package="org.openoffice.Office">
 <node oor:name="Bibliography">
  <node oor:name="CurrentDataSource">
   <prop oor:name="DataSourceName">
    <value>Bibliography</value>
   </prop>
   <prop oor:name="Command">
    <value>biblio</value>
   </prop>
   <prop oor:name="CommandType">
    <value>0</value>
   </prop>
  </node>
 </node>
</oor:component-data>

Operation 'replace': セットノードとextensibleノードにノードを追加する


oor:op="replace"を使えるのはセットノードと、extensibleノードに対してだけです。

そのノード下のプロパティの属性にも指定できます。

extensibleノードはxcuファイルでプロパティが追加可能なノードでグループノードで oor:extensible="true"となっているものです。

まずセットノードに子ノードを追加する例です。
<oor:component-schema oor:name="DataAccess" oor:package="org.openoffice.Office" xml:lang="en-US">
 <templates>
  <group oor:name="FieldAssignment">
   <prop oor:name="ProgrammaticFieldName" oor:type="xs:string"/>
   <prop oor:name="AssignedFieldName" oor:type="xs:string"/>
  </group>
 </templates>
 <component>
  <set oor:name="Fields" oor:node-type="FieldAssignment"/>
 </component>
</oor:component-schema>
9行目のセットノードFieldsに対してノード型FieldAssignmentの子ノードを追加します。
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DataAccess" oor:package="org.openoffice.Office">
 <node oor:name="Fields">
  <node oor:name="ShortName" oor:op="replace">
   <prop oor:name="ProgrammaticFieldName">
    <value>Identifier</value>
   </prop>
   <prop oor:name="AssignedFieldName">
    <value>Identifier</value>
   </prop>
  </node>
  <node oor:name="Type" oor:op="replace">
   <prop oor:name="ProgrammaticFieldName">
    <value>BibliographyType</value>
   </prop>
   <prop oor:name="AssignedFieldName">
    <value>Type</value>
   </prop>
  </node>
 </node>
</oor:component-data>
3行目と11行目でそれぞれ子ノードShortNameとTypeをoor:op="replace"で追加しています。

extensibleノードの場合はそのプロパティをxcuファイルで追加できます。
<oor:component-schema oor:name="Embedding" oor:package="org.openoffice.Office" xml:lang="en-US">
 <templates>
 </templates>
 <component>
  <group oor:name="ShortName"" oor:extensible="true"/>
 </component>
</oor:component-schema>
5行目のextensibleノードShortNameに対してxcuファイルでプロパティを追加します。
<oor:component-data xmlns:install="http://openoffice.org/2004/installation" oor:name="DataAccess" oor:package="org.openoffice.Office">
 <node oor:name="ShortName">
  <prop oor:name="ProgrammaticFieldName" oor:op="replace">
   <value>Identifier</value>
  </prop>
  <prop oor:name="AssignedFieldName" oor:op="replace">
   <value>Identifier</value>
  </prop>
 </node>
</oor:component-data>
3行目と6行目でoor:op="replace"でプロパティProgrammaticFieldNameとAssignedFieldNameが追加されていることがわかります。

この2つの例ではoor:op="replace"はreplace(置換)というよりもadd(追加)の作用をしていますが、すでにセットノードに追加されたノードに対してoor:op="replace"した場合はそのノードは置換されます。

oor:op="modify"の時はコンポーネントデータノードで指定したノードのプロパティだけが変更されるのに対して、oor:op="replace"の場合はそのノードのプロパティすべてが置換され、設定しなかったプロパティはnilになります。

この2つの例ではoor:op="replace"はreplace(置換)というよりもadd(追加)の作用をしていますが、ちゃんとreplace(置換)の作用もあります。

Operation ‘fuse’: modifyでだめならreplaceする


oor:op="fuse"はすでにある要素に対してはoor:op="modify"として作用し、要素が存在しなければoor:op="replace"として作用します。

Operation 'remove': セットノードの子ノードを削除する


oor:op="replace"と同様にoor:op="remove"はセットノードに対してのみ作用します。

oor:op="remove"でセットノードにすでにある子ノードを削除できます。

以下のことはLayering and MergingのOperation 'remove'の項とRemoved nodesの項に書いてあるのですが英語の意味がいまいち掴めなかったので未確認です。

同じ階層で追加されたものを削除するとあとでまた出現することがある?

extensibleノードのすでにあるプロパティはoor:op="remove"では削除できません。

でも、同じ階層のものは削除できる?

Operation 'reset': デフォルトに戻す


oor:op="reset"はデフォルトに戻す、ということですが「デフォルト」というが何を指すのかよくわかりませんでした。

最初に値を定義した階層に戻るということでしょうか。

Operation 'clear': 要素の内容を消去する


'oor:op="replace"やoor:op="fuse"、oor:op="remove"がノードやプロパティといった要素に作用するのに対して、oor:op="clear"はその要素の内容に作用しそれを消去します。

ただしoor:mandatory="true"のものには作用しません。

融合する順番で結果が変わる


util: OOo Registry Document FormatのMerging update layersには融合の順番が変わっても結果は同一であるべきであるがそうならないときについて書いてあります。

デフォルトの階層をDとしてこのDにAとBを作用させるときに、DAしてからDBをした場合と、まずABをしてからそれをDに作用させた時の結果について比較しています。

通常はDAしてからDBするようなのでこの比較がどういう意味があるのかよくわかりませんでした。

とりあえずどういうことをしているのか考えてみました。

AB B

Operation modify replace fuse remove
A modify B replace B fuse B remove
modify modify A modify A+B replace B fuse A+B* remove
replace replace A replace A+B replace B replace A+B remove
fuse fuse A fuse A+B replace B fuse A+B remove
remove remove remove replace B fuse B remove


AがremoveでBがmodifyの場合はAのremoveでそのノードがなくなっているのでBのmodifyは無効になって結果はremoveとなります。

AがremoveでBがreplaceの場合はノードがなければ追加しますしあれば置換するので結果はBのreplaceが適用されます。

AがremoveでBがfuseの場合はノードがなければreplaceするのでBのreplaceと同じ結果になります。

Bがremoveの場合はAがいずれのオペレーションであってもremoveになります。

Bがreplaceの場合はノードがなければ追加しあれば置換するのでAがいずれのオペレーションであってもBのreplaceが適用されます。

AがmodifyでBもmodifyの場合はAの変更が適用されたあとにBの変更が適用されます。

AがreplaceでBがmodifyの場合、Aのreplaceによってノードが必ず存在することになるのでBのmodifyも必ず適用できます。

AがfuseでBがmodifyの場合もAがreplaceのときと同様にBのmodifyが必ず適用できます。

AがreplaceでBがfuseの場合もAのreplaceによってノードが必ず存在することになるのでBのmodifyが適用されることになります。

AがfuseでBがfuseの場合もAのfuseによってノードが必ず存在するのでBのmodifyが適用されます。

AがmodifyでBがfuseの場合、Dにすでにノードがある場合はAのmodifyが適用されてBのmodifyが適用されて、DにノードがなければAのmodifyが無効になってBのreplaceが適用されることになります。

参考にしたサイト


util: OOo Registry Document Format
今回の記事はこれのLayering and Mergingの章を読んで書きました。

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

PR

0 件のコメント:

コメントを投稿