xlawrence 2005/02/01 10:36:38 CET
Modified files:
patches/sync4j/syncclient/spds SyncManager.java
Log:
File patch for Sync4j 2.2 beta 3 RC1. To use the SynchClient, this file needs
to override the distribution version. It simply allows a Synch client to send
more properties to the SyncManager.
Revision Changes Path
1.4 +755 -124
uwcal_JSR168/patches/sync4j/syncclient/spds/SyncManager.java
http://jahia.mine.nu:8080/cgi-bin/cvsweb.cgi/uwcal_JSR168/patches/sync4j/syncclient/spds/SyncManager.java.diff?r1=1.3&r2=1.4&f=h
Index: SyncManager.java
===================================================================
RCS file:
/home/cvs/repository/uwcal_JSR168/patches/sync4j/syncclient/spds/SyncManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SyncManager.java 3 Dec 2004 11:11:18 -0000 1.3
+++ SyncManager.java 1 Feb 2005 09:36:38 -0000 1.4
@@ -1,7 +1,7 @@
/**
- * Copyright (C) 2003-2004 Funambol
+ * Copyright (C) 2003-2005 Funambol
*
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
@@ -32,7 +32,9 @@
import java.text.MessageFormat;
-import sync4j.syncclient.common.Logger;
+import sync4j.syncclient.common.logging.Handler;
+import sync4j.syncclient.common.logging.Logger;
+import sync4j.syncclient.common.logging.OutputHandler;
import sync4j.syncclient.common.StringTools;
import sync4j.syncclient.spdm.DMException;
@@ -41,6 +43,7 @@
import sync4j.syncclient.spds.engine.SyncItem;
import sync4j.syncclient.spds.engine.SyncItemImpl;
+import sync4j.syncclient.spds.engine.SyncItemKey;
import sync4j.syncclient.spds.engine.SyncItemProperty;
import sync4j.syncclient.spds.engine.SyncItemState;
import sync4j.syncclient.spds.engine.SyncOperation;
@@ -48,6 +51,18 @@
import sync4j.syncclient.spds.engine.SyncSourceDefinition;
import sync4j.syncclient.spds.engine.SyncSourceFactory;
+import sync4j.syncclient.spds.event.SyncEvent;
+import sync4j.syncclient.spds.event.SyncItemEvent;
+import sync4j.syncclient.spds.event.SyncSourceEvent;
+import sync4j.syncclient.spds.event.SyncStatusEvent;
+import sync4j.syncclient.spds.event.SyncTransportEvent;
+
+import sync4j.syncclient.spds.event.SyncItemListener;
+import sync4j.syncclient.spds.event.SyncListener;
+import sync4j.syncclient.spds.event.SyncSourceListener;
+import sync4j.syncclient.spds.event.SyncStatusListener;
+import sync4j.syncclient.spds.event.SyncTransportListener;
+
import sync4j.framework.core.AbstractCommand;
import sync4j.framework.core.AddCommand;
import sync4j.framework.core.AlertCommand;
@@ -62,10 +77,12 @@
import sync4j.framework.core.ReplaceCommand;
import sync4j.framework.core.RepresentationException;
import sync4j.framework.core.Source;
+import sync4j.framework.core.SourceRef;
import sync4j.framework.core.StatusCode;
import sync4j.framework.core.StatusCommand;
import sync4j.framework.core.SyncCommand;
import sync4j.framework.core.Target;
+import sync4j.framework.core.TargetRef;
import sync4j.framework.tools.Base64;
@@ -98,20 +115,21 @@
* syncml-url
* target-local-uri
* sourceDirectory
- * </pre>
+ * </pre>
* The information required by the synchronization engine for initialization
and
* to kick off a data synchronization session is stored in the device
management
* configuration tree and can be manipulated by the means of the SyncPlatform
* Device Management API. See <i>Funambol SyncClient API 2.0 Programmer
Guide</i>
* for more information.
*
- * @version $Id: SyncManager.java,v 1.3 2004/12/03 11:11:18 xlawrence Exp $
+ * @version $Id: SyncManager.java,v 1.4 2005/02/01 09:36:38 xlawrence Exp $
* @author Fabio Maggi
*/
-public class SyncManager {
+public class SyncManager implements SyncTransportListener {
//----------------------------------------------------------------
Constants
+ private static final String XML_ALERT = "/xml/alert.xml"
;
private static final String XML_INITIALIZATION = "/xml/init.xml"
;
private static final String XML_MODIFICATIONS = "/xml/mod.xml"
;
private static final String XML_MAPPING = "/xml/map.xml"
;
@@ -180,6 +198,8 @@
public static final String AUTHENTICATION_BASIC = "basic"
;
public static final String AUTHENTICATION_CLEAR = "clear"
;
+ public static final String SESSION_ID = "12345678"
;
+
public static final String
MIMETYPE_SYNCMLDS_XML
= "application/vnd.syncml+xml"
;
@@ -227,6 +247,7 @@
private String[] sourceNames = null ;
private String[] sourceTypes = null ;
+ private String alertXML = null ;
private String clientInitXML = null ;
private String modificationsXML = null ;
private String mappingXML = null ;
@@ -258,9 +279,20 @@
private int detectedNewItems = 0 ;
private int detectedUpdateItems = 0 ;
private int detectedDeleteItems = 0 ;
- private int returnNewItems = 0 ;
- private int returnUpdateItems = 0 ;
- private int returnDeleteItems = 0 ;
+ private int receivedNewItems = 0 ;
+ private int receivedUpdateItems = 0 ;
+ private int receivedDeleteItems = 0 ;
+
+ private Vector syncItemListeners = null ;
+ private Vector syncListeners = null ;
+ private Vector syncSourceListeners = null ;
+ private Vector syncStatusListeners = null ;
+ private Vector syncTransportListeners = null ;
+
+ private SyncEvent syncEvent = null ;
+ private SyncItemEvent syncItemEvent = null ;
+ private SyncSourceEvent syncSourceEvent = null ;
+ private SyncStatusEvent syncStatusEvent = null ;
//-------------------------------------------------------------
Constructors
@@ -282,10 +314,20 @@
protected SyncManager (String appURI, Properties runtimeProperties)
throws SyncException {
+ syncItemListeners = new Vector();
+ syncListeners = new Vector();
+ syncSourceListeners = new Vector();
+ syncStatusListeners = new Vector();
+ syncTransportListeners = new Vector();
+
SyncSourceDefinition ssd = null;
try {
+ if (Logger.getHandler() == null) {
+ Logger.setHandler(new OutputHandler());
+ }
+
logger = new Logger();
loadResources();
@@ -300,12 +342,11 @@
loadParams(syncParams, runtimeProperties);
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.init();
}
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("System properties: " +
System.getProperties().toString());
}
@@ -369,8 +410,6 @@
continue;
}
- logger.debug(sourceConfig.toString());
-
ssd = new SyncSourceDefinition(sourceConfig);
if (SYNC_NONE.equals(ssd.getDefaultSync())) {
continue;
@@ -497,14 +536,17 @@
try {
+ syncEvent = new SyncEvent(SyncEvent.SYNC_BEGIN ,
+ System.currentTimeMillis() );
+ fireSyncEvent(syncEvent);
+
String databaseList = "";
//
// If sourceURIs is null or zero-length, there is nothing to
do...
//
if ((sourceURIs == null) || (sourceURIs.length == 0)) {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("No database to synchronize");
}
return;
@@ -514,20 +556,23 @@
nextTimestamp = System.currentTimeMillis();
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Initializing");
}
prepareInizializationMessage();
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("inizialization-message:" + clientInitXML);
}
+ syncEvent = new SyncEvent(SyncEvent.SEND_INITIALIZATION ,
+ System.currentTimeMillis() );
+ fireSyncEvent(syncEvent);
+
response = syncInitialization();
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("response to inizialization-message:" +
response);
}
@@ -547,21 +592,20 @@
databaseList = databaseList + ", " + keyStr;
}
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug(msg);
}
}
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Synchronizing " + databaseList);
}
url = response.
substring(response.indexOf("<RespURI>") + 9,
response.indexOf("</RespURI>"));
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("url from response to inizialization-message:"
+ url);
}
@@ -577,18 +621,43 @@
alertCode = getSourceAlertCode(sourceURIs[i]);
+ syncSourceEvent = new
+ SyncSourceEvent(SyncSourceEvent.SYNC_BEGIN ,
+ sourceURIs [i] ,
+ alertCode ,
+ System.currentTimeMillis() );
+
+ fireSyncSourceEvent(syncSourceEvent);
+
syncSourceFactory.getSyncSource(sourceURIs[i]).beginSync(alertCode);
+
}
prepareModificationMessage();
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("modification-message:" + modificationsXML);
}
+ syncEvent = new SyncEvent(SyncEvent.SEND_MODIFICATION ,
+ System.currentTimeMillis() );
+
+ fireSyncEvent(syncEvent);
+
response = syncModifications();
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ //
+ // To operate in SyncServer multimessage
+ //
+ if (response.indexOf("<Final/>") == -1 &&
+ response.indexOf("</Final>") == - 1) {
+
+ prepareAlertMessage();
+ response = sendAlertMessage();
+
+ }
+
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("response to modification-message: " +
response);
}
@@ -596,8 +665,7 @@
boolean sendResponse = processModifications(response);
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Modification done");
}
@@ -605,10 +673,15 @@
prepareMappingMessage();
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("mapping-message:" + mappingXML);
}
+ syncEvent = new SyncEvent(SyncEvent.SEND_FINALIZATION
,
+
System.currentTimeMillis() );
+
+ fireSyncEvent(syncEvent);
+
syncMapping();
}
@@ -628,11 +701,21 @@
// Notifies the source that the synchronization is
successfully
// give it a chance to stop the committing.
//
-
syncSourceFactory.getSyncSource(sourceURIs[i]).commitSync();
+ syncSourceFactory.getSyncSource(sourceURIs
[i]).commitSync();
//
// Here everything was ok
//
- updateLastAnchor(sourceURIs[i], nextTimestamp);
+ updateLastAnchor(sourceURIs [i], nextTimestamp);
+
+ alertCode = getSourceAlertCode(sourceURIs[i]);
+
+ syncSourceEvent = new
+ SyncSourceEvent(SyncSourceEvent.SYNC_END ,
+ sourceURIs [i] ,
+ alertCode ,
+ System.currentTimeMillis() );
+
+ fireSyncSourceEvent(syncSourceEvent);
} catch (DMException e) {
@@ -641,11 +724,19 @@
'/' +
sources[i].getContext() ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(msg);
}
+ syncEvent = new
+ SyncEvent(SyncEvent.SYNC_ERROR ,
+ System.currentTimeMillis() ,
+ e.getMessage() ,
+ e );
+
+ fireSyncEvent(syncEvent);
+
+
} catch (SyncException e) {
String msg = "Error committing synchronization of source
" +
@@ -653,19 +744,29 @@
": "
+
e.getMessage()
;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(msg);
}
+ syncEvent = new
+ SyncEvent(SyncEvent.SYNC_ERROR ,
+ System.currentTimeMillis() ,
+ e.getMessage() ,
+ e );
+
+ fireSyncEvent(syncEvent);
+
}
}
+ syncEvent = new SyncEvent(SyncEvent.SYNC_END ,
+ System.currentTimeMillis() );
+ fireSyncEvent(syncEvent);
+
} catch (AuthenticationException e) {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(e.getMessage());
}
@@ -673,8 +774,7 @@
} catch (UpdateException e) {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(e.getMessage());
}
@@ -682,8 +782,7 @@
} catch (SyncException e) {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(e.getMessage());
}
@@ -693,6 +792,182 @@
}
+ /**
+ * Register a new SyncListener.
+ *
+ * @param listener
+ */
+ public void addSyncListener (SyncListener listener)
{
+ syncListeners.addElement(listener);
+ }
+
+ /**
+ * Remove the specified SyncListener.
+ *
+ * @param listener
+ */
+ public void removeSyncListener (SyncListener listener)
{
+ syncListeners.removeElement(listener);
+ }
+
+ /**
+ * Register a new SyncTransportListener.
+ *
+ * @param listener
+ */
+ public void addSyncTransportListener (SyncTransportListener listener)
{
+ syncTransportListeners.addElement(listener);
+ }
+
+ /**
+ * Remove the specified SyncTransportListener.
+ *
+ * @param listener
+ */
+ public void removeSyncTransportListener (SyncTransportListener listener)
{
+ syncTransportListeners.removeElement(listener);
+ }
+
+ /**
+ * Register a new SyncSourceListener.
+ *
+ * @param listener
+ */
+ public void addSyncSourceListener (SyncSourceListener listener)
{
+ syncSourceListeners.addElement(listener);
+ }
+
+ /**
+ * Remove the specified SyncSourceListener.
+ *
+ * @param listener
+ */
+ public void removeSyncSourceListener (SyncSourceListener listener)
{
+ syncSourceListeners.removeElement(listener);
+ }
+
+ /**
+ * Register a new SyncItemListener.
+ *
+ * @param listener
+ */
+ public void addSyncItemListener (SyncItemListener listener)
{
+ syncItemListeners.addElement(listener);
+ }
+
+ /**
+ * Remove the specified SyncItemListener.
+ *
+ * @param listener
+ */
+ public void removeSyncItemListener (SyncItemListener listener)
{
+ syncItemListeners.removeElement(listener);
+ }
+
+ /**
+ * Register a new SyncStatusListener.
+ *
+ * @param listener
+ */
+ public void addSyncStatusListener (SyncStatusListener listener)
{
+ syncStatusListeners.addElement(listener);
+ }
+
+ /**
+ * Remove the specified SyncStatusListener.
+ *
+ * @param listener
+ */
+ public void removeSyncStatusListener (SyncStatusListener listener)
{
+ syncStatusListeners.removeElement(listener);
+ }
+
+
+ /**
+ * Send syncTransportEvent to syncTransportListeners
+ * on sendDataBegin method.
+ *
+ * @param syncTransportEvent
+ */
+ public void sendDataBegin(SyncTransportEvent syncTransportEvent) {
+
+ for (int i = 0, l = syncTransportListeners.size(); i < l; i++) {
+
+ ((SyncTransportListener)
+ syncTransportListeners.elementAt(i)).
+ sendDataBegin(syncTransportEvent);
+ }
+
+ }
+
+ /**
+ * Send syncTransportEvent to syncTransportListeners
+ * on sendDataEnd method.
+ *
+ * @param syncTransportEvent
+ */
+ public void sendDataEnd(SyncTransportEvent syncTransportEvent) {
+
+ for (int i = 0, l = syncTransportListeners.size(); i < l; i++) {
+
+ ((SyncTransportListener)
+ syncTransportListeners.elementAt(i)).
+ sendDataEnd(syncTransportEvent);
+ }
+
+ }
+
+ /**
+ * Send syncTransportEvent to syncTransportListeners
+ * on receiveDataBegin method.
+ *
+ * @param syncTransportEvent
+ */
+ public void receiveDataBegin(SyncTransportEvent syncTransportEvent) {
+
+ for (int i = 0, l = syncTransportListeners.size(); i < l; i++) {
+
+ ((SyncTransportListener)
+ syncTransportListeners.elementAt(i)).
+ receiveDataBegin(syncTransportEvent);
+ }
+
+ }
+
+ /**
+ * Send syncTransportEvent to syncTransportListeners
+ * on dataReceived method.
+ *
+ * @param syncTransportEvent
+ */
+ public void dataReceived(SyncTransportEvent syncTransportEvent) {
+
+ for (int i = 0, l = syncTransportListeners.size(); i < l; i++) {
+
+ ((SyncTransportListener)
+ syncTransportListeners.elementAt(i)).
+ dataReceived(syncTransportEvent);
+ }
+
+ }
+
+ /**
+ * Send syncTransportEvent to syncTransportListeners
+ * on receiveDataEnd method.
+ *
+ * @param syncTransportEvent
+ */
+ public void receiveDataEnd(SyncTransportEvent syncTransportEvent) {
+
+ for (int i = 0, l = syncTransportListeners.size(); i < l; i++) {
+
+ ((SyncTransportListener)
+ syncTransportListeners.elementAt(i)).
+ receiveDataEnd(syncTransportEvent);
+ }
+
+ }
+
//---------------------------------------------------------- Private
methods
/**
@@ -718,8 +993,7 @@
checkStatus(response, TAG_SYNCHDR ) ;
checkStatus(response, TAG_ALERT ) ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Initialization done");
}
@@ -738,8 +1012,7 @@
String response = null;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Sending modifications");
}
@@ -757,6 +1030,35 @@
}
/**
+ * Synch Modification.
+ *
+ * @throws UpdateException
+ * @return sync modification response
+ **/
+ private String sendAlertMessage()
+ throws SyncException {
+
+ String response = null;
+
+ if (logger.isLoggable(Logger.INFO) ||
+ logger.isLoggable(Logger.DEBUG)) {
+ logger.info("Sending modifications");
+ }
+
+ try {
+ response = postRequest(alertXML);
+ } catch(SyncException e) {
+ String msg = "Error sync modification: " + e.getMessage();
+ throw new SyncException(msg);
+ } catch (Exception e) {
+ String msg = "Error sync modification: " + e.getMessage();
+ throw new SyncException(msg);
+ }
+
+ return response;
+ }
+
+ /**
* Sync LUID-GUID mapping.
*
* @throws UpdateException
@@ -765,8 +1067,7 @@
private void syncMapping()
throws SyncException {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Sending mapping");
}
@@ -777,8 +1078,7 @@
throw new SyncException(msg);
}
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Synchronization done");
}
@@ -807,8 +1107,12 @@
}
try {
+
syncMLClient = (BaseSyncMLClient)
(Class.forName(syncMLClientClassName)).newInstance();
+
+ syncMLClient.addSyncTransportListener(this);
+
} catch (Exception e) {
throw new SyncException ("Error loading class " +
syncMLClientClassName +
@@ -874,6 +1178,11 @@
// 212
//
return;
+ } else if
(String.valueOf(StatusCode.REFRESH_REQUIRED).equals(statusCode)) {
+ //
+ // 508
+ //
+ return;
} else if
(String.valueOf(StatusCode.INVALID_CREDENTIALS).equals(statusCode) ||
String.valueOf(StatusCode.FORBIDDEN).equals
(statusCode) ||
String.valueOf(StatusCode.MISSING_CREDENTIALS).equals(statusCode)) {
@@ -958,8 +1267,7 @@
" is " +
alert ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(logMsg);
}
@@ -974,7 +1282,6 @@
private void prepareInizializationMessage()
throws SyncException {
- String sessionId = null ;
String username = null ;
String password = null ;
String userKey = null ;
@@ -988,7 +1295,6 @@
authenticationType = (String) syncParams.get(PARAM_AUTHENTICATION) ;
-
username = (String) syncParams.get(PARAM_USERNAME) ;
password = (String) syncParams.get(PARAM_PASSWORD) ;
@@ -1012,11 +1318,8 @@
throw new SyncException("Configuration error, authentication
type");
}
-
targetLocUri = (String) syncParams.get(PARAM_TARGETLOCALURI ) ;
deviceId = (String) syncParams.get(PARAM_DEVICEID ) ;
- sessionId = "12345678";
-
int l = sourceURIs.length;
@@ -1027,7 +1330,7 @@
clientInitXML = MessageFormat.format(
clientInitXML,
new Object[] {
- sessionId ,
+ SESSION_ID ,
targetLocUri ,
userKey ,
dbAlertsXML.toString() ,
@@ -1064,32 +1367,132 @@
//
boolean ret = false;
+ //
+ // about status command
+ //
+ Vector sourceUris = null ;
+ String sourceUri = null ;
+ String status = null ;
+ String cmdName = null ;
+ SyncItemKey key = null ;
+ Item [] items = null ;
+ SourceRef [] sr = null ;
+ TargetRef [] tr = null ;
+ int sourceUriCount = 0 ;
+ boolean added = false ;
+ boolean updated = false ;
+ boolean deleted = false ;
+
+ sourceUris = new Vector();
+
for (int i=0; (cmds != null) && (i<cmds.length); ++i) {
+ //
+ // process sync command
+ //
if (SyncCommand.COMMAND_NAME.equals(cmds[i].getName())) {
+
processSyncCommand((SyncCommand)cmds[i], msgRef);
ret = true;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
String source =((SyncCommand)
cmds[i]).getTarget().getURI();
logger.info("Returned " +
- returnNewItems +
+ receivedNewItems +
" new items, " +
- returnUpdateItems +
+ receivedUpdateItems +
" updated items, " +
- returnDeleteItems +
+ receivedDeleteItems +
" deleted items for " +
source );
}
- returnNewItems = 0 ;
- returnUpdateItems = 0 ;
- returnDeleteItems = 0 ;
+ receivedNewItems = 0 ;
+ receivedUpdateItems = 0 ;
+ receivedDeleteItems = 0 ;
+
+ //
+ // process status command
+ //
+ } else if (StatusCommand.COMMAND_NAME.equals(cmds[i].getName()))
{
+
+ cmdName = ((StatusCommand) cmds[i]).getCommandName();
+
+ if (cmdName.equals("Sync")) {
+ tr = ((StatusCommand) cmds[i]).getTargetRefs();
+ sourceUris.addElement(tr[0].toString());
+ }
+
+ if (cmdName.equals("Add" ) ||
+ cmdName.equals("Replace" ) ||
+ cmdName.equals("Delete" )) {
+
+ if (cmdName.equals ("Add" )) {
+ added = true;
+ } else if (cmdName.equals("Replace")) {
+ updated = true;
+ } else if (cmdName.equals("Delete" )) {
+ deleted = true;
+ }
+
+ //
+ // sourceUri about item
+ //
+ if ((cmdName.equals("Add" ) && added ) ||
+ (cmdName.equals("Update" ) && updated ) ||
+ (cmdName.equals("Delete" ) && deleted )) {
+ sourceUriCount++;
+ }
+
+ sourceUri = (String)
sourceUris.elementAt(sourceUriCount) ;
+ sr = ((StatusCommand)
cmds[i]).getSourceRefs() ;
+ status = ((StatusCommand)
cmds[i]).getData().toString() ;
+
+ //
+ // 1 status item
+ //
+ if (sr != null && sr.length > 0) {
+
+ key = new SyncItemKey(sr[0].toString());
+
+ syncStatusEvent = new
+ SyncStatusEvent (SyncStatusEvent.STATUS_RECEIVED
,
+ cmdName
,
+ Integer.parseInt(status)
,
+ key
,
+ sourceUri
);
+
+ fireSyncStatusEvent(syncStatusEvent);
+
+ //
+ // more than 1 status items
+ //
+ } else {
+
+ items = ((StatusCommand) cmds[i]).getItems();
+
+ for (int k = 0, m = items.length; k < m; k++) {
+ key = new
SyncItemKey(items[k].getSource().getURI());
+
+ syncStatusEvent = new
+ SyncStatusEvent (SyncStatusEvent.STATUS_RECEIVED
,
+ cmdName
,
+ Integer.parseInt(status)
,
+ key
,
+ sourceUri
);
+
+ fireSyncStatusEvent(syncStatusEvent);
+
+ }
+ }
+
+ }
+
}
+
}
return ret;
@@ -1135,6 +1538,7 @@
}
}
+
/**
* Performs a modification command on the given store calling
modifyRecords().
* This implementation handles only Add, Delete and Replace commands;
all other
@@ -1316,7 +1720,6 @@
private void prepareModificationMessage()
throws SyncException {
- String sessionId = null;
String targetLocUri = null;
String deviceId = null;
@@ -1324,7 +1727,6 @@
targetLocUri = (String) syncParams.get(PARAM_TARGETLOCALURI ) ;
deviceId = (String) syncParams.get(PARAM_DEVICEID ) ;
- sessionId = "12345678";
StringBuffer syncTag = new StringBuffer();
@@ -1338,7 +1740,7 @@
// Note we must sync only the sources that are aknoledged by the
// server with a server Alert command.
//
- if (logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.DEBUG)) {
logger.debug("serverAlerts: " + serverAlerts);
}
@@ -1349,8 +1751,7 @@
sourceURIs[i] +
". The source will not be synchronized." ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(msg);
}
@@ -1363,13 +1764,11 @@
//
// Slow Sync!
//
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Preparing slow sync for " + sourceURIs[i]);
}
items = filterRecordsForSlowSync(sourceURIs[i]);
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Detected " + items.size() + " items");
}
@@ -1377,42 +1776,36 @@
//
// Refresh from server
//
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Preparing refresh for " + sourceURIs[i]);
}
items = new Vector(); // no items sent for refresh
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("No items sent for refresh");
}
} else if (alertCode == AlertCode.ONE_WAY_FROM_SERVER) {
//
// One-way sync from server: no needs of client modifications
//
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Preparing one-way sync for " +
sourceURIs[i]);
}
items = new Vector(); // no items sent for one-way
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("No items sent for one-way");
}
} else {
//
// Fast Sync!
//
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Preparing fast sync for " + sourceURIs[i]);
}
//
// NOTE: filterRecordsForFastSync returns items in updated
state
//
items = filterRecordsForFastSync(sourceURIs[i]);
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Detected " +
detectedNewItems +
" new items, " +
@@ -1433,7 +1826,7 @@
}
modificationsXML =
- MessageFormat.format(modificationsXML, new Object[] {sessionId ,
+ MessageFormat.format(modificationsXML, new Object[] {SESSION_ID ,
targetLocUri ,
deviceId ,
deviceId ,
@@ -1441,6 +1834,27 @@
syncTag.toString()});
}
+ /**
+ * Prepare alert message
+ *
+ **/
+ private void prepareAlertMessage() {
+
+ String targetLocUri = null;
+ String deviceId = null;
+
+ targetLocUri = (String) syncParams.get(PARAM_TARGETLOCALURI ) ;
+ deviceId = (String) syncParams.get(PARAM_DEVICEID ) ;
+
+ alertXML =
+ MessageFormat.format(alertXML, new Object[] {SESSION_ID ,
+ url ,
+ deviceId ,
+ url ,
+ deviceId ,
+ targetLocUri ,
+ deviceId
});
+ }
/**
* Prepare mapping message
@@ -1449,7 +1863,6 @@
private void prepareMappingMessage() {
Hashtable sourceMapping = null ;
- String sessionId = null ;
String targetLocUri = null ;
String deviceId = null ;
@@ -1457,7 +1870,6 @@
targetLocUri = (String) syncParams.get(PARAM_TARGETLOCALURI ) ;
deviceId = (String) syncParams.get(PARAM_DEVICEID ) ;
- sessionId = "12345678" ;
StringBuffer mapTag = new StringBuffer();
@@ -1506,7 +1918,7 @@
}
mappingXML =
- MessageFormat.format(mappingXML, new Object[] {sessionId ,
+ MessageFormat.format(mappingXML, new Object[] {SESSION_ID ,
targetLocUri ,
deviceId ,
deviceId ,
@@ -1531,11 +1943,14 @@
basePath = rootNode.getContext();
- clientInitXML = read(new FileInputStream(basePath +
XML_INITIALIZATION));
-
- modificationsXML = read(new FileInputStream(basePath +
XML_MODIFICATIONS));
-
- mappingXML = read(new FileInputStream(basePath + XML_MAPPING));
+ alertXML = read
+ (new FileInputStream (basePath + XML_ALERT ));
+ clientInitXML = read
+ (new FileInputStream (basePath + XML_INITIALIZATION ));
+ modificationsXML = read
+ (new FileInputStream (basePath + XML_MODIFICATIONS ));
+ mappingXML = read
+ (new FileInputStream (basePath + XML_MAPPING ));
}
@@ -1713,6 +2128,14 @@
detectedNewItems = items.length;
for (int i=0; i < detectedNewItems; i++) {
ret.addElement(items[i]);
+
+ syncItemEvent = new
+ SyncItemEvent(SyncItemEvent.ITEM_ADDED_BY_CLIENT ,
+ sourceURI ,
+ items[i].getKey() );
+
+ fireSyncItemEvent(syncItemEvent);
+
}
}
@@ -1721,6 +2144,14 @@
detectedUpdateItems = items.length;
for (int i=0; i < detectedUpdateItems; i++) {
ret.addElement(items[i]);
+
+ syncItemEvent = new
+ SyncItemEvent(SyncItemEvent.ITEM_UPDATED_BY_CLIENT ,
+ sourceURI ,
+ items[i].getKey() );
+
+ fireSyncItemEvent(syncItemEvent);
+
}
}
@@ -1729,6 +2160,14 @@
detectedDeleteItems = items.length;
for (int i=0; i < detectedDeleteItems; i++) {
ret.addElement(items[i]);
+
+ syncItemEvent = new
+ SyncItemEvent(SyncItemEvent.ITEM_DELETED_BY_CLIENT ,
+ sourceURI ,
+ items[i].getKey() );
+
+ fireSyncItemEvent(syncItemEvent);
+
}
}
@@ -1829,38 +2268,68 @@
newItem.getKey().getKeyAsString(),
item.getKey().getKeyAsString()
);
- returnNewItems ++;
+ receivedNewItems ++;
+ syncItemEvent = new
+ SyncItemEvent(SyncItemEvent.ITEM_ADDED_BY_SERVER
,
+ syncSource.getSourceURI()
,
+ item.getKey()
);
+
+ fireSyncItemEvent(syncItemEvent);
break;
case SyncItemState.UPDATED:
- syncSource.setSyncItem
- (null,
- syncOperations[i].getSyncItem() );
- returnUpdateItems ++;
+
+ SyncItem syncItem = syncOperations[i].getSyncItem();
+
+ syncSource.setSyncItem (null,syncItem );
+ receivedUpdateItems ++;
+ syncItemEvent = new
+
SyncItemEvent(SyncItemEvent.ITEM_UPDATED_BY_SERVER ,
+ syncSource.getSourceURI()
,
+ syncItem.getKey()
);
+
+ fireSyncItemEvent(syncItemEvent);
break;
case SyncItemState.DELETED:
- syncSource.removeSyncItem
- (null,
- syncOperations[i].getSyncItem() );
- returnDeleteItems ++;
+
+ syncItem = syncOperations[i].getSyncItem();
+
+ syncSource.removeSyncItem (null, syncItem);
+ receivedDeleteItems ++;
+ syncItemEvent = new
+
SyncItemEvent(SyncItemEvent.ITEM_DELETED_BY_SERVER ,
+ syncSource.getSourceURI()
,
+ syncItem.getKey()
);
+
+ fireSyncItemEvent(syncItemEvent);
break;
}
itemStatus = StatusCode.OK;
} catch (SyncException e) {
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
- logger.info( "Error setting the item "
- + item.getKey().getKeyAsString()
- + ": "
- + e.getMessage()
- + "\nCaused by: "
- + ( (e.getCause() != null)
- ? e.getCause().getMessage()
- : "(not available)")
- );
- }
+ if (logger.isLoggable(Logger.INFO)) {
+ logger.info( "Error setting the item "
+ + item.getKey().getKeyAsString()
+ + ": "
+ + e.getMessage()
+ + "\nCaused by: "
+ + ( (e.getCause() != null)
+ ? e.getCause().getMessage()
+ : "(not available)")
+ );
+ }
+
itemStatus = StatusCode.COMMAND_FAILED;
+
+ syncEvent = new
+ SyncEvent(SyncEvent.SYNC_ERROR ,
+ System.currentTimeMillis() ,
+ e.getMessage() ,
+ e );
+
+ fireSyncEvent(syncEvent);
+
+
}
if (syncOperations[i].getOperation() == SyncItemState.NEW ) {
@@ -1880,6 +2349,14 @@
String.valueOf(itemStatus)
}
);
+ syncStatusEvent = new
+ SyncStatusEvent(SyncStatusEvent.STATUS_TO_SEND ,
+ cmdName ,
+ itemStatus ,
+ item.getKey() ,
+ syncSource.getSourceURI() );
+
+ fireSyncStatusEvent(syncStatusEvent);
}
@@ -2056,8 +2533,7 @@
}
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info("Sync mode " + sync + " not recognized. Using
two-way");
}
@@ -2089,11 +2565,18 @@
sourceURI +
" not synchronized" ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(msg);
}
+ syncEvent = new
+ SyncEvent(SyncEvent.SYNC_ERROR ,
+ System.currentTimeMillis() ,
+ e.getMessage() ,
+ e );
+
+ fireSyncEvent(syncEvent);
+
return false;
}
@@ -2149,11 +2632,18 @@
") for " +
sourceURI ;
- if (logger.isLoggable(Logger.LEVEL_INFO) ||
- logger.isLoggable(Logger.LEVEL_DEBUG)) {
+ if (logger.isLoggable(Logger.INFO)) {
logger.info(msg);
}
+ syncEvent = new
+ SyncEvent(SyncEvent.SYNC_ERROR ,
+ System.currentTimeMillis() ,
+ t.getMessage() ,
+ t );
+
+ fireSyncEvent(syncEvent);
+
}
return -1;
@@ -2355,7 +2845,7 @@
}
if (logLevel == null || logLevel.length() == 0) {
- Logger.setDefaultLoggerLevel();
+ Logger.setDefaultLevel();
} else if (!logLevel.equals(Logger.PROP_NONE) &&
!logLevel.equals(Logger.PROP_INFO) &&
!logLevel.equals(Logger.PROP_DEBUG)) {
@@ -2364,7 +2854,7 @@
"incorrect log-level: " +
logLevel );
} else {
- Logger.setLoggerLevel(logLevel);
+ Logger.setLevel(logLevel);
}
if (logFile == null || logFile.length() == 0) {
@@ -2417,5 +2907,146 @@
}
+ /**
+ * Fire SyncEvent
+ * to syncListeners.
+ *
+ * @param syncEvent
+ */
+ private void fireSyncEvent(SyncEvent syncEvent) {
+
+ for (int i = 0, l = syncListeners.size(); i < l; i++) {
+
+ if (syncEvent.getType() ==
+ SyncEvent.SYNC_BEGIN) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ syncBegin(syncEvent);
+ } else if (syncEvent.getType() ==
+ SyncEvent.SYNC_END) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ syncEnd(syncEvent);
+ } else if (syncEvent.getType() ==
+ SyncEvent.SYNC_ERROR) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ syncError(syncEvent);
+ } else if (syncEvent.getType() ==
+ SyncEvent.SEND_INITIALIZATION) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ sendInitialization(syncEvent);
+ } else if (syncEvent.getType() ==
+ SyncEvent.SEND_MODIFICATION) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ sendModification(syncEvent);
+ } else if (syncEvent.getType() ==
+ SyncEvent.SEND_FINALIZATION) {
+ ((SyncListener)
+ syncListeners.elementAt(i)).
+ sendFinalization(syncEvent);
+ }
+
+ }
+
+ }
+
+ /**
+ * Fire SyncSourceEvent
+ * to syncSourceListeners.
+ *
+ * @param syncSourceEvent
+ */
+ private void fireSyncSourceEvent(SyncSourceEvent syncSourceEvent) {
+
+ for (int i = 0, l = syncSourceListeners.size(); i < l; i++) {
+
+ if (syncSourceEvent.getType() ==
+ syncSourceEvent.SYNC_BEGIN) {
+ ((SyncSourceListener)
+ syncSourceListeners.elementAt(i)).
+ syncBegin(syncSourceEvent);
+ } else if (syncSourceEvent.getType() ==
+ syncSourceEvent.SYNC_END) {
+ ((SyncSourceListener)
+ syncSourceListeners.elementAt(i)).
+ syncEnd(syncSourceEvent);
+ }
+
+ }
+
+ }
+
+ /**
+ * Fire SyncItemEvent
+ * to syncItemListeners.
+ *
+ * @param syncItemEvent
+ */
+ private void fireSyncItemEvent(SyncItemEvent syncItemEvent) {
+
+ for (int i = 0, l = syncItemListeners.size(); i < l; i++) {
+
+ if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_ADDED_BY_SERVER) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemAddedByServer(syncItemEvent);
+ } else if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_DELETED_BY_SERVER) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemDeletedByServer(syncItemEvent);
+ } else if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_UPDATED_BY_SERVER) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemUpdatedByServer(syncItemEvent);
+ } else if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_ADDED_BY_CLIENT) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemAddedByClient(syncItemEvent);
+ } else if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_DELETED_BY_CLIENT) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemDeletedByClient(syncItemEvent);
+ } else if (syncItemEvent.getType() ==
+ SyncItemEvent.ITEM_UPDATED_BY_CLIENT) {
+ ((SyncItemListener)
+ syncItemListeners.elementAt(i)).
+ itemUpdatedByClient(syncItemEvent);
+ }
+
+ }
+
+ }
+
+ /**
+ * Fire SyncStatusEvent
+ * to syncStatusListeners.
+ *
+ * @param syncStatusEvent
+ */
+ private void fireSyncStatusEvent(SyncStatusEvent syncStatusEvent) {
+
+ for (int i = 0, l = syncStatusListeners.size(); i < l; i++) {
+ if (syncStatusEvent.getType() ==
+ syncStatusEvent.STATUS_TO_SEND) {
+ ((SyncStatusListener)
+ syncStatusListeners.elementAt(i)).
+ statusToSend(syncStatusEvent);
+ } else if (syncStatusEvent.getType() ==
+ syncStatusEvent.STATUS_RECEIVED) {
+ ((SyncStatusListener)
+ syncStatusListeners.elementAt(i)).
+ statusReceived(syncStatusEvent);
+ }
+
+ }
+ }
}
\ No newline at end of file