Attached Files | 39260-retail-sync.diff [^] (8,911 bytes) 2018-09-24 21:52 [Show Content] [Hide Content]diff --git a/src-db/database/sourcedata/STRSYNC_EXCLUDEDCOL.xml b/src-db/database/sourcedata/STRSYNC_EXCLUDEDCOL.xml
--- a/src-db/database/sourcedata/STRSYNC_EXCLUDEDCOL.xml
+++ b/src-db/database/sourcedata/STRSYNC_EXCLUDEDCOL.xml
@@ -520,6 +520,19 @@
<!--558EFA08F88A44329F63F37632184C35--> <EXCLUDE_ON_UPDATE><![CDATA[Y]]></EXCLUDE_ON_UPDATE>
<!--558EFA08F88A44329F63F37632184C35--></STRSYNC_EXCLUDEDCOL>
+<!--56413565723645258F06F333D9A7FBEA--><STRSYNC_EXCLUDEDCOL>
+<!--56413565723645258F06F333D9A7FBEA--> <STRSYNC_EXCLUDEDCOL_ID><![CDATA[56413565723645258F06F333D9A7FBEA]]></STRSYNC_EXCLUDEDCOL_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--56413565723645258F06F333D9A7FBEA--> <AD_MODULE_ID><![CDATA[C7EC0756A4044DD48BF6BB6A1CDD7734]]></AD_MODULE_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <AD_COLUMN_ID><![CDATA[603F88BC1EAB4CB5A2582018C393A680]]></AD_COLUMN_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <STRSYNC_SYNCHRONIZEDTABLE_ID><![CDATA[E0C5F001E5F14AEDB89967F3C4A88367]]></STRSYNC_SYNCHRONIZEDTABLE_ID>
+<!--56413565723645258F06F333D9A7FBEA--> <EXCLUDE_DIR><![CDATA[Bidirectional]]></EXCLUDE_DIR>
+<!--56413565723645258F06F333D9A7FBEA--> <EXCLUDE_ON_INSERT><![CDATA[Y]]></EXCLUDE_ON_INSERT>
+<!--56413565723645258F06F333D9A7FBEA--> <EXCLUDE_ON_UPDATE><![CDATA[Y]]></EXCLUDE_ON_UPDATE>
+<!--56413565723645258F06F333D9A7FBEA--></STRSYNC_EXCLUDEDCOL>
+
<!--5922BFE537D94662A3E0DD0D64001401--><STRSYNC_EXCLUDEDCOL>
<!--5922BFE537D94662A3E0DD0D64001401--> <STRSYNC_EXCLUDEDCOL_ID><![CDATA[5922BFE537D94662A3E0DD0D64001401]]></STRSYNC_EXCLUDEDCOL_ID>
<!--5922BFE537D94662A3E0DD0D64001401--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -879,7 +892,7 @@
<!--9035CA88840F40D2944E54749343EA78--> <AD_MODULE_ID><![CDATA[C7EC0756A4044DD48BF6BB6A1CDD7734]]></AD_MODULE_ID>
<!--9035CA88840F40D2944E54749343EA78--> <AD_COLUMN_ID><![CDATA[BCA1C23DFDC143C9809363F701FE63C6]]></AD_COLUMN_ID>
<!--9035CA88840F40D2944E54749343EA78--> <STRSYNC_SYNCHRONIZEDTABLE_ID><![CDATA[E0C5F001E5F14AEDB89967F3C4A88367]]></STRSYNC_SYNCHRONIZEDTABLE_ID>
-<!--9035CA88840F40D2944E54749343EA78--> <EXCLUDE_DIR><![CDATA[Bidirectional]]></EXCLUDE_DIR>
+<!--9035CA88840F40D2944E54749343EA78--> <EXCLUDE_DIR><![CDATA[CentralToStore]]></EXCLUDE_DIR>
<!--9035CA88840F40D2944E54749343EA78--> <EXCLUDE_ON_INSERT><![CDATA[Y]]></EXCLUDE_ON_INSERT>
<!--9035CA88840F40D2944E54749343EA78--> <EXCLUDE_ON_UPDATE><![CDATA[Y]]></EXCLUDE_ON_UPDATE>
<!--9035CA88840F40D2944E54749343EA78--></STRSYNC_EXCLUDEDCOL>
@@ -1261,6 +1274,19 @@
<!--C9B858A3702B487FAFDF4FD29539536F--> <EXCLUDE_ON_UPDATE><![CDATA[Y]]></EXCLUDE_ON_UPDATE>
<!--C9B858A3702B487FAFDF4FD29539536F--></STRSYNC_EXCLUDEDCOL>
+<!--CA109F4E1F624F9398B10BCC44E44239--><STRSYNC_EXCLUDEDCOL>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <STRSYNC_EXCLUDEDCOL_ID><![CDATA[CA109F4E1F624F9398B10BCC44E44239]]></STRSYNC_EXCLUDEDCOL_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <AD_MODULE_ID><![CDATA[C7EC0756A4044DD48BF6BB6A1CDD7734]]></AD_MODULE_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <AD_COLUMN_ID><![CDATA[FB2FCBC01E4D4346B54B6B0399074F4D]]></AD_COLUMN_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <STRSYNC_SYNCHRONIZEDTABLE_ID><![CDATA[E0C5F001E5F14AEDB89967F3C4A88367]]></STRSYNC_SYNCHRONIZEDTABLE_ID>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <EXCLUDE_DIR><![CDATA[Bidirectional]]></EXCLUDE_DIR>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <EXCLUDE_ON_INSERT><![CDATA[Y]]></EXCLUDE_ON_INSERT>
+<!--CA109F4E1F624F9398B10BCC44E44239--> <EXCLUDE_ON_UPDATE><![CDATA[Y]]></EXCLUDE_ON_UPDATE>
+<!--CA109F4E1F624F9398B10BCC44E44239--></STRSYNC_EXCLUDEDCOL>
+
<!--D573B02AA7624313B4D26E0673AE7160--><STRSYNC_EXCLUDEDCOL>
<!--D573B02AA7624313B4D26E0673AE7160--> <STRSYNC_EXCLUDEDCOL_ID><![CDATA[D573B02AA7624313B4D26E0673AE7160]]></STRSYNC_EXCLUDEDCOL_ID>
<!--D573B02AA7624313B4D26E0673AE7160--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src/org/openbravo/retail/storeserver/synchronization/RetailSynchronizationRequestHandler.java b/src/org/openbravo/retail/storeserver/synchronization/RetailSynchronizationRequestHandler.java
--- a/src/org/openbravo/retail/storeserver/synchronization/RetailSynchronizationRequestHandler.java
+++ b/src/org/openbravo/retail/storeserver/synchronization/RetailSynchronizationRequestHandler.java
@@ -118,9 +118,10 @@
return true;
}
- // handle invalid offline here
+ // handle invalid offline here, two cases
final boolean isOffline = thisServerDefinition.getStatus().equals(
MobileServerState.OFFLINE.getValue());
+ // sync errors when going offline and still sync errors
if (isOffline && MobileServerController.getInstance().isThisAStoreServer()
&& thisServerDefinition.isOfflineIncomingErrors()
&& ReplicationUtils.doIncomingSyncErrorsExist()) {
@@ -128,6 +129,13 @@
writeResponseJSON(response, "INVALID_OFFLINE");
return false;
}
+ // delta which is too old when going offline and still is too old
+ if (isOffline && MobileServerController.getInstance().isThisAStoreServer()
+ && thisServerDefinition.isExpiredDeltaAge() && MobileServerUtils.isDeltaAgeExpired()) {
+ // send back invalid offline status
+ writeResponseJSON(response, "INVALID_OFFLINE");
+ return false;
+ }
// only forward to CS if online
final boolean isOnline = thisServerDefinition.getStatus().equals(
diff --git a/src/org/openbravo/retail/storeserver/synchronization/StoreServerTransitionToOfflineExternalHandler.java b/src/org/openbravo/retail/storeserver/synchronization/StoreServerTransitionToOfflineExternalHandler.java
--- a/src/org/openbravo/retail/storeserver/synchronization/StoreServerTransitionToOfflineExternalHandler.java
+++ b/src/org/openbravo/retail/storeserver/synchronization/StoreServerTransitionToOfflineExternalHandler.java
@@ -21,6 +21,7 @@
import org.apache.log4j.Logger;
import org.openbravo.mobile.core.servercontroller.MobileServerController.TransitionToOfflineExternalHandler;
+import org.openbravo.mobile.core.servercontroller.MobileServerUtils;
import org.openbravo.replication.symmetricds.util.ReplicationUtils;
/**
@@ -38,8 +39,12 @@
@Override
public boolean allowTransitionToOffline() {
final boolean allow = !ReplicationUtils.doIncomingSyncErrorsExist()
- && StoreServerVersionHandler.getInstance().areCentralStoreServerVersionsCompatible();
+ && StoreServerVersionHandler.getInstance().areCentralStoreServerVersionsCompatible()
+ && !MobileServerUtils.isDeltaAgeExpired();
if (!allow) {
+ if (MobileServerUtils.isDeltaAgeExpired()) {
+ log.info("Delta age is too old, can not go to offline");
+ }
if (ReplicationUtils.doIncomingSyncErrorsExist()) {
log.info("Can not transition to offline because there are incoming sync errors");
}
diff --git a/src/org/openbravo/retail/storeserver/synchronization/eventhandler/MobileServerEventHandler.java b/src/org/openbravo/retail/storeserver/synchronization/eventhandler/MobileServerEventHandler.java
--- a/src/org/openbravo/retail/storeserver/synchronization/eventhandler/MobileServerEventHandler.java
+++ b/src/org/openbravo/retail/storeserver/synchronization/eventhandler/MobileServerEventHandler.java
@@ -52,6 +52,9 @@
private static Property OFFLINE_ERROR_PROPERTY = ModelProvider.getInstance()
.getEntity(MobileServerDefinition.ENTITY_NAME)
.getProperty(MobileServerDefinition.PROPERTY_OFFLINEINCOMINGERRORS);
+ private static Property EXPIRED_DELTA_AGE_PROPERTY = ModelProvider.getInstance()
+ .getEntity(MobileServerDefinition.ENTITY_NAME)
+ .getProperty(MobileServerDefinition.PROPERTY_EXPIREDDELTAAGE);
private static Property STATUS_PROPERTY = ModelProvider.getInstance()
.getEntity(MobileServerDefinition.ENTITY_NAME)
.getProperty(MobileServerDefinition.PROPERTY_STATUS);
@@ -96,8 +99,10 @@
final Boolean offlineError = (Boolean) event.getCurrentState(OFFLINE_ERROR_PROPERTY);
if (currentStateOffline && !previousStateOffline) {
event.setCurrentState(OFFLINE_ERROR_PROPERTY, ReplicationUtils.doIncomingSyncErrorsExist());
+ event.setCurrentState(OFFLINE_ERROR_PROPERTY, MobileServerUtils.isDeltaAgeExpired());
} else if (currentStateOnline && offlineError != null && offlineError) {
event.setCurrentState(OFFLINE_ERROR_PROPERTY, false);
+ event.setCurrentState(EXPIRED_DELTA_AGE_PROPERTY, false);
}
}
}
39260-core.diff [^] (23,612 bytes) 2018-09-24 21:52 [Show Content] [Hide Content]diff --git a/src-db/database/model/tables/OBMOBC_SERVER_DEFINITION.xml b/src-db/database/model/tables/OBMOBC_SERVER_DEFINITION.xml
--- a/src-db/database/model/tables/OBMOBC_SERVER_DEFINITION.xml
+++ b/src-db/database/model/tables/OBMOBC_SERVER_DEFINITION.xml
@@ -97,6 +97,14 @@
<default><![CDATA[N]]></default>
<onCreateDefault/>
</column>
+ <column name="DELTA_AGE" primaryKey="false" required="false" type="TIMESTAMP" size="7" autoIncrement="false">
+ <default/>
+ <onCreateDefault/>
+ </column>
+ <column name="EXPIRED_DELTA_AGE" primaryKey="false" required="false" type="CHAR" size="1" autoIncrement="false">
+ <default><![CDATA[N]]></default>
+ <onCreateDefault/>
+ </column>
<foreign-key foreignTable="AD_CLIENT" name="OBMOBC_SERV_DEF_AD_CLNT">
<reference local="AD_CLIENT_ID" foreign="AD_CLIENT_ID"/>
</foreign-key>
diff --git a/src-db/database/sourcedata/AD_COLUMN.xml b/src-db/database/sourcedata/AD_COLUMN.xml
--- a/src-db/database/sourcedata/AD_COLUMN.xml
+++ b/src-db/database/sourcedata/AD_COLUMN.xml
@@ -980,7 +980,7 @@
<!--4FFE3405421B4551BE5C663AF9B52457--> <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
<!--4FFE3405421B4551BE5C663AF9B52457--> <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
<!--4FFE3405421B4551BE5C663AF9B52457--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
-<!--4FFE3405421B4551BE5C663AF9B52457--> <POSITION><![CDATA[32]]></POSITION>
+<!--4FFE3405421B4551BE5C663AF9B52457--> <POSITION><![CDATA[24]]></POSITION>
<!--4FFE3405421B4551BE5C663AF9B52457--> <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
<!--4FFE3405421B4551BE5C663AF9B52457--> <ISAUTOSAVE><![CDATA[Y]]></ISAUTOSAVE>
<!--4FFE3405421B4551BE5C663AF9B52457--> <VALIDATEONNEW><![CDATA[Y]]></VALIDATEONNEW>
@@ -1333,6 +1333,43 @@
<!--5DD40286DCBD40C7823CC0AD3C016882--> <ALLOWED_CROSS_ORG_LINK><![CDATA[N]]></ALLOWED_CROSS_ORG_LINK>
<!--5DD40286DCBD40C7823CC0AD3C016882--></AD_COLUMN>
+<!--603F88BC1EAB4CB5A2582018C393A680--><AD_COLUMN>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_COLUMN_ID><![CDATA[603F88BC1EAB4CB5A2582018C393A680]]></AD_COLUMN_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <NAME><![CDATA[Expired_Delta_Age]]></NAME>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <COLUMNNAME><![CDATA[Expired_Delta_Age]]></COLUMNNAME>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_TABLE_ID><![CDATA[9A030632C0FC4C4AA8A58EC59BE2D116]]></AD_TABLE_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_REFERENCE_ID><![CDATA[20]]></AD_REFERENCE_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <FIELDLENGTH><![CDATA[1]]></FIELDLENGTH>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <DEFAULTVALUE><![CDATA[N]]></DEFAULTVALUE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISKEY><![CDATA[N]]></ISKEY>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISPARENT><![CDATA[N]]></ISPARENT>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISMANDATORY><![CDATA[N]]></ISMANDATORY>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISUPDATEABLE><![CDATA[Y]]></ISUPDATEABLE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISIDENTIFIER><![CDATA[N]]></ISIDENTIFIER>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <SEQNO><![CDATA[340]]></SEQNO>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISTRANSLATED><![CDATA[N]]></ISTRANSLATED>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISSELECTIONCOLUMN><![CDATA[N]]></ISSELECTIONCOLUMN>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_ELEMENT_ID><![CDATA[09B5F260704147DFA5A9140708982C52]]></AD_ELEMENT_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <POSITION><![CDATA[34]]></POSITION>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISAUTOSAVE><![CDATA[Y]]></ISAUTOSAVE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <VALIDATEONNEW><![CDATA[Y]]></VALIDATEONNEW>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <IMAGESIZEVALUESACTION><![CDATA[N]]></IMAGESIZEVALUESACTION>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ISUSEDSEQUENCE><![CDATA[N]]></ISUSEDSEQUENCE>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ALLOWSORTING><![CDATA[Y]]></ALLOWSORTING>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ALLOWFILTERING><![CDATA[Y]]></ALLOWFILTERING>
+<!--603F88BC1EAB4CB5A2582018C393A680--> <ALLOWED_CROSS_ORG_LINK><![CDATA[N]]></ALLOWED_CROSS_ORG_LINK>
+<!--603F88BC1EAB4CB5A2582018C393A680--></AD_COLUMN>
+
<!--6EEBA8A387AF4B6FA22AF4A6EFB78137--><AD_COLUMN>
<!--6EEBA8A387AF4B6FA22AF4A6EFB78137--> <AD_COLUMN_ID><![CDATA[6EEBA8A387AF4B6FA22AF4A6EFB78137]]></AD_COLUMN_ID>
<!--6EEBA8A387AF4B6FA22AF4A6EFB78137--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -3204,6 +3241,42 @@
<!--F53CD2CB9AD84C1BA0D28698E197AD8F--> <ALLOWED_CROSS_ORG_LINK><![CDATA[N]]></ALLOWED_CROSS_ORG_LINK>
<!--F53CD2CB9AD84C1BA0D28698E197AD8F--></AD_COLUMN>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--><AD_COLUMN>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_COLUMN_ID><![CDATA[FB2FCBC01E4D4346B54B6B0399074F4D]]></AD_COLUMN_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <NAME><![CDATA[Delta_Age]]></NAME>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <COLUMNNAME><![CDATA[Delta_Age]]></COLUMNNAME>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_TABLE_ID><![CDATA[9A030632C0FC4C4AA8A58EC59BE2D116]]></AD_TABLE_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_REFERENCE_ID><![CDATA[16]]></AD_REFERENCE_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <FIELDLENGTH><![CDATA[19]]></FIELDLENGTH>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISKEY><![CDATA[N]]></ISKEY>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISPARENT><![CDATA[N]]></ISPARENT>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISMANDATORY><![CDATA[N]]></ISMANDATORY>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISUPDATEABLE><![CDATA[Y]]></ISUPDATEABLE>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISIDENTIFIER><![CDATA[N]]></ISIDENTIFIER>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <SEQNO><![CDATA[330]]></SEQNO>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISTRANSLATED><![CDATA[N]]></ISTRANSLATED>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISENCRYPTED><![CDATA[N]]></ISENCRYPTED>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISSELECTIONCOLUMN><![CDATA[N]]></ISSELECTIONCOLUMN>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_ELEMENT_ID><![CDATA[FA3C973C815A468BA0328AF2686880B3]]></AD_ELEMENT_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISSESSIONATTR><![CDATA[N]]></ISSESSIONATTR>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISSECONDARYKEY><![CDATA[N]]></ISSECONDARYKEY>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISDESENCRYPTABLE><![CDATA[N]]></ISDESENCRYPTABLE>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <DEVELOPMENTSTATUS><![CDATA[RE]]></DEVELOPMENTSTATUS>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <POSITION><![CDATA[33]]></POSITION>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISTRANSIENT><![CDATA[N]]></ISTRANSIENT>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISAUTOSAVE><![CDATA[Y]]></ISAUTOSAVE>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <VALIDATEONNEW><![CDATA[Y]]></VALIDATEONNEW>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <IMAGESIZEVALUESACTION><![CDATA[N]]></IMAGESIZEVALUESACTION>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ISUSEDSEQUENCE><![CDATA[N]]></ISUSEDSEQUENCE>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ALLOWSORTING><![CDATA[Y]]></ALLOWSORTING>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ALLOWFILTERING><![CDATA[Y]]></ALLOWFILTERING>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--> <ALLOWED_CROSS_ORG_LINK><![CDATA[N]]></ALLOWED_CROSS_ORG_LINK>
+<!--FB2FCBC01E4D4346B54B6B0399074F4D--></AD_COLUMN>
+
<!--FD3212084901442C99A26D22516704C7--><AD_COLUMN>
<!--FD3212084901442C99A26D22516704C7--> <AD_COLUMN_ID><![CDATA[FD3212084901442C99A26D22516704C7]]></AD_COLUMN_ID>
<!--FD3212084901442C99A26D22516704C7--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src-db/database/sourcedata/AD_ELEMENT.xml b/src-db/database/sourcedata/AD_ELEMENT.xml
--- a/src-db/database/sourcedata/AD_ELEMENT.xml
+++ b/src-db/database/sourcedata/AD_ELEMENT.xml
@@ -1,5 +1,17 @@
<?xml version='1.0' encoding='UTF-8'?>
<data>
+<!--09B5F260704147DFA5A9140708982C52--><AD_ELEMENT>
+<!--09B5F260704147DFA5A9140708982C52--> <AD_ELEMENT_ID><![CDATA[09B5F260704147DFA5A9140708982C52]]></AD_ELEMENT_ID>
+<!--09B5F260704147DFA5A9140708982C52--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--09B5F260704147DFA5A9140708982C52--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--09B5F260704147DFA5A9140708982C52--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--09B5F260704147DFA5A9140708982C52--> <COLUMNNAME><![CDATA[Expired_Delta_Age]]></COLUMNNAME>
+<!--09B5F260704147DFA5A9140708982C52--> <NAME><![CDATA[Expired Delta Age]]></NAME>
+<!--09B5F260704147DFA5A9140708982C52--> <PRINTNAME><![CDATA[Expired Delta Age]]></PRINTNAME>
+<!--09B5F260704147DFA5A9140708982C52--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--09B5F260704147DFA5A9140708982C52--> <ISGLOSSARY><![CDATA[N]]></ISGLOSSARY>
+<!--09B5F260704147DFA5A9140708982C52--></AD_ELEMENT>
+
<!--0B7E54F58AC441C1B7D876005F10620E--><AD_ELEMENT>
<!--0B7E54F58AC441C1B7D876005F10620E--> <AD_ELEMENT_ID><![CDATA[0B7E54F58AC441C1B7D876005F10620E]]></AD_ELEMENT_ID>
<!--0B7E54F58AC441C1B7D876005F10620E--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -379,6 +391,18 @@
<!--F9C329FB3757490DA8B62412E7429B0C--> <ISGLOSSARY><![CDATA[N]]></ISGLOSSARY>
<!--F9C329FB3757490DA8B62412E7429B0C--></AD_ELEMENT>
+<!--FA3C973C815A468BA0328AF2686880B3--><AD_ELEMENT>
+<!--FA3C973C815A468BA0328AF2686880B3--> <AD_ELEMENT_ID><![CDATA[FA3C973C815A468BA0328AF2686880B3]]></AD_ELEMENT_ID>
+<!--FA3C973C815A468BA0328AF2686880B3--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--FA3C973C815A468BA0328AF2686880B3--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--FA3C973C815A468BA0328AF2686880B3--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--FA3C973C815A468BA0328AF2686880B3--> <COLUMNNAME><![CDATA[Delta_Age]]></COLUMNNAME>
+<!--FA3C973C815A468BA0328AF2686880B3--> <NAME><![CDATA[Delta Age]]></NAME>
+<!--FA3C973C815A468BA0328AF2686880B3--> <PRINTNAME><![CDATA[Delta Age]]></PRINTNAME>
+<!--FA3C973C815A468BA0328AF2686880B3--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--FA3C973C815A468BA0328AF2686880B3--> <ISGLOSSARY><![CDATA[N]]></ISGLOSSARY>
+<!--FA3C973C815A468BA0328AF2686880B3--></AD_ELEMENT>
+
<!--FD99C82285AB4FD3B000D89D3707C6A8--><AD_ELEMENT>
<!--FD99C82285AB4FD3B000D89D3707C6A8--> <AD_ELEMENT_ID><![CDATA[FD99C82285AB4FD3B000D89D3707C6A8]]></AD_ELEMENT_ID>
<!--FD99C82285AB4FD3B000D89D3707C6A8--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src-db/database/sourcedata/AD_REF_LIST.xml b/src-db/database/sourcedata/AD_REF_LIST.xml
--- a/src-db/database/sourcedata/AD_REF_LIST.xml
+++ b/src-db/database/sourcedata/AD_REF_LIST.xml
@@ -730,4 +730,16 @@
<!--F62C86D3E1744BD5AB153E53620D5A34--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
<!--F62C86D3E1744BD5AB153E53620D5A34--></AD_REF_LIST>
+<!--FEF361B73D7F426CA3796C730720960C--><AD_REF_LIST>
+<!--FEF361B73D7F426CA3796C730720960C--> <AD_REF_LIST_ID><![CDATA[FEF361B73D7F426CA3796C730720960C]]></AD_REF_LIST_ID>
+<!--FEF361B73D7F426CA3796C730720960C--> <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--FEF361B73D7F426CA3796C730720960C--> <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--FEF361B73D7F426CA3796C730720960C--> <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--FEF361B73D7F426CA3796C730720960C--> <VALUE><![CDATA[OBMOBC_MaxDeltaSyncAge]]></VALUE>
+<!--FEF361B73D7F426CA3796C730720960C--> <NAME><![CDATA[Maximum Allowed Delta Sync Age (seconds)]]></NAME>
+<!--FEF361B73D7F426CA3796C730720960C--> <DESCRIPTION><![CDATA[Maximum allowed delta sync age of outgoing batches to the store in seconds]]></DESCRIPTION>
+<!--FEF361B73D7F426CA3796C730720960C--> <AD_REFERENCE_ID><![CDATA[A26BA480E2014707B47257024C3CBFF7]]></AD_REFERENCE_ID>
+<!--FEF361B73D7F426CA3796C730720960C--> <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--FEF361B73D7F426CA3796C730720960C--></AD_REF_LIST>
+
</data>
diff --git a/src/org/openbravo/mobile/core/servercontroller/MobileServerStatusInformation.java b/src/org/openbravo/mobile/core/servercontroller/MobileServerStatusInformation.java
--- a/src/org/openbravo/mobile/core/servercontroller/MobileServerStatusInformation.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MobileServerStatusInformation.java
@@ -10,6 +10,13 @@
import java.io.IOException;
import java.io.Writer;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -26,12 +33,15 @@
import org.openbravo.dal.service.OBDal;
import org.openbravo.mobile.core.process.JSONRowConverter;
import org.openbravo.mobile.core.process.ProcessHQLQuery;
+import org.openbravo.service.json.JsonUtils;
@AuthenticationManager.Stateless
public class MobileServerStatusInformation extends ProcessHQLQuery {
private static final Logger log = Logger.getLogger(MobileServerStatusInformation.class);
+ private static SimpleDateFormat dateTimeFormat = JsonUtils.createDateTimeFormat();
+
@Override
public void exec(Writer w, JSONObject jsonsent) throws IOException, ServletException {
try {
@@ -45,7 +55,8 @@
query.setParameter("serverId", MobileServerController.getInstance()
.getThisServerDefinitionId());
final String qryResult = query.uniqueResult();
- updateLastPingAndTransitionToOnlineIfNeeded(session);
+ updateLastPingAndTransitionToOnlineIfNeeded(session,
+ jsonsent.has("deltaAge") ? jsonsent.getString("deltaAge") : null);
if (qryResult != null) {
w.write("\"serverStatus\": \"" + qryResult + "\"");
}
@@ -57,15 +68,41 @@
}
}
- private void updateLastPingAndTransitionToOnlineIfNeeded(Session session) {
+ private void updateLastPingAndTransitionToOnlineIfNeeded(Session session, String deltaAgeStr)
+ throws ParseException {
Date lastPingFromCentral = ServerStateBackground.getLastPingFromCentral();
Date lastPingThreshold = ServerStateBackground.getLastPingThreshold();
boolean lastPingFromCentralWasExpired = lastPingFromCentral.before(lastPingThreshold);
- @SuppressWarnings("rawtypes")
- final Query query = session
- .createQuery("UPDATE OBMOBC_SERVER_DEFINITION SET lastPing=now() WHERE servertype = 'MAIN'");
- query.executeUpdate();
+ Date deltaAge = getFromString(deltaAgeStr);
+
+ Connection connection = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ connection = OBDal.getInstance().getConnection();
+ ps = connection
+ .prepareStatement("UPDATE OBMOBC_SERVER_DEFINITION SET last_Ping=now(), delta_age=? WHERE servertype = 'MAIN'");
+ if (deltaAge == null) {
+ ps.setNull(1, Types.TIMESTAMP);
+ } else {
+ ps.setTimestamp(1, new Timestamp(deltaAge.getTime()));
+ }
+ ps.executeUpdate();
+ } catch (Exception ex) {
+ log.error("Error while setting delta age", ex);
+ } finally {
+ try {
+ if (ps != null) {
+ ps.close();
+ }
+ if (rs != null) {
+ rs.close();
+ }
+ } catch (Exception e) {
+ log.error("Error while releasing a prepared statement", e);
+ }
+ }
if (lastPingFromCentralWasExpired) {
log.info("Store offline, new Ping received from central server after >3 pings missed. Transitioning to online.");
@@ -85,6 +122,13 @@
return hqls;
}
+ private synchronized Date getFromString(String value) throws ParseException {
+ if (value == null) {
+ return null;
+ }
+ return dateTimeFormat.parse(value);
+ }
+
@Override
protected boolean bypassSecurity() {
return true;
diff --git a/src/org/openbravo/mobile/core/servercontroller/MobileServerUtils.java b/src/org/openbravo/mobile/core/servercontroller/MobileServerUtils.java
--- a/src/org/openbravo/mobile/core/servercontroller/MobileServerUtils.java
+++ b/src/org/openbravo/mobile/core/servercontroller/MobileServerUtils.java
@@ -10,6 +10,10 @@
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
@@ -23,6 +27,7 @@
import org.openbravo.base.secureApp.AllowedCrossDomainsHandler;
import org.openbravo.dal.core.OBContext;
import org.openbravo.dal.service.OBDal;
+import org.openbravo.database.ConnectionProvider;
import org.openbravo.erpCommon.businessUtility.Preferences;
import org.openbravo.erpCommon.utility.PropertyException;
import org.openbravo.mobile.core.MobileServerDefinition;
@@ -31,6 +36,7 @@
import org.openbravo.model.ad.domain.Preference;
import org.openbravo.model.ad.system.Client;
import org.openbravo.model.common.enterprise.Organization;
+import org.openbravo.service.db.DalConnectionProvider;
/**
* @author mtaal
@@ -39,6 +45,8 @@
private static final Logger log = Logger.getLogger(MobileServerUtils.class);
+ private static final int FIVE_MINUTES = 5 * 60;
+
public static final String MOBILE_SERVER_KEY = "mobile.server.key";
public static final String MAIN_SERVER = "MAIN";
public static final String STORE_SERVER = "STORE";
@@ -46,6 +54,51 @@
private static Boolean multiServerControllerEnabled = null;
+ public static boolean isDeltaAgeExpired() {
+
+ Date deltaAge = null;
+ Connection connection = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ ConnectionProvider readOnlyCP = DalConnectionProvider.getReadOnlyConnectionProvider();
+ try {
+ connection = readOnlyCP.getTransactionConnection();
+ ps = connection
+ .prepareStatement("SELECT delta_age FROM obmobc_server_definition WHERE servertype = 'MAIN'");
+ ps.setMaxRows(1);
+ rs = ps.executeQuery();
+ while (rs.next()) {
+ if (rs.wasNull()) {
+ deltaAge = null;
+ } else {
+ deltaAge = rs.getTimestamp(1);
+ }
+ }
+ } catch (Exception ex) {
+ log.error("Error while getting delta age", ex);
+ } finally {
+ try {
+ if (ps != null) {
+ ps.close();
+ }
+ if (rs != null) {
+ rs.close();
+ }
+ } catch (Exception e) {
+ log.error("Error while releasing a prepared statement", e);
+ }
+ }
+
+ if (deltaAge == null) {
+ return false;
+ }
+
+ int maxDeltaAge = MobileServerUtils
+ .getIntegerPreference("OBMOBC_MaxDeltaSyncAge", FIVE_MINUTES);
+
+ return ((System.currentTimeMillis() - deltaAge.getTime()) / 1000) > maxDeltaAge;
+ }
+
public static boolean isInvalidOrigin(HttpServlet servlet, HttpServletRequest request,
HttpServletResponse response) {
try {
diff --git a/src/org/openbravo/mobile/core/servercontroller/ServerStateBackground.java b/src/org/openbravo/mobile/core/servercontroller/ServerStateBackground.java
--- a/src/org/openbravo/mobile/core/servercontroller/ServerStateBackground.java
+++ b/src/org/openbravo/mobile/core/servercontroller/ServerStateBackground.java
@@ -8,6 +8,11 @@
*/
package org.openbravo.mobile.core.servercontroller;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
@@ -39,6 +44,7 @@
import org.openbravo.scheduling.ProcessContext;
import org.openbravo.scheduling.ProcessLogger;
import org.openbravo.service.db.DalBaseProcess;
+import org.openbravo.service.json.JsonUtils;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
@@ -55,6 +61,8 @@
private static final int SERVERS_PER_THREAD = 60;
private static final int WAIT_TIME = 1000 * 60 * 10;
+ private static SimpleDateFormat dateTimeFormat = JsonUtils.createDateTimeFormat();
+
private Boolean offlineTriggerOnlyByUserActions = null;
private Set<PingServerChecker> pingServerCheckers;
@@ -472,9 +480,19 @@
private void pingServer(String serverId, final JSONObject parameters, final String queryParams) {
MobileServerDefinition srv = OBDal.getInstance().get(MobileServerDefinition.class, serverId);
+
String newStatus = srv.getStatus();
JSONObject resp = null;
try {
+
+ // determine deltaage and pass it in
+ Date deltaAge = getOldestAgeBatchForServer(srv.getName());
+ String deltaAgeStr = null;
+ if (deltaAge != null) {
+ deltaAgeStr = convertToString(deltaAge);
+ }
+ parameters.put("deltaAge", deltaAgeStr);
+
resp = new JSONObject(MobileServerRequestExecutor.getInstance().request(srv,
MobileServerUtils.OBWSPATH + MobileServerStatusInformation.class.getName(),
queryParams, "POST", parameters)).getJSONObject("response");
@@ -497,6 +515,42 @@
}
}
+ private synchronized String convertToString(Date dt) {
+ return dateTimeFormat.format(dt);
+ }
+
+ private Date getOldestAgeBatchForServer(String serverId) {
+ Connection connection = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ connection = OBDal.getInstance().getConnection();
+ ps = connection
+ .prepareStatement("SELECT create_time FROM sym_outgoing_batch where channel_id <> 'reload' and node_id=? and status<>'OK' order by create_time asc");
+ ps.setMaxRows(1);
+ ps.setString(1, serverId);
+ rs = ps.executeQuery();
+ while (rs.next()) {
+ return rs.getTimestamp(1);
+ }
+ } catch (Exception ex) {
+ log4j.error("Error while getting oldest outgoing batch", ex);
+ } finally {
+ try {
+ if (ps != null) {
+ ps.close();
+ }
+ if (rs != null) {
+ rs.close();
+ }
+ } catch (Exception e) {
+ log4j.error("Error while releasing a prepared statement", e);
+ }
+ }
+
+ return null;
+ }
+
private String getStatusFromResponse(JSONObject response) throws JSONException {
String newStatus = null;
if (response != null) {
|