jan@73: "{ Package: 'stx:goodies/builder/reports' }" jan@73: jan@73: "{ NameSpace: Builder }" jan@73: jan@73: Object subclass:#ReportFormat jan@73: instanceVariableNames:'report stream' jan@73: classVariableNames:'' jan@73: poolDictionaries:'' jan@73: category:'Builder-Reports-Formats' jan@73: ! jan@73: jan@73: jan@73: !ReportFormat class methodsFor:'instance creation'! jan@73: jan@73: named:aString jan@73: "Return new format with given name. Name may be jan@73: either class or symbolic name" jan@73: jan@73: self allSubclassesDo: jan@73: [:cls | jan@73: (cls isAbstract not and:[cls name = aString or:[ cls symbolicNames includes:aString ]]) jan@73: ifTrue:[ ^ cls new ] ]. jan@73: jan@73: self error:'No format named ' , aString. jan@73: jan@73: " jan@73: ReportFormat named: 'tap' jan@73: ReportFormat named: 'JUnitFormat' jan@73: ReportFormat named: 'NONEX' jan@73: " jan@73: jan@73: "Created: / 04-08-2011 / 11:47:08 / Jan Vrany " jan@73: ! jan@73: jan@73: new jan@73: "return an initialized instance" jan@73: jan@73: ^ self basicNew initialize. jan@73: ! ! jan@73: jan@73: !ReportFormat class methodsFor:'accessing'! jan@73: jan@73: symbolicNames jan@73: "Returns a collection of symbolic names for this format" jan@73: jan@73: ^ self subclassResponsibility jan@73: jan@73: "Modified (comment): / 04-08-2011 / 11:46:07 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat class methodsFor:'testing'! jan@73: jan@73: isAbstract jan@73: jan@73: ^self == HDReportFormat jan@73: jan@73: "Created: / 04-08-2011 / 11:44:08 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat methodsFor:'accessing - defaults'! jan@73: jan@73: defaultFileSuffix jan@73: jan@73: ^self subclassResponsibility jan@73: jan@73: "Created: / 04-08-2011 / 12:47:35 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat methodsFor:'initialization'! jan@73: jan@73: initialize jan@73: "Invoked when a new instance is created." jan@73: jan@73: "/ please change as required (and remove this comment) jan@73: "/ stream := nil. jan@73: "/ suite := nil. jan@73: jan@73: "/ super initialize. -- commented since inherited method does nothing jan@73: ! jan@73: jan@73: report: aReport stream: aStream jan@73: jan@73: report := aReport. jan@73: (aStream isKindOf: EncodedStream) ifTrue:[ jan@73: stream := aStream. jan@73: ] ifFalse:[ jan@89: | encoder | jan@89: "Kludge since ISO10646_to_XMLUTF8 encoder may not be present" jan@89: jan@89: CharacterEncoderImplementations::ISO10646_to_XMLUTF8 notNil ifTrue:[ jan@89: CharacterEncoderImplementations::ISO10646_to_XMLUTF8 autoload. jan@89: encoder := CharacterEncoderImplementations::ISO10646_to_XMLUTF8 new. jan@89: ] ifFalse:[ jan@89: encoder := CharacterEncoder encoderForUTF8. jan@89: ]. jan@89: stream := EncodedStream stream: aStream encoder: encoder jan@73: ] jan@73: jan@73: "Created: / 03-08-2011 / 18:54:19 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat methodsFor:'stream - utilities'! jan@73: jan@73: stream jan@73: jan@73: ^ stream jan@73: jan@73: ! jan@73: jan@73: streamClose jan@73: jan@73: "Temporarily closes the stream" jan@73: jan@73: "stream is EncodedStream..." jan@73: stream stream close. jan@73: jan@73: "Created: / 12-08-2011 / 09:30:38 / Jan Vrany " jan@73: ! jan@73: jan@73: streamFlush jan@73: jan@73: "Temporarily closes the stream" jan@73: jan@73: "stream is EncodedStream..." jan@73: stream stream flush. jan@73: jan@73: "Created: / 12-08-2011 / 09:35:39 / Jan Vrany " jan@73: ! jan@73: jan@73: streamOpenForAppend jan@73: jan@73: "Open previously closes stream" jan@73: jan@73: | s | jan@73: "stream is EncodedStream..." jan@73: s := stream stream. jan@73: s isExternalStream ifTrue:[ jan@73: s isOpen ifTrue:[s close]. jan@73: s openForWriting. jan@73: s setToEnd. jan@73: ]. jan@73: jan@73: "Created: / 12-08-2011 / 09:31:43 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat methodsFor:'writing'! jan@73: jan@73: writeFooter jan@73: "raise an error: must be redefined in concrete subclass(es)" jan@73: jan@73: ^ self subclassResponsibility jan@73: ! jan@73: jan@73: writeHeader jan@73: "raise an error: must be redefined in concrete subclass(es)" jan@73: jan@73: ^ self subclassResponsibility jan@73: ! ! jan@73: jan@73: !ReportFormat methodsFor:'writing - utilities'! jan@73: jan@73: encode: aString jan@73: jan@73: ^Report encode: aString jan@73: jan@73: "Created: / 03-08-2011 / 14:37:10 / Jan Vrany " jan@202: ! jan@202: jan@202: writeCDATA: string jan@202: | start stop | jan@202: jan@202: start := 1. jan@202: stop := start. jan@202: [ (stop := (string indexOf: $] startingAt: stop)) ~~ 0 ] whileTrue:[ jan@202: ((stop < (string size - 1)) jan@202: and:[(string at: stop + 1) == $] jan@202: and:[(string at: stop + 2) == $>]]) ifTrue:[ jan@202: " Okay, found CDATA end token " jan@202: stream nextPutAll: string startingAt: start to: stop + 1. jan@202: stream nextPutAll: ']]>'. jan@202: start := stop := stop + 3. jan@202: ] ifFalse:[ jan@202: stop := stop + 1. jan@202: ]. jan@202: ]. jan@202: start < string size ifTrue:[ jan@202: stream nextPutAll: string startingAt: start to: string size. jan@202: ]. jan@202: jan@202: " jan@202: String streamContents:[:s | Builder::TestReportFormat::JUnit new report: nil stream: s; writeCDATA:'ABCD'] jan@202: String streamContents:[:s | Builder::TestReportFormat::JUnit new report: nil stream: s; writeCDATA:']]]]'] jan@202: String streamContents:[:s | Builder::TestReportFormat::JUnit new report: nil stream: s; writeCDATA:'Some <[CDATA[ CDATA ]]> Some Text and stray terminator ]]> here'] jan@202: " jan@202: jan@202: "Created: / 05-07-2013 / 16:54:24 / Jan Vrany " jan@73: ! ! jan@73: jan@73: !ReportFormat class methodsFor:'documentation'! jan@73: jan@73: version jan@73: ^ '$Header$' jan@73: ! jan@73: jan@73: version_CVS jan@73: ^ '$Header$' jan@73: ! jan@73: jan@73: version_SVN jan@202: ^ '$Id$' jan@73: ! ! jan@202: