/* * Copyright (C) 2005-2009 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.wcm.asset; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.service.cmr.avm.AVMNotFoundException; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.namespace.QName; import org.alfresco.wcm.AbstractWCMServiceImplTest; import org.alfresco.wcm.sandbox.SandboxInfo; import org.alfresco.wcm.util.WCMUtil; import org.alfresco.wcm.webproject.WebProjectInfo; /** * Asset Service implementation unit test * * @author janv */ public class AssetServiceImplTest extends AbstractWCMServiceImplTest { // test data private static final String PREFIX = "created-by-admin-"; private static final String FILE = "This is file1 - admin"; @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } private void checkAssetInfo(AssetInfo assetInfo, String expectedName, String expectedPath, String expectedCreator, boolean expectedIsFile, boolean expectedIsFolder, boolean expectedIsDeleted, boolean expectedIsLocked, String expectedLockOwner) { assertNotNull(assetInfo); assertEquals(expectedName, assetInfo.getName()); assertEquals(expectedPath, assetInfo.getPath()); assertEquals(expectedCreator, assetInfo.getCreator()); assertEquals(expectedIsFile, assetInfo.isFile()); assertEquals(expectedIsFolder, assetInfo.isFolder()); assertEquals(expectedIsDeleted, assetInfo.isDeleted()); assertNotNull(assetInfo.getCreatedDate()); assertEquals(expectedIsLocked, assetInfo.isLocked()); assertEquals(expectedLockOwner, assetInfo.getLockOwner()); } public void testSimple() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-assetSimple", TEST_WEBPROJ_NAME+"-assetSimple", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); // get admin's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + wpInfo.getDefaultWebApp(); // create folder assetService.createFolder(sbStoreId, path, "myFolder1", null); // create (empty) file assetService.createFile(sbStoreId, path+"/myFolder1", "myFile1", null); // ignore return // get assets AssetInfo myFolder1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", AuthenticationUtil.getAdminUserName(), false, true, false, false, null); AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", AuthenticationUtil.getAdminUserName(), true, false, false, true, AuthenticationUtil.getAdminUserName()); // delete folder assetService.deleteAsset(myFolder1Asset); // also deletes myFile1 // try to get assets (including deleted) myFolder1Asset = assetService.getAsset(sbStoreId, -1, path+"/myFolder1", true); assertNull(myFolder1Asset); myFile1Asset = assetService.getAsset(sbStoreId, -1, path+"/myFolder1/myFile1", true); assertNull(myFile1Asset); } /** * Test CRUD - create, retrieve (get, list), update and delete */ public void testCRUD() throws IOException { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-crud", TEST_WEBPROJ_NAME+"-crud", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // get non-existent assets assertNull(assetService.getAsset(sbStoreId, path+"/myFolder1")); assertNull(assetService.getAsset(sbStoreId, path+"/myFile1")); assertNull(assetService.getAsset(sbStoreId, path+"/myFolder1/myFile2")); assertEquals(0, assetService.listAssets(sbStoreId, path, false).size()); // create folder assetService.createFolder(sbStoreId, path, "myFolder1", null); assertEquals(1, assetService.listAssets(sbStoreId, path, false).size()); assertEquals(0, assetService.listAssets(sbStoreId, path+"/myFolder1", false).size()); // create file (and add content) final String MYFILE1 = "This is myFile1"; ContentWriter writer = assetService.createFile(sbStoreId, path, "myFile1", null); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1); assertEquals(2, assetService.listAssets(sbStoreId, path, false).size()); final String MYFILE2 = "This is myFile2"; writer = assetService.createFile(sbStoreId, path+"/myFolder1", "myFile2", null); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE2); assertEquals(1, assetService.listAssets(sbStoreId, path+"/myFolder1", false).size()); // get assets (not including deleted) AssetInfo myFolder1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null); AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFile1", USER_ONE, true, false, false, true, USER_ONE); // get content ContentReader reader = assetService.getContentReader(myFile1Asset); InputStream in = reader.getContentInputStream(); byte[] buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE1, new String(buff, 0, MYFILE1.length())); // assumes 1byte=1char AssetInfo myFile2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFile2"); checkAssetInfo(myFile2Asset, "myFile2", path+"/myFolder1/myFile2", USER_ONE, true, false, false, true, USER_ONE); reader = assetService.getContentReader(myFile2Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE2, new String(buff, 0, MYFILE2.length())); // assumes 1byte=1char // update content final String MYFILE2_MODIFIED = "This is myFile2 ... modified"; writer = assetService.getContentWriter(myFile2Asset); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE2_MODIFIED); // get updated content reader = assetService.getContentReader(myFile2Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE2_MODIFIED, new String(buff, 0, MYFILE2_MODIFIED.length())); // assumes 1byte=1char // delete folders and files assetService.deleteAsset(myFile1Asset); assetService.deleteAsset(myFolder1Asset); // also deletes myFile2 // try to get assets (including deleted) myFolder1Asset = assetService.getAsset(sbStoreId, -1, path+"/myFolder1", true); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, true, false, null); // TODO - unlike admin (testSimple) myFile1Asset = assetService.getAsset(sbStoreId, -1, path+"/myFile1", true); assertNull(myFile1Asset); myFile2Asset = assetService.getAsset(sbStoreId, -1, path+"/myFolder1/myFile2", true); assertNull(myFile2Asset); assertEquals(0, assetService.listAssets(sbStoreId, path, false).size()); try { // -ve test assertEquals(0, assetService.listAssets(sbStoreId, path+"/myFolder1", false).size()); fail("Cannot list assets within non-existant folder"); } catch (AVMNotFoundException nfe) { // expected } } /** * Test CRUD in a webApp - create, retrieve (get, list), update and delete */ public void testCRUDinWebApp() throws IOException { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-crudwebapp", TEST_WEBPROJ_NAME+"-crudwebapp", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String myWebApp1 = "myWebApp1"; wpService.createWebApp(wpInfo.getStoreId(), myWebApp1, null); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); // get non-existent assets assertNull(assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1")); assertNull(assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFile1")); assertNull(assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1/myFile2")); assertEquals(0, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/", false).size()); // create folder assetService.createFolderWebApp(sbStoreId, myWebApp1, "/", "myFolder1"); assertEquals(1, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/", false).size()); assertEquals(0, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/myFolder1", false).size()); // create file (and add content) final String MYFILE1 = "This is myFile1"; ContentWriter writer = assetService.createFileWebApp(sbStoreId, myWebApp1, "/", "myFile1"); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1); assertEquals(2, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/", false).size()); final String MYFILE2 = "This is myFile2"; writer = assetService.createFileWebApp(sbStoreId, myWebApp1, "/myFolder1", "myFile2"); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE2); assertEquals(1, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/myFolder1", false).size()); // get assets (not including deleted) String path = sbInfo.getSandboxRootPath() + "/" + myWebApp1; AssetInfo myFolder1Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFile1", USER_ONE, true, false, false, true, USER_ONE); // get content ContentReader reader = assetService.getContentReader(myFile1Asset); InputStream in = reader.getContentInputStream(); byte[] buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE1, new String(buff, 0, MYFILE1.length())); // assumes 1byte=1char AssetInfo myFile2Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1/myFile2"); checkAssetInfo(myFile2Asset, "myFile2", path+"/myFolder1/myFile2", USER_ONE, true, false, false, true, USER_ONE); reader = assetService.getContentReader(myFile2Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE2, new String(buff, 0, MYFILE2.length())); // assumes 1byte=1char // update content final String MYFILE2_MODIFIED = "This is myFile2 ... modified"; writer = assetService.getContentWriter(myFile2Asset); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE2_MODIFIED); // get updated content reader = assetService.getContentReader(myFile2Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE2_MODIFIED, new String(buff, 0, MYFILE2_MODIFIED.length())); // assumes 1byte=1char // delete folders and files assetService.deleteAsset(myFile1Asset); assetService.deleteAsset(myFolder1Asset); // also deletes myFile2 // try to get assets (including deleted) myFolder1Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1", true); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, true, false, null); // TODO - unlike admin (testSimple) myFile1Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFile1", true); assertNull(myFile1Asset); myFile2Asset = assetService.getAssetWebApp(sbStoreId, myWebApp1, "/myFolder1/myFile2", true); assertNull(myFile2Asset); assertEquals(0, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/", false).size()); try { // -ve test assertEquals(0, assetService.listAssetsWebApp(sbStoreId, myWebApp1, "/myFolder1", false).size()); fail("Cannot list assets within non-existant folder"); } catch (AVMNotFoundException nfe) { // expected } } /** * Test CRUD - create, retrieve (get, list), update and delete for each role */ public void testCRUDforRoles() throws IOException, InterruptedException { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-crudroles", TEST_WEBPROJ_NAME+"-crudroles", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String wpStoreId = wpInfo.getStoreId(); String defaultWebApp = wpInfo.getDefaultWebApp(); // get admin sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpStoreId); String sbStoreId = sbInfo.getSandboxId(); // create some existing folders and files String[] users = new String[]{USER_ONE, USER_TWO, USER_THREE, USER_FOUR}; for (String user : users) { assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", PREFIX+user); // create file (and add content) ContentWriter writer = assetService.createFileWebApp(sbStoreId, defaultWebApp, "/"+PREFIX+user, "fileA"); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(FILE); } sbService.submitWebApp(sbStoreId, defaultWebApp, "some existing folders and files", null); Thread.sleep(SUBMIT_DELAY); runCRUDforRoles(USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, wpStoreId, defaultWebApp, true, true, true); // TODO - pending ETHREEOH-1314 (see below) if updating folder properties runCRUDforRoles(USER_TWO, WCMUtil.ROLE_CONTENT_PUBLISHER, wpStoreId, defaultWebApp, true, true, false); runCRUDforRoles(USER_THREE, WCMUtil.ROLE_CONTENT_REVIEWER, wpStoreId, defaultWebApp, false, true, false); runCRUDforRoles(USER_FOUR, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, wpStoreId, defaultWebApp, true, false, false); } private void runCRUDforRoles(String user, String role, String wpStoreId, String defaultWebApp, boolean canCreate, boolean canUpdateExisting, boolean canDeleteExisting) throws IOException, InterruptedException { // switch to user - content manager AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName()); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpStoreId, user, role, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(user); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpStoreId); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // for checks only if (canCreate) { // create folder assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", user); // create file (and add content) final String MYFILE1 = "This is myFile1 - "+user; ContentWriter writer = assetService.createFileWebApp(sbStoreId, defaultWebApp, "/"+user, "fileA"); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1); // list assets assertEquals(1, assetService.listAssetsWebApp(sbStoreId, defaultWebApp, "/"+user, false).size()); // get assets AssetInfo myFolder1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/"+user); checkAssetInfo(myFolder1Asset, user, path+"/"+user, user, false, true, false, false, null); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/"+user+"/fileA"); checkAssetInfo(myFile1Asset, "fileA", path+"/"+user+"/fileA", user, true, false, false, true, user); // get content ContentReader reader = assetService.getContentReader(myFile1Asset); InputStream in = reader.getContentInputStream(); byte[] buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE1, new String(buff, 0, MYFILE1.length())); // assumes 1byte=1char // update content final String MYFILE1_MODIFIED = "This is myFile1 ... modified"; writer = assetService.getContentWriter(myFile1Asset); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1_MODIFIED); // get updated content reader = assetService.getContentReader(myFile1Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE1_MODIFIED, new String(buff, 0, MYFILE1_MODIFIED.length())); // assumes 1byte=1char // update folder properties - eg. title and description Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "folder title"); newProps.put(ContentModel.PROP_DESCRIPTION, "folder description"); assetService.updateAssetProperties(myFolder1Asset, newProps); Map props = assetService.getAssetProperties(myFolder1Asset); assertEquals("folder title", props.get(ContentModel.PROP_TITLE)); assertEquals("folder description", props.get(ContentModel.PROP_DESCRIPTION)); // Delete created file and folder assetService.deleteAsset(myFile1Asset); assetService.deleteAsset(myFolder1Asset); } else { try { // try to create folder (-ve test) assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", user); fail("User "+user+" with role "+role+" should not be able to create folder"); } catch (AccessDeniedException ade) { // expected } try { // try to create file (-ve test) assetService.createFileWebApp(sbStoreId, defaultWebApp, "/", "file-"+user); fail("User "+user+" with role "+role+" should not be able to create file"); } catch (AccessDeniedException ade) { // expected } } // list existing assets assertEquals(1, assetService.listAssetsWebApp(sbStoreId, defaultWebApp, "/"+PREFIX+user, false).size()); // get existing assets AssetInfo existingFolder1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/"+PREFIX+user); checkAssetInfo(existingFolder1Asset, PREFIX+user, path+"/"+PREFIX+user, AuthenticationUtil.getAdminUserName(), false, true, false, false, null); AssetInfo existingFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/"+PREFIX+user+"/fileA"); checkAssetInfo(existingFile1Asset, "fileA", path+"/"+PREFIX+user+"/fileA", AuthenticationUtil.getAdminUserName(), true, false, false, false, null); // get existing content ContentReader reader = assetService.getContentReader(existingFile1Asset); InputStream in = reader.getContentInputStream(); byte[] buff = new byte[1024]; in.read(buff); in.close(); assertEquals(FILE, new String(buff, 0, FILE.length())); // assumes 1byte=1char if (canUpdateExisting) { // update content final String MYFILE1_MODIFIED = "This is myFile1 ... modified"; ContentWriter writer = assetService.getContentWriter(existingFile1Asset); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1_MODIFIED); // get updated content reader = assetService.getContentReader(existingFile1Asset); in = reader.getContentInputStream(); buff = new byte[1024]; in.read(buff); in.close(); assertEquals(MYFILE1_MODIFIED, new String(buff, 0, MYFILE1_MODIFIED.length())); // assumes 1byte=1char // update file properties - eg. title and description Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "file title"); newProps.put(ContentModel.PROP_DESCRIPTION, "file description"); assetService.updateAssetProperties(existingFile1Asset, newProps); Map props = assetService.getAssetProperties(existingFile1Asset); assertEquals("file title", props.get(ContentModel.PROP_TITLE)); assertEquals("file description", props.get(ContentModel.PROP_DESCRIPTION)); /* TODO - pending ETHREEOH-1314 - fails for content contributor / content publisher during submit if updating folder properties */ // update folder properties - eg. title and description newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "folder title"); newProps.put(ContentModel.PROP_DESCRIPTION, "folder description"); assetService.updateAssetProperties(existingFolder1Asset, newProps); props = assetService.getAssetProperties(existingFolder1Asset); assertEquals("folder title", props.get(ContentModel.PROP_TITLE)); assertEquals("folder description", props.get(ContentModel.PROP_DESCRIPTION)); } else { try { // try to update file (-ve test) assetService.getContentWriter(existingFile1Asset); fail("User "+user+" with role "+role+" should not be able to update existing file"); } catch (AccessDeniedException ade) { // expected } try { // try to update file properties (-ve test) Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "file title"); newProps.put(ContentModel.PROP_DESCRIPTION, "file description"); assetService.updateAssetProperties(existingFile1Asset, newProps); fail("User "+user+" with role "+role+" should not be able to update existing file properties"); } catch (AccessDeniedException ade) { // expected } try { // try to update folder properties (-ve test) Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "folder title"); newProps.put(ContentModel.PROP_DESCRIPTION, "folder description"); assetService.updateAssetProperties(existingFolder1Asset, newProps); fail("User "+user+" with role "+role+" should not be able to update existing folder properties"); } catch (AccessDeniedException ade) { // expected } } if (canDeleteExisting) { // Delete existing file and folder assetService.deleteAsset(existingFile1Asset); assetService.deleteAsset(existingFolder1Asset); } else { try { // try to delete file (-ve test) assetService.deleteAsset(existingFile1Asset); fail("User "+user+" with role "+role+" should not be able to delete existing file"); } catch (AVMNotFoundException nfe) { // expected } try { // try to delete folder (-ve test) assetService.deleteAsset(existingFolder1Asset); fail("User "+user+" with role "+role+" should not be able to delete existing folder"); } catch (AVMNotFoundException ade) { // expected } } // submit the changes sbService.submitWebApp(sbStoreId, defaultWebApp, "some updates by "+user, null); Thread.sleep(SUBMIT_DELAY); } public void testRenameFile() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-renamefile", TEST_WEBPROJ_NAME+"-renamefile", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create file assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // rename file AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); myFile1Asset = assetService.renameAsset(myFile1Asset, "myFile1Renamed"); checkAssetInfo(myFile1Asset, "myFile1Renamed", path+"/myFolder1/myFolder2/myFile1Renamed", USER_ONE, true, false, false, true, USER_ONE); } public void testRenameFolder() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-renamefolder", TEST_WEBPROJ_NAME+"-renamefolder", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); AssetInfo myFolder1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null); AssetInfo myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2"); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1/myFolder2", USER_ONE, false, true, false, false, null); // rename folder 1 myFolder1Asset = assetService.renameAsset(myFolder1Asset, "myFolder1Renamed"); checkAssetInfo(myFolder1Asset, "myFolder1Renamed", path+"/myFolder1Renamed", USER_ONE, false, true, false, false, null); // rename folder 2 myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1Renamed/myFolder2"); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1Renamed/myFolder2", USER_ONE, false, true, false, false, null); myFolder2Asset = assetService.renameAsset(myFolder2Asset, "myFolder2Renamed"); checkAssetInfo(myFolder2Asset, "myFolder2Renamed", path+"/myFolder1Renamed/myFolder2Renamed", USER_ONE, false, true, false, false, null); } public void testCopyFile() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-copyfile", TEST_WEBPROJ_NAME+"-copyfile", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create (non-empty) file final String MYFILE1 = "This is myFile1"; ContentWriter writer = assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1); // copy file - note: must have content AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); // TODO review - copied files are not locked ? myFile1Asset = assetService.copyAsset(myFile1Asset, path+"/myFolder1"); //checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, false, null); } public void testCopyFolder() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-copyfolder", TEST_WEBPROJ_NAME+"-copyfolder", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create (non-empty) file final String MYFILE1 = "This is myFile1"; ContentWriter writer = assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN); writer.setEncoding("UTF-8"); writer.putContent(MYFILE1); AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); AssetInfo myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2"); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1/myFolder2", USER_ONE, false, true, false, false, null); // recursively copy folder myFolder2Asset = assetService.copyAsset(myFolder2Asset, path); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder2", USER_ONE, false, true, false, false, null); AssetInfo myCopiedFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder2"); checkAssetInfo(myCopiedFolder2Asset, "myFolder2", path+"/myFolder2", USER_ONE, false, true, false, false, null); AssetInfo myCopiedFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder2/myFile1"); // TODO review - copied files are not locked ? //checkAssetInfo(myCopiedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); checkAssetInfo(myCopiedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, false, null); } public void testMoveFile() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-movefile", TEST_WEBPROJ_NAME+"-movefile", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create (empty) file assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // ignore return // move file AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); myFile1Asset = assetService.moveAsset(myFile1Asset, path+"/myFolder1"); // TODO review - moved files are not locked ? checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE); //checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, false, null); } /* // TODO lock issue ... // org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228830920248-movefolder:/www/avm_webapps/ROOT/myFolder1/myFolder2 // at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490) // at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712) */ public void testMoveFolder() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-movefolder", TEST_WEBPROJ_NAME+"-movefolder", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folders assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create (empty) file assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // ignore return AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); AssetInfo myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2"); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1/myFolder2", USER_ONE, false, true, false, false, null); // recursively move folder myFolder2Asset = assetService.moveAsset(myFolder2Asset, path); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder2", USER_ONE, false, true, false, false, null); AssetInfo myMovedFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder2"); checkAssetInfo(myMovedFolder2Asset, "myFolder2", path+"/myFolder2", USER_ONE, false, true, false, false, null); AssetInfo myMovedFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder2/myFile1"); // TODO review - moved files are not locked ? //checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, true, USER_ONE); checkAssetInfo(myMovedFile1Asset, "myFile1", path+"/myFolder2/myFile1", USER_ONE, true, false, false, false, null); } public void testProperties() throws InterruptedException { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-properties", TEST_WEBPROJ_NAME+"-properties", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folder assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", "myFolder1"); AssetInfo myFolder1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null); Map props = assetService.getAssetProperties(myFolder1Asset); assertNotNull(props); int countFolderInbuiltProps = props.size(); // create file assetService.createFileWebApp(sbStoreId, defaultWebApp, "/myFolder1", "myFile1"); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE); props = assetService.getAssetProperties(myFile1Asset); assertNotNull(props); int countFileInbuiltProps = props.size(); assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset)); sbService.submitWebApp(sbStoreId, defaultWebApp, "submit1 label", "submit1 comment"); Thread.sleep(SUBMIT_DELAY); assertNull(assetService.getLockOwner(myFile1Asset)); // update (or set, if not already set) specific properties - eg. title and description Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "folder title"); newProps.put(ContentModel.PROP_DESCRIPTION, "folder description"); assetService.updateAssetProperties(myFolder1Asset, newProps); props = assetService.getAssetProperties(myFolder1Asset); assertEquals((countFolderInbuiltProps+2), props.size()); assertEquals("folder title", props.get(ContentModel.PROP_TITLE)); assertEquals("folder description", props.get(ContentModel.PROP_DESCRIPTION)); // set all (or replace existing) properties - eg. just title newProps = new HashMap(1); newProps.put(ContentModel.PROP_TITLE, "folder title2"); assetService.setAssetProperties(myFolder1Asset, newProps); props = assetService.getAssetProperties(myFolder1Asset); assertEquals((countFolderInbuiltProps+1), props.size()); assertEquals("folder title2", props.get(ContentModel.PROP_TITLE)); assertNull(props.get(ContentModel.PROP_DESCRIPTION)); // set all (or replace existing) properties - eg. title and description newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "file title"); newProps.put(ContentModel.PROP_DESCRIPTION, "file description"); assetService.setAssetProperties(myFile1Asset, newProps); props = assetService.getAssetProperties(myFile1Asset); assertEquals((countFileInbuiltProps+2), props.size()); assertEquals("file title", props.get(ContentModel.PROP_TITLE)); assertEquals("file description", props.get(ContentModel.PROP_DESCRIPTION)); assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset)); } public void testAspects() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-aspects", TEST_WEBPROJ_NAME+"-aspects", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folder assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", "myFolder1"); AssetInfo myFolder1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1"); checkAssetInfo(myFolder1Asset, "myFolder1", path+"/myFolder1", USER_ONE, false, true, false, false, null); int folderAspectCnt = assetService.getAspects(myFolder1Asset).size(); // create file assetService.createFileWebApp(sbStoreId, defaultWebApp, "/myFolder1", "myFile1"); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "/myFolder1/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFolder1/myFile1", USER_ONE, true, false, false, true, USER_ONE); int fileAspectCnt = assetService.getAspects(myFile1Asset).size(); // add/remove aspect to/from folder assertFalse(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED)); Map newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "folder title"); newProps.put(ContentModel.PROP_DESCRIPTION, "folder description"); assetService.addAspect(myFolder1Asset, ContentModel.ASPECT_TITLED, newProps); assertEquals(folderAspectCnt+1, assetService.getAspects(myFolder1Asset).size()); assertTrue(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED)); assetService.removeAspect(myFolder1Asset, ContentModel.ASPECT_TITLED); assertEquals(folderAspectCnt, assetService.getAspects(myFolder1Asset).size()); assertFalse(assetService.hasAspect(myFolder1Asset, ContentModel.ASPECT_TITLED)); // add/remove aspect to/from file assertFalse(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED)); newProps = new HashMap(2); newProps.put(ContentModel.PROP_TITLE, "file title"); newProps.put(ContentModel.PROP_DESCRIPTION, "file description"); assetService.addAspect(myFile1Asset, ContentModel.ASPECT_TITLED, newProps); assertEquals(fileAspectCnt+1, assetService.getAspects(myFile1Asset).size()); assertTrue(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED)); assetService.removeAspect(myFile1Asset, ContentModel.ASPECT_TITLED); assertEquals(fileAspectCnt, assetService.getAspects(myFile1Asset).size()); assertFalse(assetService.hasAspect(myFile1Asset, ContentModel.ASPECT_TITLED)); } public void testSimpleLockFile() throws InterruptedException { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-simpleLock", TEST_WEBPROJ_NAME+"-simpleLock", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web users and auto-create their (author) sandboxs wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true); wpService.inviteWebUser(wpInfo.getStoreId(), USER_TWO, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true); wpService.inviteWebUser(wpInfo.getStoreId(), USER_THREE, WCMUtil.ROLE_CONTENT_MANAGER, true); // switch to user one AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create file assetService.createFileWebApp(sbStoreId, defaultWebApp, "/", "myFile1"); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myFile1", USER_ONE, true, false, false, true, USER_ONE); assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset)); assertTrue(assetService.hasLockAccess(myFile1Asset)); // switch to user two AuthenticationUtil.setFullyAuthenticatedUser(USER_TWO); assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset)); assertFalse(assetService.hasLockAccess(myFile1Asset)); // switch to user three AuthenticationUtil.setFullyAuthenticatedUser(USER_THREE); assertEquals(USER_ONE, assetService.getLockOwner(myFile1Asset)); assertTrue(assetService.hasLockAccess(myFile1Asset)); // content manager // switch to user one AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); sbService.submitWebApp(sbStoreId, defaultWebApp, "submit1 label", "submit1 comment"); Thread.sleep(SUBMIT_DELAY); assertNull(assetService.getLockOwner(myFile1Asset)); assertTrue(assetService.hasLockAccess(myFile1Asset)); // switch to user two AuthenticationUtil.setFullyAuthenticatedUser(USER_TWO); assertNull(assetService.getLockOwner(myFile1Asset)); assertTrue(assetService.hasLockAccess(myFile1Asset)); } public void testSimpleLockFile2() throws InterruptedException { AuthenticationUtil.setFullyAuthenticatedUser(USER_ADMIN); // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-partialSubmitWithNewFolder", TEST_WEBPROJ_NAME+"-partialSubmitWithNewFolder", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // get admin's sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folder assetService.createFolderWebApp(sbStoreId, defaultWebApp, "/", "myDir1"); AssetInfo myDir1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "myDir1"); checkAssetInfo(myDir1Asset, "myDir1", path+"/myDir1", USER_ADMIN, false, true, false, false, null); // note: folders do not get locked assertNull(assetService.getLockOwner(myDir1Asset)); assertTrue(assetService.hasLockAccess(myDir1Asset)); // create two files assetService.createFileWebApp(sbStoreId, defaultWebApp, "/myDir1", "myFile1"); assetService.createFileWebApp(sbStoreId, defaultWebApp, "/myDir1", "myFile2"); AssetInfo myFile1Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "myDir1/myFile1"); checkAssetInfo(myFile1Asset, "myFile1", path+"/myDir1/myFile1", USER_ADMIN, true, false, false, true, USER_ADMIN); assertEquals(USER_ADMIN, assetService.getLockOwner(myFile1Asset)); assertTrue(assetService.hasLockAccess(myFile1Asset)); AssetInfo myFile2Asset = assetService.getAssetWebApp(sbStoreId, defaultWebApp, "myDir1/myFile2"); checkAssetInfo(myFile2Asset, "myFile2", path+"/myDir1/myFile2", USER_ADMIN, true, false, false, true, USER_ADMIN); assertEquals(USER_ADMIN, assetService.getLockOwner(myFile2Asset)); assertTrue(assetService.hasLockAccess(myFile2Asset)); List changedAssets = sbService.listChangedWebApp(sbStoreId, defaultWebApp, false); assertEquals(1, changedAssets.size()); myDir1Asset = changedAssets.get(0); checkAssetInfo(myDir1Asset, "myDir1", path+"/myDir1", USER_ADMIN, false, true, false, false, null); List selectedAssetsToSubmit = new ArrayList(1); selectedAssetsToSubmit.add(myFile1Asset); // partial submit with new folder sbService.submitListAssets(sbStoreId, selectedAssetsToSubmit, "submit1 label", "submit1 comment"); Thread.sleep(SUBMIT_DELAY); changedAssets = sbService.listChangedWebApp(sbStoreId, defaultWebApp, false); assertEquals(1, changedAssets.size()); myFile2Asset = changedAssets.get(0); // ETWOTWO-1265 checkAssetInfo(myFile2Asset, "myFile2", path+"/myDir1/myFile2", USER_ADMIN, true, false, false, true, USER_ADMIN); assertEquals(USER_ADMIN, assetService.getLockOwner(myFile2Asset)); assertTrue(assetService.hasLockAccess(myFile2Asset)); } public void testSimpleImport() { // create web project (also creates staging sandbox and admin's author sandbox) WebProjectInfo wpInfo = wpService.createWebProject(TEST_WEBPROJ_DNS+"-simpleImport", TEST_WEBPROJ_NAME+"-simpleImport", TEST_WEBPROJ_TITLE, TEST_WEBPROJ_DESCRIPTION, TEST_WEBPROJ_DEFAULT_WEBAPP, TEST_WEBPROJ_DONT_USE_AS_TEMPLATE, null); String defaultWebApp = wpInfo.getDefaultWebApp(); // invite web user and auto-create their (author) sandbox wpService.inviteWebUser(wpInfo.getStoreId(), USER_ONE, WCMUtil.ROLE_CONTENT_CONTRIBUTOR, true); // switch to user AuthenticationUtil.setFullyAuthenticatedUser(USER_ONE); // get user's author sandbox SandboxInfo sbInfo = sbService.getAuthorSandbox(wpInfo.getStoreId()); String sbStoreId = sbInfo.getSandboxId(); String path = sbInfo.getSandboxRootPath() + "/" + defaultWebApp; // create folder assetService.createFolder(sbStoreId, path, "myFolder1", null); AssetInfo myFolder1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1"); // bulk import String testFile = System.getProperty("user.dir") + "/source/test-resources/module/test.war"; File zipFile = new File(testFile); assetService.bulkImport(sbStoreId, myFolder1Asset.getPath(), zipFile, false); } }