动态ADF火车:以编程方式添加火车停靠站

我将展示如何以编程方式“即时”将火车停靠站添加到ADF火车中。 在我的用例中,我有一些票务预订应用程序。 它具有训练模型的有限任务流。 在火车的第一站,用户输入乘客的数量,在随后的站点,他们输入一些乘客的信息。 带有乘客信息的站点数量必须根据在第一个火车站点提交的值进行动态更改。 因此,描述的行为的结果应如下所示:

有界任务流具有以下结构:

StartView活动是一个页面片段,我们在其中输入乘客人数,而DynamicView活动提供了一个页面片段来输入乘客的信息。 目前,我们只有一个活动来提供乘客的信息,如果乘客人数大于一个,我将添加其他活动。
StartView页面片段的inputNumberSpinbox提交其值设置为某些PageFlowScope支持bean的passengersNumber财产和行动的提交按钮是同一个bean的方法:

public class MainTrain {
 //Extra added train stops
 private List<ActivityId> dynamicStops = new ArrayList<ActivityId>();
 
 //Value of inputNumberSpinbox
 private int passengersNumber = 1;
 
 public String buttonPress(){
 //The number of extra added train stops is greater than needed
 if (passengersNumber <= dynamicStops.size())
 clearExtraStops();
 else //The number of extra added train stops is less than needed 
 if (passengersNumber-1 > dynamicStops.size()) 
 addDynamicStops(); 
 return null;
 }

因此,通过按Submit按钮,我们可以根据inputNumberSpinbox的值添加一些火车停靠点或清除额外的停靠 。 我们将所有添加的动态停靠点保存在dynamicStops列表中。 让我们看一下clearExtraStops()方法:

private void clearExtraStops() {
 for (int i = dynamicStops.size(); i >= passengersNumber; i--) {
 //Get ActivityId to be removed
 ActivityId removeActivityId = dynamicStops.get(i-1);

 //Get current train model and remove train stop
 TrainModel trainModel = TrainUtils.findCurrentTrainModel();
 trainModel.getTrainStops().remove(removeActivityId);
 
 //Remove activity from task flow definition
 getTaskFlowDefinition().getActivities().remove(removeActivityId);
 dynamicStops.remove(i-1);
 } 
 }

该方法删除了两件事:火车模型中的火车停靠点和任务流定义中的活动。 addDynamicStops()方法将变得更加有趣:

private void addDynamicStops() { 
 for (int i = dynamicStops.size(); i < passengersNumber - 1; i++) {
 //Creating new ActivityId
 ActivityId activityId = 
 new ActivityId(getTaskFlowId(), new StringBuilder("DynamicView").append(i).toString()); 

 //The main trick of the post.
 //We consider DynamicView activity as a base for new train stop and new activity
 
 //Get base activity (DynamicView) and its train stop
 Activity baseActivity = getBaseDynamicActivity();
 TrainStopContainer stopContainer = (TrainStopContainer)baseActivity.getMetadataObject();
 TrainStop baseTrainStop = stopContainer.getTrainStop();

 //Create new Activity based on DynamicView but with new ActivityId 
 ActivityImpl activityImpl = new ActivityImpl(baseActivity, activityId); 
 //Add created activity to the task flow definition
 getTaskFlowDefinition().getActivities().put(activityId, activityImpl);

 //Create new train stop based on the DynamicView's train stop
 TrainStopModel trainStopModel = new TrainStopModel(
 new TrainStopImpl(baseTrainStop, i+2), activityId);
 //Add created train stop to the train stop model
 TrainModel trainModel = TrainUtils.findCurrentTrainModel();
 trainModel.getTrainStops().put(activityId, trainStopModel); 
 //Add created activity to our list
 dynamicStops.add(activityId); 
 }
}
 
private Activity getBaseDynamicActivity() {
 ActivityId baseActivityId = new ActivityId(getTaskFlowId(), "DynamicView"); 
 MetadataService metadataService = MetadataService.getInstance();
 return metadataService.getActivity(baseActivityId); 
}

private TaskFlowDefinition getTaskFlowDefinition() {
 MetadataService metadataService = MetadataService.getInstance();
 return metadataService.getTaskFlowDefinition(getTaskFlowId()); 
}


private TaskFlowId getTaskFlowId() {
 ControllerContext controllerContext = ControllerContext.getInstance(); 
 ViewPortContext currentViewPortCtx = controllerContext.getCurrentViewPort(); 
 TaskFlowContext taskFlowCtx = currentViewPortCtx.getTaskFlowContext(); 
 return taskFlowCtx.getTaskFlowId();
}

因此,本文的主要技巧是创建新的活动,并基于DynamicView的现有活动来停止站点。 为了实现这个想法,我创建了两个类: ActivityImplTrainStopImpl 。 这些类只不过是相应地实现Activity和TrainStop接口的代理类。 它们将接口实现委派给基本实例,除了一些特定的方法(例如,用于ID和DisplayName的getter)之外:

public class TrainStopImpl implements TrainStop { 
 //Base instance 
 private TrainStop baseTrainStop;
 
 private int mpassNo;
 private static final String PASSANGER_FORM = "Passenger's data: ";
 
 public TrainStopImpl(TrainStop trainStop, int passNo) {
 baseTrainStop = trainStop; 
 mpassNo = passNo;
 }

 //Specific implementation
 public String getDisplayName() {
 return new StringBuilder(PASSANGER_FORM).append(mpassNo).toString();
 }

 public String getOutcome() {
 return baseTrainStop.getOutcome();
 }

 public String getSequential() {
 return baseTrainStop.getSequential();
 }

...
public class ActivityImpl implements Activity {
 private Activity baseActivity;
 private ActivityId mid;
 
 public ActivityImpl(Activity activity, ActivityId id) {
 baseActivity = activity;
 mid = id;
 }

 //Specific implementation
 public ActivityId getId() {
 return mid;
 }

 public String getType() {
 return baseActivity.getType();
 }

 public Object getMetadataObject() {
 return baseActivity.getMetadataObject();
 }
...

这篇文章的另一张图片只是为了展示它的工作原理:

就这样! 您可以下载JDeveloper 11.1.1.2.0的示例应用程序

参考: 动态ADF列车。 通过ADF实践博客中的JCG合作伙伴 Eugene Fedorenko以编程方式添加火车停靠站


翻译自: https://www.javacodegeeks.com/2012/05/dynamic-adf-train-adding-train-stops.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值