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