/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package edu.uchicago.grouperabi;
import edu.internet2.middleware.grouperClient.api.*;
import edu.internet2.middleware.grouperClient.api.GcFindGroups;
import edu.internet2.middleware.grouperClient.util.GrouperClientUtils;
import edu.internet2.middleware.grouperClient.ws.*;
import edu.internet2.middleware.grouperClient.ws.beans.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.*;
import nsit.Config;
/**
* This class is used to query grouper via web-service
* @author davel
*/
public class GrouperQueryEngine {
private static Logger log = Logger.getLogger(GrouperQueryEngine.class);
private String stem = null;
private Stem myApplicationStem;
/**
* Create a new GrouperQueryEngine object
* @param stemName the stem name we are going to be working with (not the full group, just the stem)
*/
public GrouperQueryEngine(String stemName){
try{
Config conf = Config.getInstance();
initialize(conf.getOption("ldap_host"),
conf.getOption("grouper_url"),
conf.getOption("grouper_user"),
conf.getOption("grouper_password"),
stemName);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
public GrouperQueryEngine(String group, boolean isGroup){
try{
Config conf = Config.getInstance();
initialize(conf.getOption("ldap_host"),
conf.getOption("grouper_url"),
conf.getOption("grouper_user"),
conf.getOption("grouper_password"),
null);
}
catch(Exception e){
throw new RuntimeException(e);
}
}
public GrouperQueryEngine(String ldapHost, String grouperURL, String grouperUser, String grouperPassword, String stemName) {
initialize(ldapHost, grouperURL, grouperUser, grouperPassword, stemName);
}
/**
* Initialize the class
* @param ldapHost
* @param grouperURL
* @param grouperUser
* @param grouperPassword
* @param stemName
*/
private void initialize(String ldapHost, String grouperURL, String grouperUser, String grouperPassword, String stemName){
stem = stemName;
//setup GrouperClient
Map<String, String> grouperConfig = GrouperClientUtils.grouperClientOverrideMap();
grouperConfig.put("grouperClient.ldap.url", "ldaps://"+ldapHost+"/dc=uchicago,dc=edu");
grouperConfig.put("grouperClient.webService.url",grouperURL);
grouperConfig.put("grouperClient.webService.login", grouperUser);
grouperConfig.put("grouperClient.webService.password", grouperPassword);
if(stem != null){
myApplicationStem = getStem();
}
}
/*
public Group getEnforcedGroup(){
//stack the query filters
//this one is for the stem
WsQueryFilter qfps = new WsQueryFilter();
qfps.setStemName(stem);
qfps.setQueryFilterType("FIND_BY_STEM_NAME");
//this one is for the group
WsQueryFilter qfg = new WsQueryFilter();
qfg.setGroupName(eligibleUsersGroupName);
qfg.setQueryFilterType("FIND_BY_GROUP_NAME_APPROXIMATE");
//this one performs the AND
WsQueryFilter queryFilterFinal = new WsQueryFilter();
queryFilterFinal.setQueryFilterType("AND");
queryFilterFinal.setQueryFilter0(qfps);
queryFilterFinal.setQueryFilter1(qfg);
GcFindGroups gcf = new GcFindGroups();
gcf.assignQueryFilter(queryFilterFinal);
gcf.assignIncludeGroupDetail(Boolean.FALSE);
WsFindGroupsResults results = gcf.execute();
WsResultMeta resultMetadata = results.getResultMetadata();
if (!"T".equals(resultMetadata.getSuccess())) {
throw new RuntimeException("Error finding stems: " + resultMetadata.getSuccess()
+ ", " + resultMetadata.getResultCode()
+ ", " + resultMetadata.getResultMessage());
}
log.debug("we found "+results.getGroupResults().length+" groups");
return new Group(results.getGroupResults()[0], getStem(stem));
}
*
*/
public Stem getStem(){
return getStem(stem);
}
/**
* Get all effective memberships of a person
* @param subj the subject
* @return list of memberships
*/
public ArrayList<Group> getMemberships(Subject subj){
GcGetMemberships gcm = new GcGetMemberships();
gcm.assignIncludeGroupDetail(Boolean.TRUE);
WsSubjectLookup ws = new WsSubjectLookup();
ws.setSubjectId(subj.getId());
gcm.addWsSubjectLookup(ws);
WsGetMembershipsResults res = gcm.execute();
ArrayList<Group> results = new ArrayList();
for(WsGroup resGrp : res.getWsGroups()){
results.add(new Group(resGrp,null));
}
return results;
}
/**
* Get a bunch of groups by type
* @param type group type to query by
* @return ArrayList of groups. List will be empty if no results
*/
public ArrayList<Group> getGroupsByType(String type){
GcFindGroups groupFinder = new GcFindGroups();
WsQueryFilter filter = new WsQueryFilter();
filter.setQueryFilterType("FIND_BY_TYPE");
filter.setGroupTypeName(type);
groupFinder.assignQueryFilter(filter);
WsFindGroupsResults queryResults = groupFinder.execute();
ArrayList<Group> results = new ArrayList();
for(WsGroup resGrp : queryResults.getGroupResults()){
results.add(new Group(resGrp,null));
}
return results;
}
public Group findGroup(String groupID){
GcFindGroups groupFinder = new GcFindGroups();
groupFinder.addGroupName(groupID);
WsFindGroupsResults res = groupFinder.execute();
if(!"T".equals(res.getResultMetadata().getSuccess())){
throw new RuntimeException("Error finding group: "+groupID+", "+res.getResultMetadata().getResultMessage());
}
WsGroup[] groups = res.getGroupResults();
return new Group(groups[0], null);
}
Stem getStem(String stemName){
GcFindStems gcFindStems = new GcFindStems();
WsStemQueryFilter wsStemQueryFilter = new WsStemQueryFilter();
wsStemQueryFilter.setStemName(stemName);
wsStemQueryFilter.setStemQueryFilterType("FIND_BY_STEM_NAME");
gcFindStems.assignStemQueryFilter(wsStemQueryFilter);
WsFindStemsResults wsFindStemsResults = gcFindStems.execute();
WsResultMeta resultMetadata = wsFindStemsResults.getResultMetadata();
if (!"T".equals(resultMetadata.getSuccess())) {
throw new RuntimeException("Error finding stems: " + resultMetadata.getSuccess()
+ ", " + resultMetadata.getResultCode()
+ ", " + resultMetadata.getResultMessage());
}
WsStem[] wsStems = wsFindStemsResults.getStemResults();
return new Stem(wsStems[0]);
}
}