<?xml version="1.0"?>
<!--

  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="sdk" default="main" basedir=".">

    <property name="FLEX_HOME" location="${basedir}/../.."/>

    <property file="${FLEX_HOME}/env.properties"/>
    <property environment="env"/>

    <property file="${FLEX_HOME}/local.properties"/>
    <property file="${FLEX_HOME}/build.properties"/>

    <!-- comes from build.propertes unless bin distro -->
    <property name="playerglobal.version" value="11.1"/>

    <property name="frameworks.dir" value="${FLEX_HOME}/frameworks"/>

    <property name="air.dir" value="${env.AIR_HOME}"/>
    <property name="debugger" value="${env.FLASHPLAYER_DEBUGGER}"/>
    
    <target name="clean">
        <delete dir="${basedir}/config" failonerror="false" />
        <delete file="${basedir}/FlashBuilderProjectFiles.zip" failonerror="false" />
    </target>
    
    <target name="main" depends="expand-config-tokens" 
        description="Create framework config files in format expected by Adobe FlashBuilder"/>

    <!-- For testing.  Run this to integrate this SDK (in-place) with playerglobal.swc and
         AIR, and modify the framework config files to be the format FB expects.  Only
         the AIR kit for the platform specified by AIR_HOME will be incorporated.
         FlashBuilder also expects frameworks/rsls to exist.
         
         There is no clean for this operation.
    -->
    <target name="make-sdk" depends="build-rsls,install-config,install-playerglobal,install-air"
        description="Converts this SDK into the layout FlashBuilder expects."/>
    
    <target name="create-config-files" 
        description="Framework config files for Adobe FlashBuilder">
        <copy todir="${basedir}/config" overwrite="true">
            <fileset dir="${FLEX_HOME}/frameworks">
                <include name="air-config.xml"/>
                <include name="airmobile-config.xml"/>
                <include name="flex-config.xml"/>
            </fileset>            
        </copy>
    </target>

    <target name="expand-config-tokens" depends="create-config-files" description="Expand {airHome} and {playerglobalHome} tokens">        
        <echo message="expanding {airHome} and {playerglobalHome} tokens"/>
        <fix-config-file-for-flashbuilder file="${basedir}/config/air-config.xml" />
        <fix-config-file-for-flashbuilder file="${basedir}/config/airmobile-config.xml" />
        <fix-config-file-for-flashbuilder file="${basedir}/config/flex-config.xml" />
    </target>

    <!--
        {airHome}/frameworks/ is removed so path left as libs/air
        {playerglobalHome} replaced with libs/player/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}
            the compiler expands the version tokens with the configured target player
            
        Note that FlashBuilder does not appear to use the playerglobal path since it seems
        to have hard-coded the path to libs/player/targetVersion/playglobal.swc where
        target version is set thru its gui.
        
        After token replacement the library-path may end up with duplicate lines
        but the compiler seems to detect that and removes one of them.
        
        In air-config.xml these two lines are identical after token replacement.
             <path-element>libs/air</path-element>
             <path-element>{airHome}/frameworks/libs/air</path-element>
    -->
    <macrodef name="fix-config-file-for-flashbuilder">
        <attribute name="file"/>
            <sequential>
                <replace file="@{file}">
                    <replacefilter
                        token="{airHome}/frameworks/"
                        value=""/>
                    <replacefilter
                        token="{playerglobalHome}"
                        value="libs/player"/>
                    <replacefilter
                        token="$${build.number}"
                        value="${release.version}.${build.number}"/>
                </replace>
        </sequential>
    </macrodef>	

    <target name="check-rsls">
        <available file="${frameworks.dir}/rsls" type="dir" property="rsls.dir.exists"/>
    </target>
    
    <target name="build-rsls" depends="check-rsls" unless="rsls.dir.exists">
        <ant dir="${FLEX_HOME}" target="frameworks-rsls"/>
    </target>
    
    <target name="install-config" depends="expand-config-tokens">
        <copy todir="${frameworks.dir}" verbose="true">
            <fileset dir="${basedir}/config"/> 
        </copy>
    </target>
    
    <target name="install-playerglobal">
        <copy todir="${frameworks.dir}/libs/player/${playerglobal.version}" verbose="true">
            <fileset file="${env.PLAYERGLOBAL_HOME}/${playerglobal.version}/playerglobal.swc"/> 
        </copy>
    </target>
    
    <!-- Warning: symlinks may not be maintained on unix platforms -->
    <target name="install-air">
        <copy todir="${FLEX_HOME}" preservelastmodified="true" verbose="true">
            <fileset dir="${air.dir}"/>
        </copy>
        <chmod dir="${FLEX_HOME}" perm="755" includes="bin/*, **/*.bat, **/*.sh" />
    </target>

    <target name="zip-project-files">
        <zip destfile="${basedir}/FlashBuilderProjectFiles.zip">
            <zipfileset dir="${FLEX_HOME}" prefix="${release.version}">
                <include name="**/.*"/>
                <exclude name="mustella/**/.*"/>
                <exclude name="temp/**/.*"/>
            </zipfileset> 
        </zip>    
    </target>
</project>
