<!--
	Copyright 2008-2010 the EasyAnt project
	
	See the NOTICE file distributed with this work for additional information 
	regarding copyright ownership.
	
	Licensed 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="org.apache.easyant.buildtypes#build-std-java" xmlns:ea="antlib:org.apache.easyant">

	<ea:core-version requiredrevision="[0.8,+]" />

	<echo message="Building ${ivy.organisation} ${ivy.module} with org.apache.easyant.buildtypes#build-std-java..." />

	<ea:import mrid="org.apache.easyant.plugins#phases-std;0.2" />

	<property file="${org.apache.easyant.buildtypes#build-std-java.properties.file}" />

	<ea:parameter property="version.strategy.plugin.org" description="Organisation name of the version strategy plugin" default="org.apache.easyant.plugins"/>
	<ea:parameter property="version.strategy.plugin.module" description="Module name of the version strategy plugin" default="default-version-strategy"/>
	<ea:parameter property="version.strategy.plugin.rev" description="Revision number of the version strategy plugin" default="0.1"/>
	<ea:parameter property="version.strategy.plugin.mrid" description="Full mrid of the version strategy plugin" default="${version.strategy.plugin.org}#${version.strategy.plugin.module};${version.strategy.plugin.rev}"/>

	<ea:parameter property="test.plugin.org" description="Organisation name of the test plugin" default="org.apache.easyant.plugins"/>
	<ea:parameter property="test.plugin.module" description="Module name of the test plugin" default="test-${test.framework}"/>
	<ea:parameter property="test.plugin.rev" description="Revision number of the test plugin" default="0.2"/>
	<ea:parameter property="test.plugin.mrid" description="Full mrid of the test plugin" default="${test.plugin.org}#${test.plugin.module};${test.plugin.rev}"/>

	
	<ea:include mrid="org.apache.easyant.plugins#clean-std;0.1" as="clean" />

	<ea:include mrid="org.apache.easyant.plugins#ivy-provisioning;0.1" as="lib" />
	<ea:include mrid="${version.strategy.plugin.mrid}" as="version" />
	<ea:include mrid="org.apache.easyant.plugins#ivy-publication;0.1" as="publish" />
	<ea:include mrid="org.apache.easyant.plugins#ivy-utils;0.1" as="ivy" />
	<ea:include mrid="org.apache.easyant.plugins#resources-std;0.1" as="resources" />
	<ea:include mrid="org.apache.easyant.plugins#compile-java;0.1" as="compile" />
	<ea:include mrid="org.apache.easyant.plugins#compile-test-java;0.1" as="compile-test" />

	<ea:include mrid="${test.plugin.mrid}" as="test" />
	<ea:include mrid="org.apache.easyant.plugins#manifest;0.1" as="manifest" />
	
	<ea:include mrid="org.apache.easyant.plugins#package-jar;0.1" as="jar" />

	<target name="doit" depends="verify" />
</project>
