/**********************************************************************************
* $URL: $
* $Id: $
***********************************************************************************
*
* Author: Eric Jeney, jeney@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.List;
import java.net.URLEncoder;
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.tool.api.Session;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.lessonbuildertool.service.BltiEntity;
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 list of LTI Content Items for the user to choose from. Their choice will be added
* to the end of the list of items on this page.
*
* @author Charles Severance <csev@umich.edu>
* @author Eric Jeney <jeney@rutgers.edu>
*
*/
public class BltiPickerProducer implements ViewComponentProducer, NavigationCaseReporter, ViewParamsReporter {
public static final String VIEW_ID = "BltiPicker";
private SimplePageBean simplePageBean;
private SimplePageToolDao simplePageToolDao;
private LessonEntity bltiEntity;
public MessageLocator messageLocator;
public LocaleGetter localeGetter;
public void setSimplePageBean(SimplePageBean simplePageBean) {
this.simplePageBean = simplePageBean;
}
public void setSimplePageToolDao(Object dao) {
simplePageToolDao = (SimplePageToolDao) dao;
}
public void setBltiEntity(LessonEntity l) {
bltiEntity = l;
}
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("QuizPicker permission exception " + e);
return;
}
}
UIOutput.make(tofill, "html").decorate(new UIFreeAttributeDecorator("lang", localeGetter.get().getLanguage()))
.decorate(new UIFreeAttributeDecorator("xml:lang", localeGetter.get().getLanguage()));
//errorMessage=&id=&title=&source=&backPath=&sendingPage=92&path=&clearAttr=&recheck=&itemId=-1&returnView=
Long itemId = ((GeneralViewParameters) viewparams).getItemId();
simplePageBean.setItemId(itemId);
// here is a URL to return to this page
String comeBack = ServerConfigurationService.getToolUrl()+ "/" + ToolManager.getCurrentPlacement().getId() + "/BltiPicker?" +
((GeneralViewParameters) viewparams).getSendingPage() + "&itemId=" + itemId;
if ( bltiEntity instanceof BltiEntity ) ( (BltiEntity) bltiEntity).setReturnUrl(comeBack);
// here is a URL to return to the main lesson builder page
// System.out.println("/portal/tool/" + ToolManager.getCurrentPlacement().getId() + "/ShowPage?");
if (simplePageBean.canEditPage()) {
SimplePage page = simplePageBean.getCurrentPage();
String currentItem = null; // default value, normally current
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 = bltiEntity.createNewUrls(simplePageBean);
UrlItem mainLink = null;
int toolcount = 0;
for (UrlItem createLink: createLinks) {
if (createLink.Url.indexOf("panel=Main") >= 0) {
mainLink = createLink;
continue;
}
toolcount = 1;
UIBranchContainer link = UIBranchContainer.make(tofill, "blti-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_blti"));
UIInternalLink.make(link, "blti-create-link", createLink.label , view);
}
if (toolcount > 0)
UIOutput.make(tofill, "blti-tools-text", messageLocator.getMessage("simplepage.blti.tools.text"));
if (mainLink != null) {
GeneralViewParameters view = new GeneralViewParameters(ShowItemProducer.VIEW_ID);
view.setSendingPage(((GeneralViewParameters) viewparams).getSendingPage());
view.setItemId(((GeneralViewParameters) viewparams).getItemId());
view.setSource(mainLink.Url);
view.setReturnView(VIEW_ID);
view.setTitle(messageLocator.getMessage("simplepage.return_blti"));
UIInternalLink.make(tofill, "blti-main-link", mainLink.label , view);
}
UIForm form = UIForm.make(tofill, "blti-picker");
List<LessonEntity> plist = bltiEntity.getEntitiesInSite();
if (plist == null || plist.size() < 1) {
UIOutput.make(tofill, "no-blti-items");
UIOutput.make(tofill, "no-blti-items-text", messageLocator.getMessage("simplepage.no_blti_items"));
} else
UIOutput.make(tofill, "select-blti-text", messageLocator.getMessage("simplepage.select_blti.text"));
ArrayList<String> values = new ArrayList<String>();
if (plist != null)
for (LessonEntity blti: plist) {
values.add(blti.getReference());
}
// if no current item, use first
if (currentItem == null && plist != null && plist.size() > 0)
currentItem = plist.get(0).getReference();
UISelect select = UISelect.make(form, "blti-span", values.toArray(new String[1]), "#{simplePageBean.selectedBlti}", currentItem);
if (plist != null)
for (LessonEntity a : plist) {
UIBranchContainer row = UIBranchContainer.make(form, "blti:", String.valueOf(plist.indexOf(a)));
UISelectChoice.make(row, "select", select.getFullID(), plist.indexOf(a)).
decorate(new UIFreeAttributeDecorator("title", a.getTitle()));
UILink.make(row, "link", a.getTitle(), a.getUrl());
}
UIInput.make(form, "item-id", "#{simplePageBean.itemId}");
if (plist != null && plist.size() > 0) {
if (false) {
// this code works, but I think the resulting UI is too complex
UIOutput.make(form, "format-explain", messageLocator.getMessage("simplepage.format.heading"));
UISelect radios = UISelect.make(form, "format-select",
new String[] {"window", "inline", "page"},
"#{simplePageBean.format}", "page");
UISelectChoice.make(form, "format-window", radios.getFullID(), 0);
UISelectChoice.make(form, "format-inline", radios.getFullID(), 1);
UISelectChoice.make(form, "format-page", radios.getFullID(), 2);
}
UICommand.make(form, "submit", messageLocator.getMessage("simplepage.chooser.select"), "#{simplePageBean.addBlti}");
}
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(BltiPickerProducer.VIEW_ID)));
togo.add(new NavigationCase("cancel", new SimpleViewParameters(ShowPageProducer.VIEW_ID)));
return togo;
}
}