diff options
author | buraq <buraq@epfl.ch> | 2003-10-03 14:05:19 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2003-10-03 14:05:19 +0000 |
commit | 75d0b4a55fdd5abf2b807d8363ed96b179876cfe (patch) | |
tree | 977d76b28533fa3047938e0cbd21fdb61d7d9d81 | |
parent | fba7c6afa2b1184728eb5af6e082989fd8cd6e4f (diff) | |
download | scala-75d0b4a55fdd5abf2b807d8363ed96b179876cfe.tar.gz scala-75d0b4a55fdd5abf2b807d8363ed96b179876cfe.tar.bz2 scala-75d0b4a55fdd5abf2b807d8363ed96b179876cfe.zip |
removed java adapter classes for map,hashmap, ...
removed java adapter classes for map,hashmap, using scala collection
classes instead
-rw-r--r-- | sources/scala/xml/Element.scala | 8 | ||||
-rw-r--r-- | sources/scala/xml/FactoryAdapter.scala | 65 | ||||
-rw-r--r-- | sources/scala/xml/Generic.scala | 55 | ||||
-rw-r--r-- | sources/scala/xml/PCDATA.scala | 3 | ||||
-rw-r--r-- | sources/scala/xml/ScalaFactoryAdapter.scala | 76 |
5 files changed, 106 insertions, 101 deletions
diff --git a/sources/scala/xml/Element.scala b/sources/scala/xml/Element.scala index 9a128be66a..0592af3382 100644 --- a/sources/scala/xml/Element.scala +++ b/sources/scala/xml/Element.scala @@ -1,6 +1,6 @@ package scala.xml ; -import javaAdapter.Map; +import scala.collection.Map; /** superclass for specific representation of XML elements. These are created by the dtd2scala tool, together * with a parsing facility. @@ -9,7 +9,7 @@ abstract class Element { def getName: String; // the real element name def getChildren: Seq[ Element ]; // the children - def getAttribs: Map[ String, String ]; // disabled + def getAttribs: Map[ String, String ]; // disabled updates def setAttribs( m:Map[ String, String ] ):Unit ; /** see Element.hashValue @@ -40,14 +40,14 @@ object Element { */ def hashValue( name:String, attribs:Map[ String, String ], children:Seq[ Element ] ) = { - name.hashCode() + attribs.hashCode() + children.hashCode() + name.hashCode() + attribs.elements.hashCode() + children.hashCode() } /** returns a hash value computed from the element name, attributes and hash values of children. - */ def hashValue( name:String, attribs:java.util.Map, children:Seq[ Element ] ) = { name.hashCode() + attribs.hashCode() + children.hashCode() } + */ } diff --git a/sources/scala/xml/FactoryAdapter.scala b/sources/scala/xml/FactoryAdapter.scala index 594f265d0d..3d277a2504 100644 --- a/sources/scala/xml/FactoryAdapter.scala +++ b/sources/scala/xml/FactoryAdapter.scala @@ -7,11 +7,14 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.io.Writer; -import java.util.Map; +/*import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Stack; import java.util.Iterator; +*/ +import scala.collection.mutable.Stack; +import scala.collection.mutable.HashMap; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -37,8 +40,8 @@ abstract class FactoryAdapter { // default settings - /** Default parser name. */ - val DEFAULT_PARSER_NAME = "org.apache.crimson.parser.XMLReaderImpl"; // included in JDK1.4 + /** Default parser name - included in JDK1.4 */ + val DEFAULT_PARSER_NAME = "org.apache.crimson.parser.XMLReaderImpl"; //val DEFAULT_PARSER_NAME = "org.apache.xerces.parsers.SAXParser"; /** Namespaces feature id (http://xml.org/sax/features/namespaces). */ @@ -49,9 +52,9 @@ abstract class FactoryAdapter // val buffer = new StringBuffer(); - val attribStack = new Stack(); - val hStack = new Stack(); // [ element ] contains siblings - val tagStack = new Stack(); // [String] + val attribStack = new Stack[HashMap[String,String]]; + val hStack = new Stack[Element]; // [ element ] contains siblings + val tagStack = new Stack[String]; // [String] var curTag : String = null ; var capture:boolean = false; @@ -70,14 +73,14 @@ abstract class FactoryAdapter * @return a new XML element. */ def createElement(elemName:String , - attribs:Map , - chIter:Iterator ):scala.Object; //abstract + attribs:HashMap[String,String] , + chIter:List[Element] ):Element; //abstract /** Creates an PCDATA element. * @param text * @return a new PCDATA element. */ - def createPCDATA( text:String ):scala.Object; // abstract + def createPCDATA( text:String ):PCDATA; // abstract // // ContentHandler methods @@ -156,25 +159,23 @@ abstract class FactoryAdapter capture = elementContainsText(localName) ; hStack.push( null ); - var map:HashMap = null; + var map:HashMap[String,String] = null:HashMap[String,String]; if (attributes == null) { //fOut.println("null"); } else { - map = new HashMap(); - - val length:int = attributes.getLength(); - var i : int = 0; - while ( i < length ) { - val attrLocalName = attributes.getLocalName(i); - //String attrQName = attributes.getQName(i); - //String attrURI = attributes.getURI(i); - val attrType = attributes.getType(i); - val attrValue = attributes.getValue(i); - if( attrType.equals("CDATA") ) - { val _ = map.put( attrLocalName, attrValue ); } - i=i+1; + map = new HashMap[String,String]; + + for( val i <- List.range( 0, attributes.getLength() )) do { + val attrLocalName = attributes.getLocalName(i); + //String attrQName = attributes.getQName(i); + //String attrURI = attributes.getURI(i); + val attrType = attributes.getType(i); + val attrValue = attributes.getValue(i); + if( attrType.equals("CDATA") ) { + map.update( attrLocalName, attrValue ); + } } } @@ -207,22 +208,22 @@ abstract class FactoryAdapter captureText(); - val attribMap = attribStack.pop().asInstanceOf[ HashMap ]; + val attribMap = attribStack.top; attribStack.pop; // reverse order to get it right - val v = new LinkedList(); - var child = hStack.pop().asInstanceOf[ scala.Object ]; + var v:List[Element] = Nil; + var child:Element = hStack.top; hStack.pop; while( child != null ) { - v.addFirst(child); - child = hStack.pop().asInstanceOf[ scala.Object ]; + v = child::v; + child = hStack.top; hStack.pop; } // create element - rootElem = createElement(localName, attribMap, v.iterator()); + rootElem = createElement( localName, attribMap, v ); hStack.push(rootElem); // set - curTag = tagStack.pop().asInstanceOf[ String ]; + curTag = tagStack.top; tagStack.pop; if (curTag != null) // root level capture = elementContainsText(curTag); @@ -294,7 +295,7 @@ abstract class FactoryAdapter } // printError(String,SAXParseException) //} // class FA_ErrorHandler - var rootElem : scala.Object = null; + var rootElem : Element = null:Element; //FactoryAdapter // MAIN @@ -304,7 +305,7 @@ abstract class FactoryAdapter * @param fileName * @return a new XML document object */ - def loadXML( fileName:String ):scala.Object = { + def loadXML( fileName:String ):Element = { // variables //PrintWriter out = new PrintWriter(System.out); diff --git a/sources/scala/xml/Generic.scala b/sources/scala/xml/Generic.scala index 87344d101f..6cd16c6742 100644 --- a/sources/scala/xml/Generic.scala +++ b/sources/scala/xml/Generic.scala @@ -1,8 +1,7 @@ package scala.xml; -import scala.xml.javaAdapter.Map ; -import scala.xml.javaAdapter.HashMap ; - +import scala.collection.Map ; +import scala.collection.mutable.HashMap ; /** Generic.load( <fileName> ) will load the xml document from file and * create a tree with scala.Labelled, PCDATA and scala.Symbol objects. @@ -14,7 +13,6 @@ object Generic { // utility functions /** TEMPORARY converting Java iterators to scala List - */ def iterToList[ a ]( iter:java.util.Iterator ):List[a] = if( !iter.hasNext() ) @@ -22,9 +20,10 @@ object Generic { else (iter.next().asInstanceOf[ a ])::iterToList( iter ) ; - /** TEMPORARY converting Java maps to javaAdapter maps */ + /** TEMPORARY converting Java maps to javaAdapter maps + def mapToMap[a,b]( map:java.util.Map ):Map[a,b] = { val keys:java.util.Iterator = map.keySet().iterator(); @@ -42,6 +41,7 @@ object Generic { iterToMap; res } + */ /** turns a Map that contains attributes into XML like att1="val1" att2="val2" */ @@ -50,7 +50,7 @@ object Generic { def iterate( keys:Iterator[String] ) = if( keys.hasNext ) { val key = keys.next; - " " + key + "=\"" + attrib.get( key ) + "\""; + " " + key + "=\"" + attrib.get( key ).match{ case Some(x) => x } + "\""; } else { "" } @@ -124,35 +124,36 @@ object Generic { def elementContainsText( name:java.lang.String ):boolean = true; // default behaviour is hash-consing - val cache = new HashMap(); + val cache = new HashMap[Element,Element]; def createElement( elemName: String, - attrs: java.util.Map, - children: java.util.Iterator ):scala.Object = { - - val el = new Labelled( Symbol( elemName ), - Generic.iterToList[ Any ]( children )) - with Attribbed { - def attribs = Generic.mapToMap[String,String]( attrs ); + attrs: HashMap[String,String], + children: List[Element] ):Element = { + + val el = new Labelled( Symbol( elemName ), children ) + with Attribbed with Element { + def getName = elemName; + def getChildren = children; + def attribs = attrs ; // ?! not needed anymore + def getAttribs = attrs; + def setAttribs( m:Map[ String, String ] ) = { + /* FIXME throw error */ }; }; - val el_cache = cache.get( el.asInstanceOf[scala.All]) - .asInstanceOf[scala.Object]; - if ( el_cache != null ) { - System.err.println("[using cached elem!]"); - el_cache - } else { - cache.put( el.asInstanceOf[scala.All], el.asInstanceOf[scala.All] ); - el + cache.get( el ).match{ + case Some(cachedElem) => + System.err.println("[using cached elem!]"); + cachedElem + case None => + cache.update( el, el ); + el } + }; // createElement - - } - - def createPCDATA( text:String ):scala.Object = { + def createPCDATA( text:String ):PCDATA = { new PCDATA( text ); }; } // GenericFactoryAdapter -} +} //Generic diff --git a/sources/scala/xml/PCDATA.scala b/sources/scala/xml/PCDATA.scala index 8f21d11309..d7a235b187 100644 --- a/sources/scala/xml/PCDATA.scala +++ b/sources/scala/xml/PCDATA.scala @@ -2,7 +2,7 @@ package scala.xml; -import scala.xml.javaAdapter.Map ; +import scala.collection.Map ; /** an XML representation text. Used in both generic and specific XML representation */ @@ -19,7 +19,6 @@ case class PCDATA( content:String ) extends Element { */ override def toXML:String = { - // new java.util.StringBuffer !!crashes!! val s = new StringBuffer(); var i = 0; while( i < content.length() ) { diff --git a/sources/scala/xml/ScalaFactoryAdapter.scala b/sources/scala/xml/ScalaFactoryAdapter.scala index 58c60776cb..8a666cc293 100644 --- a/sources/scala/xml/ScalaFactoryAdapter.scala +++ b/sources/scala/xml/ScalaFactoryAdapter.scala @@ -1,7 +1,9 @@ package scala.xml ; -import scala.xml.javaAdapter.Map ; -import scala.xml.javaAdapter.HashMap ; +import scala.collection.Map ; +import scala.collection.mutable.HashMap ; +//import scala.xml.javaAdapter.Map ; +//import scala.xml.javaAdapter.HashMap ; /** a Scala specific dtd2scala.FactoryAdapter, which plays the SAX content * handler for the SAX parser. It implements the three callback methods @@ -31,42 +33,44 @@ abstract class ScalaFactoryAdapter /** looks up in g whether an element may contain text (PCDATA) */ - def elementContainsText( name:java.lang.String ):boolean = - g.get( name ) ; + def elementContainsText( name:java.lang.String ):boolean = + g.get( name ).match { case Some(x) => x }; // if compress is set, used for hash-consing - val cache = new HashMap(); + val cache = new HashMap[int,Element]; - /** creates an element. uses hash-consing if compress == true - */ - def createElement(elemName:String, - attribs:java.util.Map, - children:java.util.Iterator ):scala.Object = { - val _children = Generic.iterToList[Element]( children ); // 2do:optimize - if( !compress ) { - val c = f.get( elemName ); // get constructor - val el = c( _children ); - el.setAttribs( Generic.mapToMap[String,String]( attribs ) ); - el - } else { // do hash-consing - - val h = Element.hashValue( elemName, attribs, _children ); - val el_cache = cache.get( h.asInstanceOf[scala.All] ).asInstanceOf[scala.Object]; - if ( el_cache != null ) { // return cached elem - el_cache - } else { - val c = f.get( elemName ); // get constructor - val el = c( _children ); - el.setAttribs( Generic.mapToMap[String,String]( attribs ) ); - cache.put( h.asInstanceOf[scala.All], el.asInstanceOf[scala.All] ); - el - } - } - } - - /** creates PCDATA element */ - def createPCDATA( text:String ):scala.Object = { - new PCDATA( text ); - }; + /** creates an element. uses hash-consing if compress == true + */ + def createElement(elemName:String, + attribs:HashMap[String,String], + children:List[Element] ):Element = { + // 2do:optimize + if( !compress ) { + // get constructor + val c = f.get( elemName ).match{ case Some(x) => x }; + val el = c( children ); + el.setAttribs( attribs ); + el + } else { // do hash-consing + + val h = Element.hashValue( elemName, attribs, children ); + cache.get( h ).match { + + case Some(cachedElem) => + cachedElem + + case None => + // get constructor + val c = f.get( elemName ).match{ case Some(x) => x }; + val el = c( children ); + el.setAttribs( attribs ); + cache.update( h, el ); + el + } + } + } // createElement + + /** creates PCDATA element */ + def createPCDATA( text:String ):PCDATA = new PCDATA( text ); } // ScalaFactoryAdapter |