summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scala/xml/nobinding/NoBindingFactoryAdapter.scala42
1 files changed, 42 insertions, 0 deletions
diff --git a/sources/scala/xml/nobinding/NoBindingFactoryAdapter.scala b/sources/scala/xml/nobinding/NoBindingFactoryAdapter.scala
new file mode 100644
index 0000000000..4abb765b13
--- /dev/null
+++ b/sources/scala/xml/nobinding/NoBindingFactoryAdapter.scala
@@ -0,0 +1,42 @@
+package scala.xml.nobinding;
+
+import java.net.URL;
+import scala.collection.mutable.HashMap ;
+import scala.xml.{Node,Text,FactoryAdapter} ;
+
+/** nobinding adaptor providing callbacks to parser to create elements.
+* implements hash-consing
+*/
+class NoBindingFactoryAdapter extends FactoryAdapter {
+
+ def nodeContainsText( label:java.lang.String ):boolean = true;
+
+ /* default behaviour is hash-consing */
+ val cache = new HashMap[Element,Element];
+
+ def createNode( label: String,
+ attrs: HashMap[String,String],
+ children: List[Node] ):Element = {
+
+ val el = new Element( Symbol( label ), children ) {
+ override val attribHashCode = attrs.toList.hashCode(); /*set eagerly*/
+ override def attributes = attrs;
+ };
+
+ cache.get( el ).match{
+ case Some(cachedElem) =>
+ System.err.println("[using cached elem +"+cachedElem.toXML+" instead of "+el.toXML+"!]");
+ cachedElem
+ case None =>
+ cache.update( el, el );
+ el
+ }
+ }
+
+ def createText( text:String ) = Text( text );
+
+ override def loadXML( url:URL ):Element = loadXML( url.getFile() );
+
+ override def loadXML( filename:String ):Element =
+ super.loadXML( filename ).asInstanceOf[ Element ]
+ }