Initial commit: ZIP & XZ
This commit is contained in:
commit
8c84a16075
21
.gitignore
vendored
Normal file
21
.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# ---> Java
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Mobile Tools for Java (J2ME)
|
||||||
|
.mtj.tmp/
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.ear
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
# IntelliJ IDEA
|
||||||
|
*.iml
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Maven
|
||||||
|
target/
|
||||||
|
dependency-reduced-pom.xml
|
92
pom.xml
Normal file
92
pom.xml
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>eu.mikroskeem.uurimustoo</groupId>
|
||||||
|
<artifactId>algoritmidetest</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<!-- Project properties -->
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.java.version>1.8</project.java.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<!-- Repositories -->
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>mikroskeem-repo</id>
|
||||||
|
<name>mikroskeem Maven Repository</name>
|
||||||
|
<url>https://repo.wut.ee/repository/mikroskeem-repo/</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<!-- Compiler configuration -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.6.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${project.java.version}</source>
|
||||||
|
<target>${project.java.version}</target>
|
||||||
|
<showWarnings>true</showWarnings>
|
||||||
|
<showDeprecation>true</showDeprecation>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Execute directly -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.6.0</version>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>eu.mikroskeem.uurimustoo.algoritmidetest.Main</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<defaultGoal>exec:java</defaultGoal>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Tools -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>eu.mikroskeem</groupId>
|
||||||
|
<artifactId>shuriken.common</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Lombok -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.16.16</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Classpath scanner -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.lukehutch</groupId>
|
||||||
|
<artifactId>fast-classpath-scanner</artifactId>
|
||||||
|
<version>LATEST</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ######## Compressors ######## -->
|
||||||
|
|
||||||
|
<!-- XZ -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.tukaani</groupId>
|
||||||
|
<artifactId>xz</artifactId>
|
||||||
|
<version>1.6</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,13 @@
|
|||||||
|
package eu.mikroskeem.uurimustoo.algoritmidetest;
|
||||||
|
|
||||||
|
import eu.mikroskeem.shuriken.common.streams.ByteArrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Mark Vainomaa
|
||||||
|
*/
|
||||||
|
public class Main {
|
||||||
|
public static void main(String... args){
|
||||||
|
byte[] classFile = ByteArrays.fromInputStream(Main.class.getResourceAsStream("/Test.class"));
|
||||||
|
Utils.generateReport(classFile);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package eu.mikroskeem.uurimustoo.algoritmidetest;
|
||||||
|
|
||||||
|
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){
|
||||||
|
return new CompressorResult(compressor.getName(), compressor.compress(input).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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package eu.mikroskeem.uurimustoo.algoritmidetest.compressors;
|
||||||
|
|
||||||
|
import eu.mikroskeem.shuriken.common.SneakyThrow;
|
||||||
|
import org.tukaani.xz.FinishableOutputStream;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Mark Vainomaa
|
||||||
|
*/
|
||||||
|
public abstract class AbstractCompressor {
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
public final byte[] compress(byte[] input){
|
||||||
|
try {
|
||||||
|
ByteArrayInputStream bais = new ByteArrayInputStream(input);
|
||||||
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
pipe0(bais, baos);
|
||||||
|
return baos.toByteArray();
|
||||||
|
} catch (IOException e){
|
||||||
|
SneakyThrow.throwException(e);
|
||||||
|
}
|
||||||
|
return new byte[0]; // Never reaches here anyway
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pipe0(InputStream inputStream, OutputStream outputStream) throws IOException {
|
||||||
|
OutputStream out = pipe(outputStream);
|
||||||
|
byte[] buf = new byte[8192];
|
||||||
|
int s; while((s = inputStream.read()) != -1) out.write(buf, 0, s);
|
||||||
|
if(out instanceof FinishableOutputStream)
|
||||||
|
((FinishableOutputStream) out).finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract OutputStream pipe(OutputStream outputStream) throws IOException;
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package eu.mikroskeem.uurimustoo.algoritmidetest.compressors;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.tukaani.xz.LZMA2Options;
|
||||||
|
import org.tukaani.xz.XZOutputStream;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Mark Vainomaa
|
||||||
|
*/
|
||||||
|
public class CompressXZ extends AbstractCompressor {
|
||||||
|
@Getter private final String name = "XZ";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream pipe(OutputStream outputStream) throws IOException {
|
||||||
|
LZMA2Options options = new LZMA2Options();
|
||||||
|
return new XZOutputStream(outputStream, options);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package eu.mikroskeem.uurimustoo.algoritmidetest.compressors;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Mark Vainomaa
|
||||||
|
*/
|
||||||
|
public class CompressZip extends AbstractCompressor {
|
||||||
|
@Getter private final String name = "ZIP";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pipe0(InputStream inputStream, OutputStream outputStream) throws IOException {
|
||||||
|
try(ZipOutputStream out = new ZipOutputStream(outputStream)){
|
||||||
|
ZipEntry ze = new ZipEntry("Test.class");
|
||||||
|
out.putNextEntry(ze);
|
||||||
|
byte[] buf = new byte[8192];
|
||||||
|
int s;
|
||||||
|
while((s = inputStream.read()) != -1){
|
||||||
|
out.write(buf, 0, s);
|
||||||
|
}
|
||||||
|
out.closeEntry();
|
||||||
|
out.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream pipe(OutputStream outputStream) throws IOException {
|
||||||
|
throw new UnsupportedOperationException("See void pipe0()");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user