edu.cornell.mannlib.vitro.webapp.controller.edit.VclassRetryController.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.controller.edit.VclassRetryController.java

Source

/* $This file is distributed under the terms of the license in /doc/license.txt$ */

package edu.cornell.mannlib.vitro.webapp.controller.edit;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import edu.cornell.mannlib.vedit.beans.EditProcessObject;
import edu.cornell.mannlib.vedit.beans.FormObject;
import edu.cornell.mannlib.vedit.beans.Option;
import edu.cornell.mannlib.vedit.controller.BaseEditController;
import edu.cornell.mannlib.vedit.forwarder.PageForwarder;
import edu.cornell.mannlib.vedit.forwarder.impl.UrlForwarder;
import edu.cornell.mannlib.vedit.listener.ChangeListener;
import edu.cornell.mannlib.vedit.util.FormUtils;
import edu.cornell.mannlib.vedit.validator.impl.XMLNameValidator;
import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission;
import edu.cornell.mannlib.vitro.webapp.beans.Classes2Classes;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.controller.Controllers;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.edit.utils.RoleLevelOptionsSetup;
import edu.cornell.mannlib.vitro.webapp.dao.OntologyDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassDao;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;

public class VclassRetryController extends BaseEditController {

    private static final Log log = LogFactory.getLog(VclassRetryController.class.getName());

    public void doPost(HttpServletRequest req, HttpServletResponse response) {
        if (!isAuthorizedToDisplayPage(req, response, SimplePermission.EDIT_ONTOLOGY.ACTION)) {
            return;
        }

        VitroRequest request = new VitroRequest(req);

        //create an EditProcessObject for this and put it in the session
        EditProcessObject epo = super.createEpo(request);

        /*for testing*/
        VClass testMask = new VClass();
        epo.setBeanClass(VClass.class);
        epo.setImplementationClass(VClass.class);
        epo.setBeanMask(testMask);

        String action = null;
        if (epo.getAction() == null) {
            action = "insert";
            epo.setAction("insert");
        } else {
            action = epo.getAction();
        }

        WebappDaoFactory wadf = ModelAccess.on(getServletContext()).getWebappDaoFactory();

        VClassDao vcwDao = wadf.getVClassDao();
        epo.setDataAccessObject(vcwDao);
        VClassGroupDao cgDao = wadf.getVClassGroupDao();
        OntologyDao oDao = wadf.getOntologyDao();

        VClass vclassForEditing = null;
        if (!epo.getUseRecycledBean()) {
            if (request.getParameter("uri") != null) {
                try {
                    vclassForEditing = (VClass) vcwDao.getVClassByURI(request.getParameter("uri"));
                    action = "update";
                    epo.setAction("update");
                } catch (NullPointerException e) {
                    log.error("Need to implement 'record not found' error message.");
                }
            } else {
                vclassForEditing = new VClass();
                if (request.getParameter("GroupId") != null) {
                    vclassForEditing.setGroupURI(request.getParameter("GroupURI"));
                }
            }
            epo.setOriginalBean(vclassForEditing);
        } else {
            vclassForEditing = (VClass) epo.getNewBean();
        }

        //make a simple mask for the class's id
        Object[] simpleMaskPair = new Object[2];
        simpleMaskPair[0] = "URI";
        simpleMaskPair[1] = vclassForEditing.getURI();
        epo.getSimpleMask().add(simpleMaskPair);

        //validators
        List localNameValidatorList = new ArrayList();
        localNameValidatorList.add(new XMLNameValidator());
        epo.getValidatorMap().put("LocalName", localNameValidatorList);

        //set up any listeners
        List changeListenerList = new LinkedList();
        if (request.getParameter("superclassUri") != null) {
            changeListenerList.add(new SubclassListener(request.getParameter("superclassUri"),
                    request.getUnfilteredWebappDaoFactory()));
        }
        epo.setChangeListenerList(changeListenerList);

        //make a postinsert pageforwarder that will send us to a new class's fetch screen
        epo.setPostInsertPageForwarder(new VclassInsertPageForwarder());
        //make a postdelete pageforwarder that will send us to the list of classes
        epo.setPostDeletePageForwarder(new UrlForwarder("showClassHierarchy"));

        //set the getMethod so we can retrieve a new bean after we've inserted it
        try {
            Class[] args = new Class[1];
            args[0] = String.class;
            epo.setGetMethod(VClassDao.class.getDeclaredMethod("getVClassByURI", args));
        } catch (NoSuchMethodException e) {
            log.error(this.getClass().getName() + " could not find the getVClassByURI method");
        }

        HashMap<String, List<Option>> optionMap = new HashMap<String, List<Option>>();
        try {
            VClassGroupDao vcgDao = request.getUnfilteredWebappDaoFactory().getVClassGroupDao();
            List classGroupOptionList = FormUtils.makeOptionListFromBeans(vcgDao.getPublicGroupsWithVClasses(),
                    "URI", "PublicName", vclassForEditing.getGroupURI(), null,
                    (vclassForEditing.getGroupURI() != null && !(vclassForEditing.getGroupURI().equals(""))));
            classGroupOptionList.add(0, new Option("", "none", ("update".equals(action)
                    && (vclassForEditing.getGroupURI() == null || vclassForEditing.getGroupURI().equals("")))));
            optionMap.put("GroupURI", classGroupOptionList);

        } catch (Exception e) {
            log.error("unable to create GroupId option list");
        }
        try {
            List namespaceIdList = (action.equals("insert"))
                    ? FormUtils.makeOptionListFromBeans(oDao.getAllOntologies(), "URI", "Name",
                            ((vclassForEditing.getNamespace() == null) ? "" : vclassForEditing.getNamespace()),
                            null, false)
                    : FormUtils.makeOptionListFromBeans(oDao.getAllOntologies(), "URI", "Name",
                            ((vclassForEditing.getNamespace() == null) ? "" : vclassForEditing.getNamespace()),
                            null, true);
            namespaceIdList.add(0,
                    new Option(request.getUnfilteredWebappDaoFactory().getDefaultNamespace(), "default"));
            optionMap.put("Namespace", namespaceIdList);
        } catch (Exception e) {
            log.error(this.getClass().getName() + "unable to create Namespace option list");
        }

        optionMap.put("HiddenFromDisplayBelowRoleLevelUsingRoleUri",
                RoleLevelOptionsSetup.getDisplayOptionsList(vclassForEditing));
        optionMap.put("ProhibitedFromUpdateBelowRoleLevelUsingRoleUri",
                RoleLevelOptionsSetup.getUpdateOptionsList(vclassForEditing));
        optionMap.put("HiddenFromPublishBelowRoleLevelUsingRoleUri",
                RoleLevelOptionsSetup.getPublishOptionsList(vclassForEditing));

        FormObject foo = new FormObject();
        foo.setErrorMap(epo.getErrMsgMap());
        foo.setOptionLists(optionMap);

        epo.setFormObject(foo);

        request.setAttribute("formValue", foo.getValues());

        FormUtils.populateFormFromBean(vclassForEditing, action, foo, epo.getBadValueMap());

        RequestDispatcher rd = request.getRequestDispatcher(Controllers.BASIC_JSP);
        request.setAttribute("bodyJsp", "/templates/edit/formBasic.jsp");
        request.setAttribute("formJsp", "/templates/edit/specific/vclass_retry.jsp");
        request.setAttribute("colspan", "4");
        request.setAttribute("scripts", "/templates/edit/formBasic.js");
        request.setAttribute("title", "Class Editing Form");
        request.setAttribute("_action", action);
        request.setAttribute("unqualifiedClassName", "VClass");
        setRequestAttributes(request, epo);

        try {
            rd.forward(request, response);
        } catch (Exception e) {
            log.error("VclassRetryController could not forward to view.", e);
            throw new RuntimeException(e);
        }

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        doPost(request, response);
    }

    /** This listener allows us to link a new class to a parent upon creation */
    class SubclassListener implements ChangeListener {
        String superclassURI = null;
        WebappDaoFactory daoFactory = null;

        public SubclassListener(String superclassURI, WebappDaoFactory cdf) {
            this.superclassURI = superclassURI;
            this.daoFactory = cdf;
        }

        public void doInserted(Object newObj, EditProcessObject epo) {
            Classes2Classes c2c = new Classes2Classes();
            c2c.setSubclassURI(((VClass) newObj).getURI());
            c2c.setSuperclassURI(superclassURI);
            daoFactory.getVClassDao().insertNewClasses2Classes(c2c);
        }

        public void doUpdated(Object oldObj, Object newObj, EditProcessObject epo) {
            // nothing to do
        }

        public void doDeleted(Object oldObj, EditProcessObject epo) {
            // nothing to do
        }
    }

    class VclassInsertPageForwarder implements PageForwarder {

        public void doForward(HttpServletRequest request, HttpServletResponse response, EditProcessObject epo) {
            String newVclassUrl = "vclassEdit?uri=";
            VClass vcl = (VClass) epo.getNewBean();
            try {
                newVclassUrl += URLEncoder.encode(vcl.getURI(), "UTF-8");
            } catch (Exception e) {
                log.error(this.getClass().getName() + " could not use UTF-8 encoding to encode new URL");
            }
            try {
                response.sendRedirect(newVclassUrl);
            } catch (IOException ioe) {
                log.error("VclassInsertPageForwarder could not send redirect.");
            }
        }
    }

}