diff options
author | buraq <buraq@epfl.ch> | 2003-06-14 16:43:08 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2003-06-14 16:43:08 +0000 |
commit | 8cfce062de540c2ff849e9fa2463dd77d1b7ecde (patch) | |
tree | e0ab4ef0ccec3b0daf75b3e6d4868959ee0f5686 /sources | |
parent | 05deaeec7451b77a437d92c07a6e87441b1a68c5 (diff) | |
download | scala-8cfce062de540c2ff849e9fa2463dd77d1b7ecde.tar.gz scala-8cfce062de540c2ff849e9fa2463dd77d1b7ecde.tar.bz2 scala-8cfce062de540c2ff849e9fa2463dd77d1b7ecde.zip |
comments, cleanup
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/xml/DeclToScala.java | 35 | ||||
-rw-r--r-- | sources/scala/xml/dtd2scala.java | 179 |
2 files changed, 198 insertions, 16 deletions
diff --git a/sources/scala/xml/DeclToScala.java b/sources/scala/xml/DeclToScala.java index 7eeb9538b1..07343ace6e 100644 --- a/sources/scala/xml/DeclToScala.java +++ b/sources/scala/xml/DeclToScala.java @@ -24,13 +24,13 @@ public class DeclToScala { static final String ATTRIB_T = "scala.Map[String,String]"; static final String CHILDREN_VALDEF = -"val _ch:SeqList[Element] = if( children == null ) { scala.SeqNil[Element] } else children ;"; +"val _ch:List[Element] = if( children == null ) { scala.Nil[Element] } else children ;"; static final String CHILDREN_SEQ = "children"; - static final String CHILDREN_T = "scala.SeqList[Element]"; + static final String CHILDREN_T = "scala.List[Element]"; static final String RAW_NAME_DEF = "def getName:String = "; - static final String GET_CHILDREN_DEF = "def getChildren:scala.SeqList[Element] = _ch ;"; + static final String GET_CHILDREN_DEF = "def getChildren:scala.List[Element] = _ch ;"; static final String GET_ATTRIBS_DEF = "def getAttribs:scala.Map[String,String] = _at ;"; static final int IND_STEP = 5; @@ -56,9 +56,9 @@ public class DeclToScala { public void begin() { fOut.println( "// this file is generated from a DTD"); - fOut.print( "module " ); + fOut.print( "object " ); fOut.print( moduleName ); - fOut.println(" with {"); + fOut.println(" {"); fIndent = IND_STEP; printIndent(); fOut.println("import scala.xml ;"); @@ -92,24 +92,27 @@ public class DeclToScala { printIndent(); + /* // DISABLED // convenience ! overloaded constructors, have to appear *before* // the class def and need the "final" modifier - fOut.println( "final def "+clazzName+"(ch:SeqList[Element]):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], ch ) ;" ); + fOut.println( "final def "+clazzName+"(ch:List[Element]):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], ch ) ;" ); printIndent(); - fOut.println( "final def "+clazzName+"( el:Element ):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], el::SeqNil[Element] ) ;" ); + fOut.println( "final def "+clazzName+"( el:Element ):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], el::Nil[Element] ) ;" ); printIndent(); // might contain text if( decl.contentModel.indexOf("#PCDATA") != -1 ) { - fOut.println( "final def "+clazzName+"( text:String ):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], PCDATA( text )::SeqNil[Element] ) ;" ); - printIndent(); + fOut.println( "final def "+clazzName+"( text:String ):"+clazzName+" = new "+clazzName+"( null[scala.Map[String,String]], PCDATA( text )::Nil[Element] ) ;" ); + printIndent(); } + */ + fOut.print( "case class " ); fOut.print( clazzName ); @@ -120,7 +123,7 @@ public class DeclToScala { fOut.print( CHILDREN_SEQ ); fOut.print(':'); fOut.print( CHILDREN_T ); fOut.print(')'); - fOut.println(" extends Element with {"); + fOut.println(" extends Element {"); fIndent += IND_STEP ; printIndent(); @@ -180,11 +183,11 @@ public class DeclToScala { printIndent(); fOut.println( -"val _factory: scala.Map[String, (scala.Map[String,String],scala.SeqList[Element])Element] = {"); +"val _factory: scala.Map[String, (scala.Map[String,String],scala.List[Element])=>Element] = {"); fIndent += IND_STEP; printIndent(); fOut.println( -"val res = new scala.HashMap[String,(scala.Map[String,String],scala.SeqList[Element])Element] ;"); +"val res = new scala.HashMap[String,(scala.Map[String,String],scala.List[Element])=>Element] ;"); for(Iterator it = elemMap.keySet().iterator(); it.hasNext(); ) { ElemDecl decl = (ElemDecl) elemMap.get( it.next() ); printIndent(); @@ -217,9 +220,9 @@ public class DeclToScala { fOut.print( "\","); if( decl.contentModel.indexOf("#PCDATA") != -1 ) - fOut.print("True"); + fOut.print("true"); else - fOut.print("False"); + fOut.print("false"); fOut.println(");"); } @@ -245,7 +248,7 @@ public class DeclToScala { fOut.println("def load( filename:String ):Element = {"); fIndent += IND_STEP; printIndent(); - fOut.println("val fAdapter = new ScalaFactoryAdapter with {"); + fOut.println("val fAdapter = new ScalaFactoryAdapter {"); fIndent += IND_STEP; printIndent(); fOut.println("val f = _factory ;"); @@ -257,7 +260,7 @@ public class DeclToScala { printIndent(); fOut.println("val b:scala.Object = fAdapter.loadXML( filename );"); printIndent(); - fOut.println("b.as[ Element ]"); + fOut.println("b as Element"); printIndent(); fOut.println("};"); fIndent -= IND_STEP; diff --git a/sources/scala/xml/dtd2scala.java b/sources/scala/xml/dtd2scala.java new file mode 100644 index 0000000000..7f3f9e9841 --- /dev/null +++ b/sources/scala/xml/dtd2scala.java @@ -0,0 +1,179 @@ +package scala.xml ; + +import org.xml.sax.SAXParseException; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; +import org.xml.sax.helpers.DefaultHandler; +import org.xml.sax.helpers.XMLReaderFactory; +import org.xml.sax.Attributes; +import org.xml.sax.ext.DeclHandler; + +import java.util.Map ; +import java.util.HashMap ; +import java.util.TreeMap ; +import java.util.Iterator ; + +import XMLDecl.* ; + +/** 2 do : + - use DTD Handler to get the name of the DTD, use this as module name + - handle modes of attributes (add #REQUIRED ones, fill in default of #IMPLIED) + - allow package prefix to be given ! + - allow output directory to be given ! +*/ + +public class dtd2scala extends DefaultHandler implements DeclHandler { + + static final String + DEFAULT_PARSER_NAME = "org.apache.xerces.parsers.SAXParser" ; + + public Map elemMap; // elementName -> elementDecl + + public dtd2scala() { + elemMap = new HashMap(); + } + + // DTDHandler methods + + /** encountered element declaration */ + public void elementDecl(String name, String contentModel) + throws SAXException { + + ElemDecl decl = (ElemDecl) elemMap.get( name ); + + if( decl == null ) + elemMap.put( name, decl = new ElemDecl( name, + contentModel, + new HashMap() )); + else + decl.contentModel = contentModel; + + } // elementDecl(String,String) + + /** encountered attribute declaration. */ + public void attributeDecl(String elementName, + String attributeName, + String type, + String valueDefault, + String value) throws SAXException { + Map attribs; + + ElemDecl decl = (ElemDecl) elemMap.get( elementName ); + + if( decl == null ) + { + attribs = new TreeMap(); + elemMap.put( elementName, + decl = new ElemDecl( elementName, + null, + attribs )); + } + else + attribs = decl.attribs; + + + attribs.put( attributeName, new AttrDecl(attributeName, + type )); + + } // attributeDecl(String,String,String,String,String) + + + /** Internal entity declaration. */ + public void internalEntityDecl(String name, String text) + throws SAXException { + // ignore + } + + /** External entity declaration. */ + public void externalEntityDecl(String name, + String publicId, + String systemId) + throws SAXException { + // ignore + } + + /** main method. parses dtd of doc with <sysID> and translates to scala case class definitions. + * definitions are printed to stdout. + * @argv two parameters, sysID and object name + */ + + public static void main(String[] argv) throws Exception { + + if( argv.length != 2 ) + { + usage(); + } + else + { + String sysID = argv[ 0 ]; + dtd2scala myH = new dtd2scala(); + + XMLReader parser = + XMLReaderFactory.createXMLReader( DEFAULT_PARSER_NAME ); + + try { + parser.setProperty("http://xml.org/sax/properties/declaration-handler", myH); + } + catch (SAXException e) { + e.printStackTrace(System.err); + } + + try { + parser.parse( sysID ); // parse doc + } + catch (SAXParseException e) { + + System.err.println("SaxParseEx"); + e.printStackTrace( System.err ); + + } + catch (Exception e) { + System.err.println("error: Parse error occurred - "+e.getMessage()); + if (e instanceof SAXException) { + e = ((SAXException)e).getException(); + } + e.printStackTrace(System.err); + } + + // myH.print(); // DEBUG + + // instantiate translator + DeclToScala translate = new DeclToScala( argv[ 1 ] ); + + // translate + translate.toScala( myH.elemMap ); + } + + } // main + + public static void usage() { + System.out.println("usage: dtd2scala <sysID> <object name>"); + System.out.println("<sysID> is a system ID of an XML document which has a DTD."); + System.out.println("<object name> is the name of the resulting SCALA object that contains the class definitions."); + + } + /* + + // for debugging + + public void print() { + for(Iterator it = elemMap.keySet().iterator(); it.hasNext(); ) { + ElemDecl decl = (ElemDecl) elemMap.get( it.next() ); + System.out.print(decl.name); + AttrDecl adecl = null; + System.out.print("{"); + for(Iterator it2 = decl.attribs.keySet().iterator(); + it2.hasNext(); ) { + if(adecl != null) + System.out.print(","); + adecl = (AttrDecl) decl.attribs.get( it2.next() ); + System.out.print(adecl.name+":"+adecl.type); + } + System.out.println("}"); + } + + + } + */ + +} // class MyDTDHandler |