<!--
 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="edgent.api.topology" default="all"
    xmlns:jacoco="antlib:org.jacoco.ant"
    >
    <description>
        Build the functional api.
    </description>

  <import file="../../common-build.xml"/>

  <path id="compile.classpath">
    <pathelement location="${lib}/edgent.api.execution.jar"/>
    <pathelement location="${lib}/edgent.api.graph.jar"/>
    <pathelement location="${lib}/edgent.api.oplet.jar" />
    <path refid="edgent.ext.classpath"/>
  </path>

  <path id="test.compile.classpath">
    <pathelement location="${jar}" />
    <path refid="compile.classpath"/>
  </path>

  <path id="test.classpath">
    <pathelement location="${jar}" />
    <pathelement location="${test.classes}" />
    <path refid="test.compile.classpath"/>
    <path refid="test.common.classpath" />
  </path>
	
  <!-- Build a jar file containing the applications to test the ApplicationService -->
  <target name="test.compile" depends="edgent.common.test.compile,test.jar"/>
  <target name="test.jar" depends="edgent.common.test.compile">
    <jar destfile="${test.classes}/${ant.project.name}.APPS.TEST.jar">
      <service type="org.apache.edgent.topology.services.TopologyBuilder">
        <provider classname="org.apache.edgent.test.topology.services.TestApplications$AppOne" />
        <provider classname="org.apache.edgent.test.topology.services.TestApplications$AppTwo" />
        <provider classname="org.apache.edgent.test.topology.services.TestApplications$AppThree" />
      </service>
     <fileset dir="${test.classes}" includes="**/TestApplications*"/>
    </jar>
  </target>
</project>
