From c88744ab27732d133eef57e7eeed9ab98a185a8a Mon Sep 17 00:00:00 2001 From: gojomo Date: Thu, 3 Sep 2009 03:32:07 +0000 Subject: [PATCH] Improve bean-browse UI * BeanBrowseResource.java coerce edits to type of value they're replacing; makes for safer mid-crawl edits of values in maps * JobRelatedResource.java improve rendering/clickability of map, indexed objects --- .../crawler/restlet/BeanBrowseResource.java | 5 ++- .../crawler/restlet/JobRelatedResource.java | 41 +++++++++++++++---- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/engine/src/main/java/org/archive/crawler/restlet/BeanBrowseResource.java b/engine/src/main/java/org/archive/crawler/restlet/BeanBrowseResource.java index 543447d0..62a84a57 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/BeanBrowseResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/BeanBrowseResource.java @@ -91,7 +91,8 @@ public class BeanBrowseResource extends JobRelatedResource { Object namedBean = appCtx.getBean(beanName); BeanWrapperImpl bwrap = new BeanWrapperImpl(namedBean); String propPath = beanPath.substring(i+1); - bwrap.setPropertyValue(propPath, newVal); + Object coercedVal = bwrap.convertIfNecessary(newVal, bwrap.getPropertyValue(propPath).getClass()); + bwrap.setPropertyValue(propPath, coercedVal); } Reference ref = getRequest().getResourceRef(); @@ -165,7 +166,7 @@ public class BeanBrowseResource extends JobRelatedResource { pw.println(beanPath + " = "); pw.println(""); } else { - writeObject(pw, null, target); + writeObject(pw, null, target, beanPath); } } } catch (BeansException e) { diff --git a/engine/src/main/java/org/archive/crawler/restlet/JobRelatedResource.java b/engine/src/main/java/org/archive/crawler/restlet/JobRelatedResource.java index 07608ef3..0dc94e03 100644 --- a/engine/src/main/java/org/archive/crawler/restlet/JobRelatedResource.java +++ b/engine/src/main/java/org/archive/crawler/restlet/JobRelatedResource.java @@ -160,18 +160,23 @@ public abstract class JobRelatedResource extends Resource { * @param field field name to display for object * @param object object to write * @param alreadyWritten Set of objects to not redundantly write - * @param beanPath eanPath prefix to apply to sub fields browse links + * @param beanPathPrefix beanPath prefix to apply to sub fields browse links */ - protected void writeObject(PrintWriter pw, String field, Object object, HashSet alreadyWritten, String beanPath) { + protected void writeObject(PrintWriter pw, String field, Object object, HashSet alreadyWritten, String beanPathPrefix) { String key = getBeanToNameMap().get(object); String close = ""; + String beanPath = beanPathPrefix; if(StringUtils.isNotBlank(field)) { pw.write(""); String closeAnchor =""; - if(StringUtils.isNotBlank(beanPath)) { - pw.println(""); + if(StringUtils.isNotBlank(beanPathPrefix)) { + if(beanPathPrefix.endsWith(".")) { + beanPath += field; + } else if (beanPathPrefix.endsWith("[")) { + beanPath += field + "]"; + } + pw.println(""); closeAnchor = ""; - beanPath += "."+field; } pw.write(field); pw.write(closeAnchor); @@ -220,17 +225,32 @@ public abstract class JobRelatedResource extends Resource { } if(pd.getReadMethod()!=null && !pd.isHidden()) { String propName = pd.getName(); - writeObject(pw, propName, bwrap.getPropertyValue(propName), alreadyWritten, beanPath); + if(beanPath!=null) { + beanPathPrefix = beanPath+"."; + } + writeObject(pw, propName, bwrap.getPropertyValue(propName), alreadyWritten, beanPathPrefix); } } if(object.getClass().isArray()) { Object[] array = (Object[])object; for(int i = 0; i < array.length; i++) { + if(beanPath!=null) { + beanPathPrefix = beanPath+"["; + } // TODO: protect against overlong content? - writeObject(pw, i+"", array[i], alreadyWritten, null); + writeObject(pw, i+"", array[i], alreadyWritten, beanPathPrefix); } } - if(object instanceof Iterable) { + if(object instanceof List) { + List list = (List)object; + for(int i = 0; i < list.size(); i++) { + if(beanPath!=null) { + beanPathPrefix = beanPath+"["; + } + // TODO: protect against overlong content? + writeObject(pw, i+"", list.get(i), alreadyWritten, beanPathPrefix); + } + } else if(object instanceof Iterable) { for (Object next : (Iterable)object) { writeObject(pw, "#", next, alreadyWritten, null); } @@ -239,7 +259,10 @@ public abstract class JobRelatedResource extends Resource { for (Object next : ((Map)object).entrySet()) { // TODO: protect against giant maps? Map.Entry entry = (Map.Entry)next; - writeObject(pw, entry.getKey().toString(), entry.getValue(), alreadyWritten, null); + if(beanPath!=null) { + beanPathPrefix = beanPath+"["; + } + writeObject(pw, entry.getKey().toString(), entry.getValue(), alreadyWritten, beanPathPrefix); } } pw.println("");