89 lines
3.4 KiB
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());
|
|
}
|
|
}
|
|
}
|