diff --git a/config/alfresco/bootstrap/webscripts/categorysearch.get.desc.xml b/config/alfresco/bootstrap/webscripts/categorysearch.get.desc.xml index d23c0e6fd4..7bfdebefe2 100644 --- a/config/alfresco/bootstrap/webscripts/categorysearch.get.desc.xml +++ b/config/alfresco/bootstrap/webscripts/categorysearch.get.desc.xml @@ -1,8 +1,8 @@ Category Search Find all blog entries tagged with specified categories - /sample/blog/category?c={category} - /sample/blog/category.atom?c={category} + /sample/blog/category/{category} + argument guest required \ No newline at end of file diff --git a/config/alfresco/bootstrap/webscripts/categorysearch.get.js b/config/alfresco/bootstrap/webscripts/categorysearch.get.js index 3d87a3dfb3..0b281706f3 100644 --- a/config/alfresco/bootstrap/webscripts/categorysearch.get.js +++ b/config/alfresco/bootstrap/webscripts/categorysearch.get.js @@ -1,2 +1,2 @@ -var nodes = search.luceneSearch("PATH:\"/cm:generalclassifiable//cm:" + args.c + "//member\""); +var nodes = search.luceneSearch("PATH:\"/cm:generalclassifiable//cm:" + url.extension + "//member\""); model.resultset = nodes; \ No newline at end of file diff --git a/source/java/org/alfresco/repo/jscript/RhinoScriptProcessor.java b/source/java/org/alfresco/repo/jscript/RhinoScriptProcessor.java index f157569e49..04f9293e86 100644 --- a/source/java/org/alfresco/repo/jscript/RhinoScriptProcessor.java +++ b/source/java/org/alfresco/repo/jscript/RhinoScriptProcessor.java @@ -72,7 +72,7 @@ public class RhinoScriptProcessor extends BaseProcessor implements ScriptProcess private static final String SCRIPT_ROOT = "_root"; /** Base Value Converter */ - private ValueConverter valueConverter = new ReturnValueConverter(); + private ValueConverter valueConverter = new ValueConverter(); /** Store into which to resolve cm:name based script paths */ private StoreRef storeRef; @@ -510,19 +510,7 @@ public class RhinoScriptProcessor extends BaseProcessor implements ScriptProcess Object result = cx.evaluateString(scope, script, "AlfrescoScript", 1, null); // extract java object result if wrapped by Rhino - if (result instanceof Serializable) - { - result = valueConverter.convertValueForRepo((Serializable)result); - } - else if (result instanceof Wrapper) - { - result = ((Wrapper)result).unwrap(); - } - else if (result instanceof NativeArray) - { - result = Context.jsToJava(result, Object[].class); - } - + result = valueConverter.convertValueForRepo((Serializable)result); return result; } catch (Throwable err) @@ -564,30 +552,5 @@ public class RhinoScriptProcessor extends BaseProcessor implements ScriptProcess } return newModel; } - - /** - * Value conversion for handling Javascript return values. - */ - public class ReturnValueConverter extends ValueConverter - { - /** - * Convert an object from any script wrapper value to a valid repository serializable value. - * This includes converting JavaScript Array objects to Lists of valid objects. - * - * @param value Value to convert from script wrapper object to repo serializable value - * - * @return valid repo value - */ - public Serializable convertValueForRepo(Serializable value) - { - if (value instanceof Wrapper || - value instanceof ScriptableObject || - value instanceof Serializable[]) - { - value = super.convertValueForRepo(value); - } - return value; - } - } - + } diff --git a/source/java/org/alfresco/repo/jscript/ValueConverter.java b/source/java/org/alfresco/repo/jscript/ValueConverter.java index af9d4a7b05..212fe057a5 100644 --- a/source/java/org/alfresco/repo/jscript/ValueConverter.java +++ b/source/java/org/alfresco/repo/jscript/ValueConverter.java @@ -28,7 +28,9 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.AssociationRef; @@ -37,6 +39,7 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.QName; import org.mozilla.javascript.Context; +import org.mozilla.javascript.IdScriptableObject; import org.mozilla.javascript.NativeArray; import org.mozilla.javascript.ScriptRuntime; import org.mozilla.javascript.Scriptable; @@ -153,26 +156,50 @@ public class ValueConverter // set using a JavaScript Array object ScriptableObject values = (ScriptableObject)value; - if (value instanceof NativeArray) + if (value instanceof IdScriptableObject) { - // convert JavaScript array of values to a List of Serializable objects - Object[] propIds = values.getIds(); - List propValues = new ArrayList(propIds.length); - for (int i=0; i propValues = new ArrayList(propIds.length); + for (int i=0; i propValues = new HashMap(propIds.length); + for (int i=0; i freeMarkerModel = new HashMap(((Map)model).size()); - + // Look for the image resolver in the model TemplateImageResolver imageResolver = (TemplateImageResolver)((Map)model).get(TemplateService.KEY_IMAGE_RESOLVER); - - for (Object objKey : ((Map)model).keySet()) - { - String key = (String)objKey; - if (key.equals(TemplateService.KEY_IMAGE_RESOLVER) == false) - { - Object value = ((Map)model).get(key); - if (value instanceof NodeRef) - { - // Concer the node reference to a template node - freeMarkerModel.put(key, new TemplateNode((NodeRef)value, this.services, imageResolver)); - } - else - { - // Just add the object to the free marker model - freeMarkerModel.put(key, ((Map)model).get(key)); - } - } - } - - + // add the template extensions to the model // the extensions include custom root helper objects and custom template method objects for (ProcessorExtension ext : this.processorExtensions.values()) @@ -316,12 +299,70 @@ public class FreeMarkerProcessor extends BaseProcessor implements TemplateProces } freeMarkerModel.put(ext.getExtensionName(), ext); } - + + Map value = (Map)convertValue(model, imageResolver); + freeMarkerModel.putAll(value); return freeMarkerModel; } else { - return model; + return convertValue(model, null); } } + + /** + * Converts a value to a freemarker value + * + * @param value + * @param imageResolver + * @return + */ + private Object convertValue(Object value, TemplateImageResolver imageResolver) + { + if (value instanceof NodeRef) + { + return new TemplateNode((NodeRef)value, this.services, imageResolver); + } + + else if (value instanceof Map) + { + Map map = (Map)value; + Map convertedMap = new HashMap(map.size()); + for (String key : map.keySet()) + { + if (key.equals(TemplateService.KEY_IMAGE_RESOLVER) == false) + { + Object mapValue = map.get(key); + convertedMap.put(key, convertValue(mapValue, imageResolver)); + } + } + return convertedMap; + } + + else if (value instanceof List) + { + List list = (List)value; + List convertedList = new ArrayList(list.size()); + for (Object listVal : list) + { + convertedList.add(convertValue(listVal, imageResolver)); + } + return convertedList; + } + + else if (value instanceof Object[]) + { + Object[] array = (Object[])value; + Object[] convertedArray = new Object[array.length]; + int i = 0; + for (Object item : array) + { + convertedArray[i++] = convertValue(item, imageResolver); + } + return convertedArray; + } + + return value; + } + }