You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ha...@apache.org on 2017/07/17 11:52:26 UTC

git commit: [flex-asjs] [refs/heads/develop] - Fixed some issues related to single item XMLLists

Repository: flex-asjs
Updated Branches:
  refs/heads/develop b730bd827 -> 5ae65eabc


Fixed some issues related to single item XMLLists


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/5ae65eab
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/5ae65eab
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/5ae65eab

Branch: refs/heads/develop
Commit: 5ae65eabcf2fcc87dfbed210c7595a4cfa50279d
Parents: b730bd8
Author: Harbs <ha...@in-tools.com>
Authored: Mon Jul 17 14:52:21 2017 +0300
Committer: Harbs <ha...@in-tools.com>
Committed: Mon Jul 17 14:52:21 2017 +0300

----------------------------------------------------------------------
 frameworks/projects/XML/src/main/flex/XML.as    | 87 ++++++++++++++------
 .../projects/XML/src/main/flex/XMLList.as       | 29 ++++++-
 2 files changed, 91 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5ae65eab/frameworks/projects/XML/src/main/flex/XML.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/XML/src/main/flex/XML.as b/frameworks/projects/XML/src/main/flex/XML.as
index efd1756..fd54fca 100644
--- a/frameworks/projects/XML/src/main/flex/XML.as
+++ b/frameworks/projects/XML/src/main/flex/XML.as
@@ -21,6 +21,8 @@ package
 	COMPILE::JS
 	public class XML
 	{
+		import org.apache.flex.debugging.assert;
+		import org.apache.flex.debugging.assertType;
 		/*
 		 * Dealing with namespaces:
 		 * If the name is qualified, it has a prefix. Otherwise, the prefix is null.
@@ -394,6 +396,7 @@ package
 		}
 		private function addChildInternal(child:XML):void
 		{
+			assertType(child,XML,"Type must be XML");
 			child.setParent(this);
 			if(child.nodeKind() =="attribute")
 			{
@@ -496,24 +499,30 @@ package
 			*/
 			var childType:String = typeof child;
 			if(childType != "object")
-			{
-				child = child.toString();
-				var xml:XML = new XML();
-				xml.setNodeKind("text");
-				xml.setValue(child);
-				child = xml;				
-			}
-
-			if(child is XMLList)
-				child = child[0];
-
-			child.setParent(this);
+				child = xmlFromStringable(child);
 			
-			_children.push(child);
+			appendChildInternal(child);
 			normalize();
-			return child;
+			return this;
 		}
 		
+		private function appendChildInternal(child:*):void
+		{
+			if(child is XMLList)
+			{
+				var len:int = child.length();
+				for(var i:int=0; i<len; i++)
+				{
+					appendChildInternal(child[0]);
+				}
+			}
+			else
+			{
+				assertType(child,XML,"Type must be XML");
+				child.setParent(this);
+				_children.push(child);
+			}
+		}
 		
 		/**
 		 * Returns the XML value of the attribute that has the name matching the attributeName parameter.
@@ -1395,6 +1404,14 @@ package
 			return list.plus(rightHand);
 		}
 
+		private function xmlFromStringable(value:*):XML
+		{
+			var str:String = value.toString();
+			var xml:XML = new XML();
+			xml.setNodeKind("text");
+			xml.setValue(str);
+			return xml;
+		}
 		/**
 		 * Inserts the provided child object into the XML element before any existing XML properties for that element.
 		 * @param value
@@ -1403,13 +1420,34 @@ package
 		 */
 		public function prependChild(child:XML):XML
 		{
-			child.setParent(this);
-			
-			_children.unshift(child);
+			var childType:String = typeof child;
+			if(childType != "object")
+				child = xmlFromStringable(child);
 
-			return child;
+			prependChildInternal(child);
+			normalize();
+			return this;
 		}
 		
+		private function prependChildInternal(child:*):void
+		{
+			if(child is XMLList)
+			{
+				var len:int = child.length();
+				for(var i:int=0; i<len; i++)
+				{
+					prependChildInternal(child[0]);
+				}
+			}
+			else
+			{
+				assertType(child,XML,"Type must be XML");
+				child.setParent(this);
+				_children.unshift(child);
+			}
+		}
+
+		
 		/**
 		 * If a name parameter is provided, lists all the children of the XML object that contain processing instructions with that name.
 		 * 
@@ -1465,14 +1503,14 @@ package
 			var removed:XML;
 			if(!child)
 				return false;
-			if(!_attributes)
-				return false;
 
 			if(!(child is XML))
 				return removeChildByName(child);
 			
 			if(child.nodeKind() == "attribute")
 			{
+				if(!_attributes)
+					return false;
 				for(i=0;i<_attributes.length;i++)
 				{
 					if(child.equals(_attributes[i]))
@@ -1483,13 +1521,14 @@ package
 						return true;
 					}
 				}
+				return false;
 			}
 			var idx:int = _children.indexOf(child);
 			if(idx < 0)
 				return false;
 			removed = _children.splice(idx,1);
-			child.setParent(null);
-			return removed;
+			child._parent = null;
+			return true;
 		}
 		private function removeChildByName(name:*):Boolean
 		{
@@ -1507,7 +1546,7 @@ package
 					if(_attributes[i].name().matches(name))
 					{
 						child = _attributes[i];
-						child.setParent(null);
+						child._parent = null;
 						_attributes.splice(i,1);
 						removedItem = true;
 					}
@@ -1522,7 +1561,7 @@ package
 				if(_children[i].name().matches(name))
 				{
 					child = _children[i];
-					child.setParent(null);
+					child._parent = null;
 					_children.splice(i,1);
 					removedItem = true;
 				}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5ae65eab/frameworks/projects/XML/src/main/flex/XMLList.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/XML/src/main/flex/XMLList.as b/frameworks/projects/XML/src/main/flex/XMLList.as
index d07a00a..17c2e33 100644
--- a/frameworks/projects/XML/src/main/flex/XMLList.as
+++ b/frameworks/projects/XML/src/main/flex/XMLList.as
@@ -164,6 +164,9 @@ package
 		 */
 		public function attribute(attributeName:*):XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].attribute(attributeName);
+
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -182,6 +185,9 @@ package
 		 */
 		public function attributes():XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].attributes();
+
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -212,7 +218,9 @@ package
 				}
 				return retVal;
 			}
-
+			if(isSingle())
+				return _xmlArray[0].child(propertyName);
+			
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
 			{
@@ -238,6 +246,9 @@ package
 		 */
 		public function children():XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].children();
+
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -256,6 +267,9 @@ package
 		 */
 		public function comments():XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].comments();
+			
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -336,6 +350,9 @@ package
 		 */
 		public function descendants(name:Object = "*"):XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].descendants(name);
+
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -356,6 +373,9 @@ package
 		 */
 		public function elements(name:Object = "*"):XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].elements(name);
+			
 			var retVal:XMLList = new XMLList();
 			var len:int = _xmlArray.length;
 			for (var i:int=0;i<len;i++)
@@ -379,6 +399,8 @@ package
 
 		public function equals(list:*):Boolean
 		{
+			if(isSingle())
+				return _xmlArray[0].equals(list);
 			/*
 				Overview
 				The XMLList type adds the internal [[Equals]] method to the internal properties defined by the Object type.
@@ -443,6 +465,9 @@ package
 				a. If x[i].[[Class]] == "element" and the result of calling the [[HasProperty]] method of x[i] with argument P == true, return true
 				3. Return false			
 			*/
+			if(isSingle())
+				return _xmlArray[0].hasOwnProperty(propertyName);
+
 			if(parseInt(propertyName,10).toString() == propertyName)
 			{
 				return parseInt(propertyName,10) < _xmlArray.length;
@@ -597,6 +622,8 @@ package
 		 */
 		public function processingInstructions(name:String = "*"):XMLList
 		{
+			if(isSingle())
+				return _xmlArray[0].processingInstructions(name);
 			var retVal:XMLList = new XMLList();
 			if(!name)
 				return retVal;