<?xml version="1.0" encoding="utf-8"?>
<!--

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.

-->
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       preinitialize="getInvoke()"
                       applicationComplete="setup()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import org.apache.flex.crypto.MD5Stream;
            
            private static var DEFAULT_READBUFFER_SIZE:int = 2 * 1024 * 1024;
            private static var GCL:String = "Google Closure Library";
            
            private var data:Array = [];
            
            private function getInvoke():void {
                var nativeApplication:NativeApplication = NativeApplication.nativeApplication;
                nativeApplication.addEventListener(InvokeEvent.INVOKE, parseArgs);
            }
            private var logFileName:String = "MD5CheckerLog.txt";
            private var outFileName:String;
            
            private function parseArgs(event:InvokeEvent):void {
                for each (var s:String in event.arguments) {
                    if (s.indexOf("-log=") == 0) {
                        logFileName = s.substring(5);
                    }
                    if (s.indexOf("-out=") == 0) {
                        outFileName = s.substring(5);
                    }
                    if (s.indexOf("-config=") == 0) {
                        configURL = s.substring(8);
                    }
                }
            }
            
            // last modified dates and checksum map by url;
            private var configURL:String = "http://flex.apache.org/installer/sdk-installer-config-4.0.xml";
            private var fs:FileStream = new FileStream();
            private var f:File;

            private function setup():void
            {
                f = File.documentsDirectory.resolvePath(logFileName);
                fs.open(f, FileMode.WRITE);

                var urlRequest:URLRequest = new URLRequest(configURL);
                urlRequest.followRedirects = true;
                urlRequest.cacheResponse = false;
                urlRequest.method = URLRequestMethod.GET;
                xmlLoader.dataFormat = URLLoaderDataFormat.TEXT;
                xmlLoader.addEventListener(Event.COMPLETE, xmlcompleteHandler);
                xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, xmlerrorHandler);
                xmlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, xmlerrorHandler);
                xmlLoader.load(urlRequest);
                progressLabel.text = "Fetching sdk-installer-config-4.0.xml";   
            }
            
            private var xml:XML;
            
            private function xmlcompleteHandler(event:Event):void
            {
                XML.ignoreComments = false;
                XML.prettyIndent = 4;
                
                xml = new XML(xmlLoader.data as String);
                var xmlList:XMLList;
                
                var item:Object;
                
                xmlList = xml["google-closure-library"];
                for each (var node:XML in xmlList)
                {
                    item = {};
                    item.label = GCL;
                    item.url = node.@server.toString() + "/" + node.@folder.toString() + "/" + node.@file.toString();
                    item.md5 = node.@md5.toString();
                    if (!item.md5)
                        continue;
                    item.cacheID = node.@cacheID.toString();
                    item.cacheID2 = node.@cacheID2.toString();
                    item.node = node;
                    data.push(item);
                }

                xmlList = xml.flashsdk.versions.children();
                for each (node in xmlList)
                {
                    item = {};
                    item.label = "Flash PlayerGlobal " + node.@displayVersion.toString();
                    item.url = node.path.toString() + node.file.toString();
                    item.md5 = node.md5.toString();
                    if (!item.md5)
                        continue;
                    item.cacheID = node.@cacheID.toString();
                    item.cacheID2 = node.@cacheID2.toString();
                    item.node = node;
                    data.push(item);
                }
                
                xmlList = xml.airsdk.windows.versions.children();
                for each (node in xmlList)
                {
                    item = {};
                    item.label = "AIR Windows " + node.@displayVersion.toString();
                    item.url = node.path.toString() + node.file.toString();
                    item.md5 = node.md5.toString();
                    if (!item.md5)
                        continue;
                    item.cacheID = node.@cacheID.toString();
                    item.cacheID2 = node.@cacheID2.toString();
                    item.node = node;
                    data.push(item);
                }
                
                xmlList = xml.airsdk.mac.versions.children();
                for each (node in xmlList)
                {
                    item = {};
                    item.label = "AIR Mac " + node.@displayVersion.toString();
                    item.url = node.path.toString() + node.file.toString();
                    item.md5 = node.md5.toString();
                    if (!item.md5)
                        continue;
                    item.cacheID = node.@cacheID.toString();
                    item.cacheID2 = node.@cacheID2.toString();
                    item.node = node;
                    data.push(item);
                }
                dg.dataProvider = new ArrayList(data);
                checkSums();
            }
            
            private function xmlerrorHandler(event:Event):void
            {
                event.preventDefault();
                fs.writeUTFBytes("Unable to fetch " + configURL);
                fs.close();
                this.nativeApplication.exit(-1);
            }
            

            private var xmlLoader:URLLoader = new URLLoader();
            
            private var current:int;
            private var lastModified:String;
            
            private function checkSums():void
            {
                current = 0;
                checkCurrent();
            }
            
            private var urlHeadLoader:URLLoader = new URLLoader();
            private var urlLoader:URLLoader = new URLLoader();
            private var urlLoader2:URLLoader = new URLLoader();
            
            private var nodeChanged:Boolean;
            
            private function checkCurrent():void
            {
                if (current >= data.length)
                {
                    fs.close();
                    if (nodeChanged && outFileName)
                    {
                        f = File.applicationDirectory.resolvePath("ApacheHeader.txt");
                        fs.open(f, FileMode.READ);
                        var header:String = fs.readUTFBytes(fs.bytesAvailable);
                        fs.close();
                        f = File.documentsDirectory.resolvePath(outFileName);
                        fs.open(f, FileMode.WRITE);
                        fs.writeUTFBytes(header);
                        fs.writeUTFBytes(xml.toXMLString());
                        fs.close();
                    }
                    this.nativeApplication.exit(nodeChanged ? -1 : 0);
                    return;
                }
                
                lastModified = null;
                
                var urlRequest:URLRequest = new URLRequest(data[current].url);
                urlRequest.followRedirects = true;
                urlRequest.cacheResponse = false;
                urlRequest.method = URLRequestMethod.HEAD;
                urlRequest.userAgent = "Java";
                urlHeadLoader.dataFormat = URLLoaderDataFormat.BINARY;
                urlHeadLoader.addEventListener(Event.COMPLETE, headcompleteHandler);
                urlHeadLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS,headstatusHandler);
                urlHeadLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
                urlHeadLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
                urlHeadLoader.load(urlRequest);
                progressLabel.text = "Checking " + data[current].url;
            }
            
            private var lastStatus:int;
            
            private function headstatusHandler(event:HTTPStatusEvent):void
            {
                lastStatus = event.status;
                if (event.status >= 400) 
                {
                    // some problem.  skip, go to next one
                    fs.writeUTFBytes("error: " + event.toString());
                    current++;
                    checkCurrent();
                }
                else
                {
                    var foundLastModified:Boolean = false;
                    var headers:Array = event.responseHeaders;
                    for each (var header:URLRequestHeader in headers)
                    {
                        if (header.name == "Etag" || header.name == "ETag")
                        {
                            lastModified = header.value;
                            if (lastModified.indexOf('"') == 0)
                                lastModified = lastModified.substr(1);
                            if (lastModified.indexOf('"') == lastModified.length - 1)
                                lastModified = lastModified.substr(0, lastModified.length - 1);
                            foundLastModified = true;
                        }
                        else if ((header.name == "Last-Modified") && lastModified == null)
                        {
                            lastModified = header.value;
                            foundLastModified = true;
                        }
                    }
                    if (!foundLastModified)
                    {
                        trace("no last modified or etag header");
                    }
                }
            }

            private function headcompleteHandler(event:Event):void
            {
                if (data[current].cacheID != lastModified && data[current].cacheID2 != lastModified)
                {
                    download();
                }
                else
                {
                    current++;
                    checkCurrent();
                }
            }
            
            private function download():void
            {
                var urlRequest:URLRequest = new URLRequest(data[current].url);
                urlRequest.followRedirects = true;
                urlRequest.cacheResponse = false;
                urlRequest.method = URLRequestMethod.GET;
                urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                urlLoader.addEventListener(Event.COMPLETE, completeHandler);
                urlHeadLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, statusHandler);
                urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
                urlLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
                urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
                urlLoader.load(urlRequest);
                progressLabel.text = "Downloading " + data[current].url;
            }
            
            private function progressHandler(event:ProgressEvent):void
            {
                pb.setProgress(event.bytesLoaded, event.bytesTotal);
                pbCurrent.text = event.bytesLoaded.toString();
                pbTotal.text = event.bytesTotal.toString();
            }
            
            private function statusHandler(event:HTTPStatusEvent):void
            {
                lastStatus = event.status;
            }
            
            private function errorHandler(event:Event):void
            {
                fs.writeUTFBytes("error: " + event.toString());
                event.preventDefault();
                current++;
                checkCurrent();
            }
            
            
            private var md5:MD5Stream;
            private var ba:ByteArray;
            
            private function completeHandler(event:Event):void
            {
                if (lastStatus < 300)
                {
                    md5 = new MD5Stream();
                    md5.resetFields();
                    ba = urlLoader.data as ByteArray;
                    progressLabel.text = "Computing checksum for " + data[current].url;
                    getSum();
                }
                else
                {
                    current++;
                    checkCurrent();                    
                }
            }
            
            private function getSum():void
            {
                if (ba.bytesAvailable < DEFAULT_READBUFFER_SIZE)
                {
                    sumComplete();
                    return;
                }
                md5.update(ba, DEFAULT_READBUFFER_SIZE);
                pb.setProgress(ba.position, ba.length);
                pbCurrent.text = ba.position.toString();
                pbTotal.text = ba.length.toString();
                callLater(getSum);
            }
            
            private var sum:String;
            
            private function sumComplete():void
            {
                sum = md5.complete(ba, ba.length);
                retries = 1;
                redownload();
            }
            
            private function redownload():void
            {
                var urlRequest:URLRequest = new URLRequest(data[current].url);
                urlRequest.followRedirects = true;
                urlRequest.cacheResponse = false;
                urlRequest.method = URLRequestMethod.GET;
                urlLoader2.dataFormat = URLLoaderDataFormat.BINARY;
                urlLoader2.addEventListener(Event.COMPLETE, recompleteHandler);
                urlLoader2.addEventListener(ProgressEvent.PROGRESS, progressHandler);
                urlLoader2.addEventListener(IOErrorEvent.IO_ERROR, reerrorHandler);
                urlLoader2.addEventListener(SecurityErrorEvent.SECURITY_ERROR, reerrorHandler);
                urlLoader2.load(urlRequest);
                progressLabel.text = "Verifying CheckSum (" + retries.toString() + ")";
            }
            
            private var retries:int;
            
            private function reerrorHandler(event:Event):void
            {
                if (retries < 4)
                    redownload();
            }
            
            private function recompleteHandler(event:Event):void
            {
                md5 = new MD5Stream();
                md5.resetFields();
                ba = urlLoader2.data as ByteArray;
                getSum2();
            }
            
            private function getSum2():void
            {
                if (ba.bytesAvailable < DEFAULT_READBUFFER_SIZE)
                {
                    sumComplete2();
                    return;
                }
                md5.update(ba, DEFAULT_READBUFFER_SIZE);
                pb.setProgress(ba.position, ba.length);
                pbCurrent.text = ba.position.toString();
                pbTotal.text = ba.length.toString();
                callLater(getSum2);
            }
                        
            private function sumComplete2():void
            {
                var sum2:String = md5.complete(ba, ba.length);
                if (sum == sum2)
                {
                    data[current].cacheID = lastModified;
                    data[current].md5 = sum;
                    fs.writeUTFBytes("Old Node:\n");
                    fs.writeUTFBytes(data[current].node.toXMLString() + "\n");
                    fs.writeUTFBytes("New Node:\n");
                    data[current].node.@cacheID = lastModified;
                    if (data[current].label == GCL)
                        data[current].node.@md5 = sum;
                    else
                        data[current].node.md5 = sum;
                    nodeChanged = true;
                    fs.writeUTFBytes(data[current].node.toXMLString() + "\n");                        
                    dg.dataProvider.itemUpdated(data[current]);
                    current++;
                    checkCurrent();
                }
                else
                {
                    sum = sum2;
                    redownload();
                }
            }

        ]]>
    </fx:Script>
    <s:VGroup width="100%">
        <s:DataGrid id="dg" width="100%" height="300" editable="true">
            <s:columns>
                <s:ArrayList>
                    <s:GridColumn dataField="label" />
                    <s:GridColumn dataField="url" />
                    <s:GridColumn dataField="md5" editable="true"/>
                    <s:GridColumn dataField="cacheID" editable="true"/>
                </s:ArrayList>
            </s:columns>
        </s:DataGrid>
        <s:Label id="progressLabel" width="100%" />
        <mx:ProgressBar id="pb" width="100%" mode="manual" />
        <s:HGroup>
            <s:Label id="pbCurrent" />
            <s:Label text="out of" />
            <s:Label id="pbTotal" />
        </s:HGroup>
    </s:VGroup>
</s:WindowedApplication>
