The device application must meet these requirements to utilize the Replication-Based Push Synchronization APIs described in this section.
Develop the push application directly from generated mobile business object (MBO) code.
public class PushListener
implements Runnable
{
Connection conn = null;
private static String url = "http://:100;deviceside=false";
/**
* Constructor
*/
public PushListener()
{
}
public void run()
{
System.out.println("++++++ Started Push Listener ++++++++");
try
{
conn = Connector.open(url);
while (true)
{
String syncRequestStr = null;
try
{
if ( conn instanceof StreamConnectionNotifier )
{
// Open an InputStream.
StreamConnectionNotifier scn =
(StreamConnectionNotifier) conn;
StreamConnection sc = scn.acceptAndOpen();
InputStream input = sc.openInputStream();
// Extract the data from the InputStream.
StringBuffer sb = new StringBuffer();
byte[] data = new byte[256];
int chunk = 0;
while (-1 != (chunk = input.read(data)))
{
sb.append(new String(data, 0, chunk));
}
// Close the InputStream and StreamConnection.
input.close();
String s = sb.toString();
// Display the received data.
syncRequestStr = s.trim();
System.out.println(">>Received: " + syncRequestStr);
}
}
catch (Exception ex)
{
System.out.println(ex);
}
// Clients can parse the syncRequestStr to find client application
// name, package name, sync group name(publication), launch client
//application and perform sync.
// format of the push message sent by the server:
// notification_timestamp=<datetime>;app=<client app name>;
// device_id=<device id>;package=<sup package name with version>;
// publication=<comma separated list of syncGroup names>
TestDB.registerCallbackHandler(new MyCallbackHandler());
com.sybase.collections.ObjectList sgs = new com.sybase.
collections.ObjectList()
// Assume you have notification to sync two syncGroups(publications),
// sg1 and sg2:
sgs.add(TestDB.getSynchronizationGroup("sg1"));
sgs.add(TestDB.getSynchronizationGroup("sg2"));
TestDB.beginSynchronize(sgs, new Object());
}
}
catch (Exception ex)
{
System.out.println("HttpPushListener - ERROR : " + ex);
}
}
/*
* Define callback handler for handling SIS notifications
*/
public class MyCallbackHandler extends com.sybase.
persistence.DefaultCallbackHandler
{
public int onSynchronize(ObjectList arg0, SynchronizationContext arg1)
{
System.out.println("Called on Synchronize");
return SynchronizationAction.CONTINUE;
// returns SynchronizationAction.CONTINUE to proceed this sync
}
public void onSynchronizeFailure(ObjectList arg0)
{
System.out.println("Called onSynchronizeFailure");
}
public void onSynchronizeSuccess(ObjectList arg0)
{
System.out.println("Called onSynchronizeSuccess");
}
}
}
public class PushClientApp extends Application
{
public static String MDSSERVER = "localhost";
public static String MDSSERVERPORT = "8080";
static String PROFILE_HTTP_PUSH_PROTOCOL = "HTTPPUSH";
static String PROFILE_KEY_ADDRESS = "address";
static String PROFILE_KEY_PROTOCOL = "protocol";
static String PROFILE_KEY_APPNAME = "appname";
static String PROFILE_KEY_DEVICE_ID = "deviceId";
static String PUSH_HTTP_DEFAULT_DEVICE_PORT = "100";
static String DEVICE_ID = "2100000a";
public static void main(String[] args)
{
PushClientApp app = new PushClientApp();
app.enterEventDispatcher();
}
Thread pushThread;
PushClientApp()
{
// Set the connection profile information
System.out.println("++++++++ Starting the client ++++++++++");
ConnectionProfile syncprofile =
TestDB.getSynchronizationProfile();
syncprofile.setServerName("kpatilxp");
syncprofile.setPortNumber(2480);
syncprofile.save();
// Login to the SUP server
TestDB.loginToSync("supAdmin", "s3pAdmin");
// Start the http push listener thread
pushThread = new Thread(new PushListener());
pushThread.start();
setPushConnectionProfile("Test:1.0", DEVICE_ID,
syncprofile, "PushClientApp");
// Enable SIS on the synchronization group
SynchronizationGroup sg =
TestDB.getSynchronizationGroup("PushEnabled");
sg.setEnableSIS(true);
sg.setInterval(3);
sg.save(); // this will update the local db
// This will synchronize the SIS subscription to the server
TestDB.synchronize();
System.out.println("++++ Synchronization succeeded ++++++");
}
/*
* For now this assumes MDS is running on localhost
* Creates the URL for PUSH
*
* @param deviceid for SUP client
*/
public static String getHTTPPushAddress(String deviceid)
{
String mdsServer = MDSSERVER;
String mdsPort = MDSSERVERPORT;
StringBuffer result = new StringBuffer("http://");
result.append(mdsServer);
result.append(":");
result.append(mdsPort);
result.append("/push?DESTINATION=");
result.append(deviceid);
result.append("&PORT=");
result.append(PUSH_HTTP_DEFAULT_DEVICE_PORT);
return result.toString();
}
/**
* Sets up push settings for specified package's
* synchronization profile.
*
* @param packageName
* the specified package name
* @return true if set up succesfully.
*/
private boolean setPushConnectionProfile(String packageName,
String deviceId, ConnectionProfile syncProfile,
String appId)
{
try
{
String httpPushAddress = getHTTPPushAddress(deviceId);
syncProfile.setProperty(PROFILE_KEY_ADDRESS,
httpPushAddress);
syncProfile.setProperty(PROFILE_KEY_PROTOCOL,
PROFILE_HTTP_PUSH_PROTOCOL);
syncProfile.setProperty(PROFILE_KEY_APPNAME, appId);
syncProfile.setProperty(PROFILE_KEY_DEVICE_ID, deviceId);
syncProfile.save();
}
catch (Exception e)
{
System.out.println(">> setPushConnectionProfile -
Exception e : " + e);
return false;
}
return true;
}