001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie.workflow.lite;
016
017 import org.apache.oozie.workflow.WorkflowException;
018 import org.apache.oozie.ErrorCode;
019
020 import java.util.ArrayList;
021 import java.util.Arrays;
022 import java.util.List;
023
024 //TODO javadoc
025 public class JoinNodeDef extends NodeDef {
026
027 JoinNodeDef() {
028 }
029
030 public JoinNodeDef(String name, String transition) {
031 super(name, null, JoinNodeHandler.class, Arrays.asList(transition));
032 }
033
034 public static class JoinNodeHandler extends NodeHandler {
035
036 public void loopDetection(Context context) throws WorkflowException {
037 String flag = getLoopFlag(context.getNodeDef().getName());
038 if (context.getVar(flag) != null) {
039 throw new WorkflowException(ErrorCode.E0709, context.getNodeDef().getName());
040 }
041 String parentExecutionPath = context.getParentExecutionPath(context.getExecutionPath());
042 String forkCount = context.getVar(ForkNodeDef.FORK_COUNT_PREFIX + parentExecutionPath);
043 if (forkCount == null) {
044 throw new WorkflowException(ErrorCode.E0720, context.getNodeDef().getName());
045 }
046 int count = Integer.parseInt(forkCount) - 1;
047 if (count == 0) {
048 context.setVar(flag, "true");
049 }
050 }
051
052 public boolean enter(Context context) throws WorkflowException {
053 String parentExecutionPath = context.getParentExecutionPath(context.getExecutionPath());
054 String forkCount = context.getVar(ForkNodeDef.FORK_COUNT_PREFIX + parentExecutionPath);
055 if (forkCount == null) {
056 throw new WorkflowException(ErrorCode.E0720, context.getNodeDef().getName());
057 }
058 int count = Integer.parseInt(forkCount) - 1;
059 if (count > 0) {
060 context.setVar(ForkNodeDef.FORK_COUNT_PREFIX + parentExecutionPath, "" + count);
061 context.deleteExecutionPath();
062 }
063 else {
064 context.setVar(ForkNodeDef.FORK_COUNT_PREFIX + parentExecutionPath, null);
065 }
066 return (count == 0);
067 }
068
069 public List<String> multiExit(Context context) {
070 String parentExecutionPath = context.getParentExecutionPath(context.getExecutionPath());
071 // NOW we delete..
072 context.deleteExecutionPath();
073
074 String transition = context.getNodeDef().getTransitions().get(0);
075 String fullTransition = context.createFullTransition(parentExecutionPath, transition);
076 List<String> transitions = new ArrayList<String>(1);
077 transitions.add(fullTransition);
078 return transitions;
079 }
080
081 public String exit(Context context) {
082 throw new UnsupportedOperationException();
083 }
084
085 public void kill(Context context) {
086 }
087
088 public void fail(Context context) {
089 }
090 }
091
092 }