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:
import com.ibm.mobileservices.isync.*; import com.ibm.mobileservices.isync.event.*; import com.ibm.mobileservices.isync.midp.*;
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