[Building Sakai] New web service for site membership status

Steve Swinsburg steve.swinsburg at gmail.com
Tue Apr 13 17:07:38 PDT 2010


It is interesting that that saving the Site directly didn't update the AuthzGroup in Nicola's case, because this web service below certainly does (verified in both the Site membership and Realm directly), which acts on the Site and manipulates the membership:

public String removeMemberFromSite(String sessionid, String siteid, String eid) throws AxisFault {

    Session session = establishSession(sessionid);

    try {
        Site site = siteService.getSite(siteid);
        String userid = userDirectoryService.getUserByEid(eid).getId();
        site.removeMember(userid);
        siteService.save(site);
    } catch (Exception e) {
    	LOG.error("WS removeMemberFromSite(): " + e.getClass().getName() + " : " + e.getMessage());
        return e.getClass().getName() + " : " + e.getMessage();
    }
    return "success";
}

cheers,
Steve


On 14/04/2010, at 7:50 AM, Noah Botimer wrote:

> Fooled again! I was going to send you straight to the AZG service... Oh well.
> 
> It's worth noting that Site implements AuthzGroup, so you can pass a Site object directly to the save method and avoid the string building below. I suppose it would be slightly more idiomatic.
> 
> It's also worth a more technical consideration of why SiteService.save does not update the AZG... I remember tripping over this a number of times myself and did again this time.
> 
> Thanks,
> -Noah
> 
> On Apr 13, 2010, at 5:37 PM, Nicola Monat-Jacobs wrote:
> 
>> Thanks to Noah and Zhen - unfortunately siteService.save() didn't work, but AuthzGroupService.save() did, so I had to tweak it like so:
>> 
>> public String setMemberStatus(String sessionid, String siteid, String eid, boolean active) throws AxisFault { 
>> 	
>> 	Session s = establishSession(sessionid); 
>> 	
>> 	try {
>> 		AuthzGroup site = AuthzGroupService.getAuthzGroup("/site/"+siteid);
>> 
>> 		String userid = UserDirectoryService.getUserByEid(eid).getId();
>> 		Member membership = site.getMember(userid);
>> 
>> 		if (membership.isActive() && !active) {
>> 			LOG.error("membership is active but we want it to be inactive");
>> 			membership.setActive(false);
>> 		} else if (!membership.isActive() && active) {
>> 			LOG.error("membership is inactive, but we want it to be active");
>> 			membership.setActive(true);
>> 		}
>> 		AuthzGroupService.save(site);
>> 		
>> 	} catch (Exception e) {
>> 		LOG.error("WS setMemberStatus(): "+ e.getClass().getName() + " : "+ e.getMessage());
>> 		return "";
>> 	}
>> 	
>> 	return "success";
>> }
>> 
>> 
>> On Apr 13, 2010, at  1:55 PM, Noah Botimer wrote:
>> 
>>> Nicola,
>>> 
>>> You'll need to pass the site back to the site service to commit the changes. That is, something like this:
>>> 
>>> 		if (membership.isActive() && !active) {
>>> 			LOG.error("membership is active but we want it to be inactive");
>>> 			membership.setActive(false);
>>> 		} else if (!membership.isActive() && active) {
>>> 			LOG.error("membership is inactive, but we want it to be active");
>>> 			membership.setActive(true);
>>> 		}
>>> 		siteService.save(site);
>>> 
>>> Thanks,
>>> -Noah
>>> 
>>> On Apr 13, 2010, at 4:18 PM, Nicola Monat-Jacobs wrote:
>>> 
>>>> Hi -
>>>> 
>>>> I'm working on a new simple sakai web service that would allow me to remotely get and set the status of a user's enrollment in a site - active or inactive. The get method works great, however the set method doesn't seem to be working - the status of the user's enrollment doesn't change. I'd love to know if anyone has any thoughts on why this might not be working. Oh, this is a sakai 2-6-x install. Thanks!
>>>> 
>>>> Here's my jws code:
>>>> 
>>>> /** 
>>>>  * Get the status (active vs inactive) of a user's enrollment (membership) in a site
>>>>  *
>>>>  * @param	sessionid	the id of a valid session
>>>>  * @param	siteId		the id of the site you want to check 
>>>>  * @param	eid			the userid of the person you want to check
>>>>  * @return		        active, inactive, blank or error
>>>>  * @throws	AxisFault		
>>>>  *
>>>>  */
>>>> public String getMemberStatus(String sessionid, String siteid, String eid) throws AxisFault { 
>>>> 	
>>>> 	Session s = establishSession(sessionid); 
>>>> 	
>>>> 	String status = "";
>>>> 	
>>>> 	try {
>>>> 		Site site = SiteService.getSite(siteid);
>>>> 
>>>> 		String userid = UserDirectoryService.getUserByEid(eid).getId();
>>>> 		Member membership = site.getMember(userid);
>>>> 
>>>> 		if (membership.isActive()) {
>>>> 			status = "active";
>>>> 		} else {
>>>> 			status = "inactive";
>>>> 		}
>>>> 		
>>>> 	} catch (Exception e) {
>>>> 		LOG.error("WS getMemberStatus(): "+ e.getClass().getName() + " : "+ e.getMessage());
>>>> 		return "";
>>>> 	}
>>>> 	
>>>> 	return status;
>>>> }
>>>> 
>>>> 
>>>> /** 
>>>>  * Set the status of a user's enrollment (membership) in a site to either active or inactive
>>>>  *
>>>>  * @param	sessionid	the id of a valid session
>>>>  * @param	siteId		the id of the site 
>>>>  * @param	eid			the userid of the person whose status you want to set
>>>>  * @param	active		true = active, false = inactive
>>>>  * @return		        success or exception
>>>>  * @throws	AxisFault		
>>>>  *
>>>>  */
>>>> public String setMemberStatus(String sessionid, String siteid, String eid, boolean active) throws AxisFault { 
>>>> 	
>>>> 	Session s = establishSession(sessionid); 
>>>> 	
>>>> 	try {
>>>> 		Site site = SiteService.getSite(siteid);
>>>> 
>>>> 		String userid = UserDirectoryService.getUserByEid(eid).getId();
>>>> 		Member membership = site.getMember(userid);
>>>> 
>>>> 		if (membership.isActive() && !active) {
>>>> 			LOG.error("membership is active but we want it to be inactive");
>>>> 			membership.setActive(false);
>>>> 		} else if (!membership.isActive() && active) {
>>>> 			LOG.error("membership is inactive, but we want it to be active");
>>>> 			membership.setActive(true);
>>>> 		}
>>>> 		
>>>> 	} catch (Exception e) {
>>>> 		LOG.error("WS setMemberStatus(): "+ e.getClass().getName() + " : "+ e.getMessage());
>>>> 		return "";
>>>> 	}
>>>> 	
>>>> 	return "success";
>>>> }
>>>> 
>>>> 
>>>> And here's the demo perl script that I'm using to test it:
>>>> 
>>>> !/usr/bin/perl
>>>> use SOAP::Lite;
>>>> my $host='http://localhost:8080';
>>>> 
>>>> my $soap = SOAP::Lite -> proxy("$host/sakai-axis/SakaiLogin.jws?wsdl");
>>>> my $result =$soap->login("admin","admin");
>>>> my $session=$result->result();
>>>> print $session."\n\n";
>>>> 
>>>> my $true = SOAP::Data->value('true')->type('boolean');
>>>> my $false = SOAP::Data->value('')->type('boolean');
>>>> 
>>>> my $soap2 = SOAP::Lite -> proxy("$host/sakai-axis/WSLongsight.jws?wsdl");
>>>> 
>>>> my $result2 = $soap2->setMemberStatus($session,
>>>> 	"39760797-6184-4b84-892f-e93041e2bcf1",
>>>> 	"joe",
>>>> 	$true);
>>>> 	
>>>> print $result2->result();
>>>> 
>>>> 
>>>> _______________________________________________
>>>> sakai-dev mailing list
>>>> sakai-dev at collab.sakaiproject.org
>>>> http://collab.sakaiproject.org/mailman/listinfo/sakai-dev
>>>> 
>>>> TO UNSUBSCRIBE: send email to sakai-dev-unsubscribe at collab.sakaiproject.org with a subject of "unsubscribe"
>>> 
>> 
> 
> _______________________________________________
> sakai-dev mailing list
> sakai-dev at collab.sakaiproject.org
> http://collab.sakaiproject.org/mailman/listinfo/sakai-dev
> 
> TO UNSUBSCRIBE: send email to sakai-dev-unsubscribe at collab.sakaiproject.org with a subject of "unsubscribe"

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://collab.sakaiproject.org/pipermail/sakai-dev/attachments/20100414/c0f80689/attachment.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 3689 bytes
Desc: not available
Url : http://collab.sakaiproject.org/pipermail/sakai-dev/attachments/20100414/c0f80689/attachment.bin 


More information about the sakai-dev mailing list