diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml
index 0687015d27..9e20351882 100644
--- a/config/alfresco/web-scripts-application-context.xml
+++ b/config/alfresco/web-scripts-application-context.xml
@@ -329,6 +329,12 @@
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/repo/cmis/rest/CMISQueryWebScript.java b/source/java/org/alfresco/repo/cmis/rest/CMISQueryWebScript.java
new file mode 100644
index 0000000000..cfbff427e5
--- /dev/null
+++ b/source/java/org/alfresco/repo/cmis/rest/CMISQueryWebScript.java
@@ -0,0 +1,50 @@
+/*
+ * 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 .
+ */
+package org.alfresco.repo.cmis.rest;
+
+import java.util.Map;
+
+import org.alfresco.cmis.CMISResultSet;
+import org.springframework.extensions.webscripts.Cache;
+import org.springframework.extensions.webscripts.DeclarativeWebScript;
+import org.springframework.extensions.webscripts.Status;
+import org.springframework.extensions.webscripts.WebScriptRequest;
+
+
+/**
+ * Base Web Script Implementation that ensures query result sets are closed
+ */
+public class CMISQueryWebScript extends DeclarativeWebScript
+{
+ /* (non-Javadoc)
+ * @see org.springframework.extensions.webscripts.DeclarativeWebScript#executeFinallyImpl(org.springframework.extensions.webscripts.WebScriptRequest, org.springframework.extensions.webscripts.Status, org.springframework.extensions.webscripts.Cache, java.util.Map)
+ */
+ @Override
+ protected void executeFinallyImpl(WebScriptRequest req, Status status, Cache cache, Map model)
+ {
+ Object object = model.get("resultset");
+ if (object != null && object instanceof CMISResultSet)
+ {
+ CMISResultSet resultSet = (CMISResultSet)object;
+ resultSet.close();
+ }
+ }
+
+
+}
diff --git a/source/java/org/alfresco/repo/cmis/rest/test/BulkCreateAndQuerySystemTest.java b/source/java/org/alfresco/repo/cmis/rest/test/BulkCreateAndQuerySystemTest.java
new file mode 100644
index 0000000000..02c9ada96c
--- /dev/null
+++ b/source/java/org/alfresco/repo/cmis/rest/test/BulkCreateAndQuerySystemTest.java
@@ -0,0 +1,132 @@
+package org.alfresco.repo.cmis.rest.test;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.apache.abdera.Abdera;
+import org.apache.abdera.model.Document;
+import org.apache.abdera.model.Element;
+import org.apache.abdera.model.Entry;
+import org.apache.abdera.model.Feed;
+import org.apache.abdera.protocol.Response;
+import org.apache.abdera.protocol.client.AbderaClient;
+import org.apache.abdera.protocol.client.ClientResponse;
+import org.apache.chemistry.abdera.ext.CMISConstants;
+import org.apache.chemistry.abdera.ext.CMISExtensionFactory;
+import org.apache.chemistry.abdera.ext.CMISObject;
+import org.apache.chemistry.abdera.ext.CMISProperties;
+import org.apache.chemistry.abdera.ext.CMISProperty;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.StringRequestEntity;
+
+
+public class BulkCreateAndQuerySystemTest
+{
+ private static Abdera abdera;
+ private static final String URL = "http://localhost:8080";
+ private static final String rootFolder = "testfolder";
+
+ public static void main(String[] args) throws Exception {
+ abdera = new Abdera();
+ abdera.getFactory().registerExtension(new CMISExtensionFactory());
+
+ AbderaClient client = new AbderaClient(abdera);
+
+ client.setMaxConnectionsPerHost(100);
+ client.addCredentials(URL, null, "basic", new UsernamePasswordCredentials("admin", "admin"));
+
+ String rootId = createFolder(client, URL + "/alfresco/service/cmis/p/children", rootFolder);
+
+ for (int i = 0; i < 10000; i++) {
+ createFolder(client, URL + "/alfresco/service/cmis/p/" + rootFolder + "/children", "folder_" + i);
+ findFolder(client, rootId, "folder_" + i);
+ }
+ }
+
+ private static void findFolder(AbderaClient client, String inFolderId, String name) {
+ System.out.println("querying for " + name + " in " + inFolderId);
+ String query = "\n" +
+ "SELECT cmis:Name, cmis:ObjectId FROM cmis:folder WHERE cmis:Name='" + name + "' AND IN_FOLDER('" + inFolderId + "')\n" +
+ "100\n" +
+ "0\n" +
+ "";
+
+ StringRequestEntity requestEntity;
+ try {
+ requestEntity = new StringRequestEntity(query, "application/cmisquery+xml", "ISO-8859-1");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+
+ ClientResponse response = client.post(URL + "/alfresco/service/cmis/queries", requestEntity);
+ try {
+ if (response.getType() == Response.ResponseType.SUCCESS) {
+
+ Document feed = response.getDocument();
+ List entries = feed.getRoot().getEntries();
+ for (Entry entry : entries) {
+ System.out.println("received query result with name " + entry.getTitle());
+ }
+ } else {
+ throw new RuntimeException(response.getStatusText());
+ }
+ } finally {
+ response.release();
+ }
+ }
+
+ private static String createFolder(AbderaClient client, String parent, String name) throws Exception {
+ Entry entry = abdera.newEntry();
+ entry.setTitle(name);
+ entry.setSummary("Summary...");
+
+ CMISObject cmisObject = entry.addExtension(CMISConstants.OBJECT);
+ CMISProperties properties = cmisObject.addExtension(CMISConstants.PROPERTIES);
+ CMISProperty property = properties.addExtension(CMISConstants.ID_PROPERTY);
+ property.setAttributeValue(CMISConstants.PROPERTY_ID, CMISConstants.PROP_OBJECT_TYPE_ID);
+ Element value = property.addExtension(CMISConstants.PROPERTY_VALUE);
+ value.setText("cmis:folder");
+
+ ClientResponse resp = client.post(parent, entry);
+
+ try {
+ if (resp.getType() != Response.ResponseType.SUCCESS) {
+ printError(resp);
+
+ throw new RuntimeException(resp.getStatusText());
+ } else {
+ System.out.println("Created folder " + name);
+
+ Document entryDoc = resp.getDocument();
+ Entry root = entryDoc.getRoot();
+
+ CMISObject object = root.getExtension(CMISConstants.OBJECT);
+ CMISProperties p = object.getProperties();
+
+ return p.find(CMISConstants.PROP_OBJECT_ID).getStringValue();
+ }
+ } finally {
+ resp.release();
+ }
+ }
+
+ private static void printError(ClientResponse resp) {
+ try {
+ InputStream inputStream = resp.getInputStream();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
+ String line = reader.readLine();
+ while (line != null) {
+ System.out.println(line);
+ line = reader.readLine();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}