Java MIDP 同期アプリケーションのサンプル

DB2 Everyplace の Java 同期アプリケーションを作成するうえで役立つ、いくつかの Java サンプル・アプリケーションが用意されています。MIDP 同期プロバイダーの場合、サンプルは次の場所にあります。

%DSYINSTDIR%/Clients/Midp/samples

基本サンプルは、com/ibm/mobileservices/demo にある Visiting Nurse アプリケーション、VNurse.java および NursesAid.jar です。同じサンプル・ディレクトリーに、単純なアプリケーションを 構成する 2 つのファイルがあります。このアプリケーションでは、Record Store Management (RMS) コード や固有のユーザー・インターフェースは用意されていません。ファイルは、次のとおりです。

ISyncWorker.java ファイルの詳細

サンプル・プログラム SyncWorker.java では、DB2 Everyplace MIDP 同期 プロバイダー用の同期クライアント・アプリケーションのコーディング方法を示しています。

Java サンプル・アプリケーションは、次のステップを実行します。

  1. DB2 Everyplace 同期パッケージをインポートする。
          import com.ibm.mobileservices.isync.*;
          import com.ibm.mobileservices.isync.event.*;
          import com.ibm.mobileservices.isync.midp.*;
     
    
  2. 同期時のイベント通知用に ISyncListener インターフェースの eventIssued メソッドを インプリメントする。
  3. インスタンス MIDPISyncProvider を取得する。
  4. プロバイダー・オブジェクトから同期サービスのインスタンスを取得する。
  5. サービス・オブジェクトから構成保管のインスタンスを取得する。
  6. 構成保管オブジェクトから同期ドライバーのインスタンスを取得する。
  7. 同期時における同期ドライバー・オブジェクトからのイベント通知用の ISyncListener インターフェースをインプリメントするアプリケーション listener オブジェクトの登録を行う。
  8. 使用可能なすべてのサブスクリプション・セットで同期化を実行する。同期の状況 の戻りコードと例外を調べる。
  9. 同期プロバイダーによって割り振られたすべてのリソースをクローズして解放する。

ISyncSample.java の例

次の例には、前のセクションのステップを参照するコメントが記載されています。

// 例 1:  ISync Java - 単純な API の使用法
//
 
	// ステップ 1:  同期クライアント Java パッケージのインポート
      //
      import com.ibm.mobileservices.isync.*;
      import com.ibm.mobileservices.isync.event.*;
      import com.ibm.mobileservices.isync.midp.*;
      
 
 
 
/**
	Supporting class which handles all of the synchronization tasks.
	Called by ISyncSample.
*/
 
public class SyncWorker extends Thread implements ISyncListener
{
	private ISyncSample midlet;
	private boolean mCancel;
	private ISyncProvider provider;
	private ISyncService service;
	private ISyncConfigStore config;
	private ISyncDriver syncer;
	private String eventString;
	
	public SyncWorker(ISyncSample midlet)
	{
		this.midlet = midlet;
		mCancel = false;
	}
 
   // ステップ 2:  ISyncListener インターフェースの eventIssued() メソッドのインプリメント
   //          (オプショナル:イベント通知に興味がある場合)
   // 
	
	public int eventIssued(ISyncEvent evt)
	{
		int evtType = evt.getEventType();
		int evtCode = evt.getEventCode();
		int evtProg = evt.getSyncProgress();
        	String ssName = evt.getSubscriptionSetName();
		Object listenerInfo = evt.getEventInfo();
 
		Exception e = null;
		ConflictReader cr = null;
 
		if (listenerInfo instanceof Exception)
			e = (Exception) listenerInfo;
		else if (listenerInfo instanceof ConflictReader)
			cr = (ConflictReader) listenerInfo;
 
		eventString += evtCode + ":";
 
		switch(evtType)
		{
			// display event status
		  case ISync.EVTTYPE_INFO:
 
             switch (evtCode)
		    {
               case ISync.EVT_INF_SYNCING_SUBS:
                   midlet.updateSyncStat1("Synchronizing " + ssName);
                   midlet.updateSyncStat2(" ");
                   break;
               case ISync.EVT_INF_SYNC_STARTED:
                   midlet.updateSyncStat1("Synchronization started");	
                   midlet.updateSyncStat2(" ");
                   break;
               case ISync.EVT_INF_PREP_MSG:
                   midlet.updateSyncStat2("Preparing message...");
                   break;	
               case ISync.EVT_INF_SEND_MSG:
                   midlet.updateSyncStat2("Sending message...");
                   break;	
               case ISync.EVT_INF_WAIT_MSG:
             	    midlet.updateSyncStat2("Awaiting server reply...");
             	    break;
               case ISync.EVT_INF_APPLY_MSG:
                   midlet.updateSyncStat2("Applying server message...");	
                   break;
               case ISync.EVT_INF_SYNC_CANCELED:
			    midlet.updateSyncStat1("Synchronization canceled");
			    midlet.updateSyncStat2(" ");
			    break;
		      case ISync.EVT_INF_SYNC_SUCCEEDED:
			    midlet.updateSyncStat1("Synchronization succeeded");
			    midlet.updateSyncStat2(" ");
			    break;	
               case ISync.EVT_INF_SYNC_FAILED:
			    midlet.updateSyncStat1("Synchronization failed");
			    midlet.updateSyncStat2(" ");
			    break;		
               default:
                   break;
            }
 
			return ISync.RTNCB_DONE;
 
			case ISync.EVTTYPE_ERROR:
				midlet.updateSyncStat2("Error: " + evtCode);
				return ISync.RTNCB_DONE;
 
			case ISync.EVTTYPE_RETRY:
				midlet.updateSyncStat2("Retry: " + evtCode);
				return ISync.RTNCB_REPLY_YES;
 
			case ISync.EVTTYPE_CONFLICT:
			if (evtCode == ISync.EVT_CFT_REJECT)
			{
				String tabName = evt.getSubscriptionName();
                     midlet.updateSyncStat2("Conflict: " + tabName);
 
				/*
					Application needs to do the right thing with conflictRow.
				*/
 
				// System.out.println("Conflict table " + tabName
					// + " row: " + conflictRow);
			}   
			return ISync.RTNCB_DONE;
 
			// ignore other event types
			default:
				break;
			}
 
		 // let sync engine take default action
		return ISync.RTNCB_DEFAULT ;
 
	}  // end of eventIssued()
	/*
		Synchronization is implemented in a thread to allow the
		user to cancel the request which single-threaded, might
		be hung on in IO request
	*/
 
	public void run()
	{
		sync();
	}
 
	public void cancel()
	{
		try
		{
			if (syncer != null)
				syncer.cancelSync();	
		}
		catch (ISyncException iex)
		{}
 
		mCancel = true;
	}
 
	private void sync()
	{
		try
		{
			eventString = " ";
 
			String user = "nurse1";
			String password = "nurse1";
			String host = "localhost";
			String port = "9080";
			
			/*
				If jad file has values, use them, see
				DeployManifest.java in tools.
 
				In the Sun WirelessToolkit, under Settings, you can enter
				values in the User Defined tab.
			*/
 
			String x = midlet.getAppProperty("Db2eSyncUserName");
				if (x != null)
				user = x;
			x = midlet.getAppProperty("Db2eSyncPassword");
			if (x != null)
				password = x;
			x = midlet.getAppProperty("Db2eSyncHost");
			if (x != null)
				host = x;
			x = midlet.getAppProperty("Db2eSyncPort");
			if (x != null)
				port = x;
			midlet.appendForm(host + ":" + port + " " + user + "/" +
           password);
 
		
         // ステップ 3:  インスタンス MIDPISyncProvider の取得
         //
			provider = MIDPISyncProvider.getInstance();
 
         // ステップ 4:  プロバイダーからの同期サービスのインスタンスの取得
         //
				Hashtable ht = new Hashtable();
				ht.put("isync.user", userName);
				ht.put("isync.password", password);
				ht.put("isync.trace", "detailed");
 
				service = provider.createSyncService(URI, ht);
 
         // ステップ 5:  構成ストアのインスタンスの取得
         // 
			config = service.getConfigStore(null);
 
         // ステップ 6:  同期を実行するための同期ドライバーのインスタンスの取得
         // 
			syncer = config.getSyncDriver();
 
         // ステップ 7:  同期時における同期ドライバー・オブジェクトからの
         //     イベント通知用のリスナー・オブジェクトの設定
         // 
			syncer.setSyncListener(this);
 
			// ステップ 8:  使用可能になったすべてのサブスクリプション・セットでの同期の実行
            //
 
			int rc = syncer.sync();
 
			switch (rc)
			{
			  case ISync.RTN_SUCCEEDED:
				midlet.reportSyncStatus("Synchronization succeeded "
					+ eventString);
				break;
 
			  case ISync.RTN_CANCELED:
				midlet.reportSyncStatus("Synchronization canceled "
				 	+ eventString);
				break;
 
			  default:
				midlet.reportSyncStatus("Synchronization failed "
				 	+ eventString);
				break;
			}        
		//  ステップ 9: すべてのリソースのクローズ
		//
 
			close();
		}
		catch (ISyncException iex)
		{
			midlet.reportSyncStatus("Exception Code: "
				+ iex.getCode() + ", Event codes: " + eventString);	
		}
		catch (Exception e)
		{
			midlet.reportSyncStatus(e.toString());
		}
		finally
		{
			mCancel = false;
		}
	}
	
	private void close() throws ISyncException
	{
		if (syncer != null)
		{
			syncer.close();
			syncer = null;
		}
		if (config != null)
		{
			config.close();
			config = null;
		}
 
		if (service != null)
		{
			service.close();
			service = null;
		}
 
		provider = null;
	}
}
 

関連したタスク

関連した概念