在工作流程Alfresco上集成applet

时间:2016-01-28 21:49:06

标签: workflow alfresco activiti alfresco-share workflow-activity

问题我有一个小程序可以对PDF进行“更改”,之后我必须将更改保存到存储库中的相应文件中。如何在工作流程中集成此applet?要阅读的任何提示或文件吗?

我想在一个任务表单(在任务编辑页面中),一个带有按钮的新组件来调用applet,但这是个好主意?有效吗?因为我想当人按下接受按钮时,会调用小程序,然后只有在进行更改时,任务才会完成。但是如何?

3 个答案:

答案 0 :(得分:3)

我没有您的applet的详细信息,所以我无法确定它是否可行,但您可以尝试简单地使用一些javascript来访问您的applet的公共方法。

Alfresco中的表单引擎可以轻松自定义编写自定义控件。 自定义控件将生成在表单中嵌入applet所需的html和javascript,并在按下按钮时调用它。

了解您是否可以拦截Alfresco小程序执行的更新将会很有用。例如,您可以在Alfresco中拥有一个将在文档更新时调用的侦听器(行为)。如果根据您的业务逻辑,侦听器可以理解applet已完成操作,则它可以自动触发工作流的转换。 此解决方案非常强大,因为applet执行的更新和任务更新将是事务性的:它们都成功或者回滚更新。

如果可能的话,不要单独调用applet和工作流的转换:这两个操作不会是原子的,你最终会得到一个不一致的存储库。

<强>更新 要避免任何自定义Alfresco功能,请不要修改acitiviti过渡。鉴于您只需要添加一个按钮来调用您的applet,请使用自定义ftl并在表单配置中指定它。

以下文章是学习如何操作的好指南(我强烈建议您阅读并遵循练习):

Jeff Potts' article on Advanced Workflows

正如您在段落Edit share-config-custom.xml中看到的那样,您可以指定用于呈现表单中每个字段的免费标记模板。如果您愿意,可以指定用于转换按钮的其他模板。该模板将呈现applet以及html和javascript来调用它。

以下类是一个示例(它是从真实代码中复制的代码段,我没有测试它,它只是为了显示行为的主要部分)是一种侦听节点创建的行为或更新其属性。你必须选择对你更好的东西。小程序究竟是什么?它是否创建了一个新节点?或更新其属性?或者更新节点的内容?

以下链接为您提供了触发转换的代码示例: Trigger Activiti workflow for task sitting in ReceiveTask looping

package com.someco.alfresco.behaviours;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.site.SiteInfo;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;


public class SomeObjectCreatePolicy implements OnCreateNodePolicy, OnUpdatePropertiesPolicy {
    private final Logger logger = Logger.getLogger(SomeObjectCreatePolicy.class);

    @Override
    public void init() {
        this.policyComponent.bindClassBehaviour(
                QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateNode"),
                Model.TYPE_ENTITY_OBJECT,
                new JavaBehaviour(this, "onCreateNode", 
                        Behaviour.NotificationFrequency.TRANSACTION_COMMIT));

        this.policyComponent.bindClassBehaviour(
                QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
                Model.TYPE_ENTITY_OBJECT,
                new JavaBehaviour(this, "onUpdateProperties", 
                        Behaviour.NotificationFrequency.EVERY_EVENT));
    }

    @Override
    public void onCreateNode(ChildAssociationRef childAssocRef) {
        /* Your logic to fire the transition */
    }

    @Override
    public void onUpdateProperties(NodeRef nodeRef,
            Map<QName, Serializable> before, Map<QName, Serializable> after) {
        /* Your logic to fire the transition */
    }
}

当然,您可以使用Spring实例化对象:

<bean id="org.alfresco.behaviours.someObjectCreatePolicy" class="com.someco.alfresco.policy.SomeObjectCreatePolicy"
        init-method="init">
</bean>

答案 1 :(得分:1)

我们通过在iframe中打开第3方应用(applet)进行了类似的集成。 入口点是一个自定义文档库操作,使用自定义客户端java脚本打开iframe并将参数传递给它,但我想如果您希望它从表单按钮弹出,您可以为它提供自定义控件。

然后第3个pary app使用我们编写的自定义露天网页(用于保存您的pdf)与露天沟通。

=&gt;或者如果你有applets java代码,你可以将它移动到alfresco java web脚本。这将显着简化架构。

答案 2 :(得分:1)

正如我在my comment中提到的那样,它是可行的,但我不会批准你这样做的方式

我的理解(来自之前关于SO的问题)是您在自己的露天实例中集成文档签名功能的原因。并且您已经开发了一个doclib操作,该操作可以导航到带有applet的特殊页面,以验证用户身份,签署文档,然后上传新的(签名)版本。现在,您需要将相同的applet集成到工作流中,以便让用户可以要求其他用户对文档进行数字签名(或者类似的东西......)。

同样,我建议您将代码从applet迁移到服务任务(服务器端),因为它具有更高的兼容性和更高的安全性(仅供参考:并非所有浏览器仍支持NPAPI,afaik至少Chrome不再,所以他们需要配置才能运行你的小程序!)

话虽如此,我想你这样做的方法是:

  1. /org/alfresco/components/form/controls/workflow/activiti-transitions.ftl获取灵感,并创建自己的sign-transition.ftl FTL,在其中为applet添加html和js代码,就像在您的页面中一样。
  2. 请记住从工作流程序包项目中获取文档noderef(请记住,上次从页面URL上的get参数获取该信息)
  3. 在您的repo上成功上传文档后(使用applet签名后),您的JS回调应该调用与按下转换按钮时相同的逻辑(使用{{1创建Xhr到表单处理器webscript) }}作为itemKind,task作为itemId ....)