/********************************************************************************** * $URL: $ * $Id: $ ***********************************************************************************/ package org.sakaiproject.lessonbuildertool.tool.producers; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.Arrays; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.sakaiproject.assignment.cover.AssignmentService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.lessonbuildertool.SimplePage; import org.sakaiproject.lessonbuildertool.SimplePageItem; import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao; import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean; import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean.Status; import org.sakaiproject.lessonbuildertool.tool.view.FilePickerViewParameters; import org.sakaiproject.lessonbuildertool.tool.view.GeneralViewParameters; import org.sakaiproject.lessonbuildertool.tool.producers.PermissionsHelperProducer; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.lessonbuildertool.service.LessonEntity; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.tool.api.ToolSession; import org.sakaiproject.tool.api.Session; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.api.SitePage; import org.sakaiproject.site.api.ToolConfiguration; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.portal.util.CSSUtils; import uk.org.ponder.messageutil.MessageLocator; import uk.org.ponder.localeutil.LocaleGetter; import uk.org.ponder.rsf.components.UIBoundBoolean; import uk.org.ponder.rsf.components.UIBranchContainer; import uk.org.ponder.rsf.components.UIBoundString; import uk.org.ponder.rsf.components.UICommand; import uk.org.ponder.rsf.components.UIComponent; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIForm; import uk.org.ponder.rsf.components.UIInput; import uk.org.ponder.rsf.components.UIInternalLink; import uk.org.ponder.rsf.components.UILink; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.UISelect; import uk.org.ponder.rsf.components.UIVerbatim; import uk.org.ponder.rsf.components.decorators.UIDisabledDecorator; import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator; import uk.org.ponder.rsf.components.decorators.UIStyleDecorator; import uk.org.ponder.rsf.components.decorators.UITooltipDecorator; import uk.org.ponder.rsf.flow.jsfnav.NavigationCase; import uk.org.ponder.rsf.flow.jsfnav.NavigationCaseReporter; import uk.org.ponder.rsf.view.ComponentChecker; import uk.org.ponder.rsf.view.DefaultView; import uk.org.ponder.rsf.view.ViewComponentProducer; import uk.org.ponder.rsf.viewstate.SimpleViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; import uk.org.ponder.rsf.viewstate.ViewParamsReporter; import org.springframework.core.io.Resource; /** * View items such as quizes that are shown inline * * @author Charles Hedrick <hedrick@rutgers.edu> */ public class ShowItemProducer implements ViewComponentProducer, NavigationCaseReporter, ViewParamsReporter { private SimplePageBean simplePageBean; private SimplePageToolDao simplePageToolDao; public MessageLocator messageLocator; public LocaleGetter localeGetter; static final String ICONSTYLE = "\n.portletTitle .action img {\n background: url({}/help.gif) center right no-repeat;\n}\n.portletTitle .action img:hover, .portletTitle .action img:focus {\n background: url({}/help_h.gif) center right no-repeat\n}\n.portletTitle .title img {\n background: url({}/reload.gif) center left no-repeat;\n}\n.portletTitle .title img:hover, .portletTitle .title img:focus {\n background: url({}/reload_h.gif) center left no-repeat\n}\n"; public static final String VIEW_ID = "ShowItem"; public String getViewID() { return VIEW_ID; } public void fillComponents(UIContainer tofill, ViewParameters viewParams, ComponentChecker checker) { // to do assignment/quiz, etc arguments are // sendingpage, itemid - reflect the item that the user clicked // source - URL to call // clearattr may be used for Samigo hack // return is to sendingpage, with path coming from current path retrieved from SimplePageBean // to create a new assignment, quiz, etc // path non-null is what triggers this // sendingpage, itemid - these are arguments that we'll use to return to the "add assignment" page // source - URL to call // clearattr may be used for Samigo hack // returnview - viewID to return to // title - the string for the return button // as far as I can see there are no permissions issues here. It just // sticks things in an iframe. The stuff it sticks had better check though GeneralViewParameters params = (GeneralViewParameters)viewParams; UIOutput.make(tofill, "html").decorate(new UIFreeAttributeDecorator("lang", localeGetter.get().getLanguage())) .decorate(new UIFreeAttributeDecorator("xml:lang", localeGetter.get().getLanguage())); if (!simplePageBean.canReadPage()) { UIOutput.make(tofill, "error", messageLocator.getMessage("simplepage.not_available")); return; } long sendingPage = params.getSendingPage(); // the following code should check whether it's an assessment. Currently I don't // bother as I haven't put links in the other tools Session session = SessionManager.getCurrentSession(); ToolSession toolSession = SessionManager.getCurrentToolSession(); ToolConfiguration toolConfiguration = SiteService.findTool(toolSession.getPlacementId()); SitePage sitePage = toolConfiguration.getContainingPage(); String clearAttr = params.getClearAttr(); if (clearAttr != null && !clearAttr.equals("")) { // don't let users clear random attributes if (clearAttr.startsWith("LESSONBUILDER_RETURNURL")) { String toolUrl = ServerConfigurationService.getPortalUrl() + "/site/" + sitePage.getSiteId() + "/page/" + sitePage.getId() + "?clearAttr=" + clearAttr; session.setAttribute(clearAttr, toolUrl); } } String pathOp = params.getPath(); // only pop is valid; we don't have the data for the other options if (pathOp != null && !pathOp.equals("")) simplePageBean.adjustPath(pathOp, params.getSendingPage(), null, null); List<SimplePageBean.PathEntry> breadcrumbs = simplePageBean.getHierarchy(); SimplePageItem item = simplePageBean.findItem (params.getItemId()); // this is a "next" page where we couldn't tell if the item is // available. Need to check here in order to set ACLs. If not available, // return to calling page if (item != null && "true".equals(params.getRecheck())) { if (simplePageBean.isItemAvailable(item, item.getPageId())) { // for resources we do our own tracking, for the other types handled by this // class we depend upon the tool if (item.getType() == SimplePageItem.RESOURCE) simplePageBean.track(params.getItemId(), null); else if (item.isPrerequisite()) simplePageBean.checkItemPermissions(item, true); // set acl, etc } else { SimplePageBean.PathEntry containingPage = null; if (breadcrumbs.size() > 0) // shouldn't ever fail containingPage = breadcrumbs.get(breadcrumbs.size()-1); // page we're on if (containingPage != null) { // shouldn't fail GeneralViewParameters view = new GeneralViewParameters(ShowPageProducer.VIEW_ID); view.setSendingPage(containingPage.pageId); view.setItemId(containingPage.pageItemId); view.setPath("next"); UIInternalLink.make(tofill, "redirect-link", containingPage.title, view); UIOutput.make(tofill, "redirect"); } return; } } else if (item != null && item.getType() == SimplePageItem.RESOURCE) { // since recheck isn't set, permission checking should have been done. // for most item types handled here, we depend upon the tool for final access // checking and for tracking. But for resources we have to do it. if (simplePageBean.isItemAvailable(item, item.getPageId())) simplePageBean.track(params.getItemId(), null); else { UIOutput.make(tofill, "hiddenAlert"); UIOutput.make(tofill, "hidden-text", messageLocator.getMessage("simplepage.complete_required")); return; } } String helpurl = (String)toolSession.getAttribute("sakai-portal:help-action"); String reseturl = (String)toolSession.getAttribute("sakai-portal:reset-action"); String skinName = null; String skinRepo = null; String iconBase = null; if (helpurl != null || reseturl != null) { skinRepo = ServerConfigurationService.getString("skin.repo", "/library/skin"); iconBase = skinRepo + "/" + CSSUtils.adjustCssSkinFolder(null) + "/images"; UIVerbatim.make(tofill, "iconstyle", ICONSTYLE.replace("{}", iconBase)); } if (helpurl != null) { UILink.make(tofill, "helpbutton2"). decorate(new UIFreeAttributeDecorator("onclick", "openWindow('" + helpurl + "', 'Help', 'resizeable=yes,toolbar=no,scrollbars=yes,menubar=yes,width=800,height=600'); return false")). decorate(new UIFreeAttributeDecorator("title", messageLocator.getMessage("simplepage.help-button"))); UIOutput.make(tofill, "helpimage2"). decorate(new UIFreeAttributeDecorator("alt", messageLocator.getMessage("simplepage.help-button"))); UIOutput.make(tofill, "helpnewwindow2", messageLocator.getMessage("simplepage.opens-in-new")); } if (reseturl != null) { UILink.make(tofill, "resetbutton2"). decorate(new UIFreeAttributeDecorator("onclick", "location.href='" + reseturl + "'; return false")). decorate(new UIFreeAttributeDecorator("title", messageLocator.getMessage("simplepage.reset-button"))); UIOutput.make(tofill, "resetimage2"). decorate(new UIFreeAttributeDecorator("alt", messageLocator.getMessage("simplepage.reset-button"))); } if (item != null) simplePageBean.adjustBackPath(params.getBackPath(), params.getSendingPage(), item.getId(), item.getName()); String returnView = params.getReturnView(); // return to lesson doesn't make sense for resources, since they aren't separate applications in // the same sense. But we do want breadcrumbs. if (sendingPage != -1 && breadcrumbs != null && breadcrumbs.size() > 0) { SimplePageBean.PathEntry entry = breadcrumbs.get(breadcrumbs.size()-1); if (item != null && item.getType() == SimplePageItem.RESOURCE) { int index = 0; for (SimplePageBean.PathEntry e : breadcrumbs) { // don't show current page. We already have a title. This was too much UIBranchContainer crumb = UIBranchContainer.make(tofill, "crumb:"); GeneralViewParameters view = new GeneralViewParameters(ShowPageProducer.VIEW_ID); view.setSendingPage(e.pageId); view.setItemId(e.pageItemId); view.setPath(Integer.toString(index)); UIInternalLink.make(crumb, "crumb-link", e.title, view); UIOutput.make(crumb, "crumb-follow", " > "); if (index == breadcrumbs.size() - 1) { UIBranchContainer finalcrumb = UIBranchContainer.make(tofill, "crumb:"); UIOutput.make(finalcrumb, "crumb-follow", item.getName()).decorate(new UIStyleDecorator("bold")); } index++; } } else { if (returnView == null || returnView.equals("")) { GeneralViewParameters view = new GeneralViewParameters(ShowPageProducer.VIEW_ID); view.setSendingPage(entry.pageId); view.setItemId(entry.pageItemId); // path defaults to null, which is next UIInternalLink.make(tofill, "return", messageLocator.getMessage("simplepage.return"), view); UIOutput.make(tofill, "returnwarning", messageLocator.getMessage("simplepage.return.warning")); } else { GeneralViewParameters view = new GeneralViewParameters(returnView); view.setSendingPage(sendingPage);; view.setItemId(((GeneralViewParameters) params).getItemId()); UIInternalLink.make(tofill, "return", ((GeneralViewParameters) params).getTitle() , view); UIOutput.make(tofill, "returnwarning", messageLocator.getMessage("simplepage.return.warning")); } } } // see if we can add a next button if (item != null && (returnView == null || returnView.equals(""))) { simplePageBean.addPrevLink(tofill, item); simplePageBean.addNextLink(tofill, item); } UIComponent iframe = UILink.make(tofill, "iframe1", params.getSource()); if (item != null && item.getType() == SimplePageItem.BLTI) { String height = item.getHeight(); if (height == null || height.equals("")) iframe.decorate(new UIFreeAttributeDecorator("height", "1200")); else iframe.decorate(new UIFreeAttributeDecorator("height", height)); iframe.decorate(new UIFreeAttributeDecorator("onload", "")); } } public void setSimplePageBean(SimplePageBean simplePageBean) { this.simplePageBean = simplePageBean; } public void setSimplePageToolDao(SimplePageToolDao s) { simplePageToolDao = s; } public List reportNavigationCases() { List<NavigationCase> togo = new ArrayList<NavigationCase>(); togo.add(new NavigationCase("success", new SimpleViewParameters(ShowPageProducer.VIEW_ID))); togo.add(new NavigationCase("failure", new SimpleViewParameters(ShowItemProducer.VIEW_ID))); togo.add(new NavigationCase("cancel", new SimpleViewParameters(ShowPageProducer.VIEW_ID))); return togo; } public ViewParameters getViewParameters() { return new GeneralViewParameters(); } }