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