Advertisement
Guest User

Get metadata of object including ancestor metadata

a guest
Jun 14th, 2013
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.         /**
  3.          * Creates and array of metadata items for the given object type including inherited metadata.
  4.          *
  5.          * For example, if you give it a Spark Button class it gets all the
  6.          * information for it and then gets it's super class ButtonBase and
  7.          * adds all that information and so on until it gets to Object. <br/><br/>
  8.          *
  9.          * Usage:<br/><pre>
  10.          * var allStyles:XMLList = concatenateMetaDataXMLItems(myButton, "Style", new XMLList());
  11.          * </pre>
  12.          * @param metaType The name of the data in the item name property. Either Style or Event
  13.          * @param existingItems The list of the data in the item name property
  14.          * */
  15.         public static function concatenateMetaDataXMLItems(object:Object, metaType:String, existingItems:XMLList):XMLList {
  16.             var describedTypeRecord:mx.utils.DescribeTypeCacheRecord = mx.utils.DescribeTypeCache.describeType(object);
  17.             var typeDescription:* = describedTypeRecord.typeDescription;
  18.             var hasFactory:Boolean = typeDescription.factory.length()>0;
  19.             var factory:* = typeDescription.factory;
  20.             var extendsClass:XMLList = typeDescription.extendsClass;
  21.             var extendsLength:int = extendsClass.length();
  22.             var list:XMLListCollection = new XMLListCollection(typeDescription.*);
  23.             // can be on typeDescription.metadata or factory.metadata
  24.             var isRoot:Boolean = object is String ? false : true;
  25.             var className:String = !isRoot ? object as String : getQualifiedClassName(object);
  26.             var itemsLength:int;
  27.             var itemsList:XMLList;
  28.             var existingItemsLength:int = existingItems.length();
  29.             var metaName:String;
  30.             var duplicateItems:Array = [];
  31.            
  32.             if (hasFactory) {
  33.                 //itemsList = factory.metadata.(@name==name); property "name" won't work! no matches found
  34.                 itemsList = factory.metadata.(@name==metaType);
  35.             }
  36.             else {
  37.                 itemsList = typeDescription.metadata.(@name==metaType);
  38.             }
  39.            
  40.             itemsList = itemsList.copy();
  41.             itemsLength = itemsList.length();
  42.            
  43.             for (var i:int;i<itemsLength;i++) {
  44.                 var item:XML = XML(itemsList[i]);
  45.                 metaName = item.arg[0].@value;
  46.                 item.@name = metaName;
  47.                 item.@dispatchedBy = className;
  48.                 item.@className = className.indexOf("::")!=-1 ? className.split("::")[1] : className;
  49.                 //continue;
  50.                 for (var j:int=0;j<existingItemsLength;j++) {
  51.                     var existingItem:XML = existingItems[j];
  52.                     if (metaName==existingItem.@name) {
  53.                         delete itemsList[i];
  54.                         itemsLength--;
  55.                         i--;
  56.                         continue;
  57.                     }
  58.                 }
  59.             }
  60.            
  61.            
  62.             if (itemsLength>0) {
  63.                 existingItems = new XMLList(existingItems.toString()+itemsList.toString());
  64.             }
  65.  
  66.             if (isRoot && extendsLength>0) {
  67.                 for (i=0;i<extendsLength;i++) {
  68.                     var newClass:String = String(extendsClass[i].@type);
  69.                     existingItems = concatenateMetaDataXMLItems(newClass, metaType, existingItems);
  70.                 }
  71.             }
  72.                
  73.             return existingItems;
  74.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement