diff --git a/source/java/org/alfresco/repo/jscript/Search.java b/source/java/org/alfresco/repo/jscript/Search.java
index 8af5008ae5..5598669091 100644
--- a/source/java/org/alfresco/repo/jscript/Search.java
+++ b/source/java/org/alfresco/repo/jscript/Search.java
@@ -24,9 +24,12 @@
*/
package org.alfresco.repo.jscript;
+import java.io.Serializable;
import java.io.StringReader;
+import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
@@ -36,6 +39,7 @@ import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
+import org.alfresco.service.cmr.search.LimitBy;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
@@ -124,7 +128,7 @@ public final class Search extends BaseScopableProcessorExtension
{
ParameterCheck.mandatory("ref", ref);
String query = "ID:" + LuceneQueryParser.escape(ref.toString());
- Object[] result = query(ref.getStoreRef().toString(), query, SearchService.LANGUAGE_LUCENE);
+ Object[] result = query(ref.getStoreRef().toString(), query, null, SearchService.LANGUAGE_LUCENE);
if (result.length != 0)
{
return (ScriptNode)result[0];
@@ -208,7 +212,7 @@ public final class Search extends BaseScopableProcessorExtension
{
if (search != null && search.length() != 0)
{
- Object[] results = query(store, search, SearchService.LANGUAGE_XPATH);
+ Object[] results = query(store, search, null, SearchService.LANGUAGE_XPATH);
return Context.getCurrentContext().newArray(getScope(), results);
}
else
@@ -261,7 +265,7 @@ public final class Search extends BaseScopableProcessorExtension
{
if (search != null && search.length() != 0)
{
- Object[] results = query(store, search, SearchService.LANGUAGE_LUCENE);
+ Object[] results = query(store, search, null, SearchService.LANGUAGE_LUCENE);
return Context.getCurrentContext().newArray(getScope(), results);
}
else
@@ -351,7 +355,7 @@ public final class Search extends BaseScopableProcessorExtension
if (search != null)
{
- Object[] results = query(null, search, SearchService.LANGUAGE_LUCENE);
+ Object[] results = query(null, search, null, SearchService.LANGUAGE_LUCENE);
return Context.getCurrentContext().newArray(getScope(), results);
}
else
@@ -409,6 +413,110 @@ public final class Search extends BaseScopableProcessorExtension
return nodes;
}
+ /**
+ * Execute a query based on the supplied search definition object.
+ *
+ * Search object is defined in JavaScript thus:
+ *
+ * search
+ * {
+ * query: string, mandatory, in appropriate format and encoded for the given language
+ * store: string, optional, defaults to 'workspace://SpacesStore'
+ * language: string, optional, one of: lucene, xpath, jcr-xpath, fts-alfresco - defaults to 'lucene'
+ * sort: [], optional, Array of sort column objects (see below)
+ * page: object optional, paging information object (see below) - if supported by the language
+ * }
+ *
+ * sort
+ * {
+ * column: string, mandatory, sort column in appropriate format for the language
+ * ascending: boolean optional, defaults to false
+ * }
+ *
+ * page
+ * {
+ * maxItems: int, optional, max number of items to return in result set
+ * skipCount: int optional, number of items to skip over before returning results
+ * }
+ *
+ *
+ * @param search Search definition object as above
+ *
+ * @return Array of ScriptNode results
+ */
+ public Scriptable query(Object search)
+ {
+ Object[] results = null;
+
+ if (search instanceof Serializable)
+ {
+ Serializable obj = new ValueConverter().convertValueForRepo((Serializable)search);
+ if (obj instanceof Map)
+ {
+ Map def = (Map)obj;
+
+ // test for mandatory values
+ String query = (String)def.get("query");
+ if (query == null || query.length() == 0)
+ {
+ throw new AlfrescoRuntimeException("Failed to search: Missing mandatory 'query' value.");
+ }
+
+ // collect optional values
+ String store = (String)def.get("store");
+ String language = (String)def.get("language");
+ List