/********************************************************************************** * $URL: $ * $Id: $ *********************************************************************************** * * Author: Charles Hedrick, hedrick@rutgers.edu * * Copyright (c) 2010 Rutgers, the State University of New Jersey * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.lessonbuildertool.tool.producers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.sakaiproject.lessonbuildertool.service.LessonEntity; import org.sakaiproject.lessonbuildertool.SimplePage; import org.sakaiproject.lessonbuildertool.SimplePageItem; import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean; import org.sakaiproject.lessonbuildertool.tool.beans.SimplePageBean.UrlItem; import org.sakaiproject.lessonbuildertool.tool.view.GeneralViewParameters; import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao; import uk.org.ponder.messageutil.MessageLocator; import uk.org.ponder.localeutil.LocaleGetter; import uk.org.ponder.rsf.components.UIBranchContainer; import uk.org.ponder.rsf.components.UICommand; import uk.org.ponder.rsf.components.UIContainer; import uk.org.ponder.rsf.components.UIForm; import uk.org.ponder.rsf.components.UILink; import uk.org.ponder.rsf.components.UIOutput; import uk.org.ponder.rsf.components.UIInput; import uk.org.ponder.rsf.components.UISelect; import uk.org.ponder.rsf.components.UISelectChoice; import uk.org.ponder.rsf.components.UIInternalLink; import uk.org.ponder.rsf.components.decorators.UIFreeAttributeDecorator; 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.ViewComponentProducer; import uk.org.ponder.rsf.viewstate.SimpleViewParameters; import uk.org.ponder.rsf.viewstate.ViewParameters; import uk.org.ponder.rsf.viewstate.ViewParamsReporter; /** * Creates a window for the user to choose which forum topic to add to the page. * * @author Charles Hedrick <jeney@rutgers.edu> * */ public class ForumPickerProducer implements ViewComponentProducer, NavigationCaseReporter, ViewParamsReporter { public static final String VIEW_ID = "ForumPicker"; private SimplePageBean simplePageBean; private SimplePageToolDao simplePageToolDao; private LessonEntity forumEntity = null; public MessageLocator messageLocator; public LocaleGetter localeGetter; public void setForumEntity(Object e) { forumEntity = (LessonEntity)e; } public void setSimplePageBean(SimplePageBean simplePageBean) { this.simplePageBean = simplePageBean; } public void setSimplePageToolDao(Object dao) { simplePageToolDao = (SimplePageToolDao) dao; } public String getViewID() { return VIEW_ID; } public void fillComponents(UIContainer tofill, ViewParameters viewparams, ComponentChecker checker) { if (((GeneralViewParameters) viewparams).getSendingPage() != -1) { // will fail if page not in this site // security then depends upon making sure that we only deal with this page try { simplePageBean.updatePageObject(((GeneralViewParameters) viewparams).getSendingPage()); } catch (Exception e) { System.out.println("AssignmentPicker permission exception " + e); return; } } UIOutput.make(tofill, "html").decorate(new UIFreeAttributeDecorator("lang", localeGetter.get().getLanguage())) .decorate(new UIFreeAttributeDecorator("xml:lang", localeGetter.get().getLanguage())); Long itemId = ((GeneralViewParameters) viewparams).getItemId(); simplePageBean.setItemId(itemId); if (simplePageBean.canEditPage()) { SimplePage page = simplePageBean.getCurrentPage(); String currentItem = null; // default value, normally current // if itemid is null, we'll append to current page, so it's ok if (itemId != null && itemId != -1) { SimplePageItem i = simplePageToolDao.findItem(itemId); if (i == null) return; // trying to hack on item not on this page if (i.getPageId() != page.getPageId()) return; currentItem = i.getSakaiId(); } List<UrlItem> createLinks = forumEntity.createNewUrls(simplePageBean); for (UrlItem createLink: createLinks) { UIBranchContainer link = UIBranchContainer.make(tofill, "forum-create:"); GeneralViewParameters view = new GeneralViewParameters(ShowItemProducer.VIEW_ID); view.setSendingPage(((GeneralViewParameters) viewparams).getSendingPage()); view.setItemId(((GeneralViewParameters) viewparams).getItemId()); view.setSource(createLink.Url); view.setReturnView(VIEW_ID); view.setTitle(messageLocator.getMessage("simplepage.return_forum")); UIInternalLink.make(link, "forum-create-link", createLink.label , view); } List<LessonEntity> topics = forumEntity.getEntitiesInSite(); UIForm form = UIForm.make(tofill, "forum-picker"); if (createLinks.size() == 0) { UIOutput.make(tofill, "error-div"); UIOutput.make(tofill, "error", messageLocator.getMessage("simplepage.no_forum_tools")); UICommand.make(tofill, "cancel", messageLocator.getMessage("simplepage.cancel"), "#{simplePageBean.cancel}"); return; } ArrayList<String> values = new ArrayList<String>(); for (LessonEntity topic: topics) values.add(topic.getReference()); if (values.size() < 1) { UIOutput.make(tofill, "error-div"); UIOutput.make(tofill, "error", messageLocator.getMessage("simplepage.no_topics")); UICommand.make(tofill, "cancel", messageLocator.getMessage("simplepage.cancel"), "#{simplePageBean.cancel}"); return; } // if no current item, use first if (currentItem == null) { for (LessonEntity topic: topics) if (topic.isUsable()) { currentItem = topic.getReference(); break; } } if (currentItem == null) { UIOutput.make(tofill, "error", messageLocator.getMessage("simplepage.no_topics")); return; } UISelect select = UISelect.make(form, "forum-span", values.toArray(new String[1]), "#{simplePageBean.selectedEntity}", currentItem); for (LessonEntity topic: topics) { UIBranchContainer row = UIBranchContainer.make(form, "forum:", String.valueOf(topics.indexOf(topic))); if (topic.isUsable()) { UISelectChoice.make(row, "select", select.getFullID(), topics.indexOf(topic)). decorate(new UIFreeAttributeDecorator("title", topic.getTitle())); UILink.make(row, "link", topic.getTitle(), topic.getUrl()); } else { UIOutput.make(row, "name", topic.getTitle()); } } UIInput.make(form, "item-id", "#{simplePageBean.itemId}"); UICommand.make(form, "submit", messageLocator.getMessage("simplepage.chooser.select"), "#{simplePageBean.addForum}"); UICommand.make(form, "cancel", messageLocator.getMessage("simplepage.cancel"), "#{simplePageBean.cancel}"); } } public ViewParameters getViewParameters() { return new GeneralViewParameters(); } 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(ForumPickerProducer.VIEW_ID))); togo.add(new NavigationCase("cancel", new SimpleViewParameters(ShowPageProducer.VIEW_ID))); return togo; } }