edu.cornell.mannlib.vitro.webapp.web.widgets.BrowseWidget.java Source code

Java tutorial

Introduction

Here is the source code for edu.cornell.mannlib.vitro.webapp.web.widgets.BrowseWidget.java

Source

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

package edu.cornell.mannlib.vitro.webapp.web.widgets;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONObject;

import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.VClass;
import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.controller.json.JsonServlet;
import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupsForRequest;
import edu.cornell.mannlib.vitro.webapp.dao.jena.VClassGroupCache;
import edu.cornell.mannlib.vitro.webapp.utils.JsonToFmModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassGroupTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.VClassTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individuallist.ListedIndividual;
import freemarker.core.Environment;
import freemarker.template.TemplateModelException;

/**
 * This is a widget to display a classgroups, 
 * classes in classgroup, and indviduals in class.
 *  
 * @author bdc34
 *
 */
public class BrowseWidget extends Widget {
    final static Log log = LogFactory.getLog(BrowseWidget.class);

    @Override
    protected WidgetTemplateValues process(Environment env, Map params, HttpServletRequest request,
            ServletContext context) throws Exception {
        try {
            Mode mode = getMode(request, params);
            switch (mode) {
            case VCLASS_ALPHA:
                return doClassAlphaDisplay(env, params, request, context);
            case CLASS_GROUP:
                return doClassGroupDisplay(env, params, request, context);
            case VCLASS:
                return doClassDisplay(env, params, request, context);
            case ALL_CLASS_GROUPS:
                return doAllClassGroupsDisplay(env, params, request, context);
            default:
                return doAllClassGroupsDisplay(env, params, request, context);
            }
        } catch (Throwable th) {
            log.error(th, th);
            //should we return an error here?
            return null;
        }
    }

    private WidgetTemplateValues doClassAlphaDisplay(Environment env, Map params, HttpServletRequest request,
            ServletContext context) throws Exception {
        Map<String, Object> body = new HashMap<String, Object>();
        body.putAll(getCommonValues(env, context));
        body.putAll(getClassAlphaValues(env, params, request, context));

        String macroName = Mode.VCLASS_ALPHA.macroName;
        return new WidgetTemplateValues(macroName, body);
    }

    private Map<String, Object> getClassAlphaValues(Environment env, Map params, HttpServletRequest request,
            ServletContext context) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();

        String classUri = getParam(Mode.VCLASS, request, params);
        VitroRequest vreq = new VitroRequest(request);
        VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(classUri);
        map.put("class", new VClassTemplateModel(vclass));

        JSONObject vclassRes = JsonServlet.getSearchIndividualsByVClass(vclass.getURI(), request);
        map.put("totalCount", JsonToFmModel.convertJSONObjectToMap((String) vclassRes.get("totalCount")));
        map.put("alpha", JsonToFmModel.convertJSONObjectToMap((String) vclassRes.get("alpha")));
        map.put("individuals", JsonToFmModel.convertJSONArrayToList((JSONArray) vclassRes.get("individuals")));
        map.put("pages", JsonToFmModel.convertJSONArrayToList((JSONArray) vclassRes.get("pages")));
        map.put("letters", JsonToFmModel.convertJSONArrayToList((JSONArray) vclassRes.get("letters")));

        return map;
    }

    private Map<String, Object> getCommonValues(Environment env, ServletContext context) {
        Map<String, Object> values = new HashMap<String, Object>();
        //values.putAll(VitroFreemarkerConfiguration.getDirectives());
        try {
            values.put("urls", env.getDataModel().get("urls"));
            values.put("currentServlet", env.getDataModel().get("currentServlet"));
        } catch (TemplateModelException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return values;
    }

    protected WidgetTemplateValues doAllClassGroupsDisplay(Environment env, Map params, HttpServletRequest request,
            ServletContext context) {
        Map<String, Object> body = new HashMap<String, Object>();
        body.putAll(getCommonValues(env, context));
        body.putAll(getAllClassGroupData(request, params, context));

        String macroName = Mode.ALL_CLASS_GROUPS.macroName;
        return new WidgetTemplateValues(macroName, body);
    }

    /**
     * Gets a list of all VClassGroups with vclasses with individual counts.
     */
    protected Map<String, Object> getAllClassGroupData(HttpServletRequest request, Map params,
            ServletContext context) {
        Map<String, Object> map = new HashMap<String, Object>();

        VitroRequest vreq = new VitroRequest(request);

        VClassGroupsForRequest vcgc = VClassGroupCache.getVClassGroups(request);
        List<VClassGroup> cgList = vcgc.getGroups();

        //        List<VClassGroup> classGroups =
        //            vreq.getWebappDaoFactory().getVClassGroupDao().getPublicGroupsWithVClasses();
        //        
        LinkedList<VClassGroupTemplateModel> cgtmList = new LinkedList<VClassGroupTemplateModel>();
        for (VClassGroup classGroup : cgList) {
            cgtmList.add(new VClassGroupTemplateModel(classGroup));
        }
        map.put("vclassGroupList", cgtmList);
        return map;
    }

    protected WidgetTemplateValues doClassDisplay(Environment env, Map params, HttpServletRequest request,
            ServletContext context) {
        Map<String, Object> body = new HashMap<String, Object>();
        body.putAll(getCommonValues(env, context));
        body.putAll(getClassData(request, params, context));

        String macroName = Mode.VCLASS.macroName;
        return new WidgetTemplateValues(macroName, body);
    }

    private Map<String, Object> getClassData(HttpServletRequest request, Map params, ServletContext context) {
        Map<String, Object> map = new HashMap<String, Object>();

        map.putAll(getClassGroupData(request, params, context));

        String classUri = getParam(Mode.VCLASS, request, params);
        VitroRequest vreq = new VitroRequest(request);
        VClass vclass = vreq.getWebappDaoFactory().getVClassDao().getVClassByURI(classUri);
        map.put("class", new VClassTemplateModel(vclass));

        List<Individual> inds = vreq.getWebappDaoFactory().getIndividualDao().getIndividualsByVClass(vclass);

        List<ListedIndividual> tInds = new ArrayList<ListedIndividual>(inds.size());
        for (Individual ind : inds) {
            tInds.add(new ListedIndividual(ind, vreq));
        }
        map.put("individualsInClass", tInds);

        return map;
    }

    protected WidgetTemplateValues doClassGroupDisplay(Environment env, Map params, HttpServletRequest request,
            ServletContext context) {
        Map<String, Object> body = new HashMap<String, Object>();
        body.putAll(getCommonValues(env, context));
        body.putAll(getClassGroupData(request, params, context));

        String macroName = Mode.CLASS_GROUP.macroName;
        return new WidgetTemplateValues(macroName, body);
    }

    protected Map<String, Object> getClassGroupData(HttpServletRequest request, Map params,
            ServletContext context) {
        Map<String, Object> map = new HashMap<String, Object>();

        String vcgUri = getParam(Mode.CLASS_GROUP, request, params);
        VitroRequest vreq = new VitroRequest(request);
        //VClassGroup vcg = vreq.getWebappDaoFactory().getVClassGroupDao().getGroupByURI(vcgUri);

        VClassGroupsForRequest vcgc = VClassGroupCache.getVClassGroups(request);
        VClassGroup vcg = vcgc.getGroup(vcgUri);

        //vreq.getWebappDaoFactory().getVClassDao().addVClassesToGroup(vcg, false, true);
        ArrayList<VClassTemplateModel> classes = new ArrayList<VClassTemplateModel>(vcg.size());
        for (VClass vc : vcg) {
            classes.add(new VClassTemplateModel(vc));
        }
        map.put("classes", classes);

        map.put("classGroup", new VClassGroupTemplateModel(vcg));
        map.put("classGroupName", vcg.getPublicName());
        map.put("classGroupUri", vcg.getURI());

        return map;
    }

    enum Mode {
        VCLASS_ALPHA("vclassAlpha", "vclassAlpha"), VCLASS("vclass", "vclassUri"), CLASS_GROUP("classGroup",
                "classgroupUri"), ALL_CLASS_GROUPS("allClassGroups", "all");

        String macroName;
        String param;

        Mode(String macroName, String param) {
            this.macroName = macroName;
            this.param = param;
        }
    }

    protected final static Mode DEFAULT_MODE = Mode.ALL_CLASS_GROUPS;

    protected Mode getMode(HttpServletRequest request, Map params) {
        for (Mode mode : Mode.values()) {
            String queryParam = request.getParameter(mode.param);
            if (queryParam != null && !queryParam.isEmpty()) {
                return mode;
            }
            Object obj = params.get(mode.param);
            String param = obj != null ? obj.toString() : null;
            if (param != null && !param.isEmpty()) {
                return mode;
            }
        }
        return DEFAULT_MODE;
    }

    protected String getParam(Mode mode, HttpServletRequest request, Map params) {
        if (request.getParameter(mode.param) != null)
            return request.getParameter(mode.param);
        if (params.get(mode.param) != null)
            return params.get(mode.param).toString();
        else
            return null;
    }
}