モデルの永続化

記号モデルの永続化とは、地図ファイル内に SDM モデル情報を埋め込めるようにすることです。
これは、IlvPersistentSDMNodeFactory インターフェースと IlvPersistentSDMModelProperty マネージャー・プロパティーから実行できます。
地図で JViews Diagrammer Designer を利用したい場合には、この機能を使用しないでください。Designer では記号モデルがそれぞれ異なる xml ファイルに保存および設定されるためです。この機能を利用する場合は、IlvMapStyleSheetRenderer を使用する必要があります。そうでない場合、記号を配置するのに使用されるマネージャー・レイヤーが IlvMapStyleSheetRenderer.IlvMapSymbolManagerLayer クラスのインスタンスではなくなってしまうことがあります。それにより、記号のグラフィカル表示がそれぞれ異なる ivl ファイルに保存され、地図を読み込み戻したときに記号の重複が発生する原因となります。
永続的な SDM モデルのプロパティー
このクラスはマネージャーに付加される名前付きプロパティーで、ivl ファイル内でエンジン・モデルの保存と読み込みをトリガーします。
次に使用例を示します。
IlvPersistentSDMModelProperty property = 
IlvPersistentSDMModelProperty.GetPersistentSDMModel(engine,factory,listenToChanges);
この呼び出しによって、エンジンのマネージャー上でプロパティーが登録されます。このプロパティーは、(他のすべての名前付きプロパティーと同じように) マネージャーが保存されるときに保存され、内部の IlvXMLConnector を呼び出して、エンジン・モデルの XML コンテンツをストリングとして保存します。
以下で説明するように、読み込み時には、このプロパティーでエンジン・モデル内に SDM ノードを作成するのにノード・ファクトリーが必要となります。
listenToChanges を true に設定してこの呼び出しを使用すると、ivl 地図ファイルの読み込み前にこのプロパティーをエンジン用に登録することができます。付加されたリスナーにより、プロパティーの読み込み時に使用されるファクトリーとエンジンが、指定したファクトリーとエンジンにデータ読み込み前に置き換えられることが確認されます。
この操作を行わない場合は内部の XML データが読み込まれるため、後でそのエンジンを手動で付加する必要があります。
永続的な SDM ノード・ファクトリー
IlvPersistentSDMNodeFactory インターフェースの主な目的は、モデル・データを読み込み直したときにモデル・ノードが作成されるようにすることです。通常、記号の作成は一部のアプリケーションに依存しているため、このインターフェースにはその永続的なコンテキストを管理するためのメソッドも含まれています。
以下に、独自のファクトリーを記述するのに役立つ簡単なコード例を示します。
public class SampleFactory implements IlvPersistentSDMNodeFactory {
  static public class SampleContext extends IlvPersistentObject {
	// some implementation of a persistent object ...
  }
  IlvPersistentObject _factoryPersistentContext;

  public IlvPersistentObject getPersistentContext() {
    // the persistent context should be created or updated at this point.
    _factoryPersistentContext=new SampleContext();
    _factoryPersistentContext.setSomeData(this.getSomeData());
    return _factoryPersistentContext;
  }

  public boolean isPropertyIgnored(IlvSDMModel model, Object node, String name) {
   // ignore the “data” property
   if(“data”.equals(name)) return true;
   return false;
  }

  public Object newSymbol(String tag) {
   // we will create default SDM nodes
   IlvDefaultSDMNode node=new IlvDefaultSDMNode(tag);
   // configure the node, for example
   node.setProperty("data", this.getSomeData());
   return node;
  }

  public void setPersistentContext(IlvPersistentObject context) {
   // the local information should be updated with what was stored in the context
   this.setSomeData(context.getSomeData());
  }