You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pi...@apache.org on 2017/11/12 19:19:32 UTC
git commit: [flex-utilities] [refs/heads/develop] - FLEX-35295 -
Switch on Windows Ant Get to download using PowerShell by introducing class
PowerShellFileDownloader which using System.Net.WebClient class and method
DownloadFileAsync
Repository: flex-utilities
Updated Branches:
refs/heads/develop b7b11bbed -> 658a49f93
FLEX-35295 - Switch on Windows Ant Get to download using PowerShell by introducing class PowerShellFileDownloader which using System.Net.WebClient class and method DownloadFileAsync
Project: http://git-wip-us.apache.org/repos/asf/flex-utilities/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-utilities/commit/658a49f9
Tree: http://git-wip-us.apache.org/repos/asf/flex-utilities/tree/658a49f9
Diff: http://git-wip-us.apache.org/repos/asf/flex-utilities/diff/658a49f9
Branch: refs/heads/develop
Commit: 658a49f938667d59739fc1c09e8127f1406427e1
Parents: b7b11bb
Author: Piotr Zarzycki <pi...@gmail.com>
Authored: Sun Nov 12 20:19:26 2017 +0100
Committer: Piotr Zarzycki <pi...@gmail.com>
Committed: Sun Nov 12 20:19:26 2017 +0100
----------------------------------------------------------------------
.../src/org/apache/flex/ant/tags/Get.as | 107 ++++++++++----
.../flex/utils/PowerShellFileDownloader.as | 145 +++++++++++++++++++
2 files changed, 226 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/658a49f9/flex-installer/ant_on_air/src/org/apache/flex/ant/tags/Get.as
----------------------------------------------------------------------
diff --git a/flex-installer/ant_on_air/src/org/apache/flex/ant/tags/Get.as b/flex-installer/ant_on_air/src/org/apache/flex/ant/tags/Get.as
index b8d76b6..21709de 100644
--- a/flex-installer/ant_on_air/src/org/apache/flex/ant/tags/Get.as
+++ b/flex-installer/ant_on_air/src/org/apache/flex/ant/tags/Get.as
@@ -31,6 +31,7 @@ package org.apache.flex.ant.tags
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
+ import flash.system.Capabilities;
import flash.utils.ByteArray;
import mx.core.IFlexModuleFactory;
@@ -38,7 +39,8 @@ package org.apache.flex.ant.tags
import org.apache.flex.ant.Ant;
import org.apache.flex.ant.tags.supportClasses.TaskHandler;
-
+ import org.apache.flex.utils.PowerShellFileDownloader;
+
[ResourceBundle("ant")]
[Mixin]
public class Get extends TaskHandler
@@ -81,7 +83,8 @@ package org.apache.flex.ant.tags
private var urlLoader:URLLoader;
private var lastProgress:ProgressEvent;
-
+ private var powerShellFileDownloader:PowerShellFileDownloader;
+
override public function execute(callbackMode:Boolean, context:Object):Boolean
{
super.execute(callbackMode, context);
@@ -97,18 +100,20 @@ package org.apache.flex.ant.tags
catch (error:Error)
{
}
-
+
+ var destFile:File = getDestFile();
+
if (skipexisting)
{
- var destFile:File = getDestFile();
if (destFile.exists)
return true;
}
+
var s:String = ResourceManager.getInstance().getString('ant', 'GETTING');
s = s.replace("%1", src);
ant.output(ant.formatOutput("get", s));
s = ResourceManager.getInstance().getString('ant', 'GETTO');
- s = s.replace("%1", getDestFile().nativePath);
+ s = s.replace("%1", destFile.nativePath);
ant.output(ant.formatOutput("get", s));
var actualSrc:String = src;
@@ -119,14 +124,14 @@ package org.apache.flex.ant.tags
urlLoader = new URLLoader();
urlLoader.load(urlRequest);
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
- urlLoader.addEventListener(Event.COMPLETE, completeHandler);
+ urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, statusHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
return false;
}
-
+
private function statusHandler(event:HTTPStatusEvent):void
{
if (event.status >= 300 && event.status < 400)
@@ -136,7 +141,7 @@ package org.apache.flex.ant.tags
urlLoader.close();
// remove handlers from old request
- urlLoader.removeEventListener(Event.COMPLETE, completeHandler);
+ urlLoader.removeEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
urlLoader.removeEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, statusHandler);
urlLoader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
urlLoader.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
@@ -167,24 +172,54 @@ package org.apache.flex.ant.tags
newlocation += src.substring(DOWNLOADS_SOURCEFORGE_NET.length);
}
ant.output(ant.formatOutput("get", "Redirected to: " + newlocation));
- var urlRequest:URLRequest = new URLRequest(newlocation);
- var refHeader:URLRequestHeader = new URLRequestHeader("Referer", src);
- urlRequest.requestHeaders.push(refHeader);
- urlRequest.manageCookies = false;
- urlRequest.followRedirects = false;
- urlRequest.userAgent = "Java"; // required to get sourceforge redirects to do the right thing
- urlLoader = new URLLoader();
- urlLoader.load(urlRequest);
- urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
- urlLoader.addEventListener(Event.COMPLETE, completeHandler);
- urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, statusHandler);
- urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
- urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
- urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+
+ if (Capabilities.os.indexOf("Win") != -1)
+ {
+ var destination:String = getDestFile().nativePath;
+ powerShellFileDownloader = new PowerShellFileDownloader();
+ powerShellFileDownloader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
+ powerShellFileDownloader.addEventListener(Event.COMPLETE, powershellDownloadCompleteHandler);
+ powerShellFileDownloader.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, standardErrorDataHandler);
+ powerShellFileDownloader.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, ioErrorEventHandler);
+ powerShellFileDownloader.download(newlocation, destination);
+ }
+ else
+ {
+ var urlRequest:URLRequest = new URLRequest(newlocation);
+ var refHeader:URLRequestHeader = new URLRequestHeader("Referer", src);
+ urlRequest.requestHeaders.push(refHeader);
+ urlRequest.manageCookies = false;
+ urlRequest.followRedirects = false;
+ urlRequest.userAgent = "Java"; // required to get sourceforge redirects to do the right thing
+ urlLoader = new URLLoader();
+ urlLoader.load(urlRequest);
+ urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
+ urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
+ urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, statusHandler);
+ urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
+ urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorEventHandler);
+ urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
+ }
}
}
}
-
+
+ private function standardErrorDataHandler(event:ProgressEvent):void
+ {
+ if (lastProgress)
+ ant.output("ioError at: " + lastProgress.bytesLoaded + " of " + lastProgress.bytesTotal);
+
+ ant.output(event.toString());
+ if (!ignoreerrors)
+ {
+ ant.project.failureMessage = ant.formatOutput("get", event.toString());
+ ant.project.status = false;
+ }
+ dispatchEvent(new Event(Event.COMPLETE));
+ event.preventDefault();
+ cleanUpPowerShellFileDownloader();
+ }
+
private function ioErrorEventHandler(event:IOErrorEvent):void
{
if (lastProgress)
@@ -198,7 +233,8 @@ package org.apache.flex.ant.tags
}
dispatchEvent(new Event(Event.COMPLETE));
event.preventDefault();
- urlLoader = null;
+ urlLoader = null;
+ cleanUpPowerShellFileDownloader();
}
private function securityErrorHandler(event:SecurityErrorEvent):void
@@ -221,7 +257,7 @@ package org.apache.flex.ant.tags
ant.dispatchEvent(event);
}
- private function completeHandler(event:Event):void
+ private function urlLoaderCompleteHandler(event:Event):void
{
var destFile:File = getDestFile();
if (destFile)
@@ -233,9 +269,28 @@ package org.apache.flex.ant.tags
}
dispatchEvent(new Event(Event.COMPLETE));
- urlLoader = null;
+ urlLoader = null;
}
+ private function powershellDownloadCompleteHandler(event:Event):void
+ {
+ ant.output("PowerShell download completed.");
+ dispatchEvent(new Event(Event.COMPLETE));
+ cleanUpPowerShellFileDownloader();
+ }
+
+ private function cleanUpPowerShellFileDownloader():void
+ {
+ if (powerShellFileDownloader)
+ {
+ powerShellFileDownloader.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
+ powerShellFileDownloader.removeEventListener(Event.COMPLETE, powershellDownloadCompleteHandler);
+ powerShellFileDownloader.removeEventListener(ProgressEvent.STANDARD_ERROR_DATA, standardErrorDataHandler);
+ powerShellFileDownloader.removeEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, ioErrorEventHandler);
+ powerShellFileDownloader = null;
+ }
+ }
+
private function getDestFile():File
{
try {
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/658a49f9/flex-installer/ant_on_air/src/org/apache/flex/utils/PowerShellFileDownloader.as
----------------------------------------------------------------------
diff --git a/flex-installer/ant_on_air/src/org/apache/flex/utils/PowerShellFileDownloader.as b/flex-installer/ant_on_air/src/org/apache/flex/utils/PowerShellFileDownloader.as
new file mode 100644
index 0000000..5f1db51
--- /dev/null
+++ b/flex-installer/ant_on_air/src/org/apache/flex/utils/PowerShellFileDownloader.as
@@ -0,0 +1,145 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.utils
+{
+ import flash.events.IOErrorEvent;
+
+ import flash.desktop.NativeProcess;
+ import flash.desktop.NativeProcessStartupInfo;
+ import flash.events.Event;
+ import flash.events.EventDispatcher;
+ import flash.events.NativeProcessExitEvent;
+ import flash.events.ProgressEvent;
+ import flash.filesystem.File;
+
+ [Event(name="complete",type="flash.events.Event")]
+ [Event(name="progress",type="flash.events.ProgressEvent")]
+ [Event(name="standardErrorData",type="flash.events.ProgressEvent")]
+ [Event(name="standardOutputIoError",type="flash.events.IOErrorEvent")]
+ public class PowerShellFileDownloader extends EventDispatcher
+ {
+ private var _process:NativeProcess;
+ private var _url:String;
+ private var _downloadDestination:String;
+
+ public function download(url:String, downloadDestination:String):void
+ {
+ cleanUpPowerShellDownloader();
+
+ _url = url;
+ _downloadDestination = downloadDestination;
+
+ var startupInfo:NativeProcessStartupInfo = getNativeProcessStartupInfoDownload();
+
+ _process = new NativeProcess();
+ _process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onDownloadProgress);
+ _process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onDownloadError);
+ _process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
+ _process.addEventListener(Event.STANDARD_OUTPUT_CLOSE, onStandardOutputClose);
+ _process.addEventListener(NativeProcessExitEvent.EXIT, onDownloadComplete);
+ _process.start(startupInfo);
+ }
+
+ private function onStandardOutputClose(event:Event):void
+ {
+ dispatchEvent(new Event(Event.COMPLETE));
+ cleanUpPowerShellDownloader();
+ }
+
+ private function onIOError(event:IOErrorEvent):void
+ {
+ dispatchEvent(event.clone());
+ cleanUpPowerShellDownloader();
+ }
+
+ private function onDownloadComplete(event:NativeProcessExitEvent):void
+ {
+ dispatchEvent(new Event(Event.COMPLETE));
+ cleanUpPowerShellDownloader();
+ }
+
+ private function onDownloadError(event:ProgressEvent):void
+ {
+ dispatchEvent(new ProgressEvent(ProgressEvent.STANDARD_ERROR_DATA));
+ cleanUpPowerShellDownloader();
+ }
+
+ private function onDownloadProgress(event:ProgressEvent):void
+ {
+ dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, event.bubbles,
+ event.cancelable, event.bytesLoaded, event.bytesTotal));
+ }
+
+ private function getNativeProcessStartupInfoDownload():NativeProcessStartupInfo
+ {
+ var executable:File = new File("C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe");
+ var startupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
+ var arguments:Vector.<String> = new Vector.<String>();
+
+ var command:String = getPowerShellDownloadCommand();
+ arguments.push("-Command");
+ arguments.push(command);
+
+ startupInfo.executable = executable;
+ startupInfo.arguments = arguments;
+
+ return startupInfo;
+ }
+
+ private function getPowerShellDownloadCommand():String
+ {
+ var command:String = "& {";
+ command += "Param([string]$url,[string]$outPath) ";
+ command += "$url = [System.Uri]$url; ";
+ command += "$webClient = New-Object System.Net.WebClient; ";
+ command += "$webClient.DownloadFileAsync($url, $outPath); ";
+ command += "while ($webClient.IsBusy) { Start-Sleep -Milliseconds 10 } ";
+ command += "[Environment]::Exit(0);";
+ command += "}";
+ command += " ";
+ command += "\"";
+ command += _url;
+ command += "\"";
+ command += " ";
+ command += "\"";
+ command += _downloadDestination;
+ command += "\"";
+
+ return command;
+ }
+
+ private function cleanUpPowerShellDownloader():void
+ {
+ if (_process)
+ {
+ _process.closeInput();
+ _process.removeEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onDownloadProgress);
+ _process.removeEventListener(ProgressEvent.STANDARD_ERROR_DATA, onDownloadError);
+ _process.removeEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
+ _process.removeEventListener(Event.STANDARD_OUTPUT_CLOSE, onStandardOutputClose);
+ _process.removeEventListener(NativeProcessExitEvent.EXIT, onDownloadComplete);
+
+ _process = null;
+ }
+
+ _url = null;
+ _downloadDestination = null;
+ }
+ }
+}