/**********************************************************************************
* $URL:https://source.sakaiproject.org/svn/osp/trunk/presentation/tool/src/java/org/theospi/portfolio/presentation/tool/FreeFormTool.java $
* $Id:FreeFormTool.java 9134 2006-05-08 20:28:42Z chmaurer@iupui.edu $
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2007, 2008 The Sakai Foundation
*
* 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.theospi.portfolio.presentation.tool;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.FilePickerHelper;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.metaobj.shared.mgt.IdManager;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.Tool;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.theospi.jsf.intf.XmlTagFactory;
import org.theospi.portfolio.presentation.PresentationLayoutHelper;
import org.theospi.portfolio.presentation.PresentationManager;
import org.theospi.portfolio.presentation.intf.FreeFormHelper;
import org.theospi.portfolio.presentation.model.Presentation;
import org.theospi.portfolio.presentation.model.PresentationItem;
import org.theospi.portfolio.presentation.model.PresentationLayout;
import org.theospi.portfolio.presentation.model.PresentationPage;
import org.theospi.portfolio.shared.model.Node;
import org.theospi.portfolio.shared.tool.HelperToolBase;
import org.theospi.portfolio.style.StyleHelper;
import org.theospi.portfolio.style.model.Style;
/**
* Created by IntelliJ IDEA.
* User: John Ellis
* Date: Dec 31, 2005
* Time: 9:23:29 PM
* To change this template use File | Settings | File Templates.
*/
public class FreeFormTool extends HelperToolBase {
protected static final Log logger = LogFactory.getLog(FreeFormTool.class);
private PresentationManager presentationManager;
private IdManager idManager;
private XmlTagFactory factory;
private ContentHostingService contentHosting;
private Presentation presentation = null;
private DecoratedPage currentPage = null;
private List pageList;
private List attachableItems = null;
private List listableItems = null;
private List layouts = null;
private String nextPageId = null;
private int step = 1;
private int pageCount;
protected boolean validPages() {
if (getPageList() == null || getPageList().size() == 0) {
FacesContext.getCurrentInstance().addMessage(null,
getFacesMessageFromBundle("one_page_required", new Object[]{}));
return false;
}
return true;
}
public String processActionSave() {
if (!validPages()) {
return null;
}
Presentation presentation = getPresentation();
getPresentationManager().storePresentation(presentation, false, true);
return "main";
}
public String processActionSummary() {
setAttribute(FreeFormHelper.FREE_FORM_PREFIX + "presentation", getPresentation());
setRedirectCaller("editPresentation.osp");
return returnToCaller();
}
public String processActionShare() {
setAttribute(FreeFormHelper.FREE_FORM_PREFIX + "presentation", getPresentation());
setRedirectCaller("sharePresentation.osp");
return returnToCaller();
}
public String processActionReturn() {
setRedirectCaller("listPresentation.osp");
return returnToCaller();
}
/** FreeFormTool is currently set up as a helper for historic reasons.
** It should be moved and configured as a regular controller to allow proper
** navigation between SharePresentationController and EditPresentationController.
** For now, this method resets the HELPER_DONE_URL to the navigation target.
**/
private String setRedirectCaller( String target ) {
Tool tool = ToolManager.getCurrentTool();
ToolSession session = SessionManager.getCurrentToolSession();
String url = (String) session.getAttribute(tool.getId() + Tool.HELPER_DONE_URL);
url = url.substring( 0, url.lastIndexOf('/')+1 );
url = url + target;
session.setAttribute(tool.getId() + Tool.HELPER_DONE_URL, url);
return url;
}
public String processActionCancel() {
initValues();
Presentation presentation = getPresentation();
List pages = getPresentationManager().getPresentationPagesByPresentation(presentation.getId());
presentation.setPages(pages);
return "main";
}
public String processActionCancelPage() {
if (getCurrentPage().isNewPage()) {
deletePage(getCurrentPage());
}
cancelBoundValues();
return "main";
}
protected void initValues() {
currentPage = null;
pageList = null;
attachableItems = null;
listableItems = null;
}
public PresentationManager getPresentationManager() {
return presentationManager;
}
public void setPresentationManager(PresentationManager presentationManager) {
this.presentationManager = presentationManager;
}
public Presentation getPresentation() {
Presentation sessionPresentation =
(Presentation) getAttribute(FreeFormHelper.FREE_FORM_PREFIX + "presentation");
if (sessionPresentation != null) {
removeAttribute(FreeFormHelper.FREE_FORM_PREFIX + "presentation");
presentation = sessionPresentation;
List pages = presentation.getPages();
if (pages == null) {
pages = getPresentationManager().getPresentationPagesByPresentation(presentation.getId());
presentation.setPages(pages);
}
initValues();
}
return presentation;
}
public DecoratedPage getCurrentPage() {
return currentPage;
}
public void setCurrentPage(DecoratedPage currentPage) {
nextPageId = null;
this.currentPage = currentPage;
}
public void processPageSelectChange(ValueChangeEvent event) {
}
public List getPageList() {
Presentation presentation = getPresentation();
if (pageList == null) {
List pages = presentation.getPages();
pageList = new ArrayList();
for (Iterator i=pages.iterator();i.hasNext();) {
pageList.add(new DecoratedPage((PresentationPage) i.next(), this));
}
}
return pageList;
}
public void setPageList(List pageList) {
this.pageList = pageList;
}
public XmlTagFactory getFactory() {
return factory;
}
public void setFactory(XmlTagFactory factory) {
this.factory = factory;
}
public void processActionManageItems(ActionEvent event) {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
ToolSession session = SessionManager.getCurrentToolSession();
session.setAttribute(FilePickerHelper.FILE_PICKER_ATTACH_LINKS, Boolean.valueOf(true).toString());
List attachments = new ArrayList(getPresentation().getItems());
List attachmentRefs = EntityManager.newReferenceList();
for (Iterator i=attachments.iterator();i.hasNext();) {
PresentationItem attachment = (PresentationItem)i.next();
Node item = getPresentationManager().getNode(attachment.getArtifactId());
attachmentRefs.add(EntityManager.newReference(item.getResource().getReference()));
}
session.setAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS, attachmentRefs);
//Start in user's resources area
//osp-ui-05
String siteId = SiteService.getUserSiteId(SessionManager.getCurrentSessionUserId());
String collectionId = getContentHosting().getSiteCollection(siteId);
session.setAttribute(FilePickerHelper.DEFAULT_COLLECTION_ID, collectionId);
try {
context.redirect("sakai.filepicker.helper/tool");
}
catch (IOException e) {
logger.warn(e.toString());
}
}
public Set getItems() {
checkUpdateItems();
if (getPresentation().getItems() != null) {
return getPresentation().getItems();
}
getPresentation().setItems(new HashSet());
return getPresentation().getItems();
}
protected void checkUpdateItems() {
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(FilePickerHelper.FILE_PICKER_CANCEL) == null &&
session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null) {
List refs = (List)session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
List newAttachments = new ArrayList();
for(int i=0; i<refs.size(); i++) {
Reference ref = (Reference) refs.get(i);
PresentationItem item = new PresentationItem();
Node node = getPresentationManager().getNode(ref);
item.setArtifactId(node.getId());
newAttachments.add(item);
}
session.removeAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
getPresentation().getItems().clear();
getPresentation().getItems().addAll(newAttachments);
attachableItems = null;
listableItems = null;
}
}
public List getAttachableItems() {
checkUpdateItems();
if (attachableItems == null) {
attachableItems = new ArrayList();
for (Iterator i=getListableItems().iterator();i.hasNext();) {
DecoratedItem item = (DecoratedItem)i.next();
Node node = item.getNode();
attachableItems.add(createSelect(node.getExternalUri(),
node.getDisplayName()));
}
}
List pages = getPageList();
for (Iterator i=pages.iterator();i.hasNext();) {
DecoratedPage decoratedPage = (DecoratedPage) i.next();
PresentationPage page = decoratedPage.getBase();
SelectItem si = (SelectItem)createSelect(page.getUrl(),
decoratedPage.getSafeTitle());
boolean present = false;
for (Iterator j=attachableItems.iterator();j.hasNext();) {
SelectItem isi = (SelectItem) j.next();
if(isi.getLabel() != null && isi.getValue() != null)
if(isi.getLabel().equals(si.getLabel()) && isi.getValue().equals(si.getValue())) {
present = true;
break;
}
}
if(!present)
attachableItems.add(si);
}
return attachableItems;
}
public List getListableItems() {
checkUpdateItems();
if (listableItems == null) {
listableItems = new ArrayList();
for (Iterator i=getItems().iterator();i.hasNext();) {
PresentationItem item = (PresentationItem)i.next();
listableItems.add(new DecoratedItem(item, this));
}
}
return listableItems;
}
public String getCurrentPageId() {
return getCurrentPage().getBase().getId().getValue();
}
public void setCurrentPageId(String pageId) {
nextPageId = pageId;
}
public List getPageDropList() {
List base = getPageList();
List returned = new ArrayList();
for (Iterator i=base.iterator();i.hasNext();) {
DecoratedPage page = (DecoratedPage)i.next();
returned.add(createSelect(page.getBase().getId().getValue(), page.getSafeTitle()));
}
return returned;
}
public void setLayouts(List layouts) {
this.layouts = layouts;
}
public IdManager getIdManager() {
return idManager;
}
public void setIdManager(IdManager idManager) {
this.idManager = idManager;
}
public String processActionNewPage() {
PresentationPage page = new PresentationPage();
page.setNewObject(true);
page.setId(getIdManager().createId());
page.setPresentation(getPresentation());
page.setRegions(new HashSet());
getPresentation().getPages().add(page);
reorderPages();
DecoratedPage decoratedPage = new DecoratedPage(page, this);
decoratedPage.setNewPage(true);
setCurrentPage(decoratedPage);
return "edit";
}
protected void reorderPages() {
int index = 0;
for (Iterator i=presentation.getPages().iterator();i.hasNext();) {
PresentationPage page = (PresentationPage) i.next();
page.setSequence(index);
index++;
}
pageList = null;
attachableItems = null; // make sure list gets re-created in order
}
public String processRemoveSelectedPages() {
List localPageList = pageList;
for (Iterator i=localPageList.iterator();i.hasNext();) {
DecoratedPage page = (DecoratedPage) i.next();
if (page.isSelected()) {
deletePage(page);
}
}
reorderPages();
return "main";
}
public void deletePage(DecoratedPage page) {
getPresentation().getPages().remove(page.getBase());
pageList = null;
attachableItems = null; // make sure list gets re-created in order
}
public String processChangeCurrentPage() {
List base = getPageList();
for (Iterator i=base.iterator();i.hasNext();) {
DecoratedPage page = (DecoratedPage) i.next();
if (page.getBase().getId().getValue().equals(nextPageId)) {
setCurrentPage(page);
break;
}
}
return "arrange";
}
public String processActionSelectStyle() {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
ToolSession session = SessionManager.getCurrentToolSession();
session.removeAttribute(StyleHelper.CURRENT_STYLE);
session.removeAttribute(StyleHelper.CURRENT_STYLE_ID);
session.setAttribute(StyleHelper.STYLE_SELECTABLE, "true");
if (presentation.getStyle() != null)
session.setAttribute(StyleHelper.CURRENT_STYLE_ID, presentation.getStyle().getId().getValue());
try {
context.redirect("osp.style.helper/listStyle");
}
catch (IOException e) {
logger.warn(e.toString());
}
return null;
}
public String processActionSelectLayout() {
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
ToolSession session = SessionManager.getCurrentToolSession();
session.removeAttribute(PresentationLayoutHelper.CURRENT_LAYOUT);
session.removeAttribute(PresentationLayoutHelper.CURRENT_LAYOUT_ID);
session.setAttribute(PresentationLayoutHelper.LAYOUT_SELECTABLE, "true");
if (presentation.getLayout() != null)
session.setAttribute(PresentationLayoutHelper.CURRENT_LAYOUT_ID, presentation.getLayout().getId().getValue());
try {
context.redirect("osp.presLayout.helper/listLayout");
}
catch (IOException e) {
logger.warn(e.toString());
}
return null;
}
public int getStep(){
return step;
}
public String getStepString() {
return "" + (step);
}
public int getPageCount () {
return getPageList().size();
}
public String getStyleName() {
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(StyleHelper.CURRENT_STYLE) != null) {
Style style = (Style)session.getAttribute(StyleHelper.CURRENT_STYLE);
presentation.setStyle(style);
}
else if (session.getAttribute(StyleHelper.UNSELECTED_STYLE) != null) {
presentation.setStyle(null);
session.removeAttribute(StyleHelper.UNSELECTED_STYLE);
return "";
}
if (presentation.getStyle() != null)
return presentation.getStyle().getName();
return "";
}
public String getLayoutName() {
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(PresentationLayoutHelper.CURRENT_LAYOUT) != null) {
PresentationLayout layout = (PresentationLayout)session.getAttribute(PresentationLayoutHelper.CURRENT_LAYOUT);
presentation.setLayout(layout);
session.removeAttribute(PresentationLayoutHelper.CURRENT_LAYOUT);
}
else if (session.getAttribute(PresentationLayoutHelper.UNSELECTED_LAYOUT) != null) {
presentation.setLayout(null);
session.removeAttribute(PresentationLayoutHelper.UNSELECTED_LAYOUT);
return "";
}
if (presentation.getLayout() != null)
return presentation.getLayout().getName();
return "";
}
public Node getPreviewImage() {
if (presentation.getLayout() == null || presentation.getLayout().getPreviewImageId() == null) {
return null;
}
return getPresentationManager().getNode(presentation.getLayout().getPreviewImageId(), presentation.getLayout());
}
public boolean islayoutSelected() {
return (presentation.getLayout() != null);
}
public boolean isLayoutPreviewImage() {
if (islayoutSelected() && (getPreviewImage() != null)) {
return true;
}
return false;
}
/**
* @return the contentHosting
*/
public ContentHostingService getContentHosting() {
return contentHosting;
}
/**
* @param contentHosting the contentHosting to set
*/
public void setContentHosting(ContentHostingService contentHosting) {
this.contentHosting = contentHosting;
}
/**
* @return The url (String) to the portfolio preivew
*/
public String getPreviewUrl() {
String url = setRedirectCaller("viewPresentation.osp");
setAttribute(FreeFormHelper.FREE_FORM_PREFIX + "presentation", presentation);
url += "?1=1&id="+presentation.getId().getValue();
return url;
}
}