<!--
  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.
-->
<bundle-app name='${appName}' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='uri:oozie:bundle:0.2'>
          <controls>
                 <kick-off-time>2099-02-01T00:00Z</kick-off-time>
          </controls>
          <coordinator name="${bundle:conf('coordName1')}" critical='true'>
                 <app-path>#app_path1</app-path>
                 <configuration>
                     <property>
                         <name>COORD_NAME</name>
                         <value>coord1</value>
                     </property>
                     <property>
                         <name>START_TIME</name>
                         <value>${bundle:conf('coord1.starttime')}</value>
                     </property>
                     <property>
                         <name>END_TIME</name>
                         <value>2009-02-20T23:59Z</value>
                     </property>
                     <property>
                         <name>testProperty</name>
                         <value>abc</value>
                     </property>
                 </configuration>
          </coordinator>
          <coordinator name='${coordName2}' critical='false'>
                 <app-path>#app_path2</app-path>
                 <configuration>
                     <property>
                         <name>COORD_NAME</name>
                         <value>coord2</value>
                     </property>
                     <property>
                         <name>START_TIME</name>
                         <value>2009-02-02T00:00Z</value>
                     </property>
                     <property>
                         <name>END_TIME</name>
                         <value>2009-02-23T23:59Z</value>
                     </property>
                 </configuration>
          </coordinator>
</bundle-app>
