diff --git a/config/alfresco/wcm-services-context.xml b/config/alfresco/wcm-services-context.xml index 678c65f99a..20a5d85e0b 100644 --- a/config/alfresco/wcm-services-context.xml +++ b/config/alfresco/wcm-services-context.xml @@ -229,6 +229,7 @@ + diff --git a/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java b/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java index 4d1ea5d57e..9bc2d7fe99 100644 --- a/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java +++ b/source/java/org/alfresco/repo/avm/AVMLockingAwareService.java @@ -50,6 +50,7 @@ import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; +import org.alfresco.wcm.util.WCMUtil; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -680,8 +681,11 @@ public class AVMLockingAwareService implements AVMService, ApplicationContextAwa fService.removeNode(parent, name); String[] storePath = parent.split(":"); fService.createSnapshot(storePath[0], null, null); - fLockingService.removeLocksInDirectory(getWebProject(storePath[0]), storePath[0], - storePath[1] + '/' + name); + String webProject = getWebProject(storePath[0]); + if (webProject != null) + { + fLockingService.removeLocksInDirectory(webProject, storePath[0], storePath[1] + '/' + name); + } } /* (non-Javadoc) @@ -693,7 +697,11 @@ public class AVMLockingAwareService implements AVMService, ApplicationContextAwa fService.removeNode(path); String[] storePath = path.split(":"); fService.createSnapshot(storePath[0], null, null); - fLockingService.removeLocksInDirectory(getWebProject(storePath[0]), storePath[0], storePath[1]); + String webProject = getWebProject(storePath[0]); + if (webProject != null) + { + fLockingService.removeLocksInDirectory(webProject, storePath[0], storePath[1]); + } } /* (non-Javadoc) @@ -704,14 +712,26 @@ public class AVMLockingAwareService implements AVMService, ApplicationContextAwa { // TODO Unresolved: how to deal with directory level locking. // TODO This assumes that the rename occurs within the same web project. - grabLock(srcParent + '/' + srcName); - fService.rename(srcParent, srcName, dstParent, dstName); - String[] srcStorePath = splitPath(srcParent + '/' + srcName); - String[] dstStorePath = splitPath(dstParent + '/' + dstName); - String webProject = getWebProject(dstStorePath[0]); - if (webProject != null) + + String srcPath = srcParent + '/' + srcName; + + AVMNodeDescriptor desc = fService.lookup(-1, srcPath, false); + if (! (desc != null && desc.isDirectory())) { - fLockingService.modifyLock(webProject, srcStorePath[1], dstStorePath[1], dstStorePath[0], null, null); + grabLock(srcParent + '/' + srcName); + } + + fService.rename(srcParent, srcName, dstParent, dstName); + + if (! (desc != null && desc.isDirectory())) + { + String[] srcStorePath = splitPath(srcParent + '/' + srcName); + String[] dstStorePath = splitPath(dstParent + '/' + dstName); + String webProject = getWebProject(dstStorePath[0]); + if (webProject != null) + { + fLockingService.modifyLock(webProject, srcStorePath[1], dstStorePath[1], dstStorePath[0], null, null); + } } } @@ -851,18 +871,13 @@ public class AVMLockingAwareService implements AVMService, ApplicationContextAwa } private String getWebProject(String name) - { - Map results = fService.queryStorePropertyKey(name, QName.createQName(null, ".dns%")); - if (results.size() != 1) + { + String wpStoreId = WCMUtil.getWebProjectStoreId(name); + if (WCMUtil.getWebProjectNodeFromWebProjectStore(fService, wpStoreId) != null) { - return null; + return wpStoreId; } - String dnsString = results.keySet().iterator().next().getLocalName(); - String storeName = dnsString.substring(dnsString.lastIndexOf('.') + 1, dnsString.length()); - final int index = storeName.indexOf(STORE_SEPARATOR); - return (index == -1 - ? storeName - : storeName.substring(0, index)); + return null; } private void grabLock(String path) diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 0167ff58e4..89a56e8854 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -268,17 +268,21 @@ public class AVMServiceTest extends AVMServiceTestBase AVMService oldService = fService; fService = (AVMService) fContext.getBean("AVMLockingAwareService"); AuthenticationService authService = (AuthenticationService) fContext.getBean("AuthenticationService"); + try { - fService.setStoreProperty("main", QName.createQName(null, ".dns.main"), new PropertyValue(DataTypeDefinition.TEXT, "Nothing.")); - fService.createStore("test"); - fService.setStoreProperty("test", QName.createQName(null, ".dns.test.main"), new PropertyValue(DataTypeDefinition.TEXT, "Nothing.")); + // note: locking applies to WCM web projects, hence relies on WCM sandbox conventions (naming and properties) + fService.setStoreProperty("main", SandboxConstants.PROP_WEB_PROJECT_NODE_REF, new PropertyValue(DataTypeDefinition.NODE_REF, new NodeRef("workspace://SpacesStore/dummy"))); + + fService.createStore("main--admin"); + setupBasicTree0(); - authService.authenticateAsGuest(); - // assertEquals(0, fLockingService.getUsersLocks("admin").size()); - List diffs = fSyncService.compare(-1, "main:/", -1, "test:/", null); + + + List diffs = fSyncService.compare(-1, "main:/", -1, "main--admin:/", null); assertEquals(2, diffs.size()); - assertEquals("[main:/a[-1] > test:/a[-1], main:/d[-1] > test:/d[-1]]", diffs.toString()); + assertEquals("[main:/a[-1] > main--admin:/a[-1], main:/d[-1] > main--admin:/d[-1]]", diffs.toString()); + fSyncService.update(diffs, null, false, false, false, false, null, null); RetryingTransactionHelper.RetryingTransactionCallback cb = new RetryingTransactionHelper.RetryingTransactionCallback() { @@ -286,7 +290,7 @@ public class AVMServiceTest extends AVMServiceTestBase { BulkLoader loader = new BulkLoader(); loader.setAvmService(fService); - loader.recursiveLoad("source/java/org/alfresco/repo/avm", "main:/"); + loader.recursiveLoad("source/java/org/alfresco/repo/avm", "main--admin:/"); return null; } }; @@ -304,8 +308,7 @@ public class AVMServiceTest extends AVMServiceTestBase fLockingService.removeStoreLocks("main"); fLockingService.removeWebProject("main"); authService.authenticate("admin", "admin".toCharArray()); - - fService.purgeStore("test"); + fService.purgeStore("main--admin"); } } @@ -1967,6 +1970,7 @@ public class AVMServiceTest extends AVMServiceTestBase final String STAGING = "foo-staging"; // note: it is implied that the website/webproject name is the same as staging name try { + fService.createStore(STAGING); fService.createDirectory(STAGING+":/", JNDIConstants.DIR_DEFAULT_WWW); fService.createDirectory(STAGING+":/" + JNDIConstants.DIR_DEFAULT_WWW, "a"); @@ -1975,7 +1979,7 @@ public class AVMServiceTest extends AVMServiceTestBase fService.createFile(STAGING+":/" + JNDIConstants.DIR_DEFAULT_WWW + "/a/b/c", "foo").close(); fService.createFile(STAGING+":/" + JNDIConstants.DIR_DEFAULT_WWW + "/a/b/c", "bar").close(); fService.createStore("area"); - fService.setStoreProperty("area", SandboxConstants.PROP_WEBSITE_NAME, new PropertyValue(null, STAGING)); // note: it is implied that the website name is the same as staging name + fService.setStoreProperty("area", SandboxConstants.PROP_WEBSITE_NAME, new PropertyValue(null, STAGING)); // note: it is implied that the website name is the same as staging name fService.createLayeredDirectory(STAGING+":/" + JNDIConstants.DIR_DEFAULT_WWW, "area:/", JNDIConstants.DIR_DEFAULT_WWW); fService.createFile("area:/" + JNDIConstants.DIR_DEFAULT_WWW, "figs").close(); fService.getFileOutputStream("area:/" + JNDIConstants.DIR_DEFAULT_WWW + "/a/b/c/foo").close(); diff --git a/source/java/org/alfresco/wcm/asset/AssetService.java b/source/java/org/alfresco/wcm/asset/AssetService.java index 20554da879..ff17d602f6 100644 --- a/source/java/org/alfresco/wcm/asset/AssetService.java +++ b/source/java/org/alfresco/wcm/asset/AssetService.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.Serializable; import java.util.List; import java.util.Map; +import java.util.Set; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; @@ -175,6 +176,40 @@ public interface AssetService */ public void updateAssetProperties(AssetInfo asset, Map properties); + /** + * Apply aspect to asset, with given properties (can be null) + * + * @param asset + * @param aspectName + * @param properties + */ + public void addAspect(AssetInfo asset, QName aspectName, Map properties); + + /** + * Remove aspect from asset, and any related properties + * + * @param asset + * @param aspectName + */ + public void removeAspect(AssetInfo asset, QName aspectName); + + /** + * Get set of aspects applied to asset + * + * @param asset + * @return list of aspects + */ + public Set getAspects(AssetInfo asset); + + /** + * True, if asset has given aspect applied + * + * @param asset + * @param aspectName + * @return + */ + public boolean hasAspect(AssetInfo asset, QName aspectName); + /** * List assets within given sandbox and webApp and path (within webApp), optionally include deleted * @@ -182,7 +217,7 @@ public interface AssetService * @param webApp * @param parentFolderPathRelativeToWebApp * @param includeDeleted - * @return + * @return list of assets */ public List listAssetsWebApp(String sbStoreId, String webApp, String parentFolderPathRelativeToWebApp, boolean includeDeleted); @@ -192,7 +227,7 @@ public interface AssetService * @param sbStoreId * @param parentFolderPath * @param includeDeleted - * @return + * @return list of assets */ public List listAssets(String sbStoreId, String parentFolderPath, boolean includeDeleted); @@ -203,7 +238,7 @@ public interface AssetService * @param version * @param parentFolderPath * @param includeDeleted - * @return + * @return list of assets */ public List listAssets(String sbStoreId, int version, String parentFolderPath, boolean includeDeleted); diff --git a/source/java/org/alfresco/wcm/asset/AssetServiceImpl.java b/source/java/org/alfresco/wcm/asset/AssetServiceImpl.java index 2ff97345c1..9eb89a4d78 100644 --- a/source/java/org/alfresco/wcm/asset/AssetServiceImpl.java +++ b/source/java/org/alfresco/wcm/asset/AssetServiceImpl.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.mbeans.VirtServerRegistry; @@ -443,13 +444,54 @@ public class AssetServiceImpl implements AssetService private void setProperties(String avmPath, Map properties) { NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, avmPath); - avmNodeService.setProperties(avmNodeRef, properties); // note: assumes lock, if applicable, is taken by caller + avmNodeService.setProperties(avmNodeRef, properties); + } + + /* (non-Javadoc) + * @see org.alfresco.wcm.asset.AssetService#addAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName, java.util.Map) + */ + public void addAspect(AssetInfo asset, QName aspectName, Map properties) + { + addAspect(asset.getAvmPath(), aspectName, properties); } private void addAspect(String avmPath, QName aspect, Map properties) { NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, avmPath); - avmNodeService.addAspect(avmNodeRef, aspect, properties); // note: assumes lock, if applicable, is taken by caller + avmNodeService.addAspect(avmNodeRef, aspect, properties); + } + + /* (non-Javadoc) + * @see org.alfresco.wcm.asset.AssetService#removeAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName) + */ + public void removeAspect(AssetInfo asset, QName aspectName) + { + ParameterCheck.mandatory("asset", asset); + + NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(-1, asset.getAvmPath()); + avmNodeService.removeAspect(avmNodeRef, aspectName); + } + + /* (non-Javadoc) + * @see org.alfresco.wcm.asset.AssetService#getAspects(org.alfresco.wcm.asset.AssetInfo) + */ + public Set getAspects(AssetInfo asset) + { + ParameterCheck.mandatory("asset", asset); + + NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(asset.getSandboxVersion(), asset.getAvmPath()); + return avmNodeService.getAspects(avmNodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.wcm.asset.AssetService#hasAspect(org.alfresco.wcm.asset.AssetInfo, org.alfresco.service.namespace.QName) + */ + public boolean hasAspect(AssetInfo asset, QName aspectName) + { + ParameterCheck.mandatory("asset", asset); + + NodeRef avmNodeRef = AVMNodeConverter.ToNodeRef(asset.getSandboxVersion(), asset.getAvmPath()); + return avmNodeService.hasAspect(avmNodeRef, aspectName); } /* (non-Javadoc) diff --git a/source/java/org/alfresco/wcm/asset/AssetServiceImplTest.java b/source/java/org/alfresco/wcm/asset/AssetServiceImplTest.java index be9a3a4461..b090662c24 100644 --- a/source/java/org/alfresco/wcm/asset/AssetServiceImplTest.java +++ b/source/java/org/alfresco/wcm/asset/AssetServiceImplTest.java @@ -199,7 +199,7 @@ public class AssetServiceImplTest extends TestCase assetService.createFolder(sbStoreId, path, "myFolder1", null); // create (empty) file - assetService.createFile(sbStoreId, path+"/myFolder1", "myFile1", null); + assetService.createFile(sbStoreId, path+"/myFolder1", "myFile1", null); // ignore return // get assets @@ -502,12 +502,6 @@ public class AssetServiceImplTest extends TestCase checkAssetInfo(myFile1Asset, "myFile1Renamed", path+"/myFolder1/myFolder2/myFile1Renamed", USER_ONE, true, false, false, true, USER_ONE); } - /* - // TODO lock issue ... - // org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228476617644-rename:/www/avm_webapps/ROOT/myFolder1 - // at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490) - // at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712) - public void testRenameFolder() { // create web project (also creates staging sandbox and admin's author sandbox) @@ -536,20 +530,18 @@ public class AssetServiceImplTest extends TestCase AssetInfo myFolder2Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2"); checkAssetInfo(myFolder2Asset, "myFolder2", path+"/myFolder1/myFolder2", USER_ONE, false, true, false, false, null); - // TODO lock issue ... - // org.alfresco.service.cmr.avm.AVMNotFoundException: Lock not found for testAsset-1228476617644-rename:/www/avm_webapps/ROOT/myFolder1 - // at org.alfresco.repo.avm.locking.AVMLockingServiceImpl.modifyLock(AVMLockingServiceImpl.java:490) - //at org.alfresco.repo.avm.AVMLockingAwareService.rename(AVMLockingAwareService.java:712) - - // rename folder + // rename folder 1 myFolder1Asset = assetService.renameAsset(myFolder1Asset, "myFolder1Renamed"); checkAssetInfo(myFolder1Asset, "myFolder1Renamed", path+"/myFolder1Renamed", USER_ONE, false, true, false, false, null); - // rename folder + // 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+"/myFolder1/myFolder2Renamed", USER_ONE, false, true, false, false, null); + checkAssetInfo(myFolder2Asset, "myFolder2Renamed", path+"/myFolder1Renamed/myFolder2Renamed", USER_ONE, false, true, false, false, null); } - */ + public void testCopyFile() { @@ -573,7 +565,7 @@ public class AssetServiceImplTest extends TestCase assetService.createFolder(sbStoreId, path, "myFolder1", null); assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); - // create (nn-empty) file + // 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); @@ -584,9 +576,8 @@ public class AssetServiceImplTest extends TestCase 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.copyAsset(myFile1Asset, path+"/myFolder1"); - // 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); } @@ -664,7 +655,7 @@ public class AssetServiceImplTest extends TestCase assetService.createFolder(sbStoreId, path+"/myFolder1", "myFolder2", null); // create (empty) file - assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); + assetService.createFile(sbStoreId, path+"/myFolder1/myFolder2", "myFile1", null); // ignore return // move file AssetInfo myFile1Asset = assetService.getAsset(sbStoreId, path+"/myFolder1/myFolder2/myFile1"); @@ -682,7 +673,7 @@ public class AssetServiceImplTest extends TestCase // 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) @@ -705,12 +696,8 @@ public class AssetServiceImplTest extends TestCase 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); + // 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); @@ -729,10 +716,9 @@ public class AssetServiceImplTest extends TestCase 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); + //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() { @@ -817,6 +803,76 @@ public class AssetServiceImplTest extends TestCase 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() { // create web project (also creates staging sandbox and admin's author sandbox) diff --git a/source/java/org/alfresco/wcm/sandbox/SandboxServiceImpl.java b/source/java/org/alfresco/wcm/sandbox/SandboxServiceImpl.java index 7e810bd50c..e1166f2763 100644 --- a/source/java/org/alfresco/wcm/sandbox/SandboxServiceImpl.java +++ b/source/java/org/alfresco/wcm/sandbox/SandboxServiceImpl.java @@ -341,7 +341,7 @@ public class SandboxServiceImpl implements SandboxService if (sbStoreId.equals(wpStoreId)) { - throw new AlfrescoRuntimeException("Cannot delete staging sandbox '"+sbStoreId+"' (web project id: "+wpStoreId+")"); + throw new AccessDeniedException("Cannot delete staging sandbox '"+sbStoreId+"' (web project id: "+wpStoreId+")"); } // content manager may delete sandboxes, except staging sandbox diff --git a/source/java/org/alfresco/wcm/sandbox/SandboxServiceImplTest.java b/source/java/org/alfresco/wcm/sandbox/SandboxServiceImplTest.java index 8bd9ef8a70..b151eb57a0 100644 --- a/source/java/org/alfresco/wcm/sandbox/SandboxServiceImplTest.java +++ b/source/java/org/alfresco/wcm/sandbox/SandboxServiceImplTest.java @@ -33,12 +33,10 @@ import java.util.Map; import junit.framework.TestCase; -import org.alfresco.error.AlfrescoRuntimeException; 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.avm.AVMService; import org.alfresco.service.cmr.avm.VersionDescriptor; import org.alfresco.service.cmr.repository.ContentReader; @@ -419,7 +417,7 @@ public class SandboxServiceImplTest extends TestCase sbService.deleteSandbox(sbInfo.getSandboxId()); fail("Shouldn't be able to delete staging sandbox"); } - catch (AlfrescoRuntimeException exception) + catch (AccessDeniedException exception) { // Expected } @@ -430,7 +428,7 @@ public class SandboxServiceImplTest extends TestCase sbService.deleteSandbox("some-random-staging-sandbox"); fail("Shouldn't be able to delete non-existant sandbox"); } - catch (AVMNotFoundException exception) + catch (AccessDeniedException exception) { // Expected } diff --git a/source/java/org/alfresco/wcm/sandbox/script/Asset.java b/source/java/org/alfresco/wcm/sandbox/script/Asset.java index f3e1b68a17..e81e49cbd0 100644 --- a/source/java/org/alfresco/wcm/sandbox/script/Asset.java +++ b/source/java/org/alfresco/wcm/sandbox/script/Asset.java @@ -24,12 +24,20 @@ */ package org.alfresco.wcm.sandbox.script; +import java.io.Serializable; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.namespace.NamespaceException; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; import org.alfresco.util.ISO8601DateFormat; import org.alfresco.wcm.asset.AssetInfo; +import org.alfresco.wcm.asset.AssetService; import org.alfresco.wcm.sandbox.SandboxService; /** @@ -37,10 +45,15 @@ import org.alfresco.wcm.sandbox.SandboxService; * @author mrogers * */ -public class Asset +public class Asset implements Serializable { + /** + * + */ + private static final long serialVersionUID = -5759260478423750966L; private AssetInfo asset; private Sandbox sandbox; + private Map props; public Asset(Sandbox sandbox, AssetInfo asset) { @@ -62,6 +75,11 @@ public class Asset return asset.getCreatedDate(); } + public long getFileSize() + { + return asset.getFileSize(); + } + public String getCreatedDateAsISO8601() { return ISO8601DateFormat.format(getCreatedDate()); @@ -82,12 +100,33 @@ public class Asset return ISO8601DateFormat.format(getModifiedDate()); } - /* - public String getAssetRef() - { - return asset.getGuid(); - } - */ + /** + * rename this asset + * @param newName + */ + public Asset rename(String newName) + { + if(!newName.equals(asset.getName())) + { + AssetInfo newAsset = getAssetService().renameAsset(asset, newName); + this.asset = newAsset; + } + return this; + } + + /** + * move this asset + * @param newPath + */ + public Asset move(String newPath) + { + if(!newPath.equals(asset.getPath())) + { + AssetInfo newAsset = getAssetService().moveAsset(asset, newPath); + this.asset = newAsset; + } + return this; + } public String getName() { @@ -108,7 +147,7 @@ public class Asset return asset.isFile(); } - public boolean isDirectory() + public boolean isFolder() { return asset.isFolder(); } @@ -123,14 +162,82 @@ public class Asset return asset.isLocked(); } - /* TODO review + public String lockOwner() + { + return asset.getLockOwner(); + } + public int getVersion() { - return asset.getVersion(); + return asset.getSandboxVersion(); } - */ /** + * Get the properties as a key value pair. The key will be either a local qname e.g. "cm:content" or + * a global qname e.g. "{http://www.alfresco.com/content/1.0}content". + * + * Some properties will be updatable, protected properties are not. + * + * @return the properties in a key, value pair + */ + + public Map getProperties() + { + if(props == null) { + + // Note there is something very strange going on with scope which is why there's this guff with propsX + Map propsX = new HashMap(); + props = propsX; + NamespaceService ns = getNamespaceService(); + + if(!asset.isDeleted()) + { + Map intprops = getAssetService().getAssetProperties(asset); + + for (QName qname : intprops.keySet()) + { + QName prefixQname = qname.getPrefixedQName(ns); + Serializable propValue = intprops.get(qname); + try + { + propsX.put(prefixQname.toPrefixString(), propValue.toString()); + } + catch (NamespaceException ne) + { // No local name, only thing I can do is use the full namke + propsX.put(qname.toString(), propValue.toString()); + } + } + } + } + + return props; + } + +// /** +// * Save the properties please note some system properties are protected and cannot be updated. If you attempt to +// * update a protected property your request will be ignored. +// * @param properties +// */ +// public void save() +// { +// if(props != null) +// { +// /** +// * Need to map the to a +// */ +// NamespaceService ns = getNamespaceService(); +// Map newProps = new HashMap(props.size()); +// for (String key : props.keySet()) +// { +// String value = props.get(key); +// QName q = QName.resolveToQName(ns, key); +// newProps.put(q, value); +// } +// getAssetService().setAssetProperties(asset, newProps); +// } +// } + + /** * Submit this asset to staging * @param submitLabel * @param submitComment @@ -143,6 +250,14 @@ public class Asset } /** + * Delete this asset, after it has been deleted do not use this asset. + */ + public void deleteAsset() + { + getAssetService().deleteAsset(this.asset); + } + + /** * revert this asset */ public void revert() @@ -153,6 +268,49 @@ public class Asset } /** + * Get children of this asset, returns an empty array if there are no children. + * Only folders have children. + */ + public Asset[] getChildren() + { + Asset[] ret = new Asset[0]; + if(asset.isFolder()) + { + int i = 0; + List assets = getAssetService().listAssets(getSandbox().getSandboxRef(), asset.getPath(), true); + ret = new Asset[assets.size()]; + for(AssetInfo asset : assets) + { + ret[i++]=new Asset(sandbox, asset); + } + } + return ret; + } + + /** + * create a new file with the specified properties and content. + * @param name the name of the file + * @param stringContent the content of the file. Can be null. + */ + public void createFile(String name, String stringContent) + { + ContentWriter writer = getAssetService().createFile(getSandbox().getSandboxRef(), asset.getPath(), name, null); + if(stringContent != null) + { + writer.putContent(stringContent); + } + } + + /** + * create a new folder + * @param name the name of the new folder + */ + public void createFolder(String name) + { + getAssetService().createFolder(getSandbox().getSandboxRef(), asset.getPath(), name, null); + } + + /** * Get the parent sandbox which contains this asset * @return the parent sandbox which contains this asset */ @@ -161,8 +319,29 @@ public class Asset return this.sandbox; } + /** + * @return + */ private SandboxService getSandboxService() { return getSandbox().getWebproject().getWebProjects().getSandboxService(); } + + /** + * Get the asset service + * @return the asset service + */ + private AssetService getAssetService() + { + return getSandbox().getWebproject().getWebProjects().getAssetService(); + } + + /** + * Get the asset service + * @return the asset service + */ + private NamespaceService getNamespaceService() + { + return getSandbox().getWebproject().getWebProjects().getNamespaceService(); + } } diff --git a/source/java/org/alfresco/wcm/sandbox/script/Sandbox.java b/source/java/org/alfresco/wcm/sandbox/script/Sandbox.java index c27b402bc0..02859c55c2 100644 --- a/source/java/org/alfresco/wcm/sandbox/script/Sandbox.java +++ b/source/java/org/alfresco/wcm/sandbox/script/Sandbox.java @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.util.ISO8601DateFormat; import org.alfresco.wcm.asset.AssetInfo; import org.alfresco.wcm.asset.AssetService; @@ -277,28 +276,37 @@ public class Sandbox implements Serializable /** * Get the specified asset (Either folder or file) * @param path the full path e.g. /www/web_apps/ROOT/index.html - * @return the asset + * @return the asset or null if it does not exist */ public Asset getAsset(String path) { AssetService as = getAssetService(); AssetInfo item = as.getAsset(getSandboxRef(), path); - Asset newAsset = new Asset(this, item); - return newAsset; + if (item != null) + { + Asset newAsset = new Asset(this, item); + return newAsset; + } + return null; } /** * Get the specified asset with a path relative to the specified web app. * @param path e.g. index.html * @param webApp e.g. ROOT - * @return the asset + * @return the asset or null if it does not exist */ public Asset getAssetWebApp(String webApp, String path) { AssetService as = getAssetService(); AssetInfo item = as.getAssetWebApp(getSandboxRef(), webApp, path); - Asset newAsset = new Asset(this, item); - return newAsset; + if (item != null) + { + Asset newAsset = new Asset(this, item); + return newAsset; + } + return null; + } /** diff --git a/source/java/org/alfresco/wcm/util/WCMUtil.java b/source/java/org/alfresco/wcm/util/WCMUtil.java index 44ca9e465a..e46327a600 100644 --- a/source/java/org/alfresco/wcm/util/WCMUtil.java +++ b/source/java/org/alfresco/wcm/util/WCMUtil.java @@ -36,7 +36,9 @@ import org.alfresco.mbeans.VirtServerRegistry; import org.alfresco.model.WCMAppModel; import org.alfresco.repo.domain.PropertyValue; import org.alfresco.service.cmr.avm.AVMBadArgumentException; +import org.alfresco.service.cmr.avm.AVMNotFoundException; import org.alfresco.service.cmr.avm.AVMService; +import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -45,6 +47,8 @@ import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.ParameterCheck; import org.alfresco.util.VirtServerUtils; import org.alfresco.wcm.sandbox.SandboxConstants; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** @@ -57,6 +61,8 @@ import org.alfresco.wcm.sandbox.SandboxConstants; */ public class WCMUtil { + private static Log logger = LogFactory.getLog(WCMUtil.class); + /** * Extracts the sandbox store id from the avm path * @@ -478,6 +484,29 @@ public class WCMUtil : null); } + public static NodeRef getWebProjectNodeFromWebProjectStore(AVMService avmService, String wpStoreId) + { + NodeRef wpNodeRef = null; + + String stagingStoreId = wpStoreId; // note: equivalent to WCMUtil.buildStagingStoreName(wpStoreId) + + try + { + PropertyValue pValue = avmService.getStoreProperty(stagingStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF); + + if (pValue != null) + { + wpNodeRef = (NodeRef)pValue.getValue(DataTypeDefinition.NODE_REF); + } + } + catch (AVMNotFoundException nfe) + { + logger.warn(wpStoreId + " is not a web project: " + nfe); + } + + return wpNodeRef; + } + /** * Converts the provided path to an absolute path within the avm. * diff --git a/source/java/org/alfresco/wcm/webproject/WebProjectService.java b/source/java/org/alfresco/wcm/webproject/WebProjectService.java index 4991e4906c..0a513231f9 100644 --- a/source/java/org/alfresco/wcm/webproject/WebProjectService.java +++ b/source/java/org/alfresco/wcm/webproject/WebProjectService.java @@ -75,7 +75,7 @@ public interface WebProjectService * @param absoluteAVMPath the AVM path from which to determine the Web Project * @return NodeRef the web project node ref for the path or null if it could not be determined */ - public NodeRef findWebProjectNodeFromPath(String absoluteAVMPath); + public NodeRef getWebProjectNodeFromPath(String absoluteAVMPath); /** * Returns the Web Project for the given AVM store name (sandbox store id) @@ -83,7 +83,7 @@ public interface WebProjectService * @param storeName the AVM store name (sandbox store id) from which to determine the Web Project * @return NodeRef the web project node ref for the path or null if it could not be determined */ - public NodeRef findWebProjectNodeFromStore(String storeName); + public NodeRef getWebProjectNodeFromStore(String storeName); /** * List the available web projects for the current user diff --git a/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java b/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java index a2b05014e4..3a97f96413 100644 --- a/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java +++ b/source/java/org/alfresco/wcm/webproject/WebProjectServiceImpl.java @@ -66,7 +66,6 @@ import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.DNSNameMangler; import org.alfresco.util.ParameterCheck; -import org.alfresco.wcm.sandbox.SandboxConstants; import org.alfresco.wcm.sandbox.SandboxFactory; import org.alfresco.wcm.sandbox.SandboxInfo; import org.alfresco.wcm.util.WCMUtil; @@ -269,7 +268,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void createWebApp(String wpStoreId, String webAppName, String webAppDescription) { - createWebApp(findWebProjectNodeFromStore(wpStoreId), webAppName, webAppDescription); + createWebApp(getWebProjectNodeFromStore(wpStoreId), webAppName, webAppDescription); } /* (non-Javadoc) @@ -326,7 +325,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public List listWebApps(String wpStoreId) { - return listWebApps(findWebProjectNodeFromStore(wpStoreId)); + return listWebApps(getWebProjectNodeFromStore(wpStoreId)); } /* (non-Javadoc) @@ -349,7 +348,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void deleteWebApp(String wpStoreId, String webAppName) { - deleteWebApp(findWebProjectNodeFromStore(wpStoreId), webAppName); + deleteWebApp(getWebProjectNodeFromStore(wpStoreId), webAppName); } /* (non-Javadoc) @@ -477,7 +476,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public boolean isWebProject(String wpStoreId) { - NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId); + NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId); if (wpNodeRef == null) { return false; @@ -513,7 +512,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService WebProjectInfo result = null; // Get the web project node - NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId); + NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId); if (wpNodeRef != null) { // Create the web project info @@ -554,7 +553,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void updateWebProject(WebProjectInfo wpInfo) { - NodeRef wpNodeRef = findWebProjectNodeFromStore(wpInfo.getStoreId()); + NodeRef wpNodeRef = getWebProjectNodeFromStore(wpInfo.getStoreId()); if (wpNodeRef == null) { throw new AlfrescoRuntimeException("Cannot update web project '" + wpInfo.getStoreId() + "' because it does not exist."); @@ -584,7 +583,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void deleteWebProject(String wpStoreId) { - NodeRef wpNodeRef = findWebProjectNodeFromStore(wpStoreId); + NodeRef wpNodeRef = getWebProjectNodeFromStore(wpStoreId); if (wpNodeRef != null) { deleteWebProject(wpNodeRef); @@ -676,20 +675,9 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService /* (non-Javadoc) * @see org.alfresco.wcm.WebProjectService#isContentManager(java.lang.String, java.lang.String) */ - public boolean isContentManager(String storeName, String userName) + public boolean isContentManager(String wpStoreId, String userName) { - String wpStoreId = WCMUtil.getWebProjectStoreId(storeName); - PropertyValue pValue = avmService.getStoreProperty(wpStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF); - - if (pValue != null) - { - NodeRef wpNodeRef = (NodeRef) pValue.getValue(DataTypeDefinition.NODE_REF); - return isContentManager(wpNodeRef, userName); - } - else - { - return false; - } + return isContentManager(getWebProjectNodeFromStore(wpStoreId), userName); } /* (non-Javadoc) @@ -712,20 +700,11 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService /* (non-Javadoc) * @see org.alfresco.wcm.webproject.WebProjectService#isWebUser(java.lang.String, java.lang.String) */ - public boolean isWebUser(String storeName, String username) + public boolean isWebUser(String wpStoreId, String username) { - String wpStoreId = WCMUtil.getWebProjectStoreId(storeName); - PropertyValue pValue = avmService.getStoreProperty(wpStoreId, SandboxConstants.PROP_WEB_PROJECT_NODE_REF); + ParameterCheck.mandatoryString("username", username); - if (pValue != null) - { - NodeRef wpNodeRef = (NodeRef) pValue.getValue(DataTypeDefinition.NODE_REF); - return isWebUser(wpNodeRef, username); - } - else - { - return false; - } + return isWebUser(getWebProjectNodeFromStore(wpStoreId), username); } /* (non-Javadoc) @@ -733,8 +712,9 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public boolean isWebUser(NodeRef wpNodeRef, String userName) { - String userRole = getWebUserRoleImpl(wpNodeRef, userName); - return (userRole != null); + ParameterCheck.mandatoryString("userName", userName); + + return (getWebUserRoleImpl(wpNodeRef, userName) != null); } /* (non-Javadoc) @@ -750,7 +730,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public Map listWebUsers(String wpStoreId) { - return listWebUsers(findWebProjectNodeFromStore(wpStoreId)); + return listWebUsers(getWebProjectNodeFromStore(wpStoreId)); } /* (non-Javadoc) @@ -774,7 +754,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public String getWebUserRole(String wpStoreId, String userName) { - return getWebUserRole(findWebProjectNodeFromStore(wpStoreId), userName); + return getWebUserRole(getWebProjectNodeFromStore(wpStoreId), userName); } /* (non-Javadoc) @@ -782,6 +762,8 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public String getWebUserRole(NodeRef wpNodeRef, String userName) { + ParameterCheck.mandatoryString("userName", userName); + String userRole = null; if (! isWebProject(wpNodeRef)) @@ -860,72 +842,19 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService /* (non-Javadoc) * @see org.alfresco.wcm.webproject.WebProjectService#findWebProjectNodeFromPath(java.lang.String) */ - public NodeRef findWebProjectNodeFromPath(String absoluteAVMPath) + public NodeRef getWebProjectNodeFromPath(String absoluteAVMPath) { - return findWebProjectNodeFromStore(WCMUtil.getWebProjectStoreIdFromPath(absoluteAVMPath)); + return getWebProjectNodeFromStore(WCMUtil.getWebProjectStoreIdFromPath(absoluteAVMPath)); } /*(non-Javadoc) - * @see org.alfresco.wcm.webproject.WebProjectService#findWebProjectNodeFromStore(java.lang.String) + * @see org.alfresco.wcm.webproject.WebProjectService#getWebProjectNodeFromStore(java.lang.String) */ - public NodeRef findWebProjectNodeFromStore(String wpStoreId) + public NodeRef getWebProjectNodeFromStore(String wpStoreId) { ParameterCheck.mandatoryString("wpStoreId", wpStoreId); - if (wpStoreId.indexOf(WCMUtil.STORE_SEPARATOR) != -1) - { - throw new IllegalArgumentException("Unexpected web project store id '"+wpStoreId+"' - should not contain '"+WCMUtil.STORE_SEPARATOR+"'"); - } - - if (wpStoreId.indexOf(":") != -1) - { - throw new IllegalArgumentException("Unexpected web project store id '"+wpStoreId+"' - should not contain ':'"); - } - - // construct the query - String path = getWebProjectsPath() + "/*"; - String query = "PATH:\"/" + path + "\" AND @wca\\:avmstore:\"" + wpStoreId + "\""; - - NodeRef webProjectNode = null; - ResultSet results = null; - try - { - // execute the query - results = searchService.query(WEBPROJECT_STORE, SearchService.LANGUAGE_LUCENE, query); - - // WCM-810: - // the 'avmstore' property was not defined as an identifier in the model (before 2.2) - // which means it may get tokenised which in turn means that 'test' and 'test-site' - // would get returned by the query above even though it's an exact match query, - // we therefore need to go through the results and check names if there is more - // than one result although this shouldn't happen anymore as the - // AVMStorePropertyTokenisationPatch will have reindexed the wca:avmstore property - if (results.length() == 1) - { - webProjectNode = results.getNodeRef(0); - } - else if (results.length() > 1) - { - for (NodeRef node : results.getNodeRefs()) - { - String nodeStoreName = (String)nodeService.getProperty(node, WCMAppModel.PROP_AVMSTORE); - if (nodeStoreName.equals(wpStoreId)) - { - webProjectNode = node; - break; - } - } - } - } - finally - { - if (results != null) - { - results.close(); - } - } - - return webProjectNode; + return WCMUtil.getWebProjectNodeFromWebProjectStore(avmService, wpStoreId); } /* (non-Javadoc) @@ -933,7 +862,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void inviteWebUsersGroups(String wpStoreId, Map userGroupRoles) { - inviteWebUsersGroups(findWebProjectNodeFromStore(wpStoreId), userGroupRoles, false); + inviteWebUsersGroups(getWebProjectNodeFromStore(wpStoreId), userGroupRoles, false); } /* (non-Javadoc) @@ -941,7 +870,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void inviteWebUsersGroups(String wpStoreId, Map userGroupRoles, boolean autoCreateAuthorSandbox) { - inviteWebUsersGroups(findWebProjectNodeFromStore(wpStoreId), userGroupRoles, autoCreateAuthorSandbox); + inviteWebUsersGroups(getWebProjectNodeFromStore(wpStoreId), userGroupRoles, autoCreateAuthorSandbox); } public void inviteWebUsersGroups(NodeRef wpNodeRef, Map userGroupRoles, boolean autoCreateAuthorSandbox) @@ -1069,7 +998,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void inviteWebUser(String wpStoreId, String userAuth, String role) { - inviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, role, false); + inviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, role, false); } /* (non-Javadoc) @@ -1077,7 +1006,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void inviteWebUser(String wpStoreId, String userAuth, String role, boolean autoCreateAuthorSandbox) { - inviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, role, autoCreateAuthorSandbox); + inviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, role, autoCreateAuthorSandbox); } /* (non-Javadoc) @@ -1183,7 +1112,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void uninviteWebUser(String wpStoreId, String userAuth) { - uninviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, false); + uninviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, false); } /* (non-Javadoc) @@ -1191,7 +1120,7 @@ public class WebProjectServiceImpl extends WCMUtil implements WebProjectService */ public void uninviteWebUser(String wpStoreId, String userAuth, boolean autoDeleteAuthorSandbox) { - uninviteWebUser(findWebProjectNodeFromStore(wpStoreId), userAuth, autoDeleteAuthorSandbox); + uninviteWebUser(getWebProjectNodeFromStore(wpStoreId), userAuth, autoDeleteAuthorSandbox); } /* (non-Javadoc) diff --git a/source/java/org/alfresco/wcm/webproject/script/WebProjects.java b/source/java/org/alfresco/wcm/webproject/script/WebProjects.java index e2736579c3..b4db984fcb 100644 --- a/source/java/org/alfresco/wcm/webproject/script/WebProjects.java +++ b/source/java/org/alfresco/wcm/webproject/script/WebProjects.java @@ -30,6 +30,7 @@ import org.alfresco.repo.jscript.BaseScopableProcessorExtension; import org.alfresco.repo.model.Repository; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.NamespaceService; import org.alfresco.wcm.asset.AssetService; import org.alfresco.wcm.sandbox.SandboxService; import org.alfresco.wcm.webproject.WebProjectInfo; @@ -55,6 +56,9 @@ public class WebProjects extends BaseScopableProcessorExtension /** The asset service */ private AssetService assetService; + /** The namespace service */ + private NamespaceService namespaceService; + /** * Sets the Service Registry * @@ -110,6 +114,21 @@ public class WebProjects extends BaseScopableProcessorExtension return this.assetService; } + /** + * Set the alfresco namespace service + * + * @param namespace service + */ + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + public NamespaceService getNamespaceService() + { + return this.namespaceService; + } + /** * create web project * @param name