This is an automated email from the ASF dual-hosted git repository.

zsombor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 444db6e  RANGER-2394 : Add ability to search for multiple users, and 
exclude multiple users from audit logs
444db6e is described below

commit 444db6edb092f23de89813503dae04f909e5325e
Author: Zsombor Gegesy <[email protected]>
AuthorDate: Wed May 29 22:17:17 2019 +0200

    RANGER-2394 : Add ability to search for multiple users, and exclude 
multiple users from audit logs
---
 .../java/org/apache/ranger/rest/AssetREST.java     |  6 +-
 .../java/org/apache/ranger/rest/XAuditREST.java    |  5 +-
 .../ranger/solr/SolrAccessAuditsService.java       | 57 +++++++++++-------
 .../src/main/webapp/scripts/utils/XAUtils.js       | 69 +++++++++++++++-------
 .../webapp/scripts/views/reports/AuditLayout.js    | 32 ++++++----
 .../java/org/apache/ranger/rest/TestAssetREST.java | 30 +++++++++-
 6 files changed, 139 insertions(+), 60 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
index 037888e..347e247 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/AssetREST.java
@@ -626,8 +626,10 @@ public class AssetREST {
                                "Access Type", StringUtil.VALIDATION_TEXT);
                searchUtil.extractString(request, searchCriteria, "sessionId",
                                "Access Type", StringUtil.VALIDATION_TEXT);
-               searchUtil.extractString(request, searchCriteria, "requestUser",
-                               "Access Type", StringUtil.VALIDATION_TEXT);
+               searchUtil.extractStringList(request, searchCriteria, 
"requestUser",
+                       "Users", "requestUser", null, 
StringUtil.VALIDATION_TEXT);
+               searchUtil.extractStringList(request, searchCriteria, 
"excludeUser",
+                       "Exclude Users", "-requestUser", null, 
StringUtil.VALIDATION_TEXT);
                searchUtil.extractString(request, searchCriteria, "requestData",
                                "Access Type", StringUtil.VALIDATION_TEXT);
                searchUtil.extractString(request, searchCriteria, 
"resourcePath",
diff --git 
a/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
index fdf5ad8..c4630a1 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XAuditREST.java
@@ -141,9 +141,8 @@ public class XAuditREST {
        @Produces({ "application/xml", "application/json" })
        @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.SEARCH_X_ACCESS_AUDITS + "\")")
        public VXAccessAuditList searchXAccessAudits(@Context 
HttpServletRequest request) {
-                SearchCriteria searchCriteria = 
searchUtil.extractCommonCriterias(
-                request, xAccessAuditService.sortFields);
-                return xAuditMgr.searchXAccessAudits(searchCriteria);
+               SearchCriteria searchCriteria = 
searchUtil.extractCommonCriterias(request, xAccessAuditService.sortFields);
+               return xAuditMgr.searchXAccessAudits(searchCriteria);
        }
 
        @GET
diff --git 
a/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
index 5220f85..0c04fbd 100644
--- 
a/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
+++ 
b/security-admin/src/main/java/org/apache/ranger/solr/SolrAccessAuditsService.java
@@ -22,7 +22,9 @@ package org.apache.ranger.solr;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -32,11 +34,11 @@ import org.apache.ranger.common.PropertiesUtil;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.SearchCriteria;
 import org.apache.ranger.common.SearchField;
-import org.apache.ranger.common.SortField;
-import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.common.SearchField.DATA_TYPE;
 import org.apache.ranger.common.SearchField.SEARCH_TYPE;
+import org.apache.ranger.common.SortField;
 import org.apache.ranger.common.SortField.SORT_ORDER;
+import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.entity.XXServiceDef;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
@@ -54,7 +56,7 @@ import org.springframework.stereotype.Service;
 @Service
 @Scope("singleton")
 public class SolrAccessAuditsService {
-       private static final Logger logger = 
Logger.getLogger(SolrAccessAuditsService.class);
+       private static final Logger LOGGER = 
Logger.getLogger(SolrAccessAuditsService.class);
 
        @Autowired
        SolrMgr solrMgr;
@@ -71,8 +73,8 @@ public class SolrAccessAuditsService {
        @Autowired
        RangerDaoManager daoManager;
 
-       public List<SortField> sortFields = new ArrayList<SortField>();
-       public List<SearchField> searchFields = new ArrayList<SearchField>();
+       private List<SortField> sortFields = new ArrayList<SortField>();
+       private List<SearchField> searchFields = new ArrayList<SearchField>();
 
        public SolrAccessAuditsService() {
 
@@ -89,7 +91,9 @@ public class SolrAccessAuditsService {
                searchFields.add(new SearchField("sessionId", "sess",
                                SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
                searchFields.add(new SearchField("requestUser", "reqUser",
-                               SearchField.DATA_TYPE.STRING, 
SearchField.SEARCH_TYPE.FULL));
+                       SearchField.DATA_TYPE.STR_LIST, 
SearchField.SEARCH_TYPE.FULL));
+               searchFields.add(new SearchField("excludeUser", "exlUser",
+                       SearchField.DATA_TYPE.STR_LIST, 
SearchField.SEARCH_TYPE.FULL));
                searchFields.add(new SearchField("requestData", "reqData", 
SearchField.DATA_TYPE.STRING,
                                SearchField.SEARCH_TYPE.PARTIAL));
                searchFields.add(new SearchField("resourcePath", "resource", 
SearchField.DATA_TYPE.STRING,
@@ -142,22 +146,16 @@ public class SolrAccessAuditsService {
                SolrClient solrClient = solrMgr.getSolrClient();
                final boolean hiveQueryVisibility = 
PropertiesUtil.getBooleanProperty("ranger.audit.hive.query.visibility", true);
                if (solrClient == null) {
-                       logger.warn("Solr client is null, so not running the 
query.");
+                       LOGGER.warn("Solr client is null, so not running the 
query.");
                        throw restErrorUtil.createRESTException(
                                        "Error connecting to search engine",
                                        MessageEnums.ERROR_SYSTEM);
                }
-               List<String> excludeUsersList = new ArrayList<String>();
                List<VXAccessAudit> xAccessAuditList = new 
ArrayList<VXAccessAudit>();
 
-               String val = (String) 
searchCriteria.getParamList().get("excludeServiceUser");
+               Map<String, Object> paramList = searchCriteria.getParamList();
+               updateUserExclusion(paramList);
 
-               if(val !=null && Boolean.valueOf(val.trim())) { //add param to 
negate requestUsers which will be added as filter query in solr
-                       excludeUsersList = getExcludeUsersList();
-                       if(CollectionUtils.isNotEmpty(excludeUsersList)) {
-                               
searchCriteria.getParamList().put("-requestUser", excludeUsersList);
-                       }
-        }
                QueryResponse response = 
solrUtil.searchResources(searchCriteria,
                                searchFields, sortFields, solrClient);
                SolrDocumentList docs = response.getResults();
@@ -176,7 +174,7 @@ public class SolrAccessAuditsService {
                                                 logger.warn("Error in request 
data of audit from solr. AuditData: "  + vXAccessAudit.toString());
                                             }
                                         } catch (UnsupportedEncodingException 
e) {
-                                                logger.warn("Error while 
encoding request data");
+                                                LOGGER.warn("Error while 
encoding request data");
                                         }
                                 }
                         }
@@ -192,11 +190,28 @@ public class SolrAccessAuditsService {
                return returnList;
        }
 
+
+       private void updateUserExclusion(Map<String, Object> paramList) {
+               String val = (String) paramList.get("excludeServiceUser");
+
+               if (val != null && Boolean.valueOf(val.trim())) { // add param 
to negate requestUsers which will be added as
+                       // filter query in solr
+                       List<String> excludeUsersList = getExcludeUsersList();
+                       if (CollectionUtils.isNotEmpty(excludeUsersList)) {
+                               Object oldUserExclusions = 
paramList.get("-requestUser");
+                               if (oldUserExclusions instanceof Collection && 
(!((Collection<?>)oldUserExclusions).isEmpty())) {
+                                       
excludeUsersList.addAll((Collection<String>)oldUserExclusions);
+                                       paramList.put("-requestUser", 
excludeUsersList);
+                               } else {
+                                       paramList.put("-requestUser", 
excludeUsersList);
+                               }
+                       }
+               }
+       }
+
        private List<String> getExcludeUsersList() {
-               List<String> excludeUsersList = new ArrayList<String>();
                //for excluding serviceUsers using existing property in 
ranger-admin-site
-               List<String> serviceUsersList = getServiceUserList();
-               excludeUsersList.addAll(serviceUsersList);
+               List<String> excludeUsersList = new 
ArrayList<String>(getServiceUserList());
 
                //for excluding additional users using new property in 
ranger-admin-site
                String additionalExcludeUsers = 
PropertiesUtil.getProperty("ranger.accesslogs.exclude.users.list");
@@ -233,8 +248,8 @@ public class SolrAccessAuditsService {
                VXAccessAudit accessAudit = new VXAccessAudit();
 
                Object value = null;
-               if(logger.isDebugEnabled()) {
-                       logger.debug("doc=" + doc.toString());
+               if(LOGGER.isDebugEnabled()) {
+                       LOGGER.debug("doc=" + doc.toString());
                }
 
                value = doc.getFieldValue("id");
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js 
b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index a7c4497..79f397e 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -762,27 +762,45 @@ define(function(require) {
        XAUtils.addVisualSearch = function(searchOpt, serverAttrName, 
collection,
                        pluginAttr) {
                var visualSearch, that = this;
-               var search = function(searchCollection, serverAttrName, 
searchOpt,
-                               collection) {
+               var supportMultipleItems = pluginAttr.supportMultipleItems || 
false;
+               var multipleFacet = serverAttrName.filter(function(elem) { 
+                       return elem['addMultiple'];
+               }).map(function(elem) {
+                       return elem.text;
+               });
+               var search = function(searchCollection, collection) {
                        var params = {};
-                        if($('.popover')){
-                                $('.popover').remove();
-                        }
+                       if($('.popover')){
+                                       $('.popover').remove();
+                       }
                        searchCollection.each(function(m) {
                                var serverParamName = 
_.findWhere(serverAttrName, {
                                        text : m.attributes.category
                                });
                                var extraParam = {};
-                               if (!_.isUndefined(serverParamName)) {
-                                       if (_.has(serverParamName, 'multiple')
-                                                       && 
serverParamName.multiple) {
-                                               
extraParam[serverParamName.label] = XAUtils
-                                                               
.enumLabelToValue(serverParamName.optionsArr, m
-                                                                               
.get('value'));
-                                               $.extend(params, extraParam);
-                                       } else {
-                                               
extraParam[serverParamName.label] = m.get('value');
-                                               $.extend(params, extraParam);
+                               if (_.has(serverParamName, 'multiple')
+                                               && serverParamName.multiple) {
+                                       extraParam[serverParamName.label] = 
XAUtils
+                                                       
.enumLabelToValue(serverParamName.optionsArr, m
+                                                                       
.get('value'));
+                                       ;
+                                       $.extend(params, extraParam);
+                               } else {
+                                       if (!_.isUndefined(serverParamName)) {
+                                               var oldValue = 
params[serverParamName.label];
+                                               var newValue = m.get('value');
+                                               if (oldValue && 
serverParamName.addMultiple) {
+                                                       // if a value is 
already there
+                                                       if 
(Array.isArray(oldValue)) {
+                                                               // if it's a 
list, append to the end
+                                                               
oldValue.push(newValue);
+                                                       } else {
+                                                               // convert to a 
list
+                                                               
params[serverParamName.label] = [oldValue, newValue];
+                                                       }
+                                               } else {
+                                                       
params[serverParamName.label] = newValue;
+                                               }
                                        }
                                }
                        });
@@ -791,6 +809,7 @@ define(function(require) {
                        collection.fetch({
                                reset : true,
                                cache : false,
+                               traditional: supportMultipleItems, // for 
sending multiple values without []
                                error : function(coll, response, options) {
                                        that.blockUI('unblock');
                                         if(response && response.responseJSON 
&& response.responseJSON.msgDesc){
@@ -806,7 +825,7 @@ define(function(require) {
                var callbackCommon = {
                        search : function(query, searchCollection) {
                                collection.VSQuery = query;
-                               search(searchCollection, serverAttrName, 
searchOpt, collection);
+                               search(searchCollection, collection);
                        },
                        clearSearch : function(callback) {
                                 //Remove search history when click on clear 
search
@@ -823,8 +842,9 @@ define(function(require) {
                                // console.log(visualSearch);
                                var searchOptTemp = $.extend(true, [], 
searchOpt);
                                visualSearch.searchQuery.each(function(m) {
-                                       if ($.inArray(m.get('category'), 
searchOptTemp) >= 0) {
-                                               
searchOptTemp.splice($.inArray(m.get('category'),
+                                       var cat = m.get('category');
+                                       if ($.inArray(cat, searchOptTemp) >= 0 
&& $.inArray(cat, multipleFacet) < 0) {
+                                               
searchOptTemp.splice($.inArray(cat,
                                                                searchOptTemp), 
1);
                                        }
                                });
@@ -841,7 +861,15 @@ define(function(require) {
                                        text : removedFacet.get('category')
                                });
                                if (!_.isUndefined(removedFacetSeverName)) {
-                                       delete 
collection.queryParams[removedFacetSeverName.label];
+                                       var queryValue = 
collection.queryParams[removedFacetSeverName.label];
+                                       if 
($.inArray(removedFacetSeverName.text, multipleFacet) && 
Array.isArray(queryValue)) {
+                                               var idx = 
queryValue.indexOf(removedFacet.get("value"));
+                                               if (idx != -1) {
+                                                       queryValue.splice(idx);
+                                               }
+                                       } else {
+                                               delete 
collection.queryParams[removedFacetSeverName.label];
+                                       }
                                        collection.state.currentPage = 
collection.state.firstPage;
                                }
                                // TODO Added for Demo to remove datapicker 
popups
@@ -858,8 +886,7 @@ define(function(require) {
                }));
 
                if (visualSearch.searchQuery.length > 0) // For On Load Visual 
Search
-                       search(visualSearch.searchQuery, serverAttrName, 
searchOpt,
-                                       collection);
+                       search(visualSearch.searchQuery, collection);
 
                return visualSearch;
        };
diff --git 
a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js 
b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
index 9c01eb7..def5e22 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
@@ -337,7 +337,9 @@ define(function(require) {
             var serviceUser = [{'label' : 'True' , 'value' : true},{'label' : 
'False' , 'value' : false}]
                        var serverAttrName = [{text : 'Start Date',label 
:'startDate'},{text : 'End Date',label :'endDate'},
                                                  {text : 'Application',label : 
'agentId'},
-                                             {text : 'User',label 
:'requestUser'},{text : 'Resource Name',label :'resourcePath'},
+                                                 {text : 'User',label 
:'requestUser', 'addMultiple': true},
+                                                 {text : 'Exclude User',label 
:'excludeUser', 'addMultiple': true},
+                                                 {text : 'Resource Name',label 
:'resourcePath'},
                                              {text : 'Service Name',label 
:'repoName'},{text : 'Policy ID',label :'policyId'},
                                              {text : 'Service Type',label 
:'repoType','multiple' : true, 'optionsArr' : serverListForRepoType},
                                              {text : 'Result',label 
:'accessResult', 'multiple' : true, 'optionsArr' : 
XAUtils.enumToSelectLabelValuePairs(XAEnums.AccessResult)},
@@ -346,21 +348,22 @@ define(function(require) {
                                              {text : 'Resource Type',label : 
'resourceType'},{text : 'Cluster Name',label : 'cluster'},
                                   {text : 'Zone Name',label : 
'zoneName'},{text : localization.tt("lbl.agentHost"), label :"agentHost"}];
             var searchOpt = ['Resource Type','Start Date','End 
Date','Application','User','Service Name','Service Type','Resource 
Name','Access Type','Result','Access Enforcer',
-            'Client IP','Tags','Cluster Name', 'Zone Name', 
localization.tt("lbl.agentHost")];//,'Policy ID'
+            'Client IP','Tags','Cluster Name', 'Zone Name', 'Exclude User', 
localization.tt("lbl.agentHost")];//,'Policy ID'
                         this.clearVisualSearch(this.accessAuditList, 
serverAttrName);
                         this.searchInfoArr =[{text :'Access Enforcer', info 
:localization.tt('msg.accessEnforcer')},
                                             {text :'Access Type'       , info 
:localization.tt('msg.accessTypeMsg')},
                                             {text :'Client IP'                 
, info :localization.tt('msg.clientIP')},
-                                            {text : 'Cluster Name'  , info 
:localization.tt('h.clusterName')},
+                                            {text :'Cluster Name'      , info 
:localization.tt('h.clusterName')},
                                             {text :'Zone Name'      , info 
:localization.tt('h.zoneName')},
                                             {text :'End Date'       , info 
:localization.tt('h.endDate')},
                                             {text :'Resource Name'     , info 
:localization.tt('msg.resourceName')},
                                             {text :'Resource Type'  , info 
:localization.tt('msg.resourceTypeMsg')},
                                             {text :'Result'                    
, info :localization.tt('msg.resultMsg')},
                                             {text :'Service Name'      , info 
:localization.tt('h.serviceNameMsg')},
-                                        {text :'Service Type'  , info 
:localization.tt('h.serviceTypeMsg')},
+                                            {text :'Service Type'      , info 
:localization.tt('h.serviceTypeMsg')},
                                             {text :'Start Date'     , info 
:localization.tt('h.startDate')},
                                             {text :'User'                      
, info :localization.tt('h.userMsg')},
+                                            {text :'Exclude User'      , info 
:localization.tt('h.userMsg')},
                                             {text :'Application'       , info 
:localization.tt('h.application')},
                                             {text :'Tags'                      
, info :localization.tt('h.tagsMsg')} ];
                         //initilize info popover
@@ -376,7 +379,8 @@ define(function(require) {
                              placeholder 
:localization.tt('h.searchForYourAccessAudit'),
                              container : this.ui.visualSearch,
                              query     : query,
-                              type             : 'bigData',
+                             supportMultipleItems: true,
+                             type              : 'bigData',
                              callbacks :  { 
                                        valueMatches : function(facet, 
searchTerm, callback) {
                                                var auditList = [];
@@ -462,9 +466,9 @@ define(function(require) {
                 this.accessAuditList.queryParams.excludeServiceUser = true;
                 this.ui.serviceUsersExclude.prop('checked', true);
             }
-                       this.visualSearch = 
XAUtils.addVisualSearch(searchOpt,serverAttrName, this.accessAuditList, 
pluginAttr);
-                        this.setEventsToFacets(this.visualSearch, 
App.vsHistory.bigData);
-               },
+            this.visualSearch = 
XAUtils.addVisualSearch(searchOpt,serverAttrName, this.accessAuditList, 
pluginAttr);
+            this.setEventsToFacets(this.visualSearch, App.vsHistory.bigData);
+        },
                addSearchForAdminTab : function(){
                        var that = this;
                        var searchOpt = ["Audit Type", "User", "Actions", 
"Session ID", "Start Date", "End Date"];
@@ -678,14 +682,20 @@ define(function(require) {
                                 value.push(model) ;
                         });
                         vs.searchQuery.bind('remove', function(model){
-                                value = _.filter(value, function(m){ return 
m.get('category') != model.get('category');})
+                                value = _.filter(value, function(m){
+                                    return m.get('category') != 
model.get('category') || m.get('value') != model.get('value');
+                                });
                                 App.vsHistory[vs.options.type] = value;
                         });
                         vs.searchQuery.bind('change', function(model){
                                 
_.each(App.vsHistory[vs.options.type],function(m){
-                                        if(m.get('category') == 
model.get('category')){
-                                                m.attributes.value = 
model.get('value');
+                                    if(m.cid == model.cid) {
+                                        m.attributes.value = 
model.get('value');
+                                    } else if (model._previousAttributes) {
+                                        if (model._previousAttributes.category 
=== m.attributes.category && model._previousAttributes.value === 
m.attributes.value ) {
+                                            m.attributes.value = 
model.get('value');
                                         }
+                                    }
                                 })
                         });
                },
diff --git 
a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java 
b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
index ef149d5..dce3b0b 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestAssetREST.java
@@ -40,6 +40,7 @@ import org.apache.ranger.common.RangerSearchUtil;
 import org.apache.ranger.common.SearchCriteria;
 import org.apache.ranger.common.ServiceUtil;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.db.XXServiceDefDao;
 import org.apache.ranger.entity.XXServiceDef;
@@ -761,7 +762,7 @@ public class TestAssetREST {
                Mockito.verify(msBizUtil).isKeyAdmin();
                Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
                Mockito.verify(daoManager).getXXServiceDef();
-               Mockito.verify(searchUtil, 
Mockito.times(14)).extractString((HttpServletRequest) Mockito.any(),
+               Mockito.verify(searchUtil, 
Mockito.times(13)).extractString((HttpServletRequest) Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString(), Mockito.nullable(String.class));
                Mockito.verify(searchUtil, 
Mockito.times(4)).extractInt((HttpServletRequest) Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString());
@@ -769,6 +770,19 @@ public class TestAssetREST {
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
                Mockito.verify(searchUtil).extractLong((HttpServletRequest) 
Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString());
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                       (SearchCriteria) Mockito.any(), 
Mockito.eq("requestUser"), Mockito.eq("Users"), Mockito.eq("requestUser"),
+                       Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                               (SearchCriteria) Mockito.any(), 
Mockito.eq("excludeUser"), Mockito.eq("Exclude Users"), 
Mockito.eq("-requestUser"),
+                               Mockito.any(), 
Mockito.eq(StringUtil.VALIDATION_TEXT));
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                               (SearchCriteria) Mockito.any(), 
Mockito.eq("zoneName"), Mockito.eq("Zone Name List"), Mockito.eq("zoneName"),
+                               Mockito.eq(null), Mockito.eq(null));
+               
Mockito.verify(searchUtil).extractCommonCriterias(Mockito.any(HttpServletRequest.class),
+                       (List<SortField>) Mockito.any());
+               Mockito.verifyNoMoreInteractions(searchUtil, assetMgr, 
daoManager);
+
        }
 
        @Test
@@ -804,7 +818,7 @@ public class TestAssetREST {
                Mockito.verify(msBizUtil).isKeyAdmin();
                Mockito.verify(assetMgr).getAccessLogs(searchCriteria);
                Mockito.verify(daoManager).getXXServiceDef();
-               Mockito.verify(searchUtil, 
Mockito.times(14)).extractString((HttpServletRequest) Mockito.any(),
+               Mockito.verify(searchUtil, 
Mockito.times(13)).extractString((HttpServletRequest) Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString(), Mockito.nullable(String.class));
                Mockito.verify(searchUtil, 
Mockito.times(4)).extractInt((HttpServletRequest) Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString());
@@ -812,6 +826,18 @@ public class TestAssetREST {
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString(), Mockito.anyString());
                Mockito.verify(searchUtil).extractLong((HttpServletRequest) 
Mockito.any(),
                                (SearchCriteria) Mockito.any(), 
Mockito.anyString(), Mockito.anyString());
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                       (SearchCriteria) Mockito.any(), 
Mockito.eq("requestUser"), Mockito.eq("Users"), Mockito.eq("requestUser"),
+                       Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                       (SearchCriteria) Mockito.any(), 
Mockito.eq("excludeUser"), Mockito.eq("Exclude Users"), 
Mockito.eq("-requestUser"),
+                       Mockito.any(), Mockito.eq(StringUtil.VALIDATION_TEXT));
+               
Mockito.verify(searchUtil).extractStringList(Mockito.any(HttpServletRequest.class),
+                               (SearchCriteria) Mockito.any(), 
Mockito.eq("zoneName"), Mockito.eq("Zone Name List"), Mockito.eq("zoneName"),
+                               Mockito.eq(null), Mockito.eq(null));
+               
Mockito.verify(searchUtil).extractCommonCriterias(Mockito.any(HttpServletRequest.class),
+                       (List<SortField>) Mockito.any());
+               Mockito.verifyNoMoreInteractions(searchUtil, assetMgr, 
daoManager);
        }
 
        @Test

Reply via email to