`

ForkActivity修改

    博客分类:
  • jbpm
阅读更多
Problems with nested Forks

源代码修改



package org.jbpm.jpdl.internal.activity;

import java.util.ArrayList;
import java.util.List;

import org.jbpm.api.Execution;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.Condition;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.Transition;


public class ForkActivity extends JpdlActivity {

private static final long serialVersionUID = 1L;

public void execute(ActivityExecution execution) {
   execute((ExecutionImpl) execution);
}

public void execute(ExecutionImpl execution) {
   Activity activity = execution.getActivity();

   // evaluate the conditions and find the transitions that should be
   // forked
   List<Transition> forkingTransitions = new ArrayList<Transition>();
   List<Transition> outgoingTransitions = activity
     .getOutgoingTransitions();
   for (Transition transition : outgoingTransitions) {
    Condition condition = transition.getCondition();
    if ((condition == null) || (condition.evaluate(execution))) {
     forkingTransitions.add(transition);
    }
   }

   // if no outgoing transitions should be forked,
   if (forkingTransitions.size() == 0) {
    // end this execution
    execution.end();

    // if there is exactly 1 transition to be taken, just use the
    // incoming execution
   } else if (forkingTransitions.size() == 1) {
    execution.take(forkingTransitions.get(0));

    // if there are more transitions
   } else {
    ExecutionImpl concurrentRoot = null;
    if (Execution.STATE_ACTIVE_ROOT.equals(execution.getState())) {
     concurrentRoot = execution;
     execution.setState(Execution.STATE_INACTIVE_CONCURRENT_ROOT);
     execution.setActivity(null);
    } else if (Execution.STATE_ACTIVE_CONCURRENT.equals(execution
      .getState())) {
     concurrentRoot = execution.getParent();
     // 添加代码
     execution.setState(Execution.STATE_INACTIVE_CONCURRENT_ROOT);
     execution.setActivity(null);
     // 添加代码
    }

    // 添加代码
    if (Execution.STATE_INACTIVE_CONCURRENT_ROOT.equals(execution
      .getState())) {

     // 执行挂起
     execution.suspend();

    }
    // 添加代码

    for (Transition transition : forkingTransitions) {
     // launch a concurrent path of execution
     String childExecutionName = transition.getName();
     ExecutionImpl concurrentExecution = concurrentRoot
       .createExecution(childExecutionName);
     concurrentExecution.setActivity(activity);
     concurrentExecution.setState(Execution.STATE_ACTIVE_CONCURRENT);
     concurrentExecution.take(transition);

     if (concurrentRoot.isEnded()) {
      break;
     }
    }
   }
}
}
分享到:
评论

相关推荐

    github-workflow-activity:学习使用fork-feature-branch-pull-request工作流程的团队活动

    文件系统操作: 创建,重命名,移动和删除目录和文件纯文本编辑器操作: 编辑并保存文件学习成果参加者将能够: 使用通用工作流为GitHub上的项目贡献代码准备一个fork和本地存储库以对GitHub上的上游项目做出更改在...

    Android常见面试题目汇总以及答案

    启动一个Activity通常从Intent开始,经过ActivityManagerService调度,Zygote fork出新的进程,然后创建新的Activity实例,执行onCreate()、onStart()和onResume()。 8. **Activity A跳转到Activity B后按返回键的...

    ModifiedSnackBar:这是 NispokSnackBar 的 fork

    `ModifiedSnackBar`是`NispokSnackBar`的fork,意味着它继承了原有库的功能,并可能对其进行了优化和增强。开发者可能添加了新的特性,修复了已知问题,或者提高了性能。具体的修改细节可以通过查看源代码来了解。 ...

    OnlineReposiotory:这是我的 fork 存储库

    在 GitHub 或类似平台上,fork 是一种常见的协作方式,用于获取并修改其他用户的代码。 描述中的 "在线知识库" 指出此项目可能包含了学习资源或教程,而 "这是一个简单的安卓手机计数器" 提供了具体的应用场景——...

    Linux_Group_Activity

    使用C语言编写程序时,可以调用系统调用来管理用户和用户组,例如`fork()`, `exec()`, `getgid()`, `setgid()`等函数。 总的来说,“Linux_Group_Activity”是一个关于Linux系统中用户组管理和权限控制的实践项目。...

    Android代码-YinYueTai

    ,MusicStation是几年前做视频聚合的时候抓取音乐台数据形成的,最近不断有人star或者fork之前的MusicStation项目,并且发Email给我说demo获取不到数据等等问题,希望我修改。 但是由于很久没有维护之前的项目了,...

    Android代码-PIN 码专用输入控件,支持任意长度和输入任意数据

    支持更改 PinView 中每一个 EditText 的输入前、输入后、正在输入的 background 支持设置任意长度的 PIN 码长度 支持设置可输入的 PIN 码格式,目前支持文本、数字、可以自己自主设置 支持设置输入错误次数限制时间 ...

    将第一款能让自己满意的系统献给开源社区

    5. **开源项目的贡献流程**:开源项目贡献者通常会遵循一定的流程,包括Fork项目、创建分支、进行修改、提交Pull Request并参与代码审查。开发者通过这种方式参与到项目中,不仅可以提升自己的技术能力,还能为社区...

    网上书店+系统+UML+用例图+活动图+类图.doc

    它展示了系统的活动、决策、合并和fork。此处,我们将对管理员和用户的活动图进行分析。 管理员的活动图包括: * 登录系统 * 管理书籍(包括添加、删除和修改) * 管理订单 用户的活动图包括: * 查看订单 * ...

    Android代码-PhotoPicker

    高度44dp,标题居中,颜色引用activity主题设置colorPrimary.可以自己设置. 底部弹出框:原项目两边有间距,现改成铺满屏幕宽度弹出 默认图片更改成黑灰色背景,让滑动时图片闪动不会那么突兀 图片item再加一层蒙版...

    jni守护进程及手机系统界面

    1. 在C/C++代码中,使用`fork()`函数创建一个新的子进程,然后使用`setsid()`使进程成为会话领导,以确保它不依附于任何终端。 2. 使用`umask(0)`来设置文件创建权限,确保守护进程对新创建的文件有适当的权限。 3. ...

    Android框架揭秘

    当系统需要创建一个新的应用进程时,Zygote进程会被fork出来,这样就可以继承Zygote进程已经加载的类和资源,大大减少了内存的使用。Zygote进程在系统启动时会加载一些常用的类和资源,如Android框架类库、资源文件...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术05 期末考试押题试卷.docx

    - **题目**: 退出 activity 对一些资源以及状态的操作保存,可以在生命周期的哪个方法中进行? - **答案**: A. onPause() - **知识点解析**: - 在Android应用中,每个Activity都有其生命周期方法。当Activity...

    android framework

    - **权限管理**:每个权限对应一个groupId,系统的权限信息存储在`/data/system/packages.xml`中,更新应用时会修改该文件,以反映最新的权限状态。 #### 六、总结 Android Framework是整个Android操作系统的核心...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术15 期末考试押题试卷.docx

    - **解释:** Fork操作是指在GitHub上创建一个原项目的副本到自己的GitHub账户下,这样就可以在此基础上进行修改而不影响原始项目。这对于贡献开源项目或基于现有项目进行二次开发非常有用。 #### 6. **表格布局** ...

    android应用管理源码

    安装应用时,PMS会解析APK文件,验证签名,然后通过Zygote进程 fork出新的应用进程。卸载时,PMS会删除应用的文件、数据库、缓存等资源,同时从系统中移除对应的PackageInfo。 权限管理是Android安全模型的重要组成...

    Android个人笔记

    接着,SystemServer进程在Zygote中 fork 出来,它负责系统的高级管理,包括UI线程、应用进程的创建以及电源管理等。在这一阶段,还会进行属性服务的设置,如ro.product.model等,以便系统识别设备信息。 【各个层次...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术06 期末考试押题试卷.docx

    - **Fork操作:**用户可以在原项目的基础上创建一个副本,即Fork,这使得用户可以在自己的GitHub账户下对原项目进行修改。 - **应用场景:**通常用于贡献代码到开源项目中,或者基于现有项目进行二次开发。 ### 6. ...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术08 期末考试押题试卷.docx

    - **操作术语**:在GitHub上,当你基于某个项目的代码库创建自己的分支进行开发时,这一操作称为“fork”(选项B)。这样做允许你在不影响原项目的情况下自由地修改代码。 ### 构建Android UI的基本控件 **知识点...

    【国开搜题】国家开放大学 一网一平台 Android核心开发技术10 期末考试押题试卷.docx

    - 通过`fork`,可以在不改变原有项目的基础上,独立地进行开发和修改。 - `copy`不是GitHub上的标准术语;`pull`通常指从远程仓库获取最新的更改并合并到本地仓库中;`trunk`通常指的是主分支,但在GitHub上并没有...

Global site tag (gtag.js) - Google Analytics