<!--
 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.samples.console" default="all" xmlns:jacoco="antlib:org.jacoco.ant">
	<description>
        Build samples demonstrating Console functionality.
    </description>

        <property name="component.path" value="samples"/>
	<import file="../../common-build.xml" />

	<path id="compile.classpath">
		<path refid="edgent.samples.classpath"/>
        <pathelement location="${edgent.console}/server/lib/edgent.console.server.jar" />
		<pathelement location="${edgent.lib}/edgent.topology.jar" />
		<pathelement location="${edgent.lib}/edgent.providers.development.jar" />
		<pathelement location="${edgent.lib}/edgent.providers.direct.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="${test.classes}" />
		<path refid="test.compile.classpath" />
	    <path refid="test.common.classpath" />
	</path>

</project>
