This is an automated email from the ASF dual-hosted git repository. joshtynjala pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit a57891fa5778a97cecc60b171dac14cc1498c167 Author: Josh Tynjala <joshtynj...@apache.org> AuthorDate: Thu Apr 17 15:33:51 2025 -0700 ASDocModel: add ioError listeners and recovery from certain errors --- .../ASDoc/src/main/royale/models/ASDocModel.as | 154 ++++++++++++++------- 1 file changed, 106 insertions(+), 48 deletions(-) diff --git a/examples/royale/ASDoc/src/main/royale/models/ASDocModel.as b/examples/royale/ASDoc/src/main/royale/models/ASDocModel.as index 9a75d9e9b5..53e8de1399 100644 --- a/examples/royale/ASDoc/src/main/royale/models/ASDocModel.as +++ b/examples/royale/ASDoc/src/main/royale/models/ASDocModel.as @@ -42,6 +42,7 @@ package models private function initializeHandler(event:Event):void { + app.service.addEventListener("ioError", configIOErrorHandler); app.service.addEventListener("complete", configCompleteHandler); app.service.url = "config.json"; app.service.send(); @@ -70,9 +71,18 @@ package models private var platformList:Array; private var currentPlatform:String; + + private function configIOErrorHandler(event:Event):void + { + app.service.removeEventListener("ioError", configIOErrorHandler); + app.service.removeEventListener("complete", configCompleteHandler); + + trace("[ASDoc] failed to load URL: " + app.service.url); + } private function configCompleteHandler(event:Event):void { + app.service.removeEventListener("ioError", configIOErrorHandler); app.service.removeEventListener("complete", configCompleteHandler); var config:Object = JSON.parse(app.service.data); tagNameMap = config["tagNames"]; @@ -116,7 +126,7 @@ package models platformList = platforms.slice(); currentPlatform = platformList.shift(); middle = "." + currentPlatform; - app.service.addEventListener("complete", completeHandler); + app.service.addEventListener("complete", classListCompleteHandler); app.service.url = "classlist" + middle + ".json"; app.service.send(); } @@ -132,9 +142,9 @@ package models /** * @royaleignorecoercion ASDocClassData */ - private function completeHandler(event:Event):void + private function classListCompleteHandler(event:Event):void { - app.service.removeEventListener("complete", completeHandler); + app.service.removeEventListener("complete", classListCompleteHandler); if (!masterData) masterData = { "classnames": [], "data": [] }; var allNames:Array = allClasses; @@ -162,27 +172,55 @@ package models { currentPlatform = platformList.shift(); var middle:String = "." + currentPlatform; - app.service.addEventListener("complete", completeHandler); + app.service.addEventListener("complete", classListCompleteHandler); app.service.url = "classlist" + middle + ".json"; app.service.send(); } else { - filterPackageList(); platformList = platforms.slice(); currentPlatform = platformList.shift(); middle = "." + currentPlatform; + app.service.addEventListener("ioError", classesIOErrorHandler); app.service.addEventListener("complete", classesCompleteHandler); app.service.url = "classes" + middle + ".json"; app.service.send(); } } + + private function loadClassesForNextPlatform():void + { + if (platformList.length) + { + currentPlatform = platformList.shift(); + var middle:String = "." + currentPlatform; + app.service.addEventListener("ioError", classesIOErrorHandler); + app.service.addEventListener("complete", classesCompleteHandler); + app.service.url = "classes" + middle + ".json"; + app.service.send(); + } + else + { + filterPackageList(); + } + } + + private function classesIOErrorHandler(event:Event):void + { + app.service.removeEventListener("ioError", classesIOErrorHandler); + app.service.removeEventListener("complete", classesCompleteHandler); + + trace("[ASDoc] failed to load URL: " + app.service.url); + + loadClassesForNextPlatform(); + } /** * @royaleignorecoercion ASDocClass */ private function classesCompleteHandler(event:Event):void { + app.service.removeEventListener("ioError", classesIOErrorHandler); app.service.removeEventListener("complete", classesCompleteHandler); if (!masterData["filterData"]) masterData["filterData"] = {}; @@ -208,14 +246,7 @@ package models masterData["filterData"][cname] = item; } } - if (platformList.length) - { - currentPlatform = platformList.shift(); - var middle:String = "." + currentPlatform; - app.service.addEventListener("complete", classesCompleteHandler); - app.service.url = "classes" + middle + ".json"; - app.service.send(); - } + loadClassesForNextPlatform(); } private function addTags(item:ASDocClass, tags:Array):void @@ -343,7 +374,8 @@ package models dispatchEvent(new Event("currentClassChanged")); platformList = platforms.slice(); currentPlatform = platformList.shift(); - app.service.addEventListener("complete", completeClassHandler); + app.service.addEventListener("ioError", classIOErrorHandler); + app.service.addEventListener("complete", classCompleteHandler); app.service.url = computeFileName(_currentPackage + "." + _currentClass); app.service.send(); _currentClassData = null; @@ -355,16 +387,30 @@ package models private var _baseClassList:Array; private var _attributesMap:Object; + + private function classIOErrorHandler(event:Event):void + { + app.service.removeEventListener("ioError", classIOErrorHandler); + app.service.removeEventListener("complete", classCompleteHandler); + + // TODO: perhaps the list of classes should also include the list of + // platforms for each class so that we don't try to load files that + // don't exist! + // if we do that, we should log this error. + + loadClassForNextPlatform(); + } /** - * @royaleignorecoercion ASDocClass + * @royaleignorecoercion ASDocClass * @royaleignorecoercion ASDocClassMembers * @royaleignorecoercion ASDocClassFunction * @royaleignorecoercion ASDocClassField */ - private function completeClassHandler(event:Event):void + private function classCompleteHandler(event:Event):void { - app.service.removeEventListener("complete", completeClassHandler); + app.service.removeEventListener("ioError", classIOErrorHandler); + app.service.removeEventListener("complete", classCompleteHandler); var data:ASDocClass = app.reviver.parse(app.service.data) as ASDocClass; if (_currentClassData == null) { @@ -419,7 +465,7 @@ package models var a:ASDocClassAccessor = m as ASDocClassAccessor; // force link class addIfNeededAndMakeAttributes(_publicProperties, a); } -else if (m.type == "field") + else if (m.type == "field") { var f:ASDocClassField = m as ASDocClassField; // force link class addIfNeededAndMakeAttributes(_publicProperties, f); @@ -467,35 +513,42 @@ else if (m.type == "field") if (data.type == "class" && data.baseClassname && data.baseClassname.indexOf("flash.") != 0 && data.baseClassname.indexOf("goog.") != 0) { - app.service.addEventListener("complete", completeClassHandler); + app.service.addEventListener("ioError", classIOErrorHandler); + app.service.addEventListener("complete", classCompleteHandler); app.service.url = computeFileName(data.baseClassname); app.service.send(); } else if (data.type == "interface" && data.baseInterfaceNames && data.baseInterfaceNames[0].indexOf("flash.") != 0 && data.baseInterfaceNames[0].indexOf("goog.") != 0) { + app.service.addEventListener("ioError", classIOErrorHandler); app.service.addEventListener("complete", completeInterfaceHandler); extensions = data.baseInterfaceNames; app.service.url = computeFileName(data.baseInterfaceNames[0]); app.service.send(); - } else { - if (platformList.length) - { - currentPlatform = platformList.shift(); - app.service.addEventListener("complete", completeClassHandler); - app.service.url = computeFileName(_currentPackage + "." + _currentClass); - app.service.send(); - } - else - { - _publicMethods.sortOn("qname"); - _publicEvents.sortOn("qname"); - _publicProperties.sortOn("qname"); - dispatchEvent(new Event("currentDataChanged")); - } + loadClassForNextPlatform(); + } + } + + private function loadClassForNextPlatform():void + { + if (platformList.length) + { + currentPlatform = platformList.shift(); + app.service.addEventListener("ioError", classIOErrorHandler); + app.service.addEventListener("complete", classCompleteHandler); + app.service.url = computeFileName(_currentPackage + "." + _currentClass); + app.service.send(); + } + else + { + _publicMethods.sortOn("qname"); + _publicEvents.sortOn("qname"); + _publicProperties.sortOn("qname"); + dispatchEvent(new Event("currentDataChanged")); } } @@ -628,6 +681,24 @@ else if (m.type == "field") } private var extensions:Array; + + private function loadInterfaceForNextPlatform():void + { + if (platformList.length) + { + currentPlatform = platformList.shift(); + app.service.addEventListener("complete", completeInterfaceHandler); + app.service.url = computeFileName(_currentPackage + "." + _currentClass); + app.service.send(); + } + else + { + _publicMethods.sortOn("qname"); + _publicEvents.sortOn("qname"); + _publicProperties.sortOn("qname"); + dispatchEvent(new Event("currentDataChanged")); + } + } /** * @royaleignorecoercion ASDocInterface @@ -729,20 +800,7 @@ else if (m.type == "field") } else { - if (platformList.length) - { - currentPlatform = platformList.shift(); - app.service.addEventListener("complete", completeInterfaceHandler); - app.service.url = computeFileName(_currentPackage + "." + _currentClass); - app.service.send(); - } - else - { - _publicMethods.sortOn("qname"); - _publicEvents.sortOn("qname"); - _publicProperties.sortOn("qname"); - dispatchEvent(new Event("currentDataChanged")); - } + loadInterfaceForNextPlatform(); } }