sse-labs / fachproject-metrics-framework

A Scala framework for calculating JVM bytecode metrics based on the OPAL project
2 stars 2 forks source link

Multifileanalysis Dateien werden nicht in der "richtigen" Reihenfolge angeliefert #36

Open PKTUDO opened 2 years ago

PKTUDO commented 2 years ago

Multifileanalysis Dateien werden nicht in der "richtigen" Reihenfolge angeliefert:

Auf "commons-collections-2.1.jar" folgt direkt "commons-collections-3.0.jar" und auf "commons-collections-2.1.1.jar" folgt direkt "commons-collections-2.1.jar"

Beispiel-csv: "Path","Entity","ES_stability","ES_Removed","ES_Remained" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.1.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.0.jar","0.7388888888888889","1.0","0.7388888888888889" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-1.0.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.015953.jar","1.0","1.0","1.0" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.015953.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.020746.jar","1.0","1.0","1.0" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.1.1.jar","0.9540229885057472","1.0","0.9540229885057472" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.1.1.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.1.jar","0.9625668449197861","1.0","0.9625668449197861" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.0.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.1.jar","0.9533799533799534","1.0","0.9533799533799534" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.2.1.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.2.2.jar","1.0","1.0","1.0" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.020858.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.jar","0.4252421910366682","0.8765957446808511","0.48510638297872344" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.2.2.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.2.jar","0.9782608695652174","1.0","0.9782608695652174" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.020746.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-2.0.20020914.020858.jar","1.0","1.0","1.0" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-1.0.jar","1.0","1.0","1.0" "F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections","Difference between: F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.1.jar and F:\Uni\WS2122\Fachprojekt\jars\Commons-Collections\commons-collections-3.2.1.jar","0.9820627802690582","1.0","0.9820627802690582"

johannesduesing commented 2 years ago

Das stimmt, leider ist die "normale" alphanumerische Art Strings zu sortieren nicht äquivalent zur Sortierung von sogenannten Semantic Versions. Es ist leider schwierig hier eine allgemeine Sortierung zu definieren, da das ganze sowohl funktionieren soll wenn keine Versionsnummern enthalten sind, als auch bei unvollständigen Versionsnummern. Allgemein sind mehrere Lösungen denkbar:

  1. Die Dateien umbenennen, sodass die alphanumerische (normale) Sortierung auch der Versionsreihenfolge entspricht. Also zum Beispiel: 0-commons-collections-1.0.jar , 1-commons-collections-2.0.jar , etc...
  2. Eine andere Datei-Sortierung implementieren. Sie können das Attribut MultiFileAnalysisApplication.fileOrdering überschreiben. Dieses Attribut definiert die Reihenfolge in der Datei an die Analyse gegeben werden. Zur Zeit nutzt es (wie gesagt) die normale alphanumerische Reihenfolge des Dateinamens. Sie können dort aber auch auf andere Attribute von Dateien, zum Beispiel den Zeitpunkt der Erstellung zugreifen. Vielleicht lässt sich darüber eine bessere Sortierung definieren.

    object SampleFileAnalysisApplication extends MultiFileAnalysisApplication {
    
    override protected def fileOrdering: Ordering[File] = (x: File, y: File) =>{
    // Hier Erstelldatum von x und y Herausfinden und vergleichen
    }
    
    override protected def buildAnalyses(jarDirectory: File): Seq[MultiFileAnalysis[_]] = Seq(
    
    )
    }
  3. Ich arbeite grade an einer Implementierung eines Ordering[File], dass Dateinamen vergleichen kann, sofern diese: a) Mindestens eine Zahl enthalten b) Diese Zahl der Beginn einer Semantic Version (zB 2 ; 1.5.0 ; 3.1) ist Das Ordering schmeißt dann alle Textanteile des Dateinamens weg und vergleicht nur die Semantic Version. Das sollte für Ihren Use-Case Funktionieren, könnte aber möglichweise Testfälle von anderen Gruppen kaputtmachen, sofern diese JARs verwenden die keine Semantic Versions enthalten. Ich hoffe ich kann für diesen Code bis morgen einen PR erstellen, dann können Sie einmal Reviewen und Gucken ob Ihnen das weiterhelfen würde.
PKTUDO commented 2 years ago

In den jars ist meistens ein manifest enthalten. Dies hat ein Erstellungsdatum und eine Erstellungsuhrzeit, daraus könnte man auch eine Ordnung ableiten😃

PKTUDO commented 2 years ago

Leider sind diese Zeitstempel auch nicht immer weiterführend: commons-collections-1.0.jar : Manifest: 03.04.2002 14:00 commons-collections-2.0.jar : Manifest: 02.04.2002 10:36

Ich werde erstmal eine gewillkürte Reihenfolge durch das Voranstellen von 00-jarname.jar, 01-jarname.jar, ... nutzen

johannesduesing commented 2 years ago

Alles klar, das scheint mir auch erstmal die beste Lösung zu sein. Wir können nacher im Meeting einmal mögliche Alternativen besprechen 👍