#!/bin/sh -e

################################################################################
##
##  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.
##
################################################################################

#
# Usage: constructFlexForIDE "Apache Flex dir" ["Adobe Flex 4.6 dir"]
#
# This script should be used to create an Apache Flex SDK for Mac OSX that has the 
# directory structure that the an IDE that supports Flex, such as Adobe Flash Builder or
# JetBrains IntelliJ expects. 
# 
# This script can be used with either an Apache Flex binary package or an Apache Flex 
# source package.  In either case you must unzip the package.  If you use the source 
# package you must build the binaries files before running this script.  See the 
# "Building the Source in the Source Distribution" section in the README at the root 
# for build instructions.
#
# The Adobe AIR SDK for Mac and the Adobe Flash Player playerglobal.swc are copied into 
# the Apache Flex directory.  The paths in the framework configuration files 
# are modified to reflect this.  You do not need to set up any of the environment
# variables mentioned in the README because the locations of all the software are known 
# in this configuration.
#
# TextLayoutFormat (TLF), OSMF, swobject, the Adobe embedded font support, 
# and Adobe BlazeDS integration all come from the Adobe Flex 4.6 SDK.  You should
# be aware that these components have their own licenses that may or may not be
# compatible with the Apache v2 license.  See the "Software Dependencies" section
# in the README for more license information.
#
#  If the Adobe Flex SDK 4.6 directory is not specified this script will look for it
#  in the following places, and if not found, will prompt for the directory.
#
#  /Applications/Adobe Flash Builder 4.5/sdks/4.6.0
#  /Applications/Adobe Flash Builder 4.6/sdks/4.6.0
#  /Applications/Adobe Flash Builder 4.7/sdks/4.6.0
#
# The Adobe Flex 4.6 SDK is available here:
#      http://www.adobe.com/devnet/flex/flex-sdk-download.html

# copyFileOrDirectory from ADOBE_FLEX_SDK_DIR to IDE_SDK_DIR
#   param1 is file or directory to copy
copyFileOrDirectory()
{
    f="$1"
    
    echo Copying $f
    
    dir=`dirname "${IDE_SDK_DIR}/$f"`

    if [ -f "${ADOBE_FLEX_SDK_DIR}/$f" ] ; then
        mkdir -p "${dir}"
        cp -p "${ADOBE_FLEX_SDK_DIR}/$f" "${IDE_SDK_DIR}/$f"
    fi

    if [ -d "${ADOBE_FLEX_SDK_DIR}/$f" ] ; then
        rsync --archive --ignore-existing --force "${ADOBE_FLEX_SDK_DIR}/$f" "${dir}"
    fi
}

# Process the parameters.

IDE_SDK_DIR="$1"
if [ "${IDE_SDK_DIR}" = "" ] ; then
    echo Usage: $0 "Apache Flex dir" ["Adobe Flex SDK 4.6 dir"]
    exit 1;
fi

echo The Apache Flex directory for the IDE is "$IDE_SDK_DIR"

# If this is an Apache Flex dir then there should be a NOTICE file.

if [ ! -f "${IDE_SDK_DIR}/NOTICE" ]
then
    echo ${IDE_SDK_DIR} does not appear to be an Apache Flex distribution.
    exit 1;
fi

# Quick check to see if there are binaries in the Apache distribution.

if [ ! -f "${IDE_SDK_DIR}/lib/mxmlc.jar" ]
then
    echo ${IDE_SDK_DIR} does not appear to be a Apache Flex distribution with binaries.
    echo If this is a source distribution of Apache Flex you must build the binaries first.
    echo See the README.
    exit 1;
fi

# FlashBuilder requires the frameworks/rsls directory.

if [ ! -d "${IDE_SDK_DIR}/frameworks/rsls" ]
then
    echo ${IDE_SDK_DIR} does not appear to be a Apache Flex distribution with rsls.
    echo If this is a source distribution of Apache Flex you must first build the rsls.
    exit 1;
fi

if [ "$2" = "" ]
then
    #  Look for installed FlashBuilder versions 4.5, 4.6 and 4.7.
    if [ -d "/Applications/Adobe Flash Builder 4.5/sdks/4.6.0" ]
    then
        ADOBE_FLEX_SDK_DIR="/Applications/Adobe Flash Builder 4.5/sdks/4.6.0"
    elif [ -d "/Applications/Adobe Flash Builder 4.6/sdks/4.6.0" ]
    then
        ADOBE_FLEX_SDK_DIR="/Applications/Adobe Flash Builder 4.6/sdks/4.6.0"
    elif [ -d "/Applications/Adobe Flash Builder 4.7/sdks/4.6.0" ]
    then
        ADOBE_FLEX_SDK_DIR="/Applications/Adobe Flash Builder 4.7/sdks/4.6.0"
    else
        #  Couldn't find default Adobe Flex SDK so ask for it.
        while [ -z "$ADOBE_FLEX_SDK_DIR" ]
        do
            echo 'Enter directory of an Adobe Flex SDK 4.6: \c'
            read ADOBE_FLEX_SDK_DIR
        done
    fi
else
    ADOBE_FLEX_SDK_DIR="$2"
fi

echo The Adobe Flex directory is "${ADOBE_FLEX_SDK_DIR}"
echo

# Quick check to see if it is a Flex SDK.
if [ ! -f "${ADOBE_FLEX_SDK_DIR}/license-adobesdk.htm" ]
then
    echo ${ADOBE_FLEX_SDK_DIR} does not appear to be an Adobe Flex SDK
    exit 1;
fi

# Copy all the AIR SDK files to the IDE SDK.
# Copy files first, then directories.

echo Copying the AIR SDK files to directory "${IDE_SDK_DIR}"

files=(
    "AIR SDK license.pdf" 
    "AIR SDK Readme.txt" 
    bin/adl.exe 
    bin/adt.bat 
    frameworks/libs/air
    frameworks/libs/player/11.1
    frameworks/projects/air
    include
    install/android
    lib/adt.jar 
    lib/android
    lib/aot
    lib/nai
    lib/win
    runtimes
    samples/badge
    samples/descriptor-sample.xml
    samples/icons
    templates/air
    templates/extensions)
for file in "${files[@]}" 
do
    copyFileOrDirectory "$file"
done

# Copy all the third-party files from the Adobe Flex SDK to the IDE SDK.

echo
echo Copying the third-party files to directory "${IDE_SDK_DIR}"

files=(
    frameworks/libs/osmf.swc
    frameworks/libs/textLayout.swc
    frameworks/libs/player/11.1
    frameworks/javascript/fabridge/samples/fabridge/swfobject
    lib/flex-messaging-common.jar
    lib/afe.jar
    lib/aglj40.jar
    lib/flex-fontkit.jar
    lib/rideau.jar
    templates/swfobject/swfobject.js)
for file in "${files[@]}" 
do
    copyFileOrDirectory $file
done

# Copy config files formatted for IDE to frameworks.
echo
echo Copying frameworks config files configured for use without environment variables
cp -p -v -f "$IDE_SDK_DIR"/ide/flashbuilder/config/*-config.xml "$IDE_SDK_DIR/frameworks"
