org.sakaiproject.metaobj.shared.control.XmlControllerBase.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.metaobj.shared.control.XmlControllerBase.java

Source

/*******************************************************************************
 * $URL: https://source.sakaiproject.org/svn/metaobj/trunk/metaobj-util/tool-lib/src/java/org/sakaiproject/metaobj/shared/control/XmlControllerBase.java $
 * $Id: XmlControllerBase.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
 * **********************************************************************************
 *
 * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 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.sakaiproject.metaobj.shared.control;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.ModelAndView;
import org.sakaiproject.metaobj.shared.model.*;
import org.sakaiproject.metaobj.shared.mgt.HomeFactory;
import org.sakaiproject.metaobj.shared.mgt.StructuredArtifactDefinitionManager;
import org.sakaiproject.metaobj.shared.mgt.home.StructuredArtifactHomeInterface;
import org.sakaiproject.metaobj.shared.mgt.home.ResourceHelperArtifactHome;
import org.sakaiproject.metaobj.shared.FormHelper;
import org.sakaiproject.content.api.*;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.api.SessionManager;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.util.ResourceLoader;

import java.util.*;
import java.net.URI;

public class XmlControllerBase {
    protected final Log logger = LogFactory.getLog(getClass());
    private HomeFactory homeFactory;
    private XmlValidator validator = null;
    private StructuredArtifactDefinitionManager structuredArtifactDefinitionManager;
    private static final String FILE_ATTACHMENTS_FIELD = "org.sakaiproject.metaobj.shared.control.XmlControllerBase.field";
    private ResourceLoader rl = new ResourceLoader("messages");
    private ContentHostingService contentHostingService;

    protected ModelAndView handleNonSubmit(ElementBean bean, Map request, Map session, Map application,
            Errors errors) {
        return handleNonSubmit(bean, request, session, application, errors, new Hashtable());
    }

    protected ModelAndView handleNonSubmit(ElementBean bean, Map request, Map session, Map application,
            Errors errors, Map model) {
        if (request.get("backButton") != null) {
            session.remove(EditedArtifactStorage.STORED_ARTIFACT_FLAG);
            session.remove(EditedArtifactStorage.EDITED_ARTIFACT_STORAGE_SESSION_KEY);
            return new ModelAndView("back");
        }

        EditedArtifactStorage sessionBean = (EditedArtifactStorage) session
                .get(EditedArtifactStorage.EDITED_ARTIFACT_STORAGE_SESSION_KEY);

        session.put(EditedArtifactStorage.STORED_ARTIFACT_FLAG, "true");

        if (sessionBean == null) {
            StructuredArtifact artifact = (StructuredArtifact) bean;
            sessionBean = new EditedArtifactStorage(artifact.getCurrentSchema(), artifact);
            session.put(EditedArtifactStorage.EDITED_ARTIFACT_STORAGE_SESSION_KEY, sessionBean);
        }

        if ((request.get("editButton") != null && request.get("editButton").toString().length() > 0)
                || request.get("addButton") != null) {
            handleEditAdd(bean, sessionBean, request, session, application, errors);
        } else if (request.get("removeButton") != null && request.get("removeButton").toString().length() > 0) {
            handleRemove(bean, sessionBean, request, session, application, errors);
        } else if (request.get("cancelNestedButton") != null) {
            sessionBean.popCurrentElement(true);
            sessionBean.popCurrentPath();
        } else if (request.get("updateNestedButton") != null) {
            getValidator().validate(sessionBean.getCurrentElement(), errors, true);
            if (errors.hasErrors()) {
                logger.warn(this + "validate failed for: " + getSchemaName(session));
                return new ModelAndView("success");
            }
            sessionBean.popCurrentElement();
            sessionBean.popCurrentPath();
        } else if (request.get("fileHelper") != null) {
            return processFileAttachments(request, session, bean, errors);
        }

        model.put(EditedArtifactStorage.STORED_ARTIFACT_FLAG, "true");

        if (request.get("parentId") != null) {
            model.put("parentId", getParentId(request));
        }
        return new ModelAndView("subList", model);
    }

    protected void handleRemove(ElementBean bean, EditedArtifactStorage sessionBean, Map request, Map session,
            Map application, Errors errors) {
        ElementListBean parentList = findList(bean, (String) request.get("childPath"));
        if (parentList == null) {
            bean.remove((String) request.get("childPath"));
        } else {
            int removeIndex = Integer.parseInt((String) request.get("childIndex"));
            parentList.remove(removeIndex);
        }
    }

    protected void handleEditAdd(ElementBean bean, EditedArtifactStorage sessionBean, Map request, Map session,
            Map application, Errors errors) {
        // find the individual element in question
        ElementListBean parentList = findList(bean, (String) request.get("childPath"));
        ElementBean newBean = null;

        if (parentList == null) {
            newBean = findSubForm(bean, (String) request.get("childPath"));
        } else if (request.get("editButton") != null && request.get("editButton").toString().length() > 0) {
            int index = Integer.parseInt((String) request.get("childIndex"));
            newBean = (ElementBean) parentList.get(index);
        } else if (request.get("addButton") != null) {
            newBean = parentList.createBlank();
            parentList.add(newBean);
        } else {
            //TODO: figure out if assuming addButton behavior is right
            // I think this if-block assumes valid parameter input, and assuming
            // the addButton behavior is the safest fall-through to avoid a null newBean
            newBean = parentList.createBlank();
            parentList.add(newBean);
        }

        sessionBean.pushCurrentElement(newBean);
        sessionBean.pushCurrentPath((String) request.get("childPath"));

    }

    protected ElementListBean findList(ElementBean bean, String path) {
        StringTokenizer tok = new StringTokenizer(path, ".");
        ElementBean current = bean;

        while (tok.hasMoreTokens()) {
            Object obj = current.get(tok.nextToken());
            if (obj instanceof ElementBean) {
                current = (ElementBean) obj;
            } else if (obj instanceof ElementListBean) {
                return (ElementListBean) obj;
            }
        }

        return null;
    }

    protected ElementBean findSubForm(ElementBean bean, String path) {
        StringTokenizer tok = new StringTokenizer(path, ".");
        ElementBean current = bean;

        while (tok.hasMoreTokens()) {
            Object obj = current.get(tok.nextToken());
            if (obj instanceof ElementBean) {
                return (ElementBean) obj;
            }
        }

        return null;
    }

    protected String getSchemaName(Map session) {
        Object schemaName = session.get(ResourceEditingHelper.CREATE_SUB_TYPE);

        if (schemaName == null) {
            return null;
        }
        if (schemaName instanceof String) {
            return (String) schemaName;
        } else if (schemaName instanceof String[]) {
            return ((String[]) schemaName)[0];
        } else {
            return schemaName.toString();
        }
    }

    protected StructuredArtifactHomeInterface getSchema(Map session) {
        if (session.get(FormHelper.PREVIEW_HOME_TAG) != null) {
            return getStructuredArtifactDefinitionManager()
                    .convertToHome((StructuredArtifactDefinitionBean) session.get(FormHelper.PREVIEW_HOME_TAG));
        } else if (session.get(ResourceToolAction.ACTION_PIPE) != null) {
            ResourceToolActionPipe pipe = (ResourceToolActionPipe) session.get(ResourceToolAction.ACTION_PIPE);
            ContentEntity entity = pipe.getContentEntity();
            String schemaName = (String) entity.getProperties().get(ResourceProperties.PROP_STRUCTOBJ_TYPE);

            if (schemaName == null) {
                // must be a create
                schemaName = getSchemaName(session);
            }

            StructuredArtifactHomeInterface home = (StructuredArtifactHomeInterface) getHomeFactory()
                    .getHome(schemaName);
            return new ResourceHelperArtifactHome(home, pipe);
        } else {
            return (StructuredArtifactHomeInterface) getHomeFactory().getHome(getSchemaName(session));
        }
    }

    protected String getParentId(Map request) {
        Object parentId = request.get("parentId");

        if (parentId instanceof String) {
            return (String) parentId;
        } else if (parentId instanceof String[]) {
            return ((String[]) parentId)[0];
        } else {
            return parentId.toString();
        }
    }

    public HomeFactory getHomeFactory() {
        return homeFactory;
    }

    public void setHomeFactory(HomeFactory homeFactory) {
        this.homeFactory = homeFactory;
    }

    public XmlValidator getValidator() {
        return validator;
    }

    public void setValidator(XmlValidator validator) {
        this.validator = validator;
    }

    public boolean isCancel(Map request) {
        return request.get("cancelNestedButton") != null;
    }

    public ModelAndView processCancel(Map request, Map session, Map application, Object command, Errors errors)
            throws Exception {
        return handleNonSubmit((ElementBean) command, request, session, application, errors);
    }

    public ModelAndView processFileAttachments(Map request, Map session, ElementBean currentBean, Errors errors) {
        String fieldName = (String) request.get("childPath");
        String fieldLabel = (String) request.get("childFieldLabel");

        if (fieldLabel == null) {
            fieldLabel = fieldName;
        }

        session.put(FILE_ATTACHMENTS_FIELD, fieldName);
        String title = rl.getString("attachment_file_helper_title_single");
        String instructionKey = "attachment_file_helper_instructions_single";
        int limit = 0;

        //ToolSession toolSession = getSessionManager().getCurrentToolSession();
        List attachmentRefs = new ArrayList();

        session.put(FilePickerHelper.FILE_PICKER_MAX_ATTACHMENTS, FilePickerHelper.CARDINALITY_SINGLE);
        if (List.class.isAssignableFrom(currentBean.getType(fieldName))) {
            LimitedList currentIds = (LimitedList) currentBean.get(fieldName);
            attachmentRefs.addAll(convertToRefList(currentIds));
            session.put(FilePickerHelper.FILE_PICKER_MAX_ATTACHMENTS, currentIds.getUpperLimit());
            title = rl.getString("attachment_file_helper_title_multiple");
            if (currentIds.getUpperLimit() == Integer.MAX_VALUE) {
                instructionKey = "attachment_file_helper_instructions_multiple_unlim";
            } else {
                limit = currentIds.getUpperLimit();
                instructionKey = "attachment_file_helper_instructions_multiple";
            }
        } else if (currentBean.get(fieldName) != null) {
            URI value = (URI) currentBean.get(fieldName);
            attachmentRefs.add(convertToRef(value.getSchemeSpecificPart()));
        }

        session.put(FilePickerHelper.FILE_PICKER_TITLE_TEXT, title);
        session.put(FilePickerHelper.FILE_PICKER_INSTRUCTION_TEXT,
                rl.getFormattedMessage(instructionKey, new Object[] { fieldLabel, limit }));

        session.put(FilePickerHelper.FILE_PICKER_ATTACHMENTS, attachmentRefs);
        //session.put(FilePickerHelper.START_HELPER, "true");

        return new ModelAndView("fileHelper");
    }

    public void retrieveFileAttachments(Map request, Map session, ElementBean currentBean) {
        String fieldName = (String) session.get(FILE_ATTACHMENTS_FIELD);

        if (session.get(FilePickerHelper.FILE_PICKER_CANCEL) == null
                && session.get(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null) {

            List refs = (List) session.get(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
            List ids = convertRefs(refs);
            // we may convert later, for now, leave backward compatible.
            // convertToGuidList(refs);

            if (List.class.isAssignableFrom(currentBean.getType(fieldName))) {
                List refList = (List) currentBean.get(fieldName);
                refList.clear();
                refList.addAll(ids);
            } else {
                if (refs.size() > 0) {
                    currentBean.put(fieldName, ids.get(0));
                } else {
                    currentBean.put(fieldName, null);
                }
            }
        }

        session.remove(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
        session.remove(FilePickerHelper.FILE_PICKER_CANCEL);
    }

    protected List convertRefs(List refs) {
        List ret = new ArrayList();
        for (Iterator<Reference> i = refs.iterator(); i.hasNext();) {
            ret.add(convertRef(i.next()));
        }
        return ret;
    }

    protected String convertRef(Reference reference) {
        return reference.getId();
    }

    /**
     * not currently used... will use if we move to storing id rather than ref in the
     * xml form data
     * @param refs
     * @return list of converted guids
     */
    protected List convertToGuidList(List refs) {
        List idList = new ArrayList();

        for (Iterator i = refs.iterator(); i.hasNext();) {
            Reference ref = (Reference) i.next();

            idList.add(getContentHostingService().getUuid(ref.getId()));
        }

        return idList;
    }

    /**
     * @param id string
     * @return ref
     */
    protected Reference convertToRef(String id) {
        return EntityManager.newReference(getContentHostingService().getReference(id));
    }

    /**
     * @param refs
     * @return list of refs
     */
    protected List convertToRefList(List refs) {
        List refList = new ArrayList();

        for (Iterator<ElementBean> i = refs.iterator(); i.hasNext();) {
            refList.add(convertToRef(i.next().getBaseElement().getTextTrim()));
        }

        return refList;
    }

    public StructuredArtifactDefinitionManager getStructuredArtifactDefinitionManager() {
        return structuredArtifactDefinitionManager;
    }

    public void setStructuredArtifactDefinitionManager(
            StructuredArtifactDefinitionManager structuredArtifactDefinitionManager) {
        this.structuredArtifactDefinitionManager = structuredArtifactDefinitionManager;
    }

    public ContentHostingService getContentHostingService() {
        return contentHostingService;
    }

    public void setContentHostingService(ContentHostingService contentHostingService) {
        this.contentHostingService = contentHostingService;
    }
}