You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xap-commits@incubator.apache.org by mt...@apache.org on 2006/08/01 17:14:46 UTC
svn commit: r427651 - /incubator/xap/trunk/src/xap/Xap.js
Author: mturyn
Date: Tue Aug 1 10:14:46 2006
New Revision: 427651
URL: http://svn.apache.org/viewvc?rev=427651&view=rev
Log:
Added a generalised class-tree walker to which you can attach a callback, and a method to find the dependencies of all classes in the tree.
I will probably break these out into a separate analysis object later.
Modified:
incubator/xap/trunk/src/xap/Xap.js
Modified: incubator/xap/trunk/src/xap/Xap.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/src/xap/Xap.js?rev=427651&r1=427650&r2=427651&view=diff
==============================================================================
--- incubator/xap/trunk/src/xap/Xap.js (original)
+++ incubator/xap/trunk/src/xap/Xap.js Tue Aug 1 10:14:46 2006
@@ -441,48 +441,160 @@
}
-
-Xap.getAllXapClasses = function(obj,name,arr){
+Xap.getAllClasses = function(name,arr){
var theArray = null ;
if (!arr ){
theArray = new Array(0) ;
} else {
theArray = arr ;
}
- if ( obj.prototype ){
- theArray.push( name ) ;
- } else {
- for (var oo in obj){
- Xap.getAllXapClasses(obj[oo],name+"."+oo,theArray );
- }
- }
+ var pushClass = function(){
+ if(arguments[0][3]){
+ theArray.push(arguments[0][1]) ;
+ }
+ }
+ // At each node
+ Xap.walkClassTree(name, pushClass) ;
return theArray ;
}
-Xap.getClassTree = function(name,obj,tree){
- var theTree = null ;
- if (!tree ){
- theTree = new Object() ;
+
+
+Xap.walkClassTree = function(name,callbackFunction,level,object){
+ var theLevel = -1 ;
+ if( level ){
+ theLevel = level ;
} else {
- theTree = tree ;
+ theLevel=0 ;
}
-
var theObject = null ;
- if( obj ){
- theObject = obj ;
+ if( object ){
+ theObject = object ;
} else {
- theObject = eval(name) ;
+ try {
+ var theObject = eval(name) ;
+ } catch(ee){
+ return ;
+ }
}
+ var args = [] ;
+ args.push(this) ;
+ args.push(name) ;
+ args.push(theObject);
if ( theObject.prototype ){
- theTree[name] = theObject ;
+ // Let the callback know that this is a class, not a package node:
+ args.push(true) ;
+ callbackFunction.call(this,args) ;
} else {
for (var oo in theObject){
- Xap.getClassTree(name+"."+oo,theObject[oo],theTree[oo] );
+ // Let the callback know that this is a package node, not a class
+ args.push(false) ;
+ // Better in a different order?
+ callbackFunction.call(this,args) ;
+ Xap.walkClassTree(name+"."+oo,callbackFunction,theLevel+1 );
+ }
+ }
+
+ return ;
+}
+
+// Regular expressions for finding and manipulation Xap.require() or dojo.require()
+// statements in code:
+Xap.require_startRegexp = /^.*require\S\s*['"]/ ;
+Xap.require_endRegexp = /["'].*$/ ;
+// Exclude algorithmic .require() statements that aren't just quoted strings:
+Xap.requireRegexp = /(Xap|dojo)\.require\(\s*['"]\S*?['"]\s*\)/mg ;
+
+Xap.getDependencies = function(className){
+ var requirements = [] ;
+ if( !Xap._requestService ){
+ Xap._requestService = new xap.requestservice.RequestService( this );
+ }
+
+ // Build a file path from a class name:
+ var filePath = "../../src/"+ className.replace(Xap.allFullstopsRegexp,"/") + ".js" ;
+
+ // Get the source for the class:
+ var classSource = Xap._requestService.retrieve( filePath ).responseText;
+
+ // These are the lines that have a Xap.require() or a dojo.require() statement in them:
+ var requireLines = classSource.match(Xap.requireRegexp) ;
+
+ if(!requireLines){
+ return requirements;
+ }
+
+ for(var jj=0; jj < requireLines.length; ++jj){
+ // extract the argument to the .require():
+ var req = requireLines[jj].replace(Xap.require_startRegexp,"");
+ req=req.replace(Xap.require_endRegexp,"") ;
+ requirements.push(req) ;
+ var bkp=-1 ;
+ }
+
+ return requirements ;
+}
+
+
+Xap.getAllDependencies = function(name,holder,level){
+
+ var theLevel = -1 ;
+ if(level){
+ theLevel = level ;
+ } else {
+ theLevel = 0 ;
+ }
+
+ if( holder && holder[name]){
+ return ;
+ }
+
+
+ var theHolder= null ;
+ if (!holder ){
+ theHolder = new Object() ;
+ } else {
+ theHolder = holder ;
+ }
+
+ try {
+ var theObject = eval(name) ;
+ } catch (ee){
+ Xap._logString += ("Problem with getting dependencies for \""+name+"\":\n"+ee) ;
+ return ;
+ }
+
+ if(!theObject){
+ return ;
+ }
+
+ if ( theObject.prototype ){
+ theHolder[name] = Xap.getDependencies(name) ;
+ var nextLevel = 1+ theLevel ;
+ for(var ii=0; ii<theHolder[name].length; ++ii ){
+ Xap.getAllDependencies( (theHolder[name])[ii] ,theHolder,nextLevel) ;
+ }
+ } else {
+ if ( theLevel == 0){
+ var clazzes = Xap.getAllClasses ("xap") ;
+ var nextLevel = 1+ theLevel ;
+ for(var jj=0; jj < clazzes.length; ++jj){
+ Xap.getAllDependencies(clazzes[jj],theHolder,nextLevel) ;
+ }
+
+/* var arr = new Array(0) ;
+ * for( key in theHolder){
+ * arr.push(key+"::"+theHolder[key].join(","))
+ * }
+ * prompt("",arr.join("^")) ;
+ */
+ return theHolder;
}
}
- return theTree ;
}
+
+