【问题标题】:Import classes in method?在方法中导入类?
【发布时间】:2017-01-10 05:53:38
【问题描述】:

我正在自定义一个 PLM Windchill 工作流,它提供了一种执行 java 代码 sn-ps 的机制。不幸的是,它们被“插入”到准备好的服务的方法中,这意味着无法导入类,所以我必须包含完整的包名才能使用它。下面的sn-p不要试图去理解,看看它长什么样子就行了:

wt.fc.QueryResult activities = wt.fc.PersistenceHelper.manager.find((wt.pds.StatementSpec) activitiesQuery);
    while (activities.hasMoreElements()) {
          wt.workflow.work.WfAssignedActivity activity = (wt.workflow.work.WfAssignedActivity) activities.nextElement();
          if(activity.getDisplayIdentifier().toString().equals("Analyze Image Request")){
              java.util.List<wt.workflow.work.WorkItem> workItems = wt.workflow.status.WfWorkflowStatusHelper.service.getWorkItems(activity);
              for (wt.workflow.work.WorkItem workItem : workItems){
                  String action = workItem.getActionPerformed();
                  if(action != null && action.equals("Accepted")){
                      wt.org.WTPrincipalReference approver = workItem.getOwnership().getOwner();
                      n_approver = approver.getFullName() + " ("+approver.getDisplayName()+")";
                      wt.fc.collections.WTHashSet approverSet = new wt.fc.collections.WTHashSet(java.util.Arrays.asList(approver));
                      wt.project.Role role = wt.project.Role.toRole("APPROVER");
                      com.ptc.windchill.pdmlink.change.server.impl.WorkflowProcessHelper.setChangeItemParticipants(report, role, approverSet);
                      break;
                  }
              }
              break;
          }
      }

我的问题是 - 如何使这段代码更具可读性?当然没有办法在方法内部导入类,甚至没有办法将这个 sn-p 分成单独的方法(因为它被“粘贴”成一个)所以我正在寻找其他想法。

【问题讨论】:

  • 在自定义类中编写代码,并调用它?
  • @Andreas 我可以将一些代码提取到分离的类中并调用它,但是我必须在这个 sn-p 中留下很多逻辑,所以是的,这是一个很好的选择,但仍然没有不能解决我的主要问题。谢谢。

标签: java import workflow code-snippets ptc-windchill


【解决方案1】:

使代码更具可读性的一种选择是将链接的方法/属性调用分隔在多行中。

例如,这一行:

wt.project.Role role = wt.project.Role.toRole("APPROVER");

可以改写为:

wt.project.Role role = wt
                       .project
                       .Role
                       .toRole("APPROVER");

【讨论】:

  • @Damiano 实际上这个符号已经用于 Java 的功能方面,例如在 Guava 库中调用嵌套方法时。
【解决方案2】:

你不能。 工作流表达式是方法体。 像

这样的声明
wt.fc.QueryResult activities = wt.fc.PersistenceHelper.manager.find((wt.pds.StatementSpec) activitiesQuery);

在 $WT_HOME/codebase/wt/workflow/expr/ 下的一个类中结束 用一个方法:

public static Object executemethod_1(Object[] var0, Object[] var1) throws Exception {
 wt.fc.QueryResult activities = wt.fc.PersistenceHelper.manager.find((wt.pds.StatementSpec) activitiesQuery);

// some generated code to handle variables...
}

所以,你不能使用导入。

但是: 如果您的 PDMLink 版本大于 10, 您可以外化工作流表达式

http://support.ptc.com/cs/help/windchill_hc/wc100_hc/index.jspx?id=WFTemplateExtExpression&action=show

这会在 /codebase/ext/wt/workflow/externalize 下创建一个 java 类

然后你可以做你想做的事,但你必须编译这些类,并在修改时停止/启动。

基本上无非就是从表达式中调用外部代码,所以我用的不多……

【讨论】:

    【解决方案3】:

    您可以从自定义 Java 类中调用此完整代码。

    您只需要调用您的类并获取 Java 类所需的最终参数即可使其更具可读性。

    如果您需要多个输出,请在 Java 类中编写多个方法并在工作流表达式中调用它们。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2021-08-22
      • 2015-04-22
      • 2013-01-07
      相关资源
      最近更新 更多