/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/osp/trunk/matrix/tool/src/java/org/theospi/portfolio/matrix/control/CellFormPickerController.java $
* $Id: CellFormPickerController.java 131548 2013-11-14 16:42:13Z dsobiera@indiana.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.matrix.control;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.util.ResourceLoader;
import org.sakaiproject.authz.api.SecurityService;
import org.sakaiproject.content.api.ContentCollection;
import org.sakaiproject.content.api.ContentCollectionEdit;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.content.api.FilePickerHelper;
import org.sakaiproject.content.api.ResourceEditingHelper;
import org.sakaiproject.entity.api.EntityManager;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.IdUsedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.metaobj.shared.FormHelper;
import org.sakaiproject.metaobj.shared.model.Id;
import org.sakaiproject.metaobj.shared.model.StructuredArtifactDefinitionBean;
import org.sakaiproject.metaobj.utils.mvc.intf.FormController;
import org.sakaiproject.metaobj.utils.mvc.intf.LoadObjectController;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.tool.api.Placement;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.theospi.portfolio.matrix.model.WizardPage;
import org.theospi.portfolio.matrix.model.WizardPageForm;
import org.theospi.portfolio.matrix.util.FormNameGeneratorUtil;
import org.sakaiproject.metaobj.security.AllowMapSecurityAdvisor;
import org.theospi.portfolio.shared.model.Node;
import org.theospi.portfolio.shared.tool.BaseFormResourceFilter;
public class CellFormPickerController extends CellController implements FormController, LoadObjectController {
private static ResourceLoader myResources = new ResourceLoader("org.theospi.portfolio.matrix.bundle.Messages");
protected final Log logger = LogFactory.getLog(getClass());
private ContentHostingService contentHosting;
private EntityManager entityManager;
private SecurityService securityService = null;
public static final String HELPER_CREATOR = "filepicker.helper.creator";
public static final String HELPER_PICKER = "filepicker.helper.picker";
public Object fillBackingObject(Object incomingModel, Map request,
Map session, Map application) throws Exception {
String pageId = (String) request.get("page_id");
if (pageId == null) {
pageId = (String)session.get("page_id");
}
WizardPage page = getMatrixManager().getWizardPage(getIdManager().getId(pageId));
if ( page == null ) // error should already be logged
return null;
if ((session.get(FilePickerHelper.FILE_PICKER_CANCEL) == null &&
session.get(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null) ||
(FormHelper.RETURN_ACTION_SAVE.equals((String)session.get(FormHelper.RETURN_ACTION_TAG)) &&
session.get(FormHelper.RETURN_REFERENCE_TAG) != null)) {
if (session.get(FilePickerHelper.FILE_PICKER_CANCEL) == null &&
session.get(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null) {
// here is where we setup the id
List refs = (List)session.get(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
//if (session.get(WHICH_HELPER_KEY).equals(HELPER_PICKER))
if (HELPER_PICKER.equals((String)session.get(WHICH_HELPER_KEY)) &&
!"true".equals((String)session.get(KEEP_HELPER_LIST)))
page.getPageForms().clear();
for (Iterator iter = refs.iterator(); iter.hasNext();) {
Reference ref = (Reference) iter.next();
Node node = getMatrixManager().getNode(ref);
processPageForm(node, page);
}
//getMatrixManager().storePage(page);
session.remove(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
session.remove(FilePickerHelper.FILE_PICKER_CANCEL);
}
if (FormHelper.RETURN_ACTION_SAVE.equals((String)session.get(FormHelper.RETURN_ACTION_TAG)) &&
session.get(FormHelper.RETURN_REFERENCE_TAG) != null) {
String artifactId = (String)session.get(FormHelper.RETURN_REFERENCE_TAG);
Node node = getMatrixManager().getNode(getIdManager().getId(artifactId));
processPageForm(node, page);
session.remove(FormHelper.RETURN_REFERENCE_TAG);
session.remove(FormHelper.RETURN_ACTION_TAG);
}
getMatrixManager().storePage(page);
session.remove(ResourceEditingHelper.CREATE_TYPE);
session.remove(ResourceEditingHelper.CREATE_PARENT);
session.remove(ResourceEditingHelper.CREATE_SUB_TYPE);
session.remove(ResourceEditingHelper.ATTACHMENT_ID);
session.remove(WHICH_HELPER_KEY);
session.remove(KEEP_HELPER_LIST);
}
return null;
}
protected void processPageForm(Node node, WizardPage page) {
Id id = node.getId();
WizardPageForm wpf = new WizardPageForm();
wpf.setArtifactId(id);
wpf.setFormType(node.getResource().getProperties().getProperty(
node.getResource().getProperties().getNamePropStructObjType()));
wpf.setWizardPage(page);
wpf.setNewId(getIdManager().createId());
page.getPageForms().add(wpf);
}
public ModelAndView handleRequest(Object requestModel, Map request, Map session, Map application, Errors errors) {
String attachFormAction = (String) request.get("attachFormAction");
String createFormAction = (String) request.get("createFormAction");
String viewFormAction = (String) request.get("viewFormAction");
String pageId = (String) request.get("page_id");
if (pageId == null) {
pageId = (String)session.get("page_id");
session.remove("page_id");
}
WizardPage page = getMatrixManager().getWizardPage(getIdManager().getId(pageId));
String pageTitle = page.getPageDefinition().getTitle();
if (attachFormAction != null) {
//session.setAttribute(TEMPLATE_PICKER, request.getParameter("pickerField"));
//session.setAttribute("SessionPresentationTemplate", template);
//session.setAttribute(STARTING_PAGE, request.getParameter("returnPage"));
List<Reference> files = new ArrayList<Reference>();
//String pickField = (String)request.get("formType");
String id = "";
for (Iterator iter = page.getPageForms().iterator(); iter.hasNext();) {
WizardPageForm wpf = (WizardPageForm) iter.next();
if (attachFormAction.equals(wpf.getFormType())) {
id = getContentHosting().resolveUuid(wpf.getArtifactId().getValue());
Reference ref = getEntityManager().newReference(getContentHosting().getReference(id));
files.add(ref);
}
}
BaseFormResourceFilter crf = new BaseFormResourceFilter();
crf.getFormTypes().add(attachFormAction);
session.put(FilePickerHelper.FILE_PICKER_RESOURCE_FILTER, crf);
session.put("page_id", pageId);
session.put(FilePickerHelper.FILE_PICKER_ATTACHMENTS, files);
session.put(WHICH_HELPER_KEY, HELPER_PICKER);
session.put(KEEP_HELPER_LIST, "false");
//Start in user's resources area
//osp-ui-05
String siteId = SiteService.getUserSiteId(getSessionManager().getCurrentSessionUserId());
String collectionId = getContentHosting().getSiteCollection(siteId);
session.put(FilePickerHelper.DEFAULT_COLLECTION_ID, collectionId);
return new ModelAndView("formPicker");
}
else if (createFormAction != null) {
String view = setupSessionInfo(request, session, pageId, createFormAction);
session.put(WHICH_HELPER_KEY, HELPER_CREATOR);
return new ModelAndView(view);
}
else if (viewFormAction != null) {
setupSessionInfo(request, session, pageId, viewFormAction);
getSecurityService().pushAdvisor(new AllowMapSecurityAdvisor(
ContentHostingService.EVENT_RESOURCE_READ,
(String)request.get("current_form_id")));
return new ModelAndView("formViewer");
}
session.remove(FilePickerHelper.FILE_PICKER_RESOURCE_FILTER);
return new ModelAndView("page", "page_id", pageId);
}
protected String setupSessionInfo(Map request, Map<String, Object> session,
String pageId, String formTypeId) {
String retView = "formCreator";
session.put("page_id", pageId);
session.put(FormHelper.FORM_STYLES, getStyleManager().createStyleUrlList(getStyleManager().getStyles(getIdManager().getId(pageId))));
Placement placement = ToolManager.getCurrentPlacement();
String currentSite = placement.getContext();
String objectId = (String)request.get("objectId");
String objectTitle = (String)request.get("objectTitle");
session.put(FormHelper.XSL_SITE_ID, currentSite);
session.put(FormHelper.XSL_WIZARD_PAGE_ID, pageId);
session.put(FormHelper.XSL_OBJECT_ID, objectId);
session.put(FormHelper.XSL_OBJECT_TITLE, objectTitle);
if (request.get("current_form_id") == null) {
session.remove(ResourceEditingHelper.ATTACHMENT_ID);
session.put(ResourceEditingHelper.CREATE_TYPE,
ResourceEditingHelper.CREATE_TYPE_FORM);
session.put(ResourceEditingHelper.CREATE_SUB_TYPE, formTypeId);
StructuredArtifactDefinitionBean bean = getStructuredArtifactDefinitionManager().loadHome(formTypeId);
List contentResourceList = null;
try {
String folderBase = getUserCollection().getId();
String rootDisplayName = myResources.getString("portfolioInteraction.displayName");
String rootDescription = myResources.getString("portfolioInteraction.description");
String folderPath = createFolder(folderBase, "portfolio-interaction", rootDisplayName, rootDescription);
folderPath = createFolder(folderPath, currentSite, SiteService.getSiteDisplay(currentSite), null);
folderPath = createFolder(folderPath, objectId, objectTitle, null);
folderPath = createFolder(folderPath, formTypeId, bean.getDescription(), null);
contentResourceList = this.getContentHosting().getAllResources(folderPath);
session.put(FormHelper.PARENT_ID_TAG, folderPath);
} catch (TypeException e) {
throw new RuntimeException("Failed to redirect to helper", e);
} catch (IdUnusedException e) {
throw new RuntimeException("Failed to redirect to helper", e);
} catch (PermissionException e) {
throw new RuntimeException("Failed to redirect to helper", e);
}
//CWM OSP-UI-09 - for auto naming
session.put(FormHelper.NEW_FORM_DISPLAY_NAME_TAG, FormNameGeneratorUtil.getFormDisplayName(bean.getDescription(), 1, contentResourceList));
} else {
//session.put(ResourceEditingHelper.ATTACHMENT_ID, request.get("current_form_id"));
session.remove(ResourceEditingHelper.CREATE_TYPE);
session.remove(ResourceEditingHelper.CREATE_SUB_TYPE);
session.remove(ResourceEditingHelper.CREATE_PARENT);
session.put(ResourceEditingHelper.CREATE_TYPE,
ResourceEditingHelper.CREATE_TYPE_FORM);
session.put(ResourceEditingHelper.ATTACHMENT_ID, request.get("current_form_id"));
retView = "formEditor";
}
return retView;
}
protected String createFolder(String base, String append, String appendDisplay, String appendDescription) {
//String folder = "/user/" +
//SessionManager.getCurrentSessionUserId() +
//PresentationManager.PRESENTATION_PROPERTIES_FOLDER_PATH;
String folder = base + append + "/";
try {
ContentCollectionEdit propFolder = getContentHosting().addCollection(folder);
propFolder.getPropertiesEdit().addProperty(ResourceProperties.PROP_DISPLAY_NAME, appendDisplay);
propFolder.getPropertiesEdit().addProperty(ResourceProperties.PROP_DESCRIPTION, appendDescription);
getContentHosting().commitCollection(propFolder);
return propFolder.getId();
}
catch (IdUsedException e) {
// ignore... it is already there.
}
catch (Exception e) {
throw new RuntimeException(e);
}
return folder;
}
protected ContentCollection getUserCollection() throws TypeException, IdUnusedException, PermissionException {
User user = UserDirectoryService.getCurrentUser();
String userId = user.getId();
String wsId = SiteService.getUserSiteId(userId);
String wsCollectionId = getContentHosting().getSiteCollection(wsId);
ContentCollection collection = getContentHosting().getCollection(wsCollectionId);
return collection;
}
/**
* @return Returns the contentHosting.
*/
public ContentHostingService getContentHosting() {
return contentHosting;
}
/**
* @param contentHosting The contentHosting to set.
*/
public void setContentHosting(ContentHostingService contentHosting) {
this.contentHosting = contentHosting;
}
/**
* @return Returns the entityManager.
*/
public EntityManager getEntityManager() {
return entityManager;
}
/**
* @param entityManager The entityManager to set.
*/
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public SecurityService getSecurityService() {
return securityService;
}
public void setSecurityService(SecurityService securityService) {
this.securityService = securityService;
}
}