diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/modified.get.js b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/modified.get.js index 2875b2c127..e0b8664111 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/modified.get.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/modified.get.js @@ -33,7 +33,8 @@ function main() if(webApp != null) { - model.assets = sandbox.modifiedAssets(webApp); + + model.assets = sandbox.getModifiedAssetsWebApp(webApp); } else { diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.desc.xml new file mode 100644 index 0000000000..d27c7cd58e --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.desc.xml @@ -0,0 +1,26 @@ + + Submit modified assets from within the specified author sandbox. + + + If the optional webApp argument is specified then submits the modified assets within that web app. +
+ JSON data fileds +
+
label
string label for this submission (mandatory)
+
comment
string comment for this submission (mandatory)
+
all
boolean is this submit all? (optional)
+
assets
array, of JSON objects containing a path property (optional). If the "all" option is true then this parameter is ignored
+
paths
array, of String paths. If the "all" option is true then this parameter is ignored
+
+ + ]]> +
+ /api/wcm/webprojects/{webprojectref}/sandboxes/{sandboxref}/submitter + /api/wcm/webprojects/{webprojectref}/sandboxes/{sandboxref}/submitter?webApp={webApp?} + + user + required + WCM Service +
\ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.ftl new file mode 100644 index 0000000000..523c5b1639 --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.ftl @@ -0,0 +1,6 @@ +<#import "asset.lib.ftl" as assetLib/> +{ + +} + + diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.js b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.js new file mode 100644 index 0000000000..9c1295a96e --- /dev/null +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/Asset/submit.post.json.js @@ -0,0 +1,114 @@ +/* + * Submit the modified items within a sandbox (JSON) + */ +function main() +{ + var urlElements = url.extension.split("/"); + var shortName = urlElements[0]; + var boxName = urlElements[2]; + + + if(!json.has("label")) + { + status.setCode(status.STATUS_BAD_REQUEST, "property 'label' missing when submitting"); + return; + } + + if(!json.has("comment")) + { + status.setCode(status.STATUS_BAD_REQUEST, "property 'comment' missing when submitting"); + return; + } + + var webproject = webprojects.getWebProject(shortName); + if (webproject == null) + { + // Web Project cannot be found + status.setCode(status.STATUS_NOT_FOUND, "The webproject, " + shortName + ", does not exist."); + return; + } + + var sandbox = webproject.getSandbox(boxName); + if (sandbox == null) + { + // Site cannot be found + status.setCode(status.STATUS_NOT_FOUND, "The sandbox, " + boxName + ", in webproject, " + shortName + ", does not exist."); + return; + } + + // URL + var webApp = args["webApp"]; + // Mandatory + var label = json.get("label"); + var comment = json.get("comment"); + // Optional + var isAll = false; + if(json.has("all")) + { + isAll = json.getBoolean("all"); + } + var assets = null; + if(json.has("assets")) + { + assets = json.getJSONArray("assets"); + } + var paths = null; + if(json.has("paths")) + { + paths = json.getJSONArray("paths"); + } + + if(paths == null && assets == null && isAll == false ) + { + status.setCode(status.STATUS_BAD_REQUEST, "One of 'all', 'assets' or 'paths' must be specified"); + return; + } + + // Now do the submit + if(isAll) + { + if(webApp != null) + { + sandbox.submitAllWebApp(webApp, label, comment); + } + else + { + sandbox.submitAll(label, comment); + } + } + else + { + var i = 0; + var input = new Array(); + + if(assets != null) + { + for(var x = 0; x < assets.length(); x++) + { + var jsonObj = assets.getJSONObject(x); + input[i++] = jsonObj.get("path"); + } + } + + if(paths != null) + { + for(var k = 0; k < paths.length(); k++) + { + var path = paths.get(k); + input[i++] = path; + } + } + + // submit a list of files and directories + sandbox.submit(input, label, comment); + } + + // set model properties + model.sandbox = sandbox; + model.webproject = webproject; + + status.setCode(status.STATUS_OK, "Submitted"); +} + +main() + diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/sandbox.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/sandbox.lib.ftl index 511902e881..6e9f1ba6ed 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/sandbox.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/sandbox/sandbox.lib.ftl @@ -11,6 +11,8 @@ "${name}" <#if name_has_next>, ], + "isAuthorSandbox" : ${sandbox.authorSandbox?string("true", "false")}, + "isStagingSandbox" : ${sandbox.stagingSandbox?string("true", "false")}, "url" : "${url.serviceContext + "/api/wcm/webprojects/" + webproject.webProjectRef + "/sandboxes/" + sandbox.sandboxRef}" } diff --git a/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/AssetTest.java b/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/AssetTest.java new file mode 100644 index 0000000000..666ab4758d --- /dev/null +++ b/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/AssetTest.java @@ -0,0 +1,657 @@ +/* + * Copyright (C) 2005-2008 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program 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 General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ + +package org.alfresco.repo.web.scripts.wcm.sandbox; + + +import java.util.ArrayList; +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.repo.web.scripts.BaseWebScriptTest; +import org.alfresco.service.cmr.avm.AVMService; +import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.util.ISO8601DateFormat; +import org.alfresco.util.PropertyMap; +import org.alfresco.web.scripts.Status; +import org.alfresco.web.scripts.TestWebScriptServer.DeleteRequest; +import org.alfresco.web.scripts.TestWebScriptServer.GetRequest; +import org.alfresco.web.scripts.TestWebScriptServer.PostRequest; +import org.alfresco.web.scripts.TestWebScriptServer.PutRequest; +import org.alfresco.web.scripts.TestWebScriptServer.Response; +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Junit tests of the REST bindings for WCM Sandbox and WCM Sandboxes + * @author mrogers + * + */ +public class AssetTest extends BaseWebScriptTest { + + private AuthenticationService authenticationService; + private AuthenticationComponent authenticationComponent; + private PersonService personService; + + // TODO - Replace the use of these two services as and when the REST API is available + private AVMService avmNonLockingAwareService; + private AVMService avmLockingAwareService; + private char AVM_STORE_SEPARATOR = ':'; + + private static final String USER_ONE = "WebProjectTestOne"; + private static final String USER_TWO = "WebProjectTestTwo"; + private static final String USER_THREE = "WebProjectTestThree"; + private static final String USER_FOUR = "WebProjectTestFour"; + private static final String USER_ADMIN = "admin"; + public static final String ROLE_CONTENT_MANAGER = "ContentManager"; + public static final String ROLE_CONTENT_PUBLISHER = "ContentPublisher"; + public static final String ROLE_CONTENT_REVIEWER = "ContentReviewer"; + public static final String ROLE_CONTENT_CONTRIBUTOR = "ContentContributor"; + + private static final String URL_WEB_PROJECT = "/api/wcm/webprojects"; + private static final String URI_MEMBERSHIPS = "/memberships"; + private static final String URI_SANDBOXES = "/sandboxes"; + private static final String BASIC_NAME = "testProj"; + private static final String BASIC_DESCRIPTION = "testDescription"; + private static final String BASIC_TITLE = "testTitle"; + private static final String BASIC_DNSNAME = "testDNSName"; + + private static final String WEBAPP_ROOT = "ROOT"; + private static final String WEBAPP_YELLOW = "YELLOW"; + private static final String WEBAPP_GREEN = "GREEN"; + + + private List createdWebProjects = new ArrayList(5); + + @Override + protected void setUp() throws Exception + { + super.setUp(); + + this.authenticationService = (AuthenticationService)getServer().getApplicationContext().getBean("AuthenticationService"); + this.authenticationComponent = (AuthenticationComponent)getServer().getApplicationContext().getBean("authenticationComponent"); + this.personService = (PersonService)getServer().getApplicationContext().getBean("PersonService"); + + // TODO - Replace the use of these two services as and when the REST API is available + this.avmNonLockingAwareService = (AVMService)getServer().getApplicationContext().getBean("AVMService"); + this.avmLockingAwareService = (AVMService)getServer().getApplicationContext().getBean("AVMLockingAwareService"); + + // Create users + createUser(USER_ONE); + createUser(USER_TWO); + createUser(USER_THREE); + createUser(USER_FOUR); + + // Do tests as user one + this.authenticationComponent.setCurrentUser(USER_ONE); + } + + private void createUser(String userName) + { + if (this.authenticationService.authenticationExists(userName) == false) + { + this.authenticationService.createAuthentication(userName, "PWD".toCharArray()); + + PropertyMap ppOne = new PropertyMap(4); + ppOne.put(ContentModel.PROP_USERNAME, userName); + ppOne.put(ContentModel.PROP_FIRSTNAME, "firstName"); + ppOne.put(ContentModel.PROP_LASTNAME, "lastName"); + ppOne.put(ContentModel.PROP_EMAIL, "email@email.com"); + ppOne.put(ContentModel.PROP_JOBTITLE, "jobTitle"); + + this.personService.createPerson(ppOne); + } + } + + /** + * create a web project + * @return the webprojectref + * @throws Exception + */ + private String createWebProject() throws Exception + { + /** + * Create a web site + */ + JSONObject webProj = new JSONObject(); + webProj.put("name", BASIC_NAME); + webProj.put("description", BASIC_DESCRIPTION); + webProj.put("title", BASIC_TITLE); + webProj.put("dnsName", BASIC_DNSNAME); + Response response = sendRequest(new PostRequest(URL_WEB_PROJECT, webProj.toString(), "application/json"), Status.STATUS_OK); + + JSONObject result = new JSONObject(response.getContentAsString()); + JSONObject data = result.getJSONObject("data"); + String webProjectRef = data.getString("webprojectref"); + + assertNotNull("webproject ref is null", webProjectRef); + this.createdWebProjects.add(webProjectRef); + return webProjectRef; + + } + + /** + * Create a new membership + */ + private void createMembership(String webProjectRef, String userName, String role) throws Exception + { + String validURL = URL_WEB_PROJECT + "/" + webProjectRef + "/memberships"; + JSONObject membership = new JSONObject(); + membership.put("role", ROLE_CONTENT_MANAGER); + JSONObject person = new JSONObject(); + person.put("userName", USER_TWO); + membership.put("person", person); + + sendRequest(new PostRequest(validURL, membership.toString(), "application/json"), Status.STATUS_OK); + } + + /** + * + * @param user + * @return sandboxref + */ + private String createSandbox(String webprojref, String userName) throws org.json.JSONException, java.io.IOException + { + String sandboxref = null; + { + JSONObject box = new JSONObject(); + box.put("userName", userName); + String validURL = "/api/wcm/webprojects/" + webprojref + "/sandboxes"; + Response response = sendRequest(new PostRequest(validURL, box.toString(), "application/json"), Status.STATUS_OK); + JSONObject result = new JSONObject(response.getContentAsString()); + JSONObject data = result.getJSONObject("data"); + sandboxref = data.getString("sandboxref"); + assertNotNull("sandboxref is null", sandboxref); + } + return sandboxref; + + } + + private void checkSandboxEmpty(String webprojref, String sandboxref) throws Exception + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + assertTrue("sandbox is not empty", lookupResult.length() == 0); + } + + @Override + protected void tearDown() throws Exception + { + super.tearDown(); + this.authenticationComponent.setCurrentUser("admin"); + + // Tidy-up any web projects created during the execution of the test + for (String webProjectRef : this.createdWebProjects) + { + try + { + sendRequest(new DeleteRequest(URL_WEB_PROJECT + "/" + webProjectRef), 0); + } + catch (Exception e) + { + // ignore exception here + } + } + + // Clear the list + this.createdWebProjects.clear(); + } + + /** + * test the modified assets methods + * @throws Exception + */ + public void testModifiedAssetsWebAppTest() throws Exception + { + this.authenticationComponent.setCurrentUser("admin"); + String webprojref = createWebProject(); + createMembership(webprojref, USER_ONE, ROLE_CONTENT_MANAGER); + String sandboxref = createSandbox(webprojref, USER_ONE); + + //TODO REPLACE THIS IMPLEMENTATION WITH THE REST API ONCE AVAILABLE + String bodgeRootPath = sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/" + WEBAPP_ROOT; + String bodgeYellowPath = sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/" + WEBAPP_YELLOW; + + avmLockingAwareService.createDirectory(sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps", WEBAPP_YELLOW); + String submitterURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/submitter"; + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("all", true); + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + + + avmLockingAwareService.createFile(bodgeRootPath, "rootFile1"); + avmLockingAwareService.createFile(bodgeYellowPath, "yellowFile1"); + + /** + * Get the modified asset and verify its format + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified?webApp=" + WEBAPP_YELLOW; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() == 1); + + // Now check the contents.. + JSONObject x = lookupResult.getJSONObject(0); + String name = x.getString("name"); + String path = x.getString("path"); + String creator = x.getString("creator"); + boolean isFile = x.getBoolean("isFile"); + boolean isDeleted = x.getBoolean("isDeleted"); + boolean isDirectory = x.getBoolean("isDirectory"); + + assertNotNull("name is null", name); + assertEquals("name is wrong", "yellowFile1", name); + assertEquals("creator is wrong", "admin", creator); + assertTrue("not isFile", isFile); + assertFalse("not isDirectory", isDirectory); + assertFalse("not isDeleted", isDeleted); + + assertNotNull("path is null", path); + assertEquals("path of MyFile1 is not correct", path, "/www/avm_webapps/YELLOW/yellowFile1"); + } + } + + /** + * test the modified assets with a webapp methods + * @throws Exception + */ + public void testModifiedAssetsTest() throws Exception + { + this.authenticationComponent.setCurrentUser("admin"); + String webprojref = createWebProject(); + createMembership(webprojref, USER_ONE, ROLE_CONTENT_MANAGER); + String sandboxref = createSandbox(webprojref, USER_ONE); + + /** + * Get the modified assets within that sandbox (should return nothing) + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() == 0); + } + + /** + * Negative test - Get the modified assets within that sandbox with an invalid web project - should get a 404 + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + "crap" + URI_SANDBOXES + "/" + sandboxref + "/modified"; + sendRequest(new GetRequest(sandboxesURL), Status.STATUS_NOT_FOUND); + } + + /** + * Negative test - Get the modified assets within that sandbox with an invalid sandbox - should get a 404 + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + "crap" + "/modified"; + sendRequest(new GetRequest(sandboxesURL), Status.STATUS_NOT_FOUND); + } + + /** + * add a single asset + */ + //TODO REPLACE THIS IMPLEMENTATION WITH THE REST API ONCE AVAILABLE + String bodgePath = sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/ROOT"; + avmLockingAwareService.createFile(bodgePath, "myFile1"); + + /** + * Get the modified asset and verify its format + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() == 1); + + // Now check the contents.. + JSONObject x = lookupResult.getJSONObject(0); + String name = x.getString("name"); + String path = x.getString("path"); + String creator = x.getString("creator"); + boolean isFile = x.getBoolean("isFile"); + boolean isDeleted = x.getBoolean("isDeleted"); + boolean isDirectory = x.getBoolean("isDirectory"); + + assertNotNull("name is null", name); + assertEquals("name is wrong", "myFile1", name); + assertEquals("creator is wrong", "admin", creator); + assertTrue("not isFile", isFile); + assertFalse("not isDirectory", isDirectory); + assertFalse("not isDeleted", isDeleted); + + assertNotNull("path is null", path); + assertEquals("path of MyFile1 is not correct", path, "/www/avm_webapps/ROOT/myFile1"); + + } + + /** + * Add some more assets, a dir and a file + */ + avmLockingAwareService.createDirectory(bodgePath, "fileA"); + + /** + * Get the modified assets - should be 2 (filex) is in a new dir + */ + + /** + * Add a new dir containing assets + */ + avmLockingAwareService.createDirectory(bodgePath, "dir1"); + avmLockingAwareService.createFile(bodgePath + "/dir1", "filex"); + avmLockingAwareService.createFile(bodgePath + "/dir1", "filey"); + + /** + * Get the modified assets should be myFile1, fileA, dir1 + */ + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() == 3); + } + } + + /** + * test the modified assets methods + * @throws Exception + */ + public void testSubmitAssetsTest() throws Exception + { + this.authenticationComponent.setCurrentUser("admin"); + String webprojref = createWebProject(); + createMembership(webprojref, USER_ONE, ROLE_CONTENT_MANAGER); + String sandboxref = createSandbox(webprojref, USER_ONE); + + //TODO REPLACE THIS IMPLEMENTATION WITH THE REST API ONCE AVAILABLE + String bodgePath = sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/ROOT"; + avmLockingAwareService.createFile(bodgePath, "myFile1"); + + String submitterURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/submitter"; + + /** + * Submit all Negative tests - missing label + */ + { + JSONObject submitForm = new JSONObject(); + submitForm.put("comment", "the comment"); + submitForm.put("all", true); + sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_BAD_REQUEST); + } + + /** + * Submit all Negative tests - missing comment + */ + { + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("all", true); + sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_BAD_REQUEST); + } + + /** + * Submit all Negative test - invalid project + */ + { + + String crapURL = URL_WEB_PROJECT + "/" + "crap" + URI_SANDBOXES + "/" + sandboxref + "/submitter"; + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("all", true); + sendRequest(new PostRequest(crapURL, submitForm.toString(), "application/json"), Status.STATUS_NOT_FOUND); + } + + /** + * Submit all Negative test - invalid sandbox + */ + { + + String crapURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + "crap" + "/submitter"; + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("all", true); + sendRequest(new PostRequest(crapURL, submitForm.toString(), "application/json"), Status.STATUS_NOT_FOUND); + } + + /** + * Submit all Negative test - none of all, assets or paths. + */ + { + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("all", false); + sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_BAD_REQUEST); + } + + /** + * Positive test - Submit all + */ + { + avmLockingAwareService.createFile(bodgePath, "myFile2"); + + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() > 0); + } + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("all", true); + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + //TODO Nothing in the response now. + + checkSandboxEmpty(webprojref, sandboxref); + + } + + /** + * Submit paths + */ + { + avmLockingAwareService.createFile(bodgePath, "myFile3"); + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + + JSONArray paths = new JSONArray(); + paths.put("/www/avm_webapps/ROOT/myFile3"); + submitForm.put("paths", paths); + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + checkSandboxEmpty(webprojref, sandboxref); + } + + /** + * Submit assets - get a list of modified assets and submit them back + */ + { + avmLockingAwareService.createFile(bodgePath, "myFile4"); + + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() > 0); + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("assets", lookupResult); + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + + } + checkSandboxEmpty(webprojref, sandboxref); + + + } + + /** + * Submit assets more complex example - get a list of modified assets and submit them back + * Also has a delete to process + */ + { + avmLockingAwareService.removeNode(sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/ROOT/myFile3"); + avmLockingAwareService.createFile(bodgePath, "buffy.jpg"); + avmLockingAwareService.createDirectory(bodgePath, "vampires"); + avmLockingAwareService.createFile(bodgePath + "/vampires", "master"); + avmLockingAwareService.createFile(bodgePath + "/vampires", "drusilla"); + avmLockingAwareService.createDirectory(bodgePath, "humans"); + avmLockingAwareService.createFile(bodgePath + "/humans", "willow"); + avmLockingAwareService.createFile(bodgePath + "/humans", "xander"); + + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + + assertTrue("testListUserSandbox", lookupResult.length() > 0); + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("assets", lookupResult); + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + + } + checkSandboxEmpty(webprojref, sandboxref); + + } + + + /** + * Now finally, a big complicated submission of assets and paths. + */ + { + // single file in existing dir + avmLockingAwareService.createFile(bodgePath + "/vampires", "angel"); + + //delete from an existing dir + avmLockingAwareService.removeNode(sandboxref + AVM_STORE_SEPARATOR + "/www/avm_webapps/ROOT/vampires/drusilla"); + // multiple file in existing dir + avmLockingAwareService.createFile(bodgePath + "/humans", "giles"); + avmLockingAwareService.createFile(bodgePath + "/humans", "dawn"); + avmLockingAwareService.createFile(bodgePath + "/humans", "anya"); + // new directory + avmLockingAwareService.createDirectory(bodgePath, "cast"); + avmLockingAwareService.createFile(bodgePath + "/cast", "Anthony Head"); + avmLockingAwareService.createFile(bodgePath + "/cast", "James Marsters"); + + + { + String sandboxesURL = URL_WEB_PROJECT + "/" + webprojref + URI_SANDBOXES + "/" + sandboxref + "/modified"; + Response list = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject result = new JSONObject(list.getContentAsString()); + JSONArray lookupResult = result.getJSONArray("data"); + JSONArray assets = new JSONArray(); + JSONArray paths = new JSONArray(); + JSONArray omitted = new JSONArray(); + assertTrue("testListUserSandbox", lookupResult.length() > 4); + + /** + * chop off 3 items from the modified list. First 2 go into path which should leave 1 unsubmitted. + */ + for(int i = 0; i < lookupResult.length(); i++) + { + if (i < 2) + { + // do nothing + omitted.put(lookupResult.getJSONObject(i).get("path")); + } + else if ( i < 4) + { + // copy into paths + paths.put(lookupResult.getJSONObject(i).get("path")); + } + else + { + // copy into assets + assets.put(lookupResult.getJSONObject(i)); + } + } + + JSONObject submitForm = new JSONObject(); + submitForm.put("label", "the label"); + submitForm.put("comment", "the comment"); + submitForm.put("assets", assets); + submitForm.put("paths", paths); + + Response response = sendRequest(new PostRequest(submitterURL, submitForm.toString(), "application/json"), Status.STATUS_OK); + + Response listTwo = sendRequest(new GetRequest(sandboxesURL), Status.STATUS_OK); + JSONObject resultTwo = new JSONObject(listTwo.getContentAsString()); + JSONArray lookupResultTwo = resultTwo.getJSONArray("data"); + assertTrue("testListUserSandbox", lookupResultTwo.length() == 2); + + /** + * Now submit the omitted two files + */ + JSONObject submitOmitted = new JSONObject(); + submitOmitted.put("label", "the label"); + submitOmitted.put("comment", "the comment"); + submitOmitted.put("paths", omitted); + sendRequest(new PostRequest(submitterURL, submitOmitted.toString(), "application/json"), Status.STATUS_OK); + } + checkSandboxEmpty(webprojref, sandboxref); + + } + } + + /** + * test the modified assets methods + * @throws Exception + */ + public void testRevertAssetsTest() throws Exception + { + + } + +} diff --git a/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/SandboxTest.java b/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/SandboxTest.java index a99b787397..cfb4fa7f99 100644 --- a/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/SandboxTest.java +++ b/source/java/org/alfresco/repo/web/scripts/wcm/sandbox/SandboxTest.java @@ -93,6 +93,7 @@ public class SandboxTest extends BaseWebScriptTest { // Do tests as user one this.authenticationComponent.setCurrentUser(USER_ONE); + } private void createUser(String userName) @@ -211,11 +212,15 @@ public class SandboxTest extends BaseWebScriptTest { JSONObject createdDate = data.getJSONObject("createdDate"); String createdOn = createdDate.getString("iso8601"); String createdBy = data.getString("creator"); + boolean isAuthorSandbox = data.getBoolean("isAuthorSandbox"); + boolean isStagingSandbox = data.getBoolean("isStagingSandbox"); assertNotNull("created date is null", createdOn ); assertNotNull("created by is null", createdBy ); assertNotNull("sandboxref is null", sandboxref); assertNotNull("url is null", url); assertNotNull("name is null", name); + assertTrue("not author sandbox", isAuthorSandbox); + assertFalse("is staging sandbox", isStagingSandbox); // check created date - throws exception if format invalid @SuppressWarnings("unused")