在露天动态创建空间/文件夹的javascript无法正常工作



我目前正在Oracle Linux 6 64位虚拟机上使用Alfresco 4.0.d社区版(我也在Alfresco4.0.c社区版上尝试过),使用Firefox作为浏览器。

最近,我一直在尝试创建一个脚本,该脚本可以通过一条规则执行,该规则将在新项目进入空间/文件夹时动态创建子文件夹。

从本质上讲,假设您有一个新创建的名为fileOne的内容。此文件将位于名为mainFolder的空间中,当在文件上运行规则以执行脚本时,脚本将根据文件的标题作者值查看是否存在子文件夹。否则,它将根据-->子文件夹的title值-->和author值子文件夹,在mainFolder中创建子文件夹。然后我希望将该内容/文件移到现有或新创建的子文件夹中。

最终我想要的东西看起来像:

Space: mainFolder
|---> Content: fileOne --> Properties: Name, Title, Author
|---> Space: Title
      |---> Space: Author
            |---> Content: fileOne --> Properties: Name, Title, Author 

下面是脚本。。。

function main()
{
    //mainFolder space/folder MUST exist under companyhome.
    var rootSpaceName = companyhome.childByNamePath("mainFolder");
    if(rootSpaceName == null)
    { 
        logger.log("Company Home/mainFolder does not exist, so we have nothing to do.");
        return;
    }
    else
    {
        logger.log("Company Home/mainFolder exists, so carry on our process.");
        var childList = rootSpaceName.children;
        var count = childList.length;
        var seconds = new Date().getTime() / 1000;
        if(count == 0)
        {
            logger.log("Company Home/mainFolder does not have child, nothing to do.");
            return;
        }
        else
        {
            for(var i = 0; i < count; i++)
            {
                // File Title MUST exist.
                var childTitle = childList[i].properties.title;
                if(childTitle == null)
                {
                    childTitle = "New Title " + seconds;
                }
                // File Author MUST exist.
                var childAuthor = childList[i].properties.author;
                if(childAuthor == null)
                {
                    childAuthor = "New Author " + seconds;
                }
                var child = childList[i];
                logger.log("This child is: " + child);
                if(child.isContainer == false)
                {
                    for(var j = 0; j < count; j++)
                    {
                        var newChildName = childList[j].properties.name;
                        logger.log("New child name: " + newChildName);
                        var newChild = childList[j];
                        if((newChild.isContainer == true) && (childTitle == newChildName))
                        {
                            var newSpaceName = rootSpaceName.childByNamePath(newChildName);
                            var newChildList = newSpaceName.children;
                            var newCount = newChildList.length;
                            for(var k = 0; k < newCount; k++)
                            {
                                var newNewChildName = newChildList[k].properties.name;
                                var newNewChildAuthor = newChildList[k].properties.author;
                                var newNewChild = newChildList[k];
                                if((newNewChild.isContainer == true) && (newNewChildAuthor == childAuthor))
                                {
                                    var currentSpace = newSpaceName.childByNamePath(newNewChildName);
                                    child.move(currentSpace);
                                }
                            }
                        }
                        else
                        {
                            // If title folder is already created, not need to create again.
                            var newSpaceName = companyhome.childByNamePath("mainFolder/" + childTitle);
                            if(newSpaceName == null)
                            {
                                newSpaceName = rootSpaceName.createFolder(childTitle);
                                logger.log("mainFolder/" + childTitle + " is created.");
                            }
                            // If author folder is already created, not need to create again.
                            var newNewSpaceName = companyhome.childByNamePath("mainFolder/" + childTitle + "/" + childAuthor);
                            if(newNewSpaceName == null)
                            {
                                newNewSpaceName = newSpaceName.createFolder(childAuthor);
                                logger.log("mainFolder/" + childTitle + "/" + childAuthor + " is created.");
                            }
                            child.move(newNewSpaceName);
                            logger.log("Moving file " + child.properties.name);
                        }
                    }
                }
            }
        }
    }
    return;
}
main();

因此,为了测试这一点,我一步一步地做:

  1. 我单击公司主页
  2. 我单击创建新建空间
  3. 然后,我创建了一个名为mainFolder的空间(位于公司主页下)
  4. 然后,我单击新创建的文件夹,然后单击更多操作管理内容规则
  5. 然后单击创建规则
    5a。当它告诉我选择一个条件时,我选择所有项目,然后单击添加到列表并点击下一步

    5b。在它现在告诉我选择操作的地方,我选择执行脚本,然后单击设置值并添加。这允许我选择名为new-create-folders.js的脚本,我之前已将其添加到数据字典中的脚本br>5c。在这里,当它要求我输入类型时,我选择项目被更新。然后,我输入一个标题,如创建文件夹规则。最后,我在后台检查运行规则,然后点击下一步

    5d。现在,我单击完成来完成我的规则
  6. 现在创建了规则,我单击创建新建内容

    6a。我给我的内容起了一个类似name001的名字,然后我点击下一个,然后我输入了一个像title001uthor001K

现在发生的事情让我感到困惑;它按照我的意愿创建了一个名为title001的子文件夹,并在该子文件夹中创建了另一个名称为author001ame001文件夹下,还有一个名为新标题1346102873.393新标题134610 2873.393的新子文件夹,其中一个文件夹名为新作者1346102873.3 93ainFolder添加了一段内容就创建了这个文件夹?此外,现在文件夹已经创建,该规则看起来也已从mainFolder中删除,即不再有任何规则应用于该文件夹。当我返回并在mainFolder上再次创建规则时,我会得到错误:Failed to create Rule due to error: null。下面是我在日志文件中得到的错误。。。

Alfresco日志的输出/错误

17:27:51,373 DEBUG [org.alfresco.repo.jscript.RhinoScriptProcessor] Imports resolved, adding resource '_root
17:27:53,389 DEBUG [org.alfresco.repo.jscript.ScriptLogger] Company Home/mainFolder exists, so carry on our process.
17:27:53,400 DEBUG [org.alfresco.repo.jscript.ScriptLogger] This child is: Node Type: {http://www.alfresco.org/model/content/1.0}systemfolder, Node Aspects: [{http://www.alfresco.org/model/content/1.0}auditable, {http://www.alfresco.org/model/system/1.0}referenceable, {http://www.alfresco.org/model/system/1.0}localized]
17:27:53,400 DEBUG [org.alfresco.repo.jscript.ScriptLogger] New child name: b8ea2cb0-6fb6-481e-bb7b-d5364d9c509e
17:27:53,422 DEBUG [org.alfresco.repo.jscript.ScriptLogger] mainFolder/New Title 1346102873.393 is created.
17:27:53,439 DEBUG [org.alfresco.repo.jscript.ScriptLogger] mainFolder/New Title 1346102873.393/New Author 1346102873.393 is created.
17:27:53,498 DEBUG [org.alfresco.repo.jscript.ScriptLogger] Moving file b8ea2cb0-6fb6-481e-bb7b-d5364d9c509e
17:27:53,499 DEBUG [org.alfresco.repo.jscript.ScriptLogger] New child name: name001
17:27:53,523 DEBUG [org.alfresco.repo.jscript.ScriptLogger] Moving file b8ea2cb0-6fb6-481e-bb7b-d5364d9c509e
17:27:53,524 DEBUG [org.alfresco.repo.jscript.ScriptLogger] This child is: Node Type: {http://www.alfresco.org/model/content/1.0}content, Node Aspects: [{http://www.alfresco.org/model/content/1.0}auditable, {http://www.alfresco.org/model/system/1.0}referenceable, {http://www.alfresco.org/model/content/1.0}titled, {http://www.alfresco.org/model/content/1.0}author, {http://www.alfresco.org/model/system/1.0}localized, {http://www.alfresco.org/model/application/1.0}inlineeditable]
17:27:53,524 DEBUG [org.alfresco.repo.jscript.ScriptLogger] New child name: b8ea2cb0-6fb6-481e-bb7b-d5364d9c509e
17:27:53,534 DEBUG [org.alfresco.repo.jscript.ScriptLogger] mainFolder/title001 is created.
17:27:53,546 DEBUG [org.alfresco.repo.jscript.ScriptLogger] mainFolder/title001/author001 is created.
17:27:53,561 DEBUG [org.alfresco.repo.jscript.ScriptLogger] Moving file name001
17:27:53,561 DEBUG [org.alfresco.repo.jscript.ScriptLogger] New child name: name001
17:27:53,577 DEBUG [org.alfresco.repo.jscript.ScriptLogger] Moving file name001
17:27:53,578 DEBUG [org.alfresco.repo.jscript.RhinoScriptProcessor] Time to execute script: 1976.9988ms
17:31:13,385 ERROR [org.alfresco.web.ui.common.Utils] Failed to create Rule due to error: null
java.lang.NullPointerException
    at org.alfresco.repo.rule.RuleServiceImpl.getLinkedToRuleNode(RuleServiceImpl.java:1516)
    at org.alfresco.repo.rule.RuleServiceImpl.isLinkedToRuleNode(RuleServiceImpl.java:1504)
    at org.alfresco.repo.rule.RuleServiceImpl.checkForLinkedRules(RuleServiceImpl.java:947)
    at org.alfresco.repo.rule.RuleServiceImpl.saveRule(RuleServiceImpl.java:740)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.alfresco.repo.security.permissions.impl.AlwaysProceedMethodInterceptor.invoke(AlwaysProceedMethodInterceptor.java:34)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.alfresco.repo.security.permissions.impl.ExceptionTranslatorMethodInterceptor.invoke(ExceptionTranslatorMethodInterceptor.java:46)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.alfresco.repo.audit.AuditMethodInterceptor.invoke(AuditMethodInterceptor.java:147)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy53.saveRule(Unknown Source)
    at org.alfresco.web.bean.rules.CreateRuleWizard.finishImpl(CreateRuleWizard.java:148)
    at org.alfresco.web.bean.dialog.BaseDialogBean$1.execute(BaseDialogBean.java:123)
    at org.alfresco.web.bean.dialog.BaseDialogBean$1.execute(BaseDialogBean.java:119)
    at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:388)
    at org.alfresco.web.bean.dialog.BaseDialogBean.finish(BaseDialogBean.java:129)
    at org.alfresco.web.bean.wizard.WizardManager.finish(WizardManager.java:593)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:61)
    at javax.faces.component.UICommand.broadcast(UICommand.java:151)
    at javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:115)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:191)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:105)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:80)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:143)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.alfresco.repo.web.filter.beans.SessionSynchronizedFilter.doFilter(SessionSynchronizedFilter.java:67)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.alfresco.web.app.servlet.AuthenticationFilter.doFilter(AuthenticationFilter.java:104)
    at sun.reflect.GeneratedMethodAccessor443.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.alfresco.repo.management.subsystems.ChainingSubsystemProxyFactory$1.invoke(ChainingSubsystemProxyFactory.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy238.doFilter(Unknown Source)
    at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:82)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.alfresco.repo.web.filter.beans.NullFilter.doFilter(NullFilter.java:68)
    at sun.reflect.GeneratedMethodAccessor443.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.alfresco.repo.management.subsystems.ChainingSubsystemProxyFactory$1.invoke(ChainingSubsystemProxyFactory.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy238.doFilter(Unknown Source)
    at org.alfresco.repo.web.filter.beans.BeanProxyFilter.doFilter(BeanProxyFilter.java:82)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.alfresco.web.app.servlet.GlobalLocalizationFilter.doFilter(GlobalLocalizationFilter.java:58)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:662)

有人知道为什么要创建额外的文件夹,为什么在对新创建的内容执行规则后要删除规则,为什么在它首次删除原始规则后我不能向文件夹添加新规则吗?

我在Alfresco论坛上发布了同一张海报上这个问题的答案。答案是,代码试图使用与文档相同的名称创建一个文件夹。节点在文件夹中的名称必须唯一,因此这是不允许的。

听起来您的规则运行了多次,并且被自己绊倒了。脚本本身执行的某些操作会导致它再次运行吗?

请检查您的规则是否未应用于子文件夹,不要在向导的条件部分选择"所有项目",而是尝试更具体的操作,例如所有内容项目。

实际上我认为问题应该是规则被多次触发,条件规则"所有项目"都在更新。因此,每个节点都会在存储库中收到一个更新,在有规则的空间内(可能还有子文件夹,我会检查一下),它会触发,并可能创建一个循环。您是否尝试过使用带有触发器"创建节点时"的规则?

更新:

因此,我尝试在Alfresco 3.4.7 Enteprise和4.0 Community x64上调试这两个版本(Linux和Windows)。

  • 我在Scripts目录中创建了一个名为js的文件Alfresco,/公司主页/数据字典
  • 然后,我在公司主页空间中创建了一个文件夹mainFolder
  • 我在文件夹mainFolder中上传了一个新的PDF文件
  • 然后,我对PDF文件执行了fs文件。因此,进入文档的详细视图,然后单击"运行操作"-"执行脚本"
  • 在那里,一切都很完美

所以最终,问题出在规则执行中,它触发了"所有项目",因此,当脚本创建具有标题名称的新文件夹时,它会递归触发。我试着用"只有PDF类型"的节点执行规则,它就像一个魅力!

希望这能帮助。。。

可能是您的要求mainFolder中存在的文件具有标题和作者字段。您想将文件移到title->author文件夹中。

就像那样mainFolder->文件名:file1,标题:Title 1,作者:author1

mainFolder->标题1->author1->file1

我尝试用我自己的代码编辑您的代码,并在露天社区4.0c中运行,在windows的共享端运行java脚本控制台。

在主文件夹中创建规则时

1) 选择条件

1.1类型或子类型的内容作为的选择条件

1.2内容设置条件值,不选中下面的复选框摘要是Item是"Content"的子类型

2) 选择操作执行与相同的脚本

3) 类型创建或插入项目

我之所以选择这些,是因为运行我们的代码会动态地创建文件夹。所以这个规则只适用于内容。除了取消选中后台执行规则外,其他的和您相同。如果创建的项目没有标题名称,则露天默认将项目名称作为标题。

上次更新的代码:

function main()
{
    //mainFolder space/folder MUST exist under companyhome.
    var rootSpaceName = companyhome.childByNamePath("mainFolder");
    if(rootSpaceName == null)
    { 
        logger.log("Company Home/mainFolder does not exist, so we have nothing to do.");
        return;
    }
    else
    {
        logger.log("Company Home/mainFolder exists, so carry on our process.");
        var childList = rootSpaceName.children;
        var count = childList.length;
        if(count == 0)
        {
            logger.log("Company Home/mainFolder does not have child, nothing to do.");
            return;
        }
        else
        {
            for(var i = 0; i < count; i++)
            {   
                var child = childList[i];
                logger.log("This child is: " + child);
                // If each of child is file
                if(child.isDocument)
                {
                    // Get title of file and
                    // If childTitle is null, we set DEFAULT value
                    var childTitle = childList[i].properties.title;
                    if(childTitle == null)
                    {
                        childTitle = "New Title";
                    }
                    else if(childTitle == child.properties.name)
                    {
                        childTitle = "Title " + childTitle;
                    }
                    // Get author of file.
                    // If childAuthor is null, we set DEFAULT value
                    var childAuthor = childList[i].properties.author;
                    if(childAuthor == null)
                    {
                        childAuthor = "New Author";
                    }
                    logger.log("Original Title :" + child.properties.title + "tAuthor :" + child.properties.author);
                    logger.log("Setting Title :" + childTitle + "tAuthor :" + childAuthor);
                    // If title folder does not exist, create title folder
                    var newSpaceTitle = companyhome.childByNamePath("mainFolder/" + childTitle);
                    if(newSpaceTitle == null)
                    {
                        newSpaceTitle = rootSpaceName.createFolder(childTitle);
                        logger.log("mainFolder/" + childTitle + " is created.");
                    }
                    // If author folder does not exist, create author folder
                    var newSpaceAuthor = companyhome.childByNamePath("mainFolder/" + childTitle + "/" + childAuthor);
                    if(newSpaceAuthor == null)
                    {
                        newSpaceAuthor = newSpaceTitle.createFolder(childAuthor);
                        logger.log("mainFolder/" + childTitle + "/" + childAuthor + " is created.");
                    }
                    child.move(newSpaceAuthor);
                    logger.log("Moving file " + child.properties.name);
                }
            }
        }
    }
    return;
}
main();

线路:

 var rootSpaceName = companyhome.childByNamePath("mainFolder");

将尝试定位相对于CCD_ 2的文件夹,即存储库的根。您的存储库中是否存在该文件夹?

如果您正试图编写一个对进入空间的文件进行操作的脚本,那么您不需要使用相对于该文件或空间的路径吗(使用documentspace对象,而不是companyhome)?

如果没有,也许你可以再解释一下你正在努力实现什么?

如果您还没有使用它,那么Alfresco JavaScript控制台是一个非常有用的插件,用于尝试JavaScript代码,您可以使用logger.log()看到控制台输出。