@@ -10,7 +10,6 @@ package scala
1010package xml
1111package parsing
1212
13- import scala .collection .{ mutable , Iterator }
1413import org .xml .sax .Attributes
1514import org .xml .sax .helpers .DefaultHandler
1615
@@ -39,10 +38,34 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
3938 var rootElem : Node = null
4039
4140 val buffer = new StringBuilder ()
42- val attribStack = new mutable.Stack [MetaData ]
43- val hStack = new mutable.Stack [Node ] // [ element ] contains siblings
44- val tagStack = new mutable.Stack [String ]
45- var scopeStack = new mutable.Stack [NamespaceBinding ]
41+ /** List of attributes
42+ *
43+ * Previously was a [[scala.collection.mutable.Stack ]], but is now a mutable [[scala.collection.immutable.List ]].
44+ *
45+ * @since 1.0.7
46+ */
47+ var attribStack = List .empty[MetaData ]
48+ /** List of elements
49+ *
50+ * Previously was a [[scala.collection.mutable.Stack ]], but is now a mutable [[scala.collection.immutable.List ]].
51+ *
52+ * @since 1.0.7
53+ */
54+ var hStack = List .empty[Node ] // [ element ] contains siblings
55+ /** List of element names
56+ *
57+ * Previously was a [[scala.collection.mutable.Stack ]], but is now a mutable [[scala.collection.immutable.List ]].
58+ *
59+ * @since 1.0.7
60+ */
61+ var tagStack = List .empty[String ]
62+ /** List of namespaces
63+ *
64+ * Previously was a [[scala.collection.mutable.Stack ]], but is now a mutable [[scala.collection.immutable.List ]].
65+ *
66+ * @since 1.0.7
67+ */
68+ var scopeStack = List .empty[NamespaceBinding ]
4669
4770 var curTag : String = null
4871 var capture : Boolean = false
@@ -122,17 +145,17 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
122145 attributes : Attributes ): Unit =
123146 {
124147 captureText()
125- tagStack push curTag
148+ tagStack = curTag :: tagStack
126149 curTag = qname
127150
128151 val localName = splitName(qname)._2
129152 capture = nodeContainsText(localName)
130153
131- hStack push null
154+ hStack = null :: hStack
132155 var m : MetaData = Null
133156 var scpe : NamespaceBinding =
134157 if (scopeStack.isEmpty) TopScope
135- else scopeStack.top
158+ else scopeStack.head
136159
137160 for (i <- 0 until attributes.getLength()) {
138161 val qname = attributes getQName i
@@ -147,16 +170,16 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
147170 m = Attribute (Option (pre), key, Text (value), m)
148171 }
149172
150- scopeStack push scpe
151- attribStack push m
173+ scopeStack = scpe :: scopeStack
174+ attribStack = m :: attribStack
152175 }
153176
154177 /**
155178 * captures text, possibly normalizing whitespace
156179 */
157180 def captureText (): Unit = {
158181 if (capture && buffer.length > 0 )
159- hStack push createText(buffer.toString)
182+ hStack = createText(buffer.toString) :: hStack
160183
161184 buffer.clear()
162185 }
@@ -170,17 +193,24 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
170193 */
171194 override def endElement (uri : String , _localName : String , qname : String ): Unit = {
172195 captureText()
173- val metaData = attribStack.pop()
196+ val metaData = attribStack.head
197+ attribStack = attribStack.tail
174198
175199 // reverse order to get it right
176- val v = (Iterator continually hStack.pop takeWhile (_ != null )).toList.reverse
200+ val v = hStack.takeWhile(_ != null ).reverse
201+ hStack = hStack.dropWhile(_ != null ) match {
202+ case null :: hs => hs
203+ case hs => hs
204+ }
177205 val (pre, localName) = splitName(qname)
178- val scp = scopeStack.pop()
206+ val scp = scopeStack.head
207+ scopeStack = scopeStack.tail
179208
180209 // create element
181210 rootElem = createNode(pre, localName, metaData, scp, v)
182- hStack push rootElem
183- curTag = tagStack.pop()
211+ hStack = rootElem :: hStack
212+ curTag = tagStack.head
213+ tagStack = tagStack.tail
184214 capture = curTag != null && nodeContainsText(curTag) // root level
185215 }
186216
@@ -189,6 +219,6 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node
189219 */
190220 override def processingInstruction (target : String , data : String ) {
191221 captureText()
192- hStack pushAll createProcInstr(target, data)
222+ hStack = hStack.reverse_ ::: ( createProcInstr(target, data).toList )
193223 }
194224}
0 commit comments