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(); + } + } +}