Las aplicaciones de sincronización MIDP de Java de ejemplo

Existen varias aplicaciones Java de ejemplo que puede utilizar como ayuda para escribir aplicaciones para DB2 Everyplace. Para el proveedor de sincronización MIDP, los ejemplos están ubicados en:

%DSYINSTDIR%/Clients/Midp/samples

El ejemplo principal es la aplicación Visiting Nurse, bajo com/ibm/mobileservices/demo, VNurse.java y NursesAid.jar. Bajo el mismo directorio de ejemplos se encuentran dos archivos que forman una aplicación simple. Esta aplicación no proporciona código de RMS (Record Store Management) ni una interfaz de usuario sólida. Los archivos son:

Detalles del archivo ISyncWorker.java

El programa de ejemplo SyncWorker.java demuestra cómo codificar una aplicación Sync Client para el proveedor de sincronización MIDP de DB2 Everyplace.

La aplicación Java de ejemplo realiza los pasos siguientes:

  1. Importar los paquetes de sincronización de DB2 Everyplace.
          import com.ibm.mobileservices.isync.*;
    import com.ibm.mobileservices.isync.event.*;
    import com.ibm.mobileservices.isync.midp.*;
     
    
  2. Implementar el método eventIssued de la interfaz ISyncListener para la notificación de sucesos durante la sincronización.
  3. Obtener una instancia de MIDPISyncProvider
  4. Obtener del objeto de proveedor una instancia del servicio de sincronización
  5. Obtener del objeto de servicio una instancia del almacén de configuración
  6. Obtener del objeto de almacén de configuración una instancia del controlador de sincronización
  7. Registrar el objeto de escucha de la aplicación que implementa la interfaz ISyncListener para la notificación de sucesos del objeto de controlador de sincronización durante la sincronización
  8. Realizar una sincronización sobre todos los conjuntos de suscripción habilitados. Comprobar el código de retorno y las excepciones para ver el estado de la sincronización.
  9. Cerrar y liberar todos los recursos asignados por el proveedor de sincronización.

El ejemplo ISyncSample.java

El ejemplo siguiente contiene comentarios que hacen referencia a los pasos del apartado anterior.

// Ejemplo 1:  ISync Java - Uso de la API simple
//
 
	// Paso 1:  importar los paquetes Java de Sync Client
      //
      import com.ibm.mobileservices.isync.*;
      import com.ibm.mobileservices.isync.event.*;
      import com.ibm.mobileservices.isync.midp.*;
      
 
 
 
/**
	Clase de soporte que maneja todas las tareas de sincronización.
	La llama 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;
	}
 
   // Paso 2:  implementar el método eventIssued() en la interfaz
   //          si está interesado en la notificación de sucesos (opcional)
   // 
	
	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)
		{
   // visualizar el estado del suceso
		  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);
 
				/*
					La aplicación tiene que hacer lo correcto con conflictRow.
				*/
 
				// System.out.println("Conflict table " + tabName
					// + " row: " + conflictRow);
			}   
			return ISync.RTNCB_DONE;
 
   // ignorar otros tipos de suceso
			default:
				break;
			}
 
   // dejar que el motor de sincronización emprenda la acción por omisión
		return ISync.RTNCB_DEFAULT ;
 
	}  // final de eventIssued()
	/*
		Se implementa la sincronización en una hebra para permitir que el
		usuario cancele la petición que, siendo de una sola hebra, se puede
		colgar en una petición de E/S
	*/
 
	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 = "hostlocal";
			String port = "9080";
			
			/*
				Si el archivo jad tiene valores, utilícelos, vea
				DeployManifest.java en las herramientas.
 
				En Sun WirelessToolkit, bajo Settings, puede entrar
				valores en la pestaña User Defined.
			*/
 
 		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);
 
		
         // Paso 3:  obtener una instancia de MIDPISyncProvider
         //
			provider = MIDPISyncProvider.getInstance();
 
         // Paso 4:  obtener del proveedor una instancia
         //          de servicio de sincronización
         //
 			Hashtable ht = new Hashtable();
 			ht.put("isync.user", userName);
 			ht.put("isync.password", password);
 			ht.put("isync.trace", "detailed");
 
 			service = provider.createSyncService(URI, ht);
 
         // Paso 5:  obtener una instancia del almacén de configuración
         // 
			config = service.getConfigStore(null);
 
         // Paso 6:  obtener una instancia del controlador de
         //          sincronización para realizar la sincronización
         // 
			syncer = config.getSyncDriver();
 
         // Paso 7:  establecer objeto de escucha para la notificación
         //     de sucesos desde objeto sincronizador durante la sincronización
         // 
			syncer.setSyncListener(this);
 
         // Paso 8:  realizar sincronización en todos los conjuntos
         //          de suscripción habilitados
         //
 
			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;
			}        
		//  Paso 9: Cerrar todos los recursos
		//
 
			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;
	}
}
 

Tareas relacionadas

Conceptos relacionados