<!--
   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.
-->

<ivy-module version="1.0">
  <info organisation="org.apache.hadoop" module="${ant.project.name}" revision="${version}">
    <license name="Apache 2.0"/>
    <ivyauthor name="Apache Hadoop Team" url="http://hadoop.apache.org"/>
    <description>
        Hadoop Core
    </description>
  </info>
  <configurations defaultconfmapping="default">
    <!--these match the Maven configurations-->
    <conf name="default" extends="master,runtime"/>
    <conf name="master" description="contains the artifact but no dependencies"/>
    <conf name="compile" description="contains the artifact but no dependencies"/>
    <conf name="runtime" description="runtime but not the artifact"/>

    <!--
    These public configurations contain the core dependencies for running hadoop client or server.
    The server is effectively a superset of the client.
    -->
    <!--Private configurations. -->

    <conf name="common" visibility="private" extends="compile" description="common artifacts"/>
    <conf name="mapred" visibility="private" extends="compile,runtime" description="Mapred dependent artifacts"/>
    <conf name="javadoc" visibility="private" description="artiracts required while performing doc generation" extends="common"/>
    <conf name="test" extends="master" visibility="private" description="the classpath needed to run tests"/>
    <conf name="package" extends="master" description="the classpath needed for packaging"/>
    <conf name="system" extends="test" visibility="private" description="the classpath needed to run system tests"/>

    <conf name="test-hdfswithmr" extends="test" visibility="private" description="the classpath needed to run tests"/>

    <conf name="releaseaudit" visibility="private" description="Artifacts required for releaseaudit target"/>
     
    <conf name="jdiff" visibility="private" extends="common"/>
    <conf name="checkstyle" visibility="private"/>

  </configurations>

  <publications>
    <!--get the artifact from our module name-->
    <artifact conf="master"/>
  </publications>
 <dependencies>
   <dependency org="org.apache.hadoop" name="hadoop-common" 
               rev="${hadoop-common.version}" conf="compile->default"/> 
   <dependency org="org.apache.hadoop" name="hadoop-common-test" 
               rev="${hadoop-common.version}" conf="compile->default"/> 
   <dependency org="org.apache.hadoop" name="hadoop-hdfs" 
               rev="${hadoop-hdfs.version}" conf="compile->default"/> 
   <dependency org="org.apache.hadoop" name="hadoop-common-instrumented"
               rev="${hadoop-common.version}" conf="system->default"/>
   <dependency org="org.apache.hadoop" name="hadoop-hdfs-instrumented"
               rev="${hadoop-common.version}" conf="system->default"/>
   <dependency org="commons-logging" name="commons-logging" 
               rev="${commons-logging.version}" conf="compile->master"/>
   <dependency org="log4j" name="log4j" rev="${log4j.version}" 
               conf="compile->master"/>

   <dependency org="org.slf4j" name="slf4j-api" rev="${slf4j-api.version}" 
               conf="compile->master"/>
   <dependency org="org.slf4j" name="slf4j-log4j12" 
               rev="${slf4j-log4j12.version}" conf="mapred->master"/>
   <dependency org="org.apache.hadoop" name="hadoop-common-test" 
               rev="${hadoop-common.version}" conf="test->default"/>
   <dependency org="org.apache.hadoop" name="hadoop-hdfs-test" 
               rev="${hadoop-hdfs.version}" conf="test->default"/>

   <dependency org="checkstyle" name="checkstyle" rev="${checkstyle.version}"
               conf="checkstyle->default"/>

   <dependency org="jdiff" name="jdiff" rev="${jdiff.version}"
               conf="jdiff->default"/>
   <dependency org="xerces" name="xerces" rev="${xerces.version}"
               conf="jdiff->default"/>

   <dependency org="org.apache.rat" name="apache-rat-tasks" 
               rev="${rats-lib.version}" conf="releaseaudit->default"/>
   <dependency org="commons-lang" name="commons-lang" 
               rev="${commons-lang.version}" conf="releaseaudit->default"/>
   <dependency org="commons-collections" name="commons-collections" 
               rev="${commons-collections.version}" 
               conf="releaseaudit->default"/>

   <dependency org="org.apache.lucene" name="lucene-core" 
               rev="${lucene-core.version}" conf="javadoc->default"/>
   <dependency org="org.apache.hadoop" name="avro" rev="${avro.version}" 
               conf="compile->default">
      <exclude module="ant"/>
      <exclude module="jetty"/>
      <exclude module="slf4j-simple"/>
    </dependency>
   <dependency org="org.mockito" name="mockito-all" rev="${mockito-all.version}" 
               conf="test->default"/>
   <dependency org="org.vafer" name="jdeb" rev="${jdeb.version}" conf="package->master"/>
   <dependency org="org.mortbay.jetty" name="jetty-servlet-tester" rev="${jetty.version}"
               conf="test->default"/>
   <!-- dependency addition for the fault injection -->
   <dependency org="org.aspectj" name="aspectjrt" rev="${aspectj.version}"
               conf="compile->default"/>
   <dependency org="org.aspectj" name="aspectjtools" rev="${aspectj.version}"
               conf="compile->default"/>

 </dependencies>
  
</ivy-module>
