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

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

  <property name="webapp.html" location="webapp_content/html" />
  <property name="webapp.js" location="webapp_content/js" />
  <property name="webapp.resources" location="webapp_content/resources" />
  <property name="webapp.web-inf" location="webapp_content/WEB-INF" />

  <property name="webapps.dir" location="${lib}/../../webapps" />
  <property name="warfile" location="${webapps.dir}/console.war" />
  <target name="clean" depends="edgent.common.clean">
    <delete file="${warfile}" />
  </target>
	
  <path id="compile.classpath">
  	<pathelement location="${edgent.console}/server/ext/jetty-9.3.6/servlet-api-3.1.jar" />
	<pathelement location="${ext}/slf4j-1.7.12/slf4j-api-1.7.12.jar"/>
    <pathelement location="${edgent.utils}/streamscope/lib/edgent.utils.streamscope.jar"/>
    <path refid="edgent.ext.classpath" />
  </path>

  <target name="all" depends="edgent.common.all,war" />

  <target name="war" depends="edgent.common.all">
    <mkdir dir="${webapps.dir}"/>
    <war destfile="${warfile}" webxml="${webapp.web-inf}/console.xml">
      <fileset dir="${webapp.html}" />
      <zipfileset dir="${webapp.js}" prefix="js" />
      <zipfileset dir="${webapp.resources}" prefix="resources" />
      <classes dir="${classes}" />
    </war>
  </target>
	
  <path id="test.compile.classpath">
  	<pathelement location="${jar}" />
    <pathelement location="${test.classes}}" />
    <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>
