<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
       http://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<workflow-app xmlns="uri:oozie:workflow:0.4" name="test-wf">
    <global>
        <job-tracker>${foo}</job-tracker>
        <name-node>bar</name-node>
        <configuration>
            <property>
                <name>a</name>
                <value>A</value>
            </property>
            <property>
                <name>b</name>
                <value>B</value>
            </property>
        </configuration>
    </global>
        
    <start to="a"/>
    <decision name="a">
        <switch>
            <case to="b">true</case>
            <case to="c">false</case>
            <default to="c"/>
        </switch>
    </decision>
    <kill name="b">
        <message>kill</message>
    </kill>

    <fork name="c">
        <path start="d"/>
        <path start="e"/>
    </fork>

    <action name="d">
        <map-reduce>
            <prepare>
                <delete path="/tmp"/>
                <mkdir path="/tmp"/>
            </prepare>
            <streaming>
                <mapper>/mycat.sh</mapper>
                <reducer>/mywc.sh</reducer>
            </streaming>
            <file>/tmp</file>
            <archive>/tmp</archive>
        </map-reduce>
        <ok to="f"/>
        <error to="b"/>
    </action>

    <action name="e">
        <pig>
            <prepare>
                <delete path="/tmp"/>
                <mkdir path="/tmp"/>
            </prepare>
            <configuration>
                <property>
                    <name>a</name>
                    <value>A2</value>
                </property>
                <property>
                    <name>b</name>
                    <value>B</value>
                </property>
            </configuration>
            <script>/tmp</script>
            <param>x</param>
            <file>/tmp</file>
            <file>/tmp</file>
        </pig>
        <ok to="f"/>
        <error to="b"/>
    </action>

    <join name="f" to="g"/>

    <action name="g">
        <fs>
            <mkdir path='/tmp'/>
            <chmod path='/tmp' permissions='-rwxrw-rw-' dir-files='false'/>
            <move source='/tmp' target='/tmp2'/>
            <delete path='/tmp2'/>
            <mkdir path='/tmp3'/>
            <delete path='/tmp3'/>
        </fs>
        <ok to="z"/>
        <error to="b"/>
    </action>

    <end name="z"/>
</workflow-app>
