#REFACTORING
authorClaus Gittinger <cg@exept.de>
Fri, 01 Apr 2016 14:24:04 +0200
changeset 646 870714c59ff8
parent 645 4fdd7ae6c84a
child 647 f825e6333193
#REFACTORING class: MetricsReporter added:5 methods
MetricsReporter.st
--- a/MetricsReporter.st	Fri Apr 01 14:23:52 2016 +0200
+++ b/MetricsReporter.st	Fri Apr 01 14:24:04 2016 +0200
@@ -431,6 +431,122 @@
     ^ self reportXml_xradar
 ! !
 
+!MetricsReporter methodsFor:'reporting - xml-xradar'!
+
+reportXml_xradar
+    "invoked via perform, if the formatSymbol is #xml_xradar"
+    
+    "
+        self new
+            stream:Transcript;
+            packages:#( 'exept:workflow' );
+            reportXml_xradar
+    "
+
+    "/ need the exept-metrics package
+    Smalltalk loadPackage:'exept:programming/oom'.
+
+    packages do:[:eachPackageID |
+        "/ if the package is a matchPattern, generate metrics for all loaded packages
+        "/ which match that pattern.
+        "/ Otherwise, make sure that this package is loaded and generate metrics for that
+        "/ one only.
+        eachPackageID includesMatchCharacters ifFalse:[
+            Smalltalk loadPackage:eachPackageID.
+        ].
+    ].
+
+    stream nextPutLine: '<?xml version="1.0"?>';
+           nextPutLine: '<metrics>'.
+
+    packages do:[:eachPackageID |
+        "/ if the package is a matchPattern, generate metrics for all loaded packages
+        "/ which match that pattern.
+        "/ Otherwise, make sure that this package is loaded and generate metrics for that
+        "/ one only.
+        self reportXml_xradar_forPackage:eachPackageID
+    ].
+    stream nextPutLine: '</metrics>'.
+!
+
+reportXml_xradar_forClass:aClass
+    stream nextPutLine: '    <class>'.
+    stream nextPutLine: ('      <name>%1</name>' bindWith:aClass name).
+
+    self methodMetricNames notEmptyOrNil ifTrue:[
+        aClass instAndClassMethodsDo:[:eachMethod |
+            self reportXml_xradar_forMethod:eachMethod
+        ].
+    ].
+
+    self classMetricNames notEmptyOrNil ifTrue:[
+        self reportXml_xradar_values:(self generateClassMetricsFor:aClass).
+    ].
+
+    stream nextPutLine: '    </class>'.
+!
+
+reportXml_xradar_forMethod:aMethod
+    stream nextPutLine: '      <method>'.
+    stream nextPutLine:('        <name>%1</name>' bindWith:aMethod selector).
+
+    self reportXml_xradar_values:(self generateMethodMetricsFor:aMethod).
+
+    stream nextPutLine: '      </method>'.
+!
+
+reportXml_xradar_forPackage:aPackageIDOrPattern
+    |genMetricsForClass|
+
+    genMetricsForClass :=
+        [:aClass |
+            Autoload autoloadFailedSignal handle:[:ex |
+            ] do:[
+                aClass autoload.
+                self reportXml_xradar_forClass:aClass
+            ]
+        ].
+
+    stream nextPutLine: '  <project>'.
+    stream nextPutLine: ('    <name>%1</name>' bindWith:aPackageIDOrPattern).
+
+    (self classMetricNames notEmptyOrNil 
+    or:[self methodMetricNames notEmptyOrNil]) ifTrue:[
+        aPackageIDOrPattern includesMatchCharacters ifTrue:[
+            Smalltalk allClasses do:[:eachClass |
+                (eachClass package matches:aPackageIDOrPattern) ifTrue:[ 
+                    genMetricsForClass value:eachClass
+                ].
+            ].
+        ] ifFalse:[
+            Smalltalk allClassesInPackage:aPackageIDOrPattern do:genMetricsForClass.
+        ].
+    ].
+
+    self reportXml_xradar_values:(self generatePackageMetricsFor:aPackageIDOrPattern).
+
+    stream nextPutLine: '  </project>'.
+!
+
+reportXml_xradar_values:metricValues
+    |metricShortName metricLongName metricValue possibleErrorMessage|
+
+    metricValues do:[:eachMetricInfo |
+        metricShortName := eachMetricInfo shortName.
+        metricLongName := eachMetricInfo longName.
+        metricValue := eachMetricInfo metricValue.
+        possibleErrorMessage := eachMetricInfo errorMessage.
+        possibleErrorMessage notNil ifTrue:[
+            metricLongName := metricLongName , '(Error: ',possibleErrorMessage,')'.
+        ].    
+
+        stream nextPutLine: '    <measurement>'.
+        stream nextPutLine: ('      <short-name>%1</short-name>' bindWith:metricShortName).
+        stream nextPutLine: ('      <long-name>%1</long-name>' bindWith:metricLongName).
+        stream nextPutLine: ('      <value>%1</value>' bindWith:metricValue).
+        stream nextPutLine: '    </measurement>'.
+    ]
+! !
 
 !MetricsReporter methodsFor:'reporting-private'!