<?xml version="1.0"?>
<!--
 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.
-->

<project name="ant_eclipse" basedir="." default="default">

  <!-- bring in the environmental properties -->
  <property environment="env"/>
  <property name="maven.home" value="${env.MAVEN_HOME}"/>

  <!-- make sure we have maven -->
  <target name="check-env" description="Check if environment variables are set">
    <echo>maven.home = ${maven.home}</echo>
    <fail unless="env.MAVEN_HOME" message="You MUST set MAVEN_HOME first"/>
  </target>

  <target name="default" depends="check-env">
  
       <condition property="maven.script" value="maven.bat">
         <and>
            <os family="windows" />
            <equals arg1="${maven.script}" arg2="$${maven.script}" />
          <not>
            <isset property="cygwin.home" />
          </not>
        </and>
        </condition>
        
       <condition property="maven.script" value="maven">
          <equals arg1="${maven.script}" arg2="$${maven.script}" />
       </condition>  
  
    <!-- call maven jar:install -Dtest=Unit -->
    <exec executable="${maven.script}" failonerror="true">
      <arg value="jar:install"/>
      <arg value="-Dtest=Unit"/>
    </exec>
    
  </target>

</project>
