--- 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'!