blob: 6aa901b7378c314d67c1a4dea3a12b7ff11289ea [file] [log] [blame]
<?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">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
private static var skipDefs:Object = {
"AS3" : 1,
"ArgumentError" : 1,
"Array" : 1,
"Boolean" : 1,
"Class" : 1,
"Date" : 1,
"DefinitionError" : 1,
"Error" : 1,
"EvalError" : 1,
"Function" : 1,
"int" : 1,
"JSON" : 1,
"Math" : 1,
"Namespace" : 1,
"Number" : 1,
"Object": 1,
"QName" : 1,
"RangeError" : 1,
"ReferenceError" : 1,
"RegExp" : 1,
"SecurityError" : 1,
"String" : 1,
"SyntaxError" : 1,
"TypeError" : 1,
"uint" : 1,
"URIError" : 1,
"__AS3__.vec.Vector" : 1,
"XML" : 1,
"XMLList" : 1,
"trace" : 1,
"mx.core:mx_internal" : 1
}
private var dirFile:File = new File();
private var fs:FileStream;
private function browse():void
{
dirFile.addEventListener(Event.SELECT, selectHandler);
dirFile.browseForDirectory("Mustella Directory");
}
private function selectHandler(event:Event):void
{
dir.text = dirFile.nativePath;
}
private function generateDB():void
{
callLater(readDB);
}
private function readDB():void
{
var f:File = new File(dirFile.nativePath + "/" + "deps.xml");
try
{
var fs:FileStream = new FileStream();
fs.open(f, FileMode.READ);
var s:String = fs.readUTFBytes(fs.bytesAvailable);
var xml:XML = XML(s);
var scripts:XMLList = xml.scripts.script;
var n:int = scripts.length();
for (var i:int = 0; i < n; i++)
{
var script:XML = scripts[i];
var depMap:Object = db[script.@name] = {};
var deps:XMLList = script.deps;
var m:int= deps.length;
for (var j:int = 0; j < m; j++)
{
depMap[deps[j].@name] = 1;
}
}
fs.close();
}
catch (e:Error)
{
}
dirFile.nativePath = dir.text;
addFromFiles(dirFile);
}
private var listings:Array = [];
private var counts:Array = [];
private var indexes:Array = [];
private var outputs:Array = [];
private var listing:Array;
private var count:int;
private var index:int;
private function addFromFiles(dir:File):void
{
outputs.push(output.text);
output.text = "Scanning: " + dir.nativePath;
listing = dir.getDirectoryListing();
count = listing.length;
index = 0;
callLater(scanFiles);
}
private function scanFiles():void
{
for (index; index < count; index++)
{
var f:File = listing[index];
if (f.isHidden) continue;
if (f.isDirectory)
{
listings.push(listing);
counts.push(count);
indexes.push(index);
addFromFiles(f);
return;
}
else if (f.nativePath.lastIndexOf(".lnk.xml") == f.nativePath.length - 8)
{
fs = new FileStream();
fs.open(f, FileMode.READ);
var s:String = fs.readUTFBytes(fs.bytesAvailable);
outputs.push(output.text);
output.text = "Parsing: " + f.nativePath;
fs.close();
callLater(parseFile, [s, f.nativePath.substring(dir.text.length, f.nativePath.length - 8)]);
return;
}
}
if (listings.length > 0)
{
listing = listings.pop();
count = counts.pop();
index = indexes.pop();
output.text = outputs.pop();
index++;
callLater(scanFiles);
}
else
{
output.text = "done!";
callLater(saveDB);
}
}
private function saveDB():void
{
var xml:XML = <Dependencies />;
for (var p:String in db)
{
var script:XML = <script />;
script.@name = p;
var deps:Object = db[p];
for (var q:String in deps)
{
var dep:XML = <dep />;
dep.@name = q;
script.appendChild(dep);
}
xml.appendChild(script);
}
var f:File = new File(dirFile.nativePath + "/" + "deps.xml");
var fs:FileStream = new FileStream();
fs.open(f, FileMode.WRITE);
var s:String = xml.toXMLString();
fs.writeUTFBytes(s);
fs.close();
}
private var db:Object = {};
private function parseFile(s:String, mainClassPath:String):void
{
var xml:XML = XML(s);
var scripts:XMLList = xml.scripts.script;
var n:int = scripts.length();
for (var i:int = 0; i < n; i++)
{
var mxmlFile:Boolean = false;
var start:int;
var end:int;
var script:XML = scripts[i];
var name:String = script.def.@id;
var path:String = script.@name;
// if from a source file in the mustella dir
// use the path to it in case there are name collisions
if (path.indexOf(dir.text) == 0)
{
start = path.indexOf(".as");
if (start != -1)
name = path.substring(dir.text.length, start);
else
{
start = path.indexOf(".mxml");
if (start != -1)
{
name = path.substring(dir.text.length, start);
mxmlFile = true;
}
}
}
if (db[name] == null)
{
var depMap:Object = db[name] = {};
var deps:XMLList = script.dep;
var m:int;
var j:int;
m = deps.length();
for (j = 0; j < m; j++)
{
var dep:String = deps[j].@id;
if (skipDefs[dep])
continue; // skip as3 and mustella classes
if (dep.indexOf("flash.") == 0)
continue; // skip flash classes
depMap[dep] = 1;
}
deps = script.pre;
m = deps.length();
for (j = 0; j < m; j++)
{
dep = deps[j].@id;
if (skipDefs[dep])
continue; // skip as3 and mustella classes
if (dep.indexOf("flash.") == 0)
continue; // skip flash classes
depMap[dep] = 1;
if (dep == "UnitTester" && mxmlFile)
{
// this is a test script so inject a dependency on the
// main swf
depMap[mainClassPath] = 1;
}
}
}
}
index++;
output.text = outputs.pop();
callLater(scanFiles);
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout />
</s:layout>
<s:HGroup>
<s:Label text="Mustella Directory:" />
<s:TextInput id="dir" width="220"/>
<s:Button label="Browse..." click="browse()" />
<s:Button label="Generate DB" click="generateDB()" />
</s:HGroup>
<s:Label id="output" />
</s:WindowedApplication>