# HG changeset patch
# User Asier Lostalé <asier.lostale@openbravo.com>
# Date 1335279919 -7200
# Node ID 92cb624e3987b8a532f9e5d3b5ca96087a24218d
# Parent  7e96bd54d7b0a9c144f3ab1f80fed9eccf230648
fixed issue 020337: Direct navigation should be filtered by record

 Direct and linked items navigation is now filtered by the selected record, this
 improves perfomance because it is not needed to retrieve all records in grid to
 calculate selected recod position in grid.

diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/src-db/database/sourcedata/AD_MESSAGE.xml
--- a/modules/org.openbravo.client.application/src-db/database/sourcedata/AD_MESSAGE.xml	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/src-db/database/sourcedata/AD_MESSAGE.xml	Tue Apr 24 17:05:19 2012 +0200
@@ -332,6 +332,17 @@
 <!--6267D26C10A84572BBA5B3360F847E65-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
 <!--6267D26C10A84572BBA5B3360F847E65--></AD_MESSAGE>
 
+<!--6504DF0738A142D599C824644653BA88--><AD_MESSAGE>
+<!--6504DF0738A142D599C824644653BA88-->  <AD_MESSAGE_ID><![CDATA[6504DF0738A142D599C824644653BA88]]></AD_MESSAGE_ID>
+<!--6504DF0738A142D599C824644653BA88-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--6504DF0738A142D599C824644653BA88-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--6504DF0738A142D599C824644653BA88-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--6504DF0738A142D599C824644653BA88-->  <VALUE><![CDATA[OBUIAPP_SingleRecordFilterMsg]]></VALUE>
+<!--6504DF0738A142D599C824644653BA88-->  <MSGTEXT><![CDATA[The grid is filtered for the last document viewed. Due to high volumes, clearing this filter can take up to a 30 seconds delay.]]></MSGTEXT>
+<!--6504DF0738A142D599C824644653BA88-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--6504DF0738A142D599C824644653BA88-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
+<!--6504DF0738A142D599C824644653BA88--></AD_MESSAGE>
+
 <!--675524506E80458799E39F8CC309CBFD--><AD_MESSAGE>
 <!--675524506E80458799E39F8CC309CBFD-->  <AD_MESSAGE_ID><![CDATA[675524506E80458799E39F8CC309CBFD]]></AD_MESSAGE_ID>
 <!--675524506E80458799E39F8CC309CBFD-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
@@ -575,6 +586,17 @@
 <!--9A66DC27282742BF825F53B741231823-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
 <!--9A66DC27282742BF825F53B741231823--></AD_MESSAGE>
 
+<!--9DFDAA99FA614533B4042E6C02266BC7--><AD_MESSAGE>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <AD_MESSAGE_ID><![CDATA[9DFDAA99FA614533B4042E6C02266BC7]]></AD_MESSAGE_ID>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <VALUE><![CDATA[OBUIAPP_GridFilterSingleRecord]]></VALUE>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <MSGTEXT><![CDATA[Single record filter applied. Click to clear.]]></MSGTEXT>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--9DFDAA99FA614533B4042E6C02266BC7-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
+<!--9DFDAA99FA614533B4042E6C02266BC7--></AD_MESSAGE>
+
 <!--9EFEA3F8412B4F5C836DFB40034156EA--><AD_MESSAGE>
 <!--9EFEA3F8412B4F5C836DFB40034156EA-->  <AD_MESSAGE_ID><![CDATA[9EFEA3F8412B4F5C836DFB40034156EA]]></AD_MESSAGE_ID>
 <!--9EFEA3F8412B4F5C836DFB40034156EA-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/src-db/database/sourcedata/AD_REF_LIST.xml
--- a/modules/org.openbravo.client.application/src-db/database/sourcedata/AD_REF_LIST.xml	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/src-db/database/sourcedata/AD_REF_LIST.xml	Tue Apr 24 17:05:19 2012 +0200
@@ -58,6 +58,18 @@
 <!--40A4904733AF41BD9BBAA95344D3A3EF-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
 <!--40A4904733AF41BD9BBAA95344D3A3EF--></AD_REF_LIST>
 
+<!--57A4B4D636954DF88444CAD72B20598B--><AD_REF_LIST>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <AD_REF_LIST_ID><![CDATA[57A4B4D636954DF88444CAD72B20598B]]></AD_REF_LIST_ID>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <VALUE><![CDATA[OBUIAPP_ShowSingleRecordFilterMsg]]></VALUE>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <NAME><![CDATA[Show Single Record Filter Message]]></NAME>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <DESCRIPTION><![CDATA[If true, shows a message when single record filter is applied]]></DESCRIPTION>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <AD_REFERENCE_ID><![CDATA[A26BA480E2014707B47257024C3CBFF7]]></AD_REFERENCE_ID>
+<!--57A4B4D636954DF88444CAD72B20598B-->  <AD_MODULE_ID><![CDATA[9BA0836A3CD74EE4AB48753A47211BCC]]></AD_MODULE_ID>
+<!--57A4B4D636954DF88444CAD72B20598B--></AD_REF_LIST>
+
 <!--AB1C6E86500844C3B4B222D8402AC1B2--><AD_REF_LIST>
 <!--AB1C6E86500844C3B4B222D8402AC1B2-->  <AD_REF_LIST_ID><![CDATA[AB1C6E86500844C3B4B222D8402AC1B2]]></AD_REF_LIST_ID>
 <!--AB1C6E86500844C3B4B222D8402AC1B2-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form-linked-items.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form-linked-items.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form-linked-items.js	Tue Apr 24 17:05:19 2012 +0200
@@ -224,7 +224,7 @@
    * Opens linked item in a new window
    */
   openLinkedItemInNewWindow: function (record) {
-    OB.Utilities.openView(record.adWindowId, record.adTabId, record.adMenuName, record.id, 'DIRECT', null, record.readOnly, record.singleRecord);
+    OB.Utilities.openView(record.adWindowId, record.adTabId, record.adMenuName, record.id, 'DIRECT', null, record.readOnly, record.singleRecord, true);
   },
 
   /**
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/form/ob-view-form.js	Tue Apr 24 17:05:19 2012 +0200
@@ -1323,6 +1323,13 @@
     if (this.isNew) {
       this.view.refreshChildViews();
     }
+
+    if (this.view.directNavigation) {
+      // direct navigation opens form view, set message in toolbar when switching 
+      // back to grid
+      this.view.viewGrid.setSingleRecordFilterMessage();
+    }
+
     this.view.standardWindow.setDirtyEditForm(null);
   },
 
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js	Tue Apr 24 17:05:19 2012 +0200
@@ -443,6 +443,9 @@
     if (!noPerformAction) {
       this.filterEditor.performAction();
     }
+    if (this.view && this.view.directNavigation) {
+      delete this.view.directNavigation;
+    }
   },
 
   showSummaryRow: function () {
@@ -478,6 +481,19 @@
     this.checkShowFilterFunnelIcon(criteria);
   },
 
+  setSingleRecordFilterMessage: function () {
+    var showMessageProperty, showMessage;
+
+    if (!this.view.isShowingForm && (this.view.messageBar && !this.view.messageBar.isVisible())) {
+
+      showMessageProperty = OB.PropertyStore.get('OBUIAPP_ShowSingleRecordFilterMsg');
+      showMessage = showMessageProperty !== 'N' && showMessageProperty !== '"N"';
+
+      this.view.messageBar.setMessage(isc.OBMessageBar.TYPE_INFO, '<div><div style="float: left;">' + OB.I18N.getLabel('OBUIAPP_SingleRecordFilterMsg') + '<br/>' + OB.I18N.getLabel('OBUIAPP_ClearFilters') + '</div><div style="float: right; padding-top: 15px;"><a href="#" style="font-weight:normal; color:inherit;" onclick="' + 'window[\'' + this.view.messageBar.ID + '\'].hide(); OB.PropertyStore.set(\'OBUIAPP_ShowSingleRecordFilterMsg\', \'N\');">' + OB.I18N.getLabel('OBUIAPP_NeverShowMessageAgain') + '</a></div></div>', ' ');
+      this.view.messageBar.hasFilterMessage = true;
+    }
+  },
+
   checkShowFilterFunnelIcon: function (criteria) {
     if (!this.filterImage) {
       return;
@@ -485,7 +501,12 @@
     var gridIsFiltered = this.isGridFiltered(criteria);
     var noParentOrParentSelected = !this.view || !this.view.parentView || (this.view.parentView.viewGrid.getSelectedRecords() && this.view.parentView.viewGrid.getSelectedRecords().length > 0);
 
-    if (this.filterClause && gridIsFiltered) {
+    if (this.view && this.view.directNavigation) {
+      this.filterImage.prompt = OB.I18N.getLabel('OBUIAPP_GridFilterSingleRecord');
+      this.filterImage.show(true);
+      this.setSingleRecordFilterMessage();
+      return;
+    } else if (this.filterClause && gridIsFiltered) {
       this.filterImage.prompt = OB.I18N.getLabel('OBUIAPP_GridFilterBothToolTip');
       this.filterImage.show(true);
     } else if (this.filterClause) {
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js	Tue Apr 24 17:05:19 2012 +0200
@@ -1217,6 +1217,10 @@
       if (this.isOpenDirectMode && this.view.parentView) {
         params._filterByParentProperty = this.view.parentProperty;
       }
+
+      if (this.view && this.view.directNavigation) {
+        params._directNavigation = true;
+      }
     } else if (params._targetRecordId) {
       delete params._targetRecordId;
     }
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-utilities.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-utilities.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-utilities.js	Tue Apr 24 17:05:19 2012 +0200
@@ -367,7 +367,7 @@
 // ** {{{OB.Utilities.openView}}} **
 // Open a view taking into account if a specific window should be opened in classic mode or not.
 // Returns the object used to open the window.
-OB.Utilities.openView = function (windowId, tabId, tabTitle, recordId, command, icon, readOnly, singleRecord) {
+OB.Utilities.openView = function (windowId, tabId, tabTitle, recordId, command, icon, readOnly, singleRecord, direct) {
   var isClassicEnvironment = OB.Utilities.useClassicMode(windowId);
 
   var openObject;
@@ -411,19 +411,18 @@
   if (command) {
     openObject.command = command;
   }
-  OB.Layout.ViewManager.openView(openObject.viewId, openObject);
+  OB.Layout.ViewManager.openView(openObject.viewId, openObject, null, direct);
   return openObject;
 };
 
 // ** {{{OB.Utilities.openDirectView}}} **
 // Open the correct view for a passed in target definition, coming from a certain source Window.
 OB.Utilities.openDirectView = function (sourceWindowId, keyColumn, targetEntity, recordId) {
-
   var actionURL = OB.Application.contextUrl + 'utility/ReferencedLink.html',
       callback, reqObj, request;
 
   callback = function (response, data, request) {
-    OB.Utilities.openView(data.windowId, data.tabId, data.tabTitle, data.recordId);
+    OB.Utilities.openView(data.windowId, data.tabId, data.tabTitle, data.recordId, null, null, null, null, true);
   };
 
   reqObj = {
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-view-manager.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-view-manager.js	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/utilities/ob-view-manager.js	Tue Apr 24 17:05:19 2012 +0200
@@ -230,8 +230,7 @@
     // information
     // to initialize an instance.
     //
-    openView: function (viewName, params, state) {
-
+    openView: function (viewName, params, state, direct) {
       params = params || {};
 
       // only add closable views to the recent items, this prevents the workspace
@@ -262,7 +261,7 @@
       // Returns the function implementation of a View
       //
 
-      function getView(viewName, params, state) {
+      function getView(viewName, params, state, direct) {
 
         if (!viewName) {
           throw {
@@ -275,7 +274,7 @@
         // Shows a view in a tab in the {{{ TabSet }}} or external
         //
 
-        function showTab(viewName, params, state) {
+        function showTab(viewName, params, state, direct) {
 
           // will as a default display a loading tab when loading the 
           // view from the server or creating a new instance
@@ -284,7 +283,8 @@
           // 2) view is not open but class was loaded (open view and show loading bar)
           // 3) view is open and class is loaded (show loading bar in open view)          
           var viewTabId, tabTitle, loadingTab = vmgr.findLoadingTab(params),
-              loadingPane, currentPane, tabSet = OB.MainView.TabSet;
+              loadingPane, currentPane, tabSet = OB.MainView.TabSet,
+              parent, i;
 
           params = params || {};
 
@@ -323,7 +323,7 @@
             // but don't forget to destroy it afterwards...
             var cnv = isc.Canvas.create({
               openView: function () {
-                vmgr.openView(viewName, params);
+                vmgr.openView(viewName, params, null, direct);
                 // delete so that at the next opening a new loading layout
                 // is created
                 delete params.loadingTabId;
@@ -342,6 +342,29 @@
             viewInstance.setViewState(state);
           }
 
+          if (direct) {
+            // set directly opened tab and all its ancestors as directNavigation
+            if (params && params.id) {
+              var tabId = params.id;
+
+              if (viewInstance.view && viewInstance.view.tabId === tabId) {
+                viewInstance.view.directNavigation = true;
+              } else if (viewInstance.views) {
+                for (i = 0; viewInstance.views.length; i++) {
+                  if (viewInstance.views[i].tabId === tabId) {
+                    viewInstance.views[i].directNavigation = true;
+                    parent = viewInstance.views[i].parentView;
+                    while (parent) {
+                      parent.directNavigation = true;
+                      parent = parent.parentView;
+                    }
+                    break;
+                  }
+                }
+              }
+            }
+          }
+
           // is not shown in a tab, let it show itself in a different way
           // but first get rid of the loading tab
           if (viewInstance && viewInstance.show && viewInstance.showsItself) {
@@ -425,16 +448,16 @@
               message: 'The view ' + viewName + ' not defined'
             };
           }
-          showTab(viewName, params);
+          showTab(viewName, params, null, direct);
         }
 
         if (isc[viewName]) {
-          showTab(viewName, params);
+          showTab(viewName, params, null, direct);
         } else {
           vmgr.fetchView(viewName, fetchViewCallback, null, params, true);
         }
       }
-      getView(viewName, params, state);
+      getView(viewName, params, state, direct);
     },
 
     // ** {{{ ViewManager.restoreState(state, data) }}} **
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
--- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java	Tue Apr 24 17:05:19 2012 +0200
@@ -11,7 +11,7 @@
  * under the License. 
  * The Original Code is Openbravo ERP. 
  * The Initial Developer of the Original Code is Openbravo SLU 
- * All portions are Copyright (C) 2009-2011 Openbravo SLU 
+ * All portions are Copyright (C) 2009-2012 Openbravo SLU 
  * All Rights Reserved. 
  * Contributor(s):  ______________________________________.
  ************************************************************************
@@ -208,14 +208,22 @@
     if (parameters.containsKey(JsonConstants.USE_ALIAS)) {
       queryService.setUseAlias();
     }
-    // set the where/org filter parameters and the @ parameters
-    for (String key : parameters.keySet()) {
-      if (key.equals(JsonConstants.WHERE_PARAMETER)
-          || key.equals(JsonConstants.IDENTIFIER)
-          || key.equals(JsonConstants.ORG_PARAMETER)
-          || (key.startsWith(DataEntityQueryService.PARAM_DELIMITER) && key
-              .endsWith(DataEntityQueryService.PARAM_DELIMITER))) {
-        queryService.addFilterParameter(key, parameters.get(key));
+    boolean directNavigation = parameters.containsKey("_directNavigation")
+        && "true".equals(parameters.get("_directNavigation"))
+        && parameters.containsKey(JsonConstants.TARGETRECORDID_PARAMETER);
+
+    if (!directNavigation) {
+      // set the where/org filter parameters and the @ parameters
+      for (String key : parameters.keySet()) {
+        if (key.equals(JsonConstants.WHERE_PARAMETER)
+            || key.equals(JsonConstants.IDENTIFIER)
+            || key.equals(JsonConstants.ORG_PARAMETER)
+            || key.equals(JsonConstants.TARGETRECORDID_PARAMETER)
+            || (key.startsWith(DataEntityQueryService.PARAM_DELIMITER) && key
+                .endsWith(DataEntityQueryService.PARAM_DELIMITER))) {
+          queryService.addFilterParameter(key, parameters.get(key));
+        }
+
       }
     }
     queryService.setCriteria(JsonUtils.buildCriteria(parameters));
@@ -260,7 +268,7 @@
 
     // compute a new startrow if the targetrecordid was passed in
     int targetRowNumber = -1;
-    if (parameters.containsKey(JsonConstants.TARGETRECORDID_PARAMETER)) {
+    if (!directNavigation && parameters.containsKey(JsonConstants.TARGETRECORDID_PARAMETER)) {
       final String targetRecordId = parameters.get(JsonConstants.TARGETRECORDID_PARAMETER);
       targetRowNumber = queryService.getRowNumber(targetRecordId);
       if (targetRowNumber != -1) {
diff -r 7e96bd54d7b0 -r 92cb624e3987 modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonUtils.java
--- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonUtils.java	Fri Apr 20 11:17:28 2012 +0200
+++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonUtils.java	Tue Apr 24 17:05:19 2012 +0200
@@ -11,7 +11,7 @@
  * under the License. 
  * The Original Code is Openbravo ERP. 
  * The Initial Developer of the Original Code is Openbravo SLU 
- * All portions are Copyright (C) 2009-2011 Openbravo SLU 
+ * All portions are Copyright (C) 2009-2012 Openbravo SLU 
  * All Rights Reserved. 
  * Contributor(s):  ______________________________________.
  ************************************************************************
@@ -281,6 +281,24 @@
   public static JSONObject buildCriteria(Map<String, String> parameters) {
     try {
       final JSONObject criteria = new JSONObject();
+      final List<JSONObject> criteriaObjects = new ArrayList<JSONObject>();
+
+      if (parameters.containsKey("_directNavigation")
+          && "true".equals(parameters.get("_directNavigation"))
+          && parameters.containsKey(JsonConstants.TARGETRECORDID_PARAMETER)) {
+
+        criteria.put("_constructor", "AdvancedCriteria");
+        criteria.put("operator", "and");
+
+        JSONObject id = new JSONObject();
+        id.put("fieldName", "id");
+        id.put("operator", "equals");
+        id.put("value", parameters.get(JsonConstants.TARGETRECORDID_PARAMETER));
+
+        criteriaObjects.add(id);
+        criteria.put("criteria", new JSONArray(criteriaObjects));
+        return criteria;
+      }
 
       if (parameters.get(JsonConstants.OR_EXPRESSION_PARAMETER) != null) {
         criteria.put("operator", "or");
@@ -289,7 +307,6 @@
       }
       criteria.put("_constructor", "AdvancedCriteria");
 
-      final List<JSONObject> criteriaObjects = new ArrayList<JSONObject>();
       if (parameters.containsKey("criteria") && !parameters.get("criteria").equals("")) {
         String fullCriteriaStr = parameters.get("criteria");
         if (fullCriteriaStr.startsWith("[")) {
