You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by zs...@apache.org on 2019/06/06 19:05:38 UTC
[ranger] branch master updated: RANGER-2394 : Add ability to search
for multiple users, and exclude multiple users from audit logs
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 <zs...@apache.org>
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