diff options
author | buraq <buraq@epfl.ch> | 2003-11-17 11:26:02 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2003-11-17 11:26:02 +0000 |
commit | 7318a7e03d040182098505f2f764c3e836bfe883 (patch) | |
tree | dba8e2d001898ac4632379eb644d4aa607855324 /sources | |
parent | 9a63043f7cea8f46324e65a020b1bb8f85b530d4 (diff) | |
download | scala-7318a7e03d040182098505f2f764c3e836bfe883.tar.gz scala-7318a7e03d040182098505f2f764c3e836bfe883.tar.bz2 scala-7318a7e03d040182098505f2f764c3e836bfe883.zip |
api change
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/xml/nobinding/NoBindingFactoryAdapter.scala | 42 |
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 ] + } |