java-class-compression-rese.../src/main/java/eu/mikroskeem/uurimustoo/algoritmidetest/Utils.java

89 lines
3.4 KiB
Java

package eu.mikroskeem.uurimustoo.algoritmidetest;
import eu.mikroskeem.shuriken.instrumentation.validate.Validate;
import eu.mikroskeem.shuriken.reflect.Reflect;
import eu.mikroskeem.uurimustoo.algoritmidetest.compressors.AbstractCompressor;
import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author Mark Vainomaa
*/
public class Utils {
public static List<AbstractCompressor> getAllCompressors(){
return new FastClasspathScanner(AbstractCompressor.class.getPackage().getName())
.scan().getNamesOfSubclassesOf(AbstractCompressor.class)
.stream()
.map(className -> {
try {
return (AbstractCompressor)Reflect.getClass(className)
.get().construct().getClassInstance();
} catch (Exception e){
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
public static CompressorResult executeCompressor(byte[] input, AbstractCompressor compressor){
String compressorName = compressor.getName();
byte[] compressed = compressor.compress(input);
/* Verify for sure */
try {
byte[] decompressed = compressor.decompress(compressed);
Validate.checkGeneratedClass(decompressed);
assert decompressed.length == input.length;
} catch (Throwable e){
System.out.println(String.format("Tekkis viga %s algoritmi lahtipakkimisel! %s", compressorName, e.toString()));
compressorName = compressorName + " (katki)";
}
return new CompressorResult(compressorName, compressed.length);
}
public static List<CompressorResult> executeAllAndSort(byte[] input){
List<CompressorResult> compressorResults = getAllCompressors().stream()
.map(c -> executeCompressor(input, c))
.collect(Collectors.toList());
compressorResults.add(new CompressorResult("Orginaal", input.length)); // Inject original size
Collections.sort(compressorResults);
Collections.reverse(compressorResults);
return compressorResults;
}
public static void generateReport(byte[] input){
System.out.println("---------------------------------");
System.out.println("| Algoritm | Suurus |");
/* Show other results */
executeAllAndSort(input).forEach(compressorResult -> {
System.out.println("|----------------|--------------|");
System.out.format("| %-12s| %-10s|%n",
compressorResult.getCompressorName(),
compressorResult.getSize()
);
});
System.out.println("|-------------------------------|");
}
@RequiredArgsConstructor
@Getter
public static class CompressorResult implements Comparable<CompressorResult> {
private final String compressorName;
private final int size;
@Override
public int compareTo(@NotNull Utils.CompressorResult o) {
return new Integer(size).compareTo(o.getSize());
}
}
}