<!--

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.

-->

==========================================================================================
Overview:
==========================================================================================

- The Apache Flex SDK Installer AIR application provides an easy installation of the 
  Apache Flex SDK and all its dependencies.  This will make it suitable for working with 
  IDEs such as Adobe Flash Builder, FDT, IntelliJ IDEA, FlashDevelop, etc.  
  The application downloads the following dependencies:
    - The AIR sdk (Windows vs. Mac) based on the current platform
    - Adobe Flash Player playerglobal.swc
    - SwfObject
    - Open Source Media Framework (OSMF)
	 
  Optionally, the application will download these files if the user explicitly agrees to 
  the licensing terms:
    - Adobe BlazeDS
    - Adobe embedded font support
 
- The Apache Flex SDK Installer 3.0 and later supports the ability to install 
  virtually anything that can be installed via an Apache Ant script.  The list 
  of choices to install are described in 
  installer/src/installer/sdk-installer-config-4.0.xml and posted to
  http://flex.apache.org/installer/sdk-installer-config-4.0.xml.  By default, the
  installer looks there to determine the list of choices.  Once a selection is made,
  the installer then looks in the folder of the install package for a -config.xml file
  and if found, uses that to determine the set of licensing options that need to be
  accepted before installing.  The installer then uncompresses the install package and
  looks for installer.xml and runs that script via an approximation of Apache Ant that
  has been written in ActionScript.  If the -config.xml file is not found, the Installer
  assumes it is installing an older version of the Apache Flex SDK.

- When installing an older version of the Apache Flex SDK, the installer
  determines the file names and urls of the downloaded files from 
  installer/src/installer/sdk-installer-config-4.0.xml. When the dependencies file 
  names or urls change in future, update the sdk-installer-config-4.0.xml to ensure 
  that the application works correctly.  For newer installs driven by Apache Ant
  scripts, the file names and urls are determined by the script itself.
    
- The application uses http://flex.apache.org/single-mirror-url.cgi to determine
  the preferred mirror url to use to download the binary package.  Newer installs
  that use Apache Ant scripts use their own logic to select dependencies from mirrors.
  
- Once the binary package is downloaded, a MD5 hash is generated for it.  
  This hash is compared with the hash from the Apache Flex SDK release site.  
  If they match, we verify that the downloaded binary package is a valid Apache release and 
  proceed to unzip the file.  
	
- If required, the Adobe AIR SDK will be downloaded and the relevant files are copied 
  to the required locations.
  
- If required, the Adobe Flash Player playerglobal.swc file and the config files 
  are placed in the required locations.
  
- Then the rest of the external dependencies and the optional files (if selected by user) 
  are downloaded and copied into the appropriate locations.  

- If you experience problems with the install, please try again, but right-click
  and select "Verbose Logging" to add more information to the log. 

- From the 2.6 version, you can select the version of Adobe Flash Player and Adobe AIR SDK
  the installer downloads.

- From the 2.5 version, by default, Apache Flex SDK Installer 2.5 downloads Adobe Flash 
  Player 11.1 and Adobe AIR SDK 3.4. 
  If you want to change it to any other supported combination, you save a copy of the 
  config file found at: http://flex.apache.org/installer/sdk-installer-config-3.0.xml, 
  modify the download urls to point to the required versions.  Then run the app from 
  command line mode with the optional command line parameter: -config=<path to config file>

- If building the app for Linux, open InstallApacheFlex-app.xml and change the Adobe AIR 
  namespace from http://ns.adobe.com/air/application/4.0 to 
  http://ns.adobe.com/air/application/2.6  This is because AIR 2.6 is the latest available 
  version on Linux.  
	
==========================================================================================
How to build the installer using ANT (no Flash Builder or any other IDE required):
==========================================================================================

0.  Make sure you have the right version of the Adobe AIR SDK.  Apache Flex Installer
    3.1 uses Adobe AIR SDK 4.0.  If you want to use an older version of the AIR SDK,
    you will have to change the namespace in the following files:
	installer/src/InstallApacheFlex-app.xml
	ant_on_air/tests/AntOnAIR-app.xml.

1.  Unzip the source distribution.  You should see the 'installer' directory and the 
    'common' and 'ant_on_air' directories in the root.

2.  In the ant_on_air directory, run:
        ant [-DFLEX_HOME=/path/to/apache/flex/sdk] [-DAIR_HOME=/path/to/air/sdk]
            
    FLEX_HOME is the absolute path to the Apache Flex SDK
        If you omit this argument, and the system environment variable, FLEX_HOME exists,
        it is used.  Otherwise, the FLEX_HOME_MAC or FLEX_HOME_WIN property in 
        installer/build.properties is used.
        
    AIR_HOME is the absolute path to the Adobe AIR SDK
        If you omit this argument, and the system environment variable, AIR_HOME exists,
        it is used.  Otherwise, the AIR_HOME_MAC or AIR_HOME_WIN property in 
        installer/build.properties is used.
          	
3.  In the installer directory, run:
        ant build [-DFLEX_HOME=/path/to/apache/flex/sdk] [-DAIR_HOME=/path/to/air/sdk]
        
4.  The installer executable file created in the installer/release directory.  If you are 
    on Windows, you will see an .exe file; if you are on Mac OS, you will see a .dmg file.  
	A temporary digital signing certificate - temp.p12 will be created in the installer 
	directory as well.  The password for this file is available in the build.properties 
	file (var: TEMP_PASS_CHANGE_THIS)

==========================================================================================
How to set up the project for working with Adobe Flash Builder 4.7:
==========================================================================================

1.  Unzip the source distribution.  You should see the 'installer' directory and the 
    'common' and 'ant_on_air' directories in the root.

2.  In the installer directory run: 
        ant get-as3commons.swc
    This step downloads the required as3commons library and saves it in the libs 
    directory.

3.  If using Adobe Flash Builder, add a linked resource called: 
        APACHE_FLEX_UTILITIES_ROOT 
    and point it to the directory path where the 'installer' and 'common' directories are 
    located.

4.  In the installer project, add ${APACHE_FLEX_UTILITIES_ROOT}/common/src as a source path.

5.  In the installer project, add ${APACHE_FLEX_UTILITIES_ROOT}/ant_on_air/src as a source path.

6.  In the installer project, add ${APACHE_FLEX_UTILITIES_ROOT}/ant_on_air/external as a source path.

7.  In the installer project, add ${APACHE_FLEX_UTILITIES_ROOT}/ant_on_air/locale/{locale} as a source path.

==========================================================================================
How to set up the project for working with JetBrains IDEA 12+
==========================================================================================

1.  Setup a new project by either unzipping the downloaded source or grabbing the source from the version control.

2.  During the project setup, DO NOT search for modules or frameworks.  We will set these up later.

3.  Setup a new module by going to the File -> New Module menu.
    Module Type :  Flash
    Target Platform : Desktop
    Output Type : Application
    Create Sample App :  Unchecked
    Create HTML Wrapper : Unchecked

    Create the new module, name it "installer" and chose the ${APACHE_FLEX_UTILITIES_ROOT}/installer directory

4.  After the module is created, go into the installer module settings (Right-Click ->  Open Module Settings)

5.  Add the following Content Roots :
    flex-utilities\ant_on_air
    flex-utilities\common

6.  Mark the following directories as Sources :   (some may already be marked as src)
    flex-utilities\ant_on_air\src
    flex-utilities\ant_on_air\external
    flex-utilities\common\src
    flex-utilities\installer\src

7.  Close the Settings dialog

8.  Open the Ant Build tab within IDEA.
    Add the flex-utilities\build.xml ANT build script.

9.  Run the get-as3commons.swc ant target.  This will download the required SWC to build the installer.

10. Return to the module properties, and go to the dependencies tab.  Make sure the following are listed :
    Flex SDK
    flex-utilities\installer\libs
    flex-utilities\installer\common\bin\common.swc
    flex-utilities\installer\ant_on_air\bin\ant_on_air.swc
    flex-utilities\ant_on_air\external\libs\as3commons-zip-1.0.0-alpha.1.swc

11. Apply and close the dialog box.

12. Update the flex-utilities\installer\build.properties to match your settings.  In theory you should only
    have to update the FLEX_HOME_WIN or FLEX_HOME_MAC property to point to your SDK with AIR 4.0 overlaid.

You should now be able to build and debug the installer.
