From 8f0b35209f3feeac5a4fda93a69ad4545aab9906 Mon Sep 17 00:00:00 2001 From: bdc34 Date: Fri, 14 Jan 2011 19:36:21 +0000 Subject: [PATCH] Adding alpha to browse widget data generation, adding JSONtoFmModel.java NIHVIVO-1674 --- .../vitro/webapp/controller/JSONServlet.java | 4 +- .../vitro/webapp/utils/JSONtoFmModel.java | 202 ++++++++++++++++++ .../webapp/web/widgets/BrowseWidget.java | 38 +++- 3 files changed, 239 insertions(+), 5 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/JSONtoFmModel.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/JSONServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/JSONServlet.java index e250fece0..85d1ff5e5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/JSONServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/JSONServlet.java @@ -97,7 +97,7 @@ public class JSONServlet extends VitroHttpServlet { log.debug("parameter vclassId URI parameter expected "); throw new Exception("parameter vclassId URI parameter expected "); } - rObj = getLuceneIndividualsByVClass(vclass.getURI(),req,resp,getServletContext()); + rObj = getLuceneIndividualsByVClass(vclass.getURI(),req, getServletContext()); }catch(Exception ex){ errorMessage = ex.toString(); log.error(ex,ex); @@ -126,7 +126,7 @@ public class JSONServlet extends VitroHttpServlet { } - protected static JSONObject getLuceneIndividualsByVClass(String vclassURI, HttpServletRequest req, HttpServletResponse resp, ServletContext context) throws Exception { + public static JSONObject getLuceneIndividualsByVClass(String vclassURI, HttpServletRequest req, ServletContext context) throws Exception { VitroRequest vreq = new VitroRequest(req); VClass vclass=null; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/JSONtoFmModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/JSONtoFmModel.java new file mode 100644 index 000000000..707138fcc --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/JSONtoFmModel.java @@ -0,0 +1,202 @@ +package edu.cornell.mannlib.vitro.webapp.utils; + +/* + * Copyright (C) 2005-2010 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; +//import java.util.regex.Pattern; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONTokener; +//import org.springframework.extensions.surf.util.ISO8601DateFormat; + +/** + * Utility to convert JSON to Freemarker-compatible data model + * + * @author janv + */ +public final class JSONtoFmModel +{ + public static String ROOT_ARRAY = "root"; + + // note: current format is dependent on ISO8601DateFormat.parser, eg. YYYY-MM-DDThh:mm:ss.sssTZD +// private static String REGEXP_ISO8061 = "^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(.([0-9]){3})?(Z|[\\+\\-]([0-9]{2}):([0-9]{2}))$"; +// private static Pattern matcherISO8601 = Pattern.compile(REGEXP_ISO8061); +// +// public static boolean autoConvertISO8601 = true; + + /** + * Convert JSON Object string to Freemarker-compatible data model + * + * @param jsonString + * @return model + * @throws JSONException + */ + public static Map convertJSONObjectToMap(String jsonString) throws JSONException + { + JSONObject jo = new JSONObject(new JSONTokener(jsonString)); + return convertJSONObjectToMap(jo); + } + + /** + * JSONObject is an unordered collection of name/value pairs -> convert to Map (equivalent to Freemarker "hash") + */ + @SuppressWarnings("unchecked") + public static Map convertJSONObjectToMap(JSONObject jo) throws JSONException + { + Map model = new HashMap(); + + Iterator itr = (Iterator)jo.keys(); + while (itr.hasNext()) + { + String key = (String)itr.next(); + + Object o = jo.get(key); + if (o instanceof JSONObject) + { + model.put(key, convertJSONObjectToMap((JSONObject)o)); + } + else if (o instanceof JSONArray) + { + model.put(key, convertJSONArrayToList((JSONArray)o)); + } + else if (o == JSONObject.NULL) + { + model.put(key, null); // note: http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing + } + else + { +// if ((o instanceof String) && autoConvertISO8601 && (matcherISO8601.matcher((String)o).matches())) +// { +// o = ISO8601DateFormat.parse((String)o); +// } + + model.put(key, o); + } + } + + return model; + } + + /** + * Convert JSON Array string to Freemarker-compatible data model + * + * @param jsonString + * @return model + * @throws JSONException + */ + public static Map convertJSONArrayToMap(String jsonString) throws JSONException + { + Map model = new HashMap(); + JSONArray ja = new JSONArray(new JSONTokener(jsonString)); + model.put(ROOT_ARRAY, convertJSONArrayToList(ja)); + return model; + } + + /** + * JSONArray is an ordered sequence of values -> convert to List (equivalent to Freemarker "sequence") + */ + public static List convertJSONArrayToList(JSONArray ja) throws JSONException + { + List model = new ArrayList(); + + for (int i = 0; i < ja.length(); i++) + { + Object o = ja.get(i); + + if (o instanceof JSONArray) + { + model.add(convertJSONArrayToList((JSONArray)o)); + } + else if (o instanceof JSONObject) + { + model.add(convertJSONObjectToMap((JSONObject)o)); + } + else if (o == JSONObject.NULL) + { + model.add(null); + } + else + { +// if ((o instanceof String) && autoConvertISO8601 && (matcherISO8601.matcher((String)o).matches())) +// { +// o = ISO8601DateFormat.parse((String)o); +// } + + model.add(o); + } + } + + return model; + } + + // for debugging only + public static String toString(Map map) + { + return JSONtoFmModel.toStringBuffer(map, 0).toString(); + } + + @SuppressWarnings("unchecked") + private static StringBuffer toStringBuffer(Map unsortedMap, int indent) + { + StringBuffer tabs = new StringBuffer(); + for (int i = 0; i < indent; i++) + { + tabs.append("\t"); + } + + StringBuffer sb = new StringBuffer(); + + SortedMap map = new TreeMap(); + map.putAll(unsortedMap); + + for (Map.Entry entry : map.entrySet()) + { + if (entry.getValue() instanceof Map) + { + sb.append(tabs).append(entry.getKey()).append(":").append(entry.getValue().getClass()).append("\n"); + sb.append(JSONtoFmModel.toStringBuffer((Map)entry.getValue(), indent+1)); + } + else if (entry.getValue() instanceof List) + { + sb.append(tabs).append("[\n"); + List l = (List)entry.getValue(); + for (int i = 0; i < l.size(); i++) + { + sb.append(tabs).append(l.get(i)).append(":").append((l.get(i) != null) ? l.get(i).getClass() : "null").append("\n"); + } + sb.append(tabs).append("]\n"); + } + else + { + sb.append(tabs).append(entry.getKey()).append(":").append(entry.getValue()).append(":").append((entry.getValue() != null ? entry.getValue().getClass() : "null")).append("\n"); + } + } + + return sb; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/BrowseWidget.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/BrowseWidget.java index bbadada9f..2d9153087 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/BrowseWidget.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/widgets/BrowseWidget.java @@ -13,13 +13,17 @@ 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.JSONServlet; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHttpServlet; 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.individual.ListedIndividualTemplateModel; @@ -40,6 +44,7 @@ public class BrowseWidget extends Widget { protected WidgetTemplateValues process(Environment env, Map params, HttpServletRequest request, ServletContext context) throws Exception { + try{ Mode mode = getMode( request, params ); switch( mode ){ case VCLASS_ALPHA: @@ -53,15 +58,42 @@ public class BrowseWidget extends Widget { 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) { - // TODO Auto-generated method stub + Map params, HttpServletRequest request, ServletContext context) throws Exception { + Map body = new HashMap(); + body.putAll(getCommonValues(env,context)); + body.putAll(getClassAlphaValues(env,params,request,context)); - return null; + String macroName = Mode.VCLASS_ALPHA.macroName; + return new WidgetTemplateValues(macroName, body); } + private Map getClassAlphaValues(Environment env, Map params, HttpServletRequest request, ServletContext context) throws Exception{ + Map map= new HashMap(); + + 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.getLuceneIndividualsByVClass(vclass.getURI(), request, context); + map.put("vclass", JSONtoFmModel.convertJSONObjectToMap( (JSONObject) vclassRes.get("vclass") )); + 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 getCommonValues(Environment env, ServletContext context){ Map values = new HashMap(); values.putAll(FreemarkerHttpServlet.getDirectives());