13.4.3. Object State Viewer (OSV)

メインウィンドウのObjectsペインでオブジェクトを選択すると、オブジェクトタイプに登録したObject State Viewer (OSV)が呼び出されます。OSVは選択したオブジェクトに関する情報をユーザーインターフェースで利用できるようにします。Atomic Action (トランザクション)のOSVは標準のツールで分配されます。Abstract Recordsの情報をヒューリスティック、失敗、読み取り専用、その他など、メソッド一覧に表示します。独自のOSVを記述し、自身で定義したオブジェクトタイプの情報を表示することができます。

13.4.3.1. OSVの記述

OSV プラグインを記述し、Object Store Browser がユーザ定義のAbstract Recordの状況を表示することができます。OSV プラグインは、com.arjuna.ats.tools.objectstorebrowser.stateviewers.StateViewerInterface インターフェースの実装クラスとなっています。
これは、plugins/ ディレクトリ内のJARにてパッケージされています。例13.1「AbstractRecord クラス」 の例は、AbstractRecord クラスのOSVプラグインを作成しています。

例13.1 AbstractRecord クラス

	  public class SimpleRecord extends AbstractRecord
	  {
	  private int _value = 0;
	  
	  .....
	  
	  public void increase()
	  {
	  _value++;
	  }
	  
	  public int get()
	  {
	  return _value;
	  }
	  
	  public String type()
	  {
	  return “/StateManager/AbstractRecord/SimpleRecord”;
	  }
	  
	  public boolean restore_state(InputObjectState os, int i)
	  {
	  boolean returnValue = true;
	  
	  try
	  {
	  _value = os.unpackInt();
	  }
	  catch (java.io.IOException e)
	  {
	  returnValue = false;
	  }
	  
	  return returnValue;
	  }
	  
	  public boolean save_state(OutputObjectState os, int i)
	  {
	  boolean returnValue = true;
	  
	  try
	  {
	  os.packInt(_value);
	  }
	  catch (java.io.IOException e)
	  {
	  returnValue = false;
	  }
	  
	  return returnValue;
	  }
	  }
目的は、Object Store Browser にて表示した時にAbstract Record の現在値を表示することです。ステートをAbstract Record のインスタンスに読み込み、getValue() メソッドを呼出すことでこの目的を簡単に達成することができます。
	  public class SimpleRecordOSVPlugin implements StateViewerInterface
	  {
	  /**
	  * A uid node of the type this viewer is registered against has been expanded.
	  * @param os
	  * @param type
	  * @param manipulator
	  * @param node
	  * @throws ObjectStoreException
	  */
	  public void uidNodeExpanded(ObjectStore os,
	  String type,
	  ObjectStoreBrowserTreeManipulationInterface 
	  manipulator,
	  UidNode node,
	  StatePanel infoPanel)
	  throws ObjectStoreException
	  {
	  // Do nothing
	  }
	  
	  /**
	  * An entry has been selected of the type this viewer is registered against.
	  *
	  * @param os
	  * @param type
	  * @param uid
	  * @param entry
	  * @param statePanel
	  * @throws ObjectStoreException
	  */
	  public void entrySelected(ObjectStore os,
	  String type,
	  Uid uid,
	  ObjectStoreViewEntry entry,
	  StatePanel statePanel) 
	  throws ObjectStoreException
	  {
	  SimpleRecord rec = new SimpleRecord();
	  
	  if ( rec.restore_state( os.read_committed(uid, type), ObjectType.ANDPERSISTENT ) )
	  {
	  statePanel.setData( “Value”, rec.getValue() );
	  }
	  }
	  
	  /**
	  * Get the type this state viewer is intended to be registered against.
	  * @return
	  */
	  public String getType()
	  {
	  return “/StateManager/AbstractRecord/SimpleRecord”;
	  }
	  }
特定のタイプを示すUnique Identification (UID) がObject Store Hierarchy ツリーで展開されると、uidNodeExpanded メソッドを呼び出します。このAbstract Record は直接オブジェクトストアにて見ることができません。アトミックアクションのリストの1つからでなければ閲覧できなくなっています。特定のタイプを持つオブジェクトを示すObject ビューからエントリーを選択すると、entrySelected メソッドが呼び出されます。両方のメソッドにてStatePanel を使いオブジェクトステートについての情報を表示します。StatePanel にはStatePanel メソッドに記載されているメソッドが含まれており、この情報の表示がしやすくなっています。

StatePanel メソッド

setInfo(String info)
一般情報を表示します。
setData(String name, String value)
テーブルに情報を入力し、Object Store Browser ツールで表示します。
enableDetailsButton(DetailsButtonListener listener)
Details ボタンを有効にします。リスナインターフェースにより、ボタンを押すとプラグインに通知されるようになっています。開発者はこの情報の表示方法を管理します。
この例では、ステートをオブジェクトストアから読み取りgetValue() メソッドで返された値を使いステートパネルテーブルに入力しています。getType() メソッドは登録に関するプラグインタイプを返します。
このプラグインをObject Store Browser に追加するには、osbv-というプリフィックスのついた名をつけ、JAR ファイルにパッケージします。JARファイルににはマニフェストファイル内に特定の情報を含むことで、クラスにプラグインを持つObject Store Browser に通知する必要があります。Apache Ant スクリプトを利用してこれを実行するには、例13.2「Ant でプラグインをパッキング」を参照してください。

例13.2 Ant でプラグインをパッキング

	  <jar jarfile="osbv-simplerecord.jar">
	  <fileset dir="build" includes="*.class”/>
	  <manifest>
	  <section name="arjuna-tools-objectstorebrowser">
	  <attribute name="plugin-classname-1" value=" SimpleRecordOSVPlugin "/>
	  </section>
	  </manifest>
	  </jar>
マニフェストファイルにて正しい情報を用いてJAR を作成した後、 bin/tools/plugins ディレクトリに置きます。