help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] [PATCH] Finish XML refactoring


From: Paolo Bonzini
Subject: [Help-smalltalk] [PATCH] Finish XML refactoring
Date: Tue, 06 Nov 2007 16:18:36 +0100
User-agent: Thunderbird 2.0.0.6 (Macintosh/20070728)

This patch finishes the refactoring of the XML package in five different packages. It is now possible to load XML-XMLNodeBuilder without loading XML-XMLParser (which may mean, in a remote future, being able to use the XSL engine with an Expat-based parser), and to load XML-SAXParser without loading XML-DOM (because it does not make sense that you need to). In doing so, I removed one more abstract method from XML-SAXParser. Also, InputSource is a SAX defined class, so I moved it up to XML-SAXDriver.

Paolo
* looking for address@hidden/smalltalk--devo--2.2--patch-626 to compare with
* comparing to address@hidden/smalltalk--devo--2.2--patch-626
M  packages/xml/builder/package.xml
M  packages/xml/parser/package.xml
M  packages/xml/saxparser/package.xml
M  packages/xml/dom/DOM.st
M  packages/xml/saxdriver/SAX.st
M  packages/xml/saxparser/Parser.st
M  packages.xml
M  packages/xml/ChangeLog
M  packages/xml/parser/XML.st

* modified files

--- orig/packages.xml
+++ mod/packages.xml
@@ -1,6 +1,7 @@
 <packages>
 <package>
   <name>XML</name>
+  <prereq>XML-XMLNodeBuilder</prereq>
   <prereq>XML-XMLParser</prereq>
 </package>
 


--- orig/packages/xml/ChangeLog
+++ mod/packages/xml/ChangeLog
@@ -1,10 +1,23 @@
 2007-11-06  Paolo Bonzini  <address@hidden>
 
+       * saxdriver/SAX.st: Declare stub DOM_SAXDriver.  Move InputSource 
here...
+       * dom/DOM.st: ... from here.
+       * saxparser/Parser.st: Remove #pushSource:for: abstract method,
+       move #dtd (undoing part of the previous commit) and 
Entity>>#streamFor:...
+       * parser/XML.st: ... here as #pushSourceFor:.
+
+       * saxparser/package.xml: Remove XML-DOM dependency.
+       * parser/package.xml: Remove XML-XMLNodeBuilder dependency, add
+       XML-DOM dependency.
+       * builder/package.xml: Add XML-DOM dependency.
+
+2007-11-06  Paolo Bonzini  <address@hidden>
+
        * saxparser/package.xml: Fix dependency.
        * parser/XMLParser.st: Remove #contentsOf:for:.  Test
        recursive expansion of entities in #pushSource:for:.  Add
        #wrapSourceInSpaces and use it instead of #streamFor:addSpaces:.
-       Add #attributeTypeFor:subKey:from:.  Move dtd...
+       Add #attributeTypeFor:subKey:from:.  Move #dtd...
        * saxparser/Parser.st: ... here.  Port #mapEncoding: to gst.  Remove
        abstract methods #hasExpanded: and #contentsOf:for:.  Remove checks
        for recursive expansion of entities and #streamFor:addSpaces:.


--- orig/packages/xml/builder/package.xml
+++ mod/packages/xml/builder/package.xml
@@ -2,6 +2,7 @@
   <name>XML-XMLNodeBuilder</name>
   <namespace>XML</namespace>
 
+  <prereq>XML-DOM</prereq>
   <prereq>XML-SAXParser</prereq>
 
   <filein>NodeBuilder.st</filein>


--- orig/packages/xml/dom/DOM.st
+++ mod/packages/xml/dom/DOM.st
@@ -1941,69 +1941,6 @@ Instance Variables:
 ]
 
 
-Object subclass: InputSource [
-    | uri encoding stream |
-    
-    <category: 'XML-XML-Resources'>
-    <comment: '
-An InputSource represents a data source which may have been fetched
-locally or from the net, and which has various properties. An
-InputSource may be created by a SAXDriver in response to the
-#resolveEntity:systemID: message.
-
-In release 5i.4, we record the URI and the data, and if possible the
-encoding. In future we may want to also incorporate things like the
-MIME type or other attributes.
-
-Instance Variables:
-    uri                                <nil | NetClients.URL>  The URI of the 
data source, if known
-    encoding           <nil | Symbol>          If the transport protocol 
specified an encoding,
-                                                                       this 
should take precedence over the encoding
-                                                                       
contained in the <?xml?> declaration
-    stream                     <Stream>                        the data 
source'>
-
-    InputSource class >> for: uri [
-       <category: 'private'>
-       | stream |
-       stream := NetClients.URIResolver openStreamOn: uri.
-       ^self 
-           uri: (uri isString ifTrue: [NetClients.URL fromString: uri] 
ifFalse: [uri])
-           encoding: nil
-           stream: stream
-    ]
-
-    InputSource class >> uri: aURI encoding: anEncodingName stream: aStream [
-       <category: 'instance creation'>
-       ^self new 
-           uri: aURI
-           encoding: anEncodingName
-           stream: aStream
-    ]
-
-    uri: aURI encoding: anEncodingName stream: aStream [
-       <category: 'initialize'>
-       uri := aURI.
-       encoding := anEncodingName.
-       stream := aStream
-    ]
-
-    encoding [
-       <category: 'accessing'>
-       ^encoding
-    ]
-
-    stream [
-       <category: 'accessing'>
-       ^stream
-    ]
-
-    uri [
-       <category: 'accessing'>
-       ^uri
-    ]
-]
-
-
 SAXDriver extend [
     isValidating [
        "Allows a SAX driver to act like a parser when accessing a DocumentType"


--- orig/packages/xml/parser/XML.st
+++ mod/packages/xml/parser/XML.st
@@ -1749,7 +1749,7 @@ values exceed a particular value will al
 
 
 SAXParser subclass: XMLParser [
-    | sourceStack hereChar lastSource currentSource unresolvedIDREFs 
definedIDs latestID elementStack eol buffer nameBuffer |
+    | sourceStack dtd hereChar lastSource currentSource unresolvedIDREFs 
definedIDs latestID elementStack eol buffer nameBuffer |
     
     <category: 'XML-XML-Parsing'>
     <comment: '
@@ -1766,6 +1766,7 @@ Version 1.0 specification.
 
 Instance Variables:
     sourceStack        <XML.StreamWrapper>     stack of input streams that 
handles inclusion.
+    dtd                         <XML.DocumentType>      the document type 
definition for the current document
     hereChar           <Character>                             the current 
character being parsed
     lastSource         <XML.StreamWrapper>     record of previous source used 
to check correct nesting
     currentSource      <XML.StreamWrapper>     current input stream (the top 
of sourceStack)
@@ -2199,6 +2200,7 @@ Instance Variables:
        super on: dataSource.
        sourceStack := self wrapDataSource: dataSource.
        elementStack := OrderedCollection new.
+       dtd := DocumentType new.
        unresolvedIDREFs := Set new.
        definedIDs := Set new.
     ]
@@ -2221,6 +2223,11 @@ Instance Variables:
            from: self) isInternal: false
     ]
 
+    dtd [
+       <category: 'accessing'>
+       ^dtd
+    ]
+
     eol [
        <category: 'accessing'>
        ^eol
@@ -2334,6 +2341,23 @@ Instance Variables:
        self docTypeDecl ifTrue: [[self misc] whileTrue]
     ]
 
+    pushSourceFor: entity [
+        <category: 'entities'>
+        entity text == nil
+            ifTrue: 
+                [| str input |
+                input := sax resolveEntity: entity publicID
+                            systemID: entity systemID.
+                input == nil ifTrue: [input := InputSource for: entity 
systemID].
+                self pushSource: input for: entity ]
+            ifFalse:
+                [self pushSource: (InputSource
+                                        uri: nil
+                                        encoding: nil
+                                        stream: entity text readStream)
+                        for: entity]
+    ]
+
     pushSource: anInputSource for: anEntity [
        | str |
         <category: 'api'>
@@ -2750,7 +2774,7 @@ Instance Variables:
                                    pushSource: (StreamWrapper 
emptyWithExtraSpace: refType ~= #data from: self).
                                self getNextChar]]
                    ifFalse:
-                       [exp streamFor: self.
+                       [self pushSourceFor: exp.
                        refType = #data ifFalse: [self wrapSourceInSpaces]].
                (refType ~= #data and: [self sourceWrapper uri notNil]) 
                    ifTrue: [self sourceWrapper usedAsExternal: true].
@@ -3173,7 +3197,7 @@ Instance Variables:
                    ifFalse: 
                        [self 
                            malformed: 'References to unparsed entities other 
than in an attribute of type ENTITY are not permitted'].
-               exp streamFor: self]
+               self pushSourceFor: exp]
     ]
 
     getElement [


--- orig/packages/xml/parser/package.xml
+++ mod/packages/xml/parser/package.xml
@@ -2,7 +2,8 @@
   <name>XML-XMLParser</name>
   <namespace>XML</namespace>
 
-  <prereq>XML-XMLNodeBuilder</prereq>
+  <prereq>XML-SAXParser</prereq>
+  <prereq>XML-DOM</prereq>
 
   <filein>XML.st</filein>
   <file>XML.st</file>


--- orig/packages/xml/saxdriver/SAX.st
+++ mod/packages/xml/saxdriver/SAX.st
@@ -304,6 +304,14 @@ Instance Variables:
 ]
 
 
+SAXDriver subclass: DOM_SAXDriver [
+    <category: 'XML-XML-DOM'>
+    startElement [
+       self notYetImplemented
+    ]
+]
+
+
 SAXDriver subclass: SAXDispatcher [
     | contentHandler dtdHandler entityResolver errorHandler |
     
@@ -1048,3 +1056,66 @@ MalformedSignal subclass: BadCharacterSi
     <comment: nil>
 ]
 
+
+Object subclass: InputSource [
+    | uri encoding stream |
+    
+    <category: 'XML-XML-Resources'>
+    <comment: '
+An InputSource represents a data source which may have been fetched
+locally or from the net, and which has various properties. An
+InputSource may be created by a SAXDriver in response to the
+#resolveEntity:systemID: message.
+
+In release 5i.4, we record the URI and the data, and if possible the
+encoding. In future we may want to also incorporate things like the
+MIME type or other attributes.
+
+Instance Variables:
+    uri                                <nil | NetClients.URL>  The URI of the 
data source, if known
+    encoding           <nil | Symbol>          If the transport protocol 
specified an encoding,
+                                                                       this 
should take precedence over the encoding
+                                                                       
contained in the <?xml?> declaration
+    stream                     <Stream>                        the data 
source'>
+
+    InputSource class >> for: uri [
+       <category: 'private'>
+       | stream |
+       stream := NetClients.URIResolver openStreamOn: uri.
+       ^self 
+           uri: (uri isString ifTrue: [NetClients.URL fromString: uri] 
ifFalse: [uri])
+           encoding: nil
+           stream: stream
+    ]
+
+    InputSource class >> uri: aURI encoding: anEncodingName stream: aStream [
+       <category: 'instance creation'>
+       ^self new 
+           uri: aURI
+           encoding: anEncodingName
+           stream: aStream
+    ]
+
+    uri: aURI encoding: anEncodingName stream: aStream [
+       <category: 'initialize'>
+       uri := aURI.
+       encoding := anEncodingName.
+       stream := aStream
+    ]
+
+    encoding [
+       <category: 'accessing'>
+       ^encoding
+    ]
+
+    stream [
+       <category: 'accessing'>
+       ^stream
+    ]
+
+    uri [
+       <category: 'accessing'>
+       ^uri
+    ]
+]
+


--- orig/packages/xml/saxparser/Parser.st
+++ mod/packages/xml/saxparser/Parser.st
@@ -29,7 +29,7 @@
 
 
 Object subclass: SAXParser [
-    | sax dtd validating flags |
+    | sax validating flags |
     
     <category: 'XML-XML-SAX'>
     <comment: '
@@ -46,7 +46,6 @@ Version 1.0 specification.
 
 Instance Variables:
     sax                                <XML.SAXDriver>                 the 
output
-    dtd                         <XML.DocumentType>      the document type 
definition for the current document
     validating <Boolean>                                               if true 
then the parse validates the XML
     flags              <SmallInteger>                          sundry boolean 
values that are not accessed often enough
                                                                                
        to need separate instance variables.'>
@@ -113,7 +112,6 @@ Instance Variables:
         state of the parse, but retain those that
         relate to options."
        flags := flags bitAnd: 65535 bitInvert.
-       dtd := DocumentType new.
     ]
 
     saxDriver: aSAXDriver [
@@ -127,11 +125,6 @@ Instance Variables:
        ^sax document
     ]
 
-    dtd [
-       <category: 'accessing'>
-       ^dtd
-    ]
-
     saxDriver [
        <category: 'accessing'>
        ^sax
@@ -147,11 +140,6 @@ Instance Variables:
        ^validating
     ]
 
-    pushSource: anInputSource for: anEntity [
-        <category: 'api'>
-       self subclassResponsibility
-    ]
-
     scanDocument [
        <category: 'api'>
        self subclassResponsibility
@@ -415,26 +403,6 @@ Instance Variables:
 
 
 
-Entity extend [
-    streamFor: aParser [
-       <category: 'accessing'>
-       text == nil 
-           ifTrue: 
-               [| str input |
-               input := aParser saxDriver resolveEntity: self publicID
-                           systemID: self systemID.
-               input == nil ifTrue: [input := InputSource for: self systemID].
-               aParser pushSource: input for: self]
-           ifFalse:
-               [aParser pushSource: (InputSource 
-                                       uri: nil
-                                       encoding: nil
-                                       stream: text readStream)
-                       for: self]
-    ]
-]
-
-
 SAXException subclass: SAXNotRecognizedException [
     
     <category: 'XML-XML-Exceptions'>


--- orig/packages/xml/saxparser/package.xml
+++ mod/packages/xml/saxparser/package.xml
@@ -3,7 +3,6 @@
   <namespace>XML</namespace>
 
   <prereq>XML-SAXDriver</prereq>
-  <prereq>XML-DOM</prereq>
 
   <filein>Parser.st</filein>
   <file>Parser.st</file>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]