<!--
 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.console.server" default="all" xmlns:jacoco="antlib:org.jacoco.ant">
	<description>
		Build the console server classes.
	</description>

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

	<path id="compile.classpath">
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-http-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-io-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-security-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-server-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-servlet-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-util-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-webapp-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/jetty-xml-9.3.6.v20151106.jar" />
		<pathelement location="${component.ext}/jetty-9.3.6/servlet-api-3.1.jar" />
		<pathelement location="${ext}/slf4j-1.7.12/slf4j-api-1.7.12.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>
