In one of my previous posts I showed how to create train stops programmatically. And I got a comment with a question on the post - "Is it possible to show different pages on each of the dynamic train stop?". The answer is - Yes, off course!
In this post I'm going to give an example of showing train stops programmatically. So, I need to show or hide some stops dynamically at runtime. Everybody knows that TrainStop has Ignore attribute
And if we could dynamically change it's value or put there some EL expression that could be evaluated during the taskflow's life cycle, It would be the best approach of showing/hiding train stops at runtime. But Ignore attribute is evaluated only once, at the task flow initialization phase and cannot be modified further. But! As it was shown in this post we can programmatically add (or remove) train stops to the train model of the task flow. So, we can do it!
Let's say I've got the following train TaskFlow:
PassenerView activity, LuggageView and MealView by default have <ignore>true</ignore> attribute and at the very beginning, after task flow initialization, are hidden. The train model doesn't have stops for these activities. On the first stop of the task flow I'm going to decide which activity should be included in the train and which one is hidden. On the task flow initialization I call the following managed bean method:
The ignoredStops map is shown on the StartView page using techniques explained in this post. So, I have the following page:
The following method is called on Submit button's action:
If needed activities are chosen we can press Submit button and get the following picture:
That's it!
In this post I'm going to give an example of showing train stops programmatically. So, I need to show or hide some stops dynamically at runtime. Everybody knows that TrainStop has Ignore attribute
And if we could dynamically change it's value or put there some EL expression that could be evaluated during the taskflow's life cycle, It would be the best approach of showing/hiding train stops at runtime. But Ignore attribute is evaluated only once, at the task flow initialization phase and cannot be modified further. But! As it was shown in this post we can programmatically add (or remove) train stops to the train model of the task flow. So, we can do it!
Let's say I've got the following train TaskFlow:
PassenerView activity, LuggageView and MealView by default have <ignore>true</ignore> attribute and at the very beginning, after task flow initialization, are hidden. The train model doesn't have stops for these activities. On the first stop of the task flow I'm going to decide which activity should be included in the train and which one is hidden. On the task flow initialization I call the following managed bean method:
private static String START_VIEW = "StartView"; //Fill map with all activities of the TaskFlow //except StartView private void InitIgnoredStops() { for (Iterator it= getTaskFlowDefinition().getActivities().values().iterator(); it.hasNext();) { Activity act = (Activity) it.next(); if (!START_VIEW.equals(act.getIdAttribute())) { ignoredStops.put(act.getId(), "false"); } } }
The ignoredStops map is shown on the StartView page using techniques explained in this post. So, I have the following page:
The following method is called on Submit button's action:
public String buttonPress() { TrainModel trainModel = TrainUtils.findCurrentTrainModel(); //Loop over the map for (Object actid : ignoredStops.keySet().toArray()) { //If activity is not chosen if (!Boolean.parseBoolean(ignoredStops.get(actid).toString())) { // if activity is included in the train then remove it if (trainModel.getTrainStops().get(actid) != null) trainModel.getTrainStops().remove(actid); } else { //If activity is chosen and it is not included in the train // then we need to include it if (trainModel.getTrainStops().get(actid) == null) { MetadataService metadataService = MetadataService.getInstance(); //Get activity and its train stop definition Activity activity = metadataService.getActivity((ActivityId)actid); TrainStopContainer stopContainer = (TrainStopContainer)activity.getMetadataObject(); TrainStop ts = stopContainer.getTrainStop(); //Create new train stop model and add it to the train trainModel.getTrainStops().put((ActivityId)actid, new TrainStopModel(ts, (ActivityId)actid)); } } } }
If needed activities are chosen we can press Submit button and get the following picture:
can u please post the sample application
ReplyDeleteIt is posted on ADF Samples java.net project. http://java.net/projects/smuenchadf/pages/ADFSamplesTaskFlows#EFE002
DeleteVery helpful. thank you
ReplyDeleteCan we skip default activity and move to any other stop at the very first time when we enter into task flow.?
ReplyDeleteNo, we can't. A task flow always starts with a default activity. But the default activity can be a method call or router ...
Delete