Blackboard Portlet - UW Madison
Welcome
Outline
Blackboard Portlet - Overview
Technologies
Spring Forms
Spring Forms - Object
private LocalTime startHourMinute;
private LocalTime endHourMinute;
Spring Forms - Jsp
<form action="${saveSessionActionUrl}" method="post">
<%-- Using nestedPath as form:form does not work for portlets see: https://jira.springsource.org/browse/SPR-10382 --%>
<spring:nestedPath path="sessionForm">
<form:hidden path="sessionId"/>
<form:hidden path="newSession" />
<form:hidden path="needToSendInitialEmail" />
<form:input id="${n}startdatepicker" class="date start" path="startDate" style="width: 82px;"/>
...
Spring Forms - Controller
BlackboardVCPortlet / blackboardvc-portlet-webapp / src / main / java / org / jasig / portlet / blackboardvcportlet /mvc / sessionmngr / SessionCreateEditController.java
Blackboard example:
model.put("serverConfiguration", serverConfiguration);
if (!model.containsKey("sessionForm"))
{
SessionForm sessionForm = new SessionForm(serverConfiguration);
model.addAttribute("sessionForm", sessionForm);
}
return "createEditSession";
Spring - Security
Spring Security - Context
BlackboardVCPortlet / blackboardvc-portlet-webapp / src / main / webapp / WEB-INF / context /securityContext.xml
<!--
| Setup role hierarchy to simplify hasRole checks
+-->
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
<constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy" class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
<property name="hierarchy">
<value>
ROLE_ADMIN > ROLE_FULL_ACCESS
</value>
</property>
</bean>
Spring Security - Annotate
/**
* A user needs "edit" to view the set of session chairs but we don't want the call to fail
* if they only have "view" permission. So we pre-auth them with view and then filter all
* the results unless they have "edit"
*/
@Override
@PreAuthorize("hasRole('ROLE_ADMIN') ")
public Set<ConferenceUser> getSessionChairs(Session session) {
return new LinkedHashSet<ConferenceUser>(sessionDao.getSessionChairs(session));
}
Spring Security - JSP
<sec:authorize access="hasRole('ROLE_ADMIN')">
<tr>
<td class="label">
<span class="uportal-channel-strong">
<spring:message code="moderatorLink" text="moderatorLink"/>
</span>
<br/>
<span class="uportal-channel-table-caption"><spring:message code="moderatorLinkDesc" text="moderatorLinkDesc"/></span>
</td>
<td><a href="${session.launchUrl}" target="_blank">${session.launchUrl}</a></td></tr>
</sec:authorize>
Datatables
Datatables - How to Add
BlackboardVCPortlet / blackboardvc-portlet-webapp / src / main / webapp / WEB-INF / jsp /viewSessionsMax.jsp
<table width="100%" id="sessionList">
...
</table>
var futureTable = $('#sessionList').dataTable( {
"aaData": upcomingSessions,
"aaSorting": [[3, "desc"]],
...
});
Datatables - markup
<table id="Pluto_1596_n237_1160_portletTable" class="display table dataTable" aria-describedby="Pluto_1596_n237_1160_portletTable_info">
<thead>
<tr role="row"><th class="essential sorting_asc" style="border:none;" role="columnheader" tabindex="0" aria-controls="Pluto_1596_n237_1160_portletTable" rowspan="1" colspan="1" aria-sort="ascending" aria-label="
...
</tr></tbody></table>
Datatables - Screenshot
Datatables - Screenshot
Session Storage
Session Storage - Use
BlackboardVCPortlet/blackboardvc-portlet-webapp/src/main/webapp/WEB-INF/jsp/viewSessionsNormal.jsp
<c:set var="n"><portlet:namespace /></c:set>
var currentWCPTab = "${n}"+"webConferencePortletTab";
$("#${n}tabs").tabs(
{
create: function(event, ui){
if(!sessionStorage.getItem(currentWCPTab)){
sessionStorage.setItem(currentWCPTab, 0);
}
},
active: sessionStorage.getItem(currentWCPTab),
activate: function(event, ui){
var currentTab = $("#${n}tabs").tabs("option", "active");
sessionStorage.setItem(currentWCPTab, currentTab);
}
} );
Soap Web Services
BlackboardVCPortlet / blackboardvc-portlet-webapp / src / main / java / org / jasig / portlet / blackboardvcportlet /dao / ws / impl / SessionWSDaoImpl.java
@Override
public boolean removeSessionTelephony(long sessionId) {
BlackboardSessionTelephony bst = new ObjectFactory().createBlackboardSessionTelephony();
bst.setSessionId(sessionId);
JAXBElement<BlackboardSessionTelephony> removeSessionTelephony = new ObjectFactory().createRemoveSessionTelephony(bst);
return WSDaoUtils.isSuccessful (sasWebServiceOperations.marshalSendAndReceiveToSAS("http://sas.elluminate.com/RemoveSessionTelephony", removeSessionTelephony));
}
Demo Time
Questions