<!--
* Copyright 2001-2009 The Apache Software Foundation.
*
* 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="juddi-core-jpa" default="copy-from-core" basedir=".">
	
	<target name="copy-main">
		    <echo>delete: ${basedir}/src/main/</echo>
		    <delete dir="${basedir}/src/main/"  />
	        <mkdir dir="${basedir}/src/main/"/>
	        <echo>copy: ${juddi.core.dir}/src/main</echo>
	        <copy todir="${basedir}/src/main">
	            <fileset dir="${juddi.core.dir}/src/main">
	               <include name="**/*"/>
	            </fileset>
	        </copy>
	    </target>
	
	<target name="copy-test-java">
		<echo>delete: ${basedir}/src/test/java</echo>
		<delete dir="${basedir}/src/test/java" />
        <mkdir dir="${basedir}/src/test/java"/>
        <echo>copy: ${juddi.core.dir}/src/test/java</echo>
        <copy todir="${basedir}/src/test/java">
        	<fileset dir="${juddi.core.dir}/src/test/java">
        	   <include name="**/*.java"/>
        	</fileset>
        </copy>
    </target>
	
	<target name="copy-from-core" depends="copy-main,copy-test-java"/>

</project>
