Creative Commons Attribution- NonCommercial-ShareAlike 2.5 License Sakai Programmer's Café Sakai Montreal CRIM Workshop Sakai code exercises Aaron Zeckoski
2 Add a permission New permission: –myapp.view.summary Requires changing 3 files
3 Add Permission - logic api Update the logic api –Add the method boolean viewSummary(String userId, String context) –Don’t forget the javadoc comment!
4 Add Permission - logic test Update the logic test –Add a test method testViewSummaryString()
5 Add permission - logic impl Update the logic impl –Add the perm using FunctionManager In the init method –Implement the new method Use SecurityService to check the permissionAdd
6 Add Permission - test Test the code using the automated testing in Eclipse Run maven sakai –note that the new test runs Try the app to make sure it still works –There will be no visible changes
7 Add a page (part 1) Summary page –Shows statistics on total entries For now it will just show some text –Permission protected –Accessible from the list items page Requires adding 2 new files Requires changing 3 files
8 Add page - add template Create a new template –Copy the file from an existing template –Name it Summary.html Add in 3 spans or divs (or whatever) with rsf:ids like shown: –total-items –current-context-items –current-user-items
9 Add page - add producer Create a new producer –You can do this using eclipse Add new class –implements ViewComponentProducer –Can also copy an existing producer Connect it to the template –Set the ViewID to Summary –Add in UIOutput for the 3 rsf:ids Use made up strings for the values
10 Add page - requestContext Add a bean definition for the new producer to requestContext.xml –Make it an anonymous bean
11 Add page - list template Update the list template to include a link to the Summary.html file Summary –Add it to the navIntraTool part In Sakai, the general rule is to put internal tool navigation in the navIntraTool part (grey bar at top)
12 Add page - list producer Update the list producer to include a UIInternalLink to the summary page –This ties to the link in the template UIInternalLink.make(tofill, "summary", new AddItemViewParameters(SummaryProducer.VIEW_ID, null) );
13 Add page - test Run maven sakai –Deploy the tool Test in Sakai (try out the new page) –Make sure the link back to list items works
14 Add page - use perm Update the new producer –Add a permission check which throws an exception when a user without permission tries to view the new page –Don’t rely on security through obscurity Update the Items producer to check the perms before rendering the link
15 Questions? We will make the summary page functional next
16 Add page - logic api Add some methods to get the 3 pieces of information we want –countAllItems() –countAllItemsByContext(String context) –countAllItemsByOwner(String userId)
17 Add page - logic test Create test methods for the 3 new methods in the api –Check for multiple sites and multiple users –Positives and negatives
18 Add page - logic impl Implement the 3 methods –Use the dao countByProperties –Get default values if the inputs are null
19 Add page - update summary Update the summary producer to use the security method –Throw an exception if the user does not have permission to view this page –Do not use security through obscurity
20 Add page - update list Update the list producer to use the security check to render the link –Don’t give the user links or options that will not work for them
21 Questions? Next we will update the data model
22 Add a field to the data model Add a description field to the data model –It should be a text field of unlimited length –It should be adjustable on the add/modify page screen
23 Add field - update hbm Update the hbm file with the new description field –Use text as the type
24 Add field - update model class Update the model (value) class with the description property –String –Update full constructor –Add getter and setter Use eclipse to generate
25 Add field - update logic test Fix the logic test to use the new constructor and data model class
26 Add field - update dao test Fix the dao test to use the new constructor and data model class
27 Add field - update dao preload Fix the dao preload to use the new constructor and data model class
28 Add field - update AddItem template Add a new textarea for the description to the AddItem template –Probably should use a row for the label and another for the textarea
29 Add field - update AddItem producer Bind a UIInput to the description field –Do it for creating and updating the item UIInput.make(addupdateitem, "item-description", "#{itemsBean.newItem.description}");
30 Add field - update backing bean Add an if statement to update the description if it is not null –In RSF the unchanged return value is null –Do it like title or hidden
31 Questions?
32 Use Sakai Announcement Service Use the Sakai Announcement Service to create an announcement when new items are added –Need to inject the service and call it
33 AnnouncementService String channelRef = announcementService.channelReference(siteId, SiteService.MAIN_CONTAINER); try { AnnouncementChannel ac = announcementService.getAnnouncementChannel(channelRef); ac.addAnnouncementMessage("New Item", false, null, "A new item was added called: title"); } catch (IdUnusedException e1) { log.error("failure adding message: ref=" + channelRef,e1); } catch (PermissionException e1) { log.error("failure adding message: ref=" + channelRef,e1); }
34 Annc - Update the logic api Add a method to the api to create an announcement –Needed since we are accessing it in the backing bean –Alternative: make the create item trigger a private method in the logic impl
35 Annc - Update the logic test Use mock objects to pretend we are using the Announcement Service
36 Annc - update the logic impl Update the logic impl to include the previously referenced code
37 Annc - update backing bean Call the create announcement method when a new item is created
38 Questions?