1
Fork 0
mirror of https://github.com/Steffo99/unimore-oop-2020-cleaver.git synced 2024-11-22 08:04:19 +00:00

Add ChopJob.run() code (no crypt yet)

This commit is contained in:
Steffo 2019-12-16 14:49:18 +01:00
parent fbe9dbbd0f
commit d79f83f376
11 changed files with 229 additions and 11 deletions

View file

@ -1,5 +0,0 @@
<Cleaver>
<Compress/>
<Crypt/>
<Split mode="by-parts">10</Split>
</Cleaver>

View file

@ -0,0 +1,21 @@
package eu.steffo.cleaver;
import eu.steffo.cleaver.logic.ChopJob;
import eu.steffo.cleaver.logic.Job;
import eu.steffo.cleaver.logic.split.SplitFileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test {
public static void main(String[] args) {
OutputStream stream = new SplitFileOutputStream("test", 64);
for(int i = 0; i < 256; i++) {
try {
stream.write(i);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

View file

@ -17,6 +17,7 @@ public class FileSelectRow extends Row {
fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(true);
fileChooser.setCurrentDirectory(new File("."));
this.add(Box.createHorizontalStrut(8));

View file

@ -1,11 +1,29 @@
package eu.steffo.cleaver.logic;
import eu.steffo.cleaver.errors.ChpFileError;
import eu.steffo.cleaver.errors.ProgrammingError;
import eu.steffo.cleaver.logic.compress.CompressConfig;
import eu.steffo.cleaver.logic.crypt.CryptConfig;
import eu.steffo.cleaver.logic.progress.ErrorProgress;
import eu.steffo.cleaver.logic.progress.FinishedProgress;
import eu.steffo.cleaver.logic.progress.WorkingProgress;
import eu.steffo.cleaver.logic.split.SplitByPartsConfig;
import eu.steffo.cleaver.logic.split.SplitBySizeConfig;
import eu.steffo.cleaver.logic.split.SplitConfig;
import eu.steffo.cleaver.logic.split.SplitFileOutputStream;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.util.zip.DeflaterOutputStream;
public class ChopJob extends Job {
@ -27,7 +45,78 @@ public class ChopJob extends Job {
@Override
public void run() {
this.setProgress(new FinishedProgress());
try {
InputStream inputStream = new FileInputStream(file);
long partSize;
if(splitConfig instanceof SplitBySizeConfig) {
partSize = ((SplitBySizeConfig)splitConfig).getSize();
}
else if(splitConfig instanceof SplitByPartsConfig) {
partSize = ((SplitByPartsConfig)splitConfig).getParts();
}
else {
partSize = file.length();
}
OutputStream outputStream = new SplitFileOutputStream(file.getName(), partSize);
if(compressConfig != null) {
outputStream = new DeflaterOutputStream(outputStream);
}
if(cryptConfig != null) {
//TODO
}
//Create the .chp file
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new ProgrammingError();
}
Document doc = builder.newDocument();
Element root = doc.createElement("Cleaver");
doc.appendChild(root);
if(splitConfig != null) {
root.appendChild(splitConfig.toElement(doc));
}
if(compressConfig != null) {
root.appendChild(compressConfig.toElement(doc));
}
if(cryptConfig != null) {
root.appendChild(cryptConfig.toElement(doc));
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(String.format("%s.chp", file.getName()));
transformer.transform(source, result);
//Actually run the job
int bytesUntilNextUpdate = 1024;
this.setProgress(new WorkingProgress());
int i;
while((i = inputStream.read()) != -1) {
outputStream.write(i);
bytesUntilNextUpdate -= 1;
if(bytesUntilNextUpdate <= 0) {
this.setProgress(new WorkingProgress((float)file.length() / (float)partSize));
bytesUntilNextUpdate = 1024;
}
}
inputStream.close();
outputStream.close();
this.setProgress(new FinishedProgress());
} catch (Throwable e) {
this.setProgress(new ErrorProgress(e));
}
}
public SplitConfig getSplitConfig() {

View file

@ -1,8 +1,15 @@
package eu.steffo.cleaver.logic.compress;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class CompressConfig {
@Override
public String toString() {
return "Yes";
}
public Element toElement(Document doc) {
return doc.createElement("Compress");
}
}

View file

@ -1,5 +1,8 @@
package eu.steffo.cleaver.logic.crypt;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class CryptConfig {
protected String key;
@ -15,4 +18,8 @@ public class CryptConfig {
public String toString() {
return "••••••••";
}
public Element toElement(Document doc) {
return doc.createElement("Crypt");
}
}

View file

@ -0,0 +1,14 @@
package eu.steffo.cleaver.logic.progress;
public class ErrorProgress extends Progress {
public final Throwable error;
public ErrorProgress(Throwable error) {
this.error = error;
}
@Override
public String toString() {
return "Error: " + error.getMessage();
}
}

View file

@ -1,5 +1,9 @@
package eu.steffo.cleaver.logic.split;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class SplitByPartsConfig extends SplitConfig {
protected int parts;
@ -15,4 +19,17 @@ public class SplitByPartsConfig extends SplitConfig {
public String toString() {
return String.format("%d parts", this.parts);
}
@Override
public Element toElement(Document doc) {
Element element = doc.createElement("Split");
Attr attr = doc.createAttribute("mode");
attr.setValue("by-parts");
element.setAttributeNode(attr);
element.setTextContent(Integer.toString(parts));
return element;
}
}

View file

@ -1,13 +1,18 @@
package eu.steffo.cleaver.logic.split;
public class SplitBySizeConfig extends SplitConfig {
protected int size;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
public SplitBySizeConfig(int size) {
public class SplitBySizeConfig extends SplitConfig {
protected long size;
public SplitBySizeConfig(long size) {
this.size = size;
}
public int getSize() {
public long getSize() {
return size;
}
@ -15,4 +20,17 @@ public class SplitBySizeConfig extends SplitConfig {
public String toString() {
return String.format("%d bytes", this.size);
}
@Override
public Element toElement(Document doc) {
Element element = doc.createElement("Split");
Attr attr = doc.createAttribute("mode");
attr.setValue("by-size");
element.setAttributeNode(attr);
element.setTextContent(Long.toString(size));
return element;
}
}

View file

@ -1,4 +1,8 @@
package eu.steffo.cleaver.logic.split;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public abstract class SplitConfig {
public abstract Element toElement(Document doc);
}

View file

@ -0,0 +1,45 @@
package eu.steffo.cleaver.logic.split;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class SplitFileOutputStream extends OutputStream {
protected String fileBaseName;
protected FileOutputStream currentFileOutputStream;
protected long currentByteCount;
protected long maximumByteCount;
protected int currentFileCount;
public SplitFileOutputStream(String fileBaseName, long maximumByteCount) {
this.fileBaseName = fileBaseName;
this.maximumByteCount = maximumByteCount;
this.currentByteCount = 0;
this.currentFileCount = 0;
this.currentFileOutputStream = null;
}
protected void createNextFileOutputStream() throws IOException {
if(currentFileOutputStream != null) {
currentFileOutputStream.close();
}
currentFileCount += 1;
currentFileOutputStream = new FileOutputStream(String.format("%s.c%d", fileBaseName, currentFileCount));
currentByteCount = 0;
}
@Override
public void write(int b) throws IOException {
if(currentFileOutputStream == null || currentByteCount >= maximumByteCount) {
createNextFileOutputStream();
}
currentFileOutputStream.write(b);
currentByteCount += 1;
}
@Override
public void close() throws IOException {
currentFileOutputStream.close();
}
}