package io.github.minecraftgui.models.repositories;
import io.github.minecraftgui.controllers.MainController;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by Samuel on 2016-01-03.
*/
public class FileRepository {
private final ArrayList<String> mimeTypesAllowed;
protected final CopyOnWriteArrayList<String> urlLoaded;
public FileRepository(ArrayList<String> mimeTypesAllowed) {
this.mimeTypesAllowed = mimeTypesAllowed;
this.urlLoaded = new CopyOnWriteArrayList<>();
}
public InputStream getFile(String url) throws Exception {
String fileName = generateFileName(url);
File file = new File(MainController.PATH+"resources/"+fileName);
if(file.exists() && getFileLength(url) == file.length())
return new FileInputStream(file);
else{
ByteArrayInputStream bais = downloadFileByUrl(url);
FileOutputStream fos;
file.createNewFile();
fos = new FileOutputStream(file);
int i;
while ((i = bais.read()) != -1)
fos.write(i);
fos.close();
bais.reset();
return bais;
}
}
private long getFileLength(String fileUrl) throws Exception {
URL url = new URL(fileUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
long length = con.getContentLengthLong();
con.disconnect();
return length;
}
private ByteArrayInputStream downloadFileByUrl(String fileUrl) throws Exception {
URL url = new URL(fileUrl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if(con.getContentLengthLong() <= 3145728 && mimeTypesAllowed.contains(con.getContentType().replace("\"", ""))) {
InputStream is = con.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream((int) con.getContentLengthLong());
int i;
while((i = is.read()) != -1)
baos.write(i);
return new ByteArrayInputStream(baos.toByteArray());
}
return null;
}
private String generateFileName(String url) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(url.getBytes());
byte array[] = messageDigest.digest();
String name = "";
for(int i = 0; i < array.length; i++)
name += array[i]+"";
return name;
}
}