This example is for v4.10.0+ and v5.7.0+.
Get the immediate and total membership counts for a group. This is the V1 template converted to V2
Config
grouper.properties
grouperGshTemplate.membershipCountV2basic.allowWsFromNoOwner = true grouperGshTemplate.membershipCountV2basic.displayErrorOutput = true grouperGshTemplate.membershipCountV2basic.groupUuidCanRun = test\u003AtemplateRunners grouperGshTemplate.membershipCountV2basic.gshTemplate = // grouperGshTemplate.membershipCountV2basic.input.0.defaultValue = test\u003AtestGroup grouperGshTemplate.membershipCountV2basic.input.0.description = fully qualified group name (ID path) grouperGshTemplate.membershipCountV2basic.input.0.formElementType = text grouperGshTemplate.membershipCountV2basic.input.0.label = Group name grouperGshTemplate.membershipCountV2basic.input.0.name = gsh_input_groupName grouperGshTemplate.membershipCountV2basic.input.0.type = string grouperGshTemplate.membershipCountV2basic.input.0.validationRegex = ^[a-zA-Z0-9_.\u003A-]+\u0024 grouperGshTemplate.membershipCountV2basic.input.0.validationType = regex grouperGshTemplate.membershipCountV2basic.numberOfInputs = 1 grouperGshTemplate.membershipCountV2basic.runAsType = GrouperSystem grouperGshTemplate.membershipCountV2basic.securityRunType = specifiedGroup grouperGshTemplate.membershipCountV2basic.templateDescription = count membership immediate and total of group grouperGshTemplate.membershipCountV2basic.templateName = membershipCountV2 basic grouperGshTemplate.membershipCountV2basic.templateVersion = V2
GSH script
import com.fasterxml.jackson.databind.node.ObjectNode; import edu.internet2.middleware.grouper.GrouperSession; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateOutput; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2input; import edu.internet2.middleware.grouper.app.gsh.template.GshTemplateV2output; import edu.internet2.middleware.grouper.misc.GrouperStartup; import edu.internet2.middleware.grouper.util.GrouperUtil; import edu.internet2.middleware.grouperClient.jdbc.GcDbAccess; import edu.internet2.middleware.subject.Subject; public class Test25membershipCountV2basic extends GshTemplateV2 { @Override public void gshRunLogic(GshTemplateV2input gshTemplateV2input, GshTemplateV2output gshTemplateV2output) { String gsh_input_groupName = gshTemplateV2input.getGsh_builtin_inputString("gsh_input_groupName"); GrouperSession gsh_builtin_grouperSession = gshTemplateV2input.getGsh_builtin_grouperSession(); Subject gsh_builtin_subject = gshTemplateV2input.getGsh_builtin_subject(); GshTemplateOutput gsh_builtin_gshTemplateOutput = gshTemplateV2output.getGsh_builtin_gshTemplateOutput(); String effectiveQuery = "select count(*) from grouper_memberships_lw_v where group_name = ? and list_name = 'members'"; int effectiveCount = new GcDbAccess().sql(effectiveQuery).addBindVar(gsh_input_groupName).selectList(Integer.class).get(0); String immediateQuery = "select count(*) from grouper_memberships_v where group_name = ? and list_name = 'members' and membership_type = 'immediate'"; int immediateCount = new GcDbAccess().sql(immediateQuery).addBindVar(gsh_input_groupName).selectList(Integer.class).get(0); ObjectNode result = GrouperUtil.jsonJacksonNode(); GrouperUtil.jsonJacksonAssignLong(result, "totalMembershipCount", GrouperUtil.longValue(effectiveCount)); GrouperUtil.jsonJacksonAssignLong(result, "immediateMembershipCount", GrouperUtil.longValue(immediateCount)); gsh_builtin_gshTemplateOutput.addOutputLine(GrouperUtil.jsonJacksonToString(result)); } public static void main(String[] args) { GrouperStartup.startup(); GshTemplateV2input gshTemplateV2input = new GshTemplateV2input(); GshTemplateV2output gshTemplateV2output = new GshTemplateV2output(); gshTemplateV2input.getGsh_builtin_inputs().put("gsh_input_groupName", "test:testGroup"); new Test25membershipCountV2basic().gshRunLogic(gshTemplateV2input, gshTemplateV2output); System.out.println(gshTemplateV2output.getGsh_builtin_gshTemplateOutput().getOutputLines().get(0)); System.exit(0); } }
Sample WS call
Request
PUT https://grouperWs.school.edu/grouper-ws/servicesRest/2.6.0/gshTemplateExec Content-Type: application/json Authorization: sas9f8d7sa9df87asd98f { "WsRestGshTemplateExecRequest":{ "configId":"membershipCountV2basic", "inputs":[ { "name":"gsh_input_groupName", "value":"test:testGroup" } ] } }
Response
STATUS: 200 x-grouper-resultcode: SUCCESS x-grouper-resultcode2: NONE x-grouper-success: T { "WsGshTemplateExecResult": { "resultMetadata": { "resultCode": "SUCCESS", "resultMessage": "Success for: clientVersion: 4.0.0, configId: membershipCountV2basic, ownerType: null , inputs: Array size: 1: [0]: edu.internet2.middleware.grouper.ws.coresoap.WsGshTemplateInput@1eb2b170\n\n, actAsSubject: null, paramNames: \n, params: null", "success": "T" }, "responseMetadata": { "millis": "1551", "serverVersion": "4.0.0" }, "transaction": true, "gshValidationLines": [], "gshOutputLines": [{ "messageType": "success", "text": "{\"totalMembershipCount\":12,\"immediateMembershipCount\":10}" }] } }