diff --git a/config/alfresco/site-services-context.xml b/config/alfresco/site-services-context.xml index a743a85270..132d8344d1 100644 --- a/config/alfresco/site-services-context.xml +++ b/config/alfresco/site-services-context.xml @@ -18,6 +18,7 @@ + @@ -30,6 +31,7 @@ siteService + diff --git a/source/java/org/alfresco/repo/site/SiteService.java b/source/java/org/alfresco/repo/site/SiteService.java index 6fad738dd8..818a7b91a7 100644 --- a/source/java/org/alfresco/repo/site/SiteService.java +++ b/source/java/org/alfresco/repo/site/SiteService.java @@ -3,6 +3,8 @@ package org.alfresco.repo.site; import java.util.List; import java.util.Map; +import org.alfresco.service.cmr.repository.NodeRef; + /** * Site service fundamental API. *

@@ -105,6 +107,23 @@ public interface SiteService void removeMembership(String shortName, String userName); - + /** + * Gets (or creates, if it doesn't exist) the "container" folder for the specified + * component. + * + * @param shortName short name of site + * @param componentId component id + * @return noderef of folder container + */ + NodeRef getContainer(String shortName, String componentId); + + /** + * Determines if a "container" folder for the specified component exists. + * + * @param shortName short name of site + * @param componentId component id + * @return true => "container" folder exists for component + */ + boolean hasContainer(String shortName, String componentId); } diff --git a/source/java/org/alfresco/repo/site/SiteServiceImpl.java b/source/java/org/alfresco/repo/site/SiteServiceImpl.java index 92683fc0ba..1f73791585 100644 --- a/source/java/org/alfresco/repo/site/SiteServiceImpl.java +++ b/source/java/org/alfresco/repo/site/SiteServiceImpl.java @@ -37,6 +37,9 @@ import org.alfresco.repo.activities.ActivityType; import org.alfresco.repo.security.authentication.AuthenticationComponent; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.cmr.activities.ActivityService; +import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -74,6 +77,7 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic private static final String ACTIVITY_TOOL = "siteService"; private NodeService nodeService; + private FileFolderService fileFolderService; private SearchService searchService; private PermissionService permissionService; private ActivityService activityService; @@ -86,6 +90,11 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic this.nodeService = nodeService; } + public void setFileFolderService(FileFolderService fileFolderService) + { + this.fileFolderService = fileFolderService; + } + public void setSearchService(SearchService searchService) { this.searchService = searchService; @@ -452,6 +461,93 @@ public class SiteServiceImpl extends AbstractLifecycleBean implements SiteServic } } } + + /* (non-Javadoc) + * @see org.alfresco.repo.site.SiteService#getContainer(java.lang.String) + */ + public NodeRef getContainer(String shortName, String componentId) + { + if (componentId == null || componentId.length() ==0) + { + throw new AlfrescoRuntimeException("Component id not provided"); + } + + // retrieve site + NodeRef siteNodeRef = getSiteNodeRef(shortName); + if (siteNodeRef == null) + { + throw new AlfrescoRuntimeException("Site " + shortName + " does not exist."); + } + + // retrieve component folder within site + // NOTE: component id is used for folder name + NodeRef containerNodeRef = null; + try + { + containerNodeRef = findContainer(siteNodeRef, componentId); + } + catch(FileNotFoundException e) + { + // create component folder + FileInfo fileInfo = fileFolderService.create(siteNodeRef, componentId, ContentModel.TYPE_FOLDER); + containerNodeRef = fileInfo.getNodeRef(); + } + + return containerNodeRef; + } + + /* (non-Javadoc) + * @see org.alfresco.repo.site.SiteService#hasContainer(java.lang.String) + */ + public boolean hasContainer(String shortName, String componentId) + { + if (componentId == null || componentId.length() ==0) + { + throw new AlfrescoRuntimeException("Component id not provided"); + } + + // retrieve site + NodeRef siteNodeRef = getSiteNodeRef(shortName); + if (siteNodeRef == null) + { + throw new AlfrescoRuntimeException("Site " + shortName + " does not exist."); + } + + // retrieve component folder within site + // NOTE: component id is used for folder name + boolean hasContainer = false; + try + { + findContainer(siteNodeRef, componentId); + hasContainer = true; + } + catch(FileNotFoundException e) + { + } + + return hasContainer; + } + + /** + * Locate site "container" folder for component + * + * @param siteNodeRef site + * @param componentId component id + * @return "container" node ref, if it exists + * @throws FileNotFoundException + */ + private NodeRef findContainer(NodeRef siteNodeRef, String componentId) + throws FileNotFoundException + { + List paths = new ArrayList(1); + paths.add(componentId); + FileInfo fileInfo = fileFolderService.resolveNamePath(siteNodeRef, paths); + if (!fileInfo.isFolder()) + { + throw new AlfrescoRuntimeException("Site container " + fileInfo.getName() + " does not refer to a folder "); + } + return fileInfo.getNodeRef(); + } private String getActivityData(String userName, String role) { diff --git a/source/java/org/alfresco/repo/site/SiteServiceImplTest.java b/source/java/org/alfresco/repo/site/SiteServiceImplTest.java index 63b3681245..172dae6ab8 100644 --- a/source/java/org/alfresco/repo/site/SiteServiceImplTest.java +++ b/source/java/org/alfresco/repo/site/SiteServiceImplTest.java @@ -31,6 +31,7 @@ import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.jscript.ClasspathScriptLocation; import org.alfresco.repo.security.authentication.AuthenticationComponent; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.ScriptLocation; import org.alfresco.service.cmr.repository.ScriptService; import org.alfresco.util.BaseAlfrescoSpringTest; @@ -334,6 +335,30 @@ public class SiteServiceImplTest extends BaseAlfrescoSpringTest // TODO .. try and remove the only site manager and should get a failure } + public void testContainer() + { + // Create a couple of sites as user one + SiteInfo siteInfo = this.siteService.createSite(TEST_SITE_PRESET, "testContainer", TEST_TITLE, TEST_DESCRIPTION, true); + + boolean hasContainer = this.siteService.hasContainer(siteInfo.getShortName(), "folder.component"); + assertFalse(hasContainer); + NodeRef container1 = this.siteService.getContainer(siteInfo.getShortName(), "folder.component"); + assertNotNull(container1); + NodeRef container2 = this.siteService.getContainer(siteInfo.getShortName(), "folder.component"); + assertNotNull(container2); + assertTrue(container1.equals(container2)); + boolean hasContainer2 = this.siteService.hasContainer(siteInfo.getShortName(), "folder.component"); + assertTrue(hasContainer2); + boolean hasContainer3 = this.siteService.hasContainer(siteInfo.getShortName(), "folder.component2"); + assertFalse(hasContainer3); + NodeRef container3 = this.siteService.getContainer(siteInfo.getShortName(), "folder.component2"); + assertNotNull(container3); + assertFalse(container1.equals(container3)); + boolean hasContainer4 = this.siteService.hasContainer(siteInfo.getShortName(), "folder.component2"); + assertTrue(hasContainer4); + } + + // == Test the JavaScript API == public void testJSAPI() throws Exception diff --git a/source/java/org/alfresco/repo/site/script/ScriptSiteService.java b/source/java/org/alfresco/repo/site/script/ScriptSiteService.java index 5eb37104f6..af02930f06 100644 --- a/source/java/org/alfresco/repo/site/script/ScriptSiteService.java +++ b/source/java/org/alfresco/repo/site/script/ScriptSiteService.java @@ -28,9 +28,9 @@ import java.util.ArrayList; import java.util.List; import org.alfresco.repo.jscript.BaseScopableProcessorExtension; -import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.site.SiteInfo; import org.alfresco.repo.site.SiteService; +import org.alfresco.service.ServiceRegistry; /** @@ -40,8 +40,21 @@ import org.alfresco.repo.site.SiteService; */ public class ScriptSiteService extends BaseScopableProcessorExtension { + /** Service Registry */ + private ServiceRegistry serviceRegistry; + /** The site service */ private SiteService siteService; + + /** + * Sets the Service Registry + * + * @param serviceRegistry + */ + public void setServiceRegistry(ServiceRegistry serviceRegistry) + { + this.serviceRegistry = serviceRegistry; + } /** * Set the site service @@ -61,14 +74,14 @@ public class ScriptSiteService extends BaseScopableProcessorExtension * @param sitePreset site preset * @param shortName site short name * @param title site title - * @param descripion site description + * @param description site description * @param isPublic whether the site is public or not * @return Site the created site */ - public Site createSite(String sitePreset, String shortName, String title, String descripion, boolean isPublic) + public Site createSite(String sitePreset, String shortName, String title, String description, boolean isPublic) { - SiteInfo siteInfo = this.siteService.createSite(sitePreset, shortName, title, descripion, isPublic); - return new Site(this.siteService, siteInfo); + SiteInfo siteInfo = this.siteService.createSite(sitePreset, shortName, title, description, isPublic); + return new Site(siteInfo, this.serviceRegistry, this.siteService, getScope()); } /** @@ -87,7 +100,7 @@ public class ScriptSiteService extends BaseScopableProcessorExtension List sites = new ArrayList(siteInfos.size()); for (SiteInfo siteInfo : siteInfos) { - sites.add(new Site(this.siteService, siteInfo)); + sites.add(new Site(siteInfo, this.serviceRegistry, this.siteService, getScope())); } return (Site[])sites.toArray(new Site[sites.size()]); } @@ -106,7 +119,7 @@ public class ScriptSiteService extends BaseScopableProcessorExtension SiteInfo siteInfo = this.siteService.getSite(shortName); if (siteInfo != null) { - site = new Site(this.siteService, siteInfo); + site = new Site(siteInfo, this.serviceRegistry, this.siteService, getScope()); } return site; } diff --git a/source/java/org/alfresco/repo/site/script/Site.java b/source/java/org/alfresco/repo/site/script/Site.java index ed99974ba1..727b326b4d 100644 --- a/source/java/org/alfresco/repo/site/script/Site.java +++ b/source/java/org/alfresco/repo/site/script/Site.java @@ -27,9 +27,14 @@ package org.alfresco.repo.site.script; import java.io.Serializable; import java.util.Map; +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.repo.jscript.ScriptableHashMap; import org.alfresco.repo.site.SiteInfo; import org.alfresco.repo.site.SiteService; +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.repository.NodeRef; +import org.mozilla.javascript.Scriptable; /** * Site JavaScript object @@ -38,14 +43,22 @@ import org.alfresco.repo.site.SiteService; */ public class Site implements Serializable { + // TODO: DC - Should Site derive from ScriptNode? + /** Serializable serial verion UID */ private static final long serialVersionUID = 8013569574120957923L; /** Site information */ private SiteInfo siteInfo; + /** Services Registry */ + private ServiceRegistry serviceRegistry; + /** Site service */ private SiteService siteService; + + /** Scriptable */ + private Scriptable scope; /** Indicates whether there are any outstanding changes that need to be saved */ private boolean isDirty = false; @@ -55,10 +68,12 @@ public class Site implements Serializable * * @param siteInfo site information */ - /*package*/ Site(SiteService siteService, SiteInfo siteInfo) + /*package*/ Site(SiteInfo siteInfo, ServiceRegistry serviceRegistry, SiteService siteService, Scriptable scope) { + this.serviceRegistry = serviceRegistry; this.siteService = siteService; this.siteInfo = siteInfo; + this.scope = scope; } /** @@ -242,4 +257,48 @@ public class Site implements Serializable { this.siteService.removeMembership(getShortName(), userName); } + + /** + * Gets (or creates) the "container" folder for the specified component id + * + * @param componentId + * @return node representing the "container" folder + */ + public ScriptNode getContainer(String componentId) + { + ScriptNode container = null; + try + { + NodeRef containerNodeRef = this.siteService.getContainer(getShortName(), componentId); + container = new ScriptNode(containerNodeRef, this.serviceRegistry, this.scope); + } + catch(AlfrescoRuntimeException e) + { + // NOTE: not good practice to catch all, but in general we're not throwing exceptions + // into the script layer + } + return container; + } + + /** + * Determine if the "container" folder for the specified component exists + * + * @param componentId + * @return true => "container" folder exists + */ + public boolean hasContainer(String componentId) + { + boolean hasContainer = false; + try + { + hasContainer = this.siteService.hasContainer(getShortName(), componentId); + } + catch(AlfrescoRuntimeException e) + { + // NOTE: not good practice to catch all, but in general we're not throwing exceptions + // into the script layer + } + return hasContainer; + } + } diff --git a/source/java/org/alfresco/repo/site/script/test_siteService.js b/source/java/org/alfresco/repo/site/script/test_siteService.js index 9aa5499f2f..6ac9b4d05b 100644 --- a/source/java/org/alfresco/repo/site/script/test_siteService.js +++ b/source/java/org/alfresco/repo/site/script/test_siteService.js @@ -78,7 +78,26 @@ function testMembership() } +function testContainer() +{ + var site = siteService.getSite("siteShortName"); + test.assertNotNull(site); + + var hasContainer = site.hasContainer("folder.component"); + test.assertFalse(hasContainer); + + var container = site.getContainer("folder.component"); + test.assertNotNull(container); + var hasContainer2 = site.hasContainer("folder.component"); + test.assertTrue(hasContainer2); + var container2 = site.getContainer("folder.component"); + test.assertNotNull(container2); + test.assertEquals(container, container2); +} + + // Execute test's testCRUD(); testListSites(); -testMembership(); \ No newline at end of file +testMembership(); +testContainer(); \ No newline at end of file