diff --git a/pom.xml b/pom.xml
index d9e89d3..2b1aefa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,16 +26,6 @@
config
1.4.0
-
- commons-io
- commons-io
- 2.6
-
-
- commons-codec
- commons-codec
- 1.14
-
com.formdev
flatlaf
@@ -51,31 +41,38 @@
ini4j
0.5.4
-
- com.github.mfornos
- humanize-slim
- 1.2.2
-
com.github.Gurkengewuerz
zsyncer
locale_fix-2f7565d392-1
-
- com.squareup.okhttp3
- okhttp
- 4.4.1
-
+
+
+ src/main/resources
+ true
+
+ **/project.properties
+
+
+
+
+ src/main/resources
+ false
+
+ **/*
+
+
+
maven-compiler-plugin
3.5.1
-
- 1.8
+
+ 12
diff --git a/src/main/java/de/mc8051/arma3launcher/ArmA3Launcher.java b/src/main/java/de/mc8051/arma3launcher/ArmA3Launcher.java
index b0b327f..be6430d 100644
--- a/src/main/java/de/mc8051/arma3launcher/ArmA3Launcher.java
+++ b/src/main/java/de/mc8051/arma3launcher/ArmA3Launcher.java
@@ -13,6 +13,7 @@ import java.awt.event.WindowEvent;
import java.io.File;
import java.util.Arrays;
import java.util.Locale;
+import java.util.Properties;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -35,7 +36,11 @@ public class ArmA3Launcher {
config = ConfigFactory.load("arma3launcher");
CLIENT_NAME = config.getString("name");
- VERSION = config.getString("version");
+
+ final Properties properties = new Properties();
+ properties.load(ArmA3Launcher.class.getClassLoader().getResourceAsStream("project.properties"));
+
+ VERSION = properties.getProperty("version");
APPLICATION_PATH = getAppData() + CLIENT_NAME;
diff --git a/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form b/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form
index d061ed7..25f042d 100644
--- a/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form
+++ b/src/main/java/de/mc8051/arma3launcher/LauncherGUI.form
@@ -8,7 +8,7 @@
-
+
@@ -16,7 +16,7 @@
-
+
diff --git a/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java b/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java
index 06b2768..18fe726 100644
--- a/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java
+++ b/src/main/java/de/mc8051/arma3launcher/LauncherGUI.java
@@ -18,8 +18,8 @@ import de.mc8051.arma3launcher.repo.SyncList;
import de.mc8051.arma3launcher.repo.Syncer;
import de.mc8051.arma3launcher.steam.SteamTimer;
import de.mc8051.arma3launcher.utils.Callback;
+import de.mc8051.arma3launcher.utils.Humanize;
import de.mc8051.arma3launcher.utils.LangUtils;
-import humanize.Humanize;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
@@ -134,6 +134,7 @@ public class LauncherGUI implements Observer {
private JLabel syncFileCountLabel;
public JLabel syncDownloadedLabel;
public JLabel syncDownloadSpeedLabel;
+ private JSplitPane splitView;
private JCheckBoxTree repoTree;
private FileChecker fileChecker;
@@ -317,6 +318,7 @@ public class LauncherGUI implements Observer {
syncDownloadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
+ if(lastSynclist == null) return;
new Thread(() -> syncer.sync(lastSynclist.clone())).start();
}
});
@@ -365,6 +367,7 @@ public class LauncherGUI implements Observer {
armaStatus.setText(LangUtils.getInstance().getString("closed"));
armaStatus.setForeground(Color.red);
}
+ splitView.setDividerLocation(-1);
}
public void techCheck() {
@@ -629,6 +632,7 @@ public class LauncherGUI implements Observer {
// Select Mod if in modset.Mods
// Custom Checkbox Render
// Wenn modset.type == Server alle Checkboxen deaktivieren!
+ // Show hint that server modsets cant be edited
}
public void updateRepoTree() {
diff --git a/src/main/java/de/mc8051/arma3launcher/objects/ModFile.java b/src/main/java/de/mc8051/arma3launcher/objects/ModFile.java
index c5b357c..43338f5 100644
--- a/src/main/java/de/mc8051/arma3launcher/objects/ModFile.java
+++ b/src/main/java/de/mc8051/arma3launcher/objects/ModFile.java
@@ -1,15 +1,15 @@
package de.mc8051.arma3launcher.objects;
import de.mc8051.arma3launcher.ArmA3Launcher;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.io.FilenameUtils;
+import de.mc8051.arma3launcher.utils.FileUtils;
import java.io.File;
-import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Paths;
+import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.logging.Level;
@@ -24,7 +24,6 @@ public class ModFile implements AbstractMod {
private long size;
private String folder;
private String filename;
- private String extension;
private String modfileString;
private String sha1sum;
private String parent;
@@ -36,9 +35,7 @@ public class ModFile implements AbstractMod {
// size: size as in metafile on server
this.f = f;
this.size = size;
- this.folder = FilenameUtils.getPath(modfile);
- this.filename = FilenameUtils.getBaseName(modfile);
- this.extension = FilenameUtils.getExtension(modfile);
+ this.filename = Paths.get(f.getPath()).getFileName().toString();
this.modfileString = modfile;
this.sha1sum = sha1sum.toLowerCase();
this.parent = parent;
@@ -52,18 +49,6 @@ public class ModFile implements AbstractMod {
return size;
}
- public String getReletaivePath() {
- return folder;
- }
-
- public String getFilename() {
- return filename;
- }
-
- public String getExtension() {
- return extension;
- }
-
public ArrayList getPath() {
ArrayList list = new ArrayList<>();
File relativePath = new File("./" + modfileString);
@@ -87,7 +72,7 @@ public class ModFile implements AbstractMod {
}
public String getName() {
- return filename + (extension.equals("") ? "" : "." + extension);
+ return filename;
}
public String getModfileString() {
@@ -105,9 +90,9 @@ public class ModFile implements AbstractMod {
public String getLocalGeneratedSHA1Sum() {
try {
if (localGeneratedSHA1sum.isEmpty() && exists()) {
- localGeneratedSHA1sum = DigestUtils.sha1Hex(new FileInputStream(f.getAbsolutePath())).toLowerCase();
+ localGeneratedSHA1sum = FileUtils.sha1Hex(f);
}
- } catch (IOException e) {
+ } catch (IOException | NoSuchAlgorithmException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
}
return localGeneratedSHA1sum;
diff --git a/src/main/java/de/mc8051/arma3launcher/repo/RepositoryManger.java b/src/main/java/de/mc8051/arma3launcher/repo/RepositoryManger.java
index 51f7240..df3a077 100644
--- a/src/main/java/de/mc8051/arma3launcher/repo/RepositoryManger.java
+++ b/src/main/java/de/mc8051/arma3launcher/repo/RepositoryManger.java
@@ -9,14 +9,17 @@ import de.mc8051.arma3launcher.objects.ModFile;
import de.mc8051.arma3launcher.objects.Modset;
import de.mc8051.arma3launcher.objects.Server;
import de.mc8051.arma3launcher.utils.Callback;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -24,6 +27,8 @@ import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
+import static java.time.temporal.ChronoUnit.SECONDS;
+
/**
* Created by gurkengewuerz.de on 24.03.2020.
*/
@@ -36,28 +41,37 @@ public class RepositoryManger implements Observable {
private static HashMap statusMap = new HashMap<>();
private List observerList = new ArrayList<>();
- private OkHttpClient client = new OkHttpClient();
private RepositoryManger() {
statusMap.put(Type.METADATA, DownloadStatus.FINNISHED);
statusMap.put(Type.MODSET, DownloadStatus.FINNISHED);
}
- private void getAsync(String url, Callback.HttpCallback callback) {
+ private void getAsync(String urlS, Callback.HttpCallback callback) {
new Thread(() -> {
try {
- Request request = new Request.Builder()
- .url(url)
+ URI url = new URI(urlS);
+
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(url)
+ .GET()
+ .headers("Content-Type", "text/plain;charset=UTF-8")
+ .timeout(Duration.of(3, SECONDS))
.build();
- Response r = client.newCall(request).execute();
+ HttpResponse response = HttpClient.newBuilder()
+ .followRedirects(HttpClient.Redirect.ALWAYS)
+ .build().send(request, HttpResponse.BodyHandlers.ofString());
+
+ Response r = new Response(response);
+
if (!r.isSuccessful()) {
- Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Cant open " + r.request().url().toString() + " code " + r.code());
+ Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Cant open " + r.request().uri() + " code " + r.getStatusCode());
return;
}
callback.response(r);
- } catch (IOException e) {
+ } catch (IOException | URISyntaxException | InterruptedException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
callback.response(null);
}
@@ -77,7 +91,7 @@ public class RepositoryManger implements Observable {
}
try {
- JSONObject jsonObject = new JSONObject(r.body().string());
+ JSONObject jsonObject = new JSONObject(r.getBody());
if (jsonObject.has("modsets")) {
Modset.MODSET_LIST.clear();
@@ -104,7 +118,7 @@ public class RepositoryManger implements Observable {
statusMap.replace(Type.METADATA, DownloadStatus.FINNISHED);
RepositoryManger.getInstance().notifyObservers(Type.METADATA.toString());
- } catch (IOException | NullPointerException e) {
+ } catch (NullPointerException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
}
}
@@ -126,7 +140,7 @@ public class RepositoryManger implements Observable {
try {
RepositoryManger.MOD_LIST.clear();
RepositoryManger.MOD_LIST_SIZE = 0;
- JSONObject jsonObject = new JSONObject(r.body().string());
+ JSONObject jsonObject = new JSONObject(r.getBody());
String modPath = ArmA3Launcher.user_config.get("client", "modPath");
if(modPath == null) modPath = "";
@@ -170,7 +184,7 @@ public class RepositoryManger implements Observable {
statusMap.replace(Type.MODSET, DownloadStatus.FINNISHED);
RepositoryManger.getInstance().notifyObservers(Type.MODSET.toString());
- } catch (IOException | NullPointerException e) {
+ } catch (NullPointerException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
}
}
diff --git a/src/main/java/de/mc8051/arma3launcher/repo/Response.java b/src/main/java/de/mc8051/arma3launcher/repo/Response.java
new file mode 100644
index 0000000..e45cc3e
--- /dev/null
+++ b/src/main/java/de/mc8051/arma3launcher/repo/Response.java
@@ -0,0 +1,34 @@
+package de.mc8051.arma3launcher.repo;
+
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+/**
+ * Created by gurkengewuerz.de on 27.03.2020.
+ */
+public class Response {
+
+ private int statusCode;
+ private HttpResponse response;
+
+ public Response(HttpResponse response) {
+ this.response = response;
+ statusCode = response.statusCode();
+ }
+
+ public boolean isSuccessful() {
+ return statusCode >= 200 && statusCode <= 299;
+ }
+
+ public HttpRequest request() {
+ return response.request();
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public String getBody() {
+ return response.body();
+ }
+}
diff --git a/src/main/java/de/mc8051/arma3launcher/repo/Syncer.java b/src/main/java/de/mc8051/arma3launcher/repo/Syncer.java
index 59a09db..ec66c6a 100644
--- a/src/main/java/de/mc8051/arma3launcher/repo/Syncer.java
+++ b/src/main/java/de/mc8051/arma3launcher/repo/Syncer.java
@@ -9,7 +9,7 @@ import de.mc8051.arma3launcher.interfaces.Observable;
import de.mc8051.arma3launcher.interfaces.Observer;
import de.mc8051.arma3launcher.objects.AbstractMod;
import de.mc8051.arma3launcher.objects.ModFile;
-import humanize.Humanize;
+import de.mc8051.arma3launcher.utils.Humanize;
import javax.swing.*;
import java.io.IOException;
diff --git a/src/main/java/de/mc8051/arma3launcher/utils/Callback.java b/src/main/java/de/mc8051/arma3launcher/utils/Callback.java
index fd47ea5..868c297 100644
--- a/src/main/java/de/mc8051/arma3launcher/utils/Callback.java
+++ b/src/main/java/de/mc8051/arma3launcher/utils/Callback.java
@@ -1,6 +1,6 @@
package de.mc8051.arma3launcher.utils;
-import okhttp3.Response;
+import de.mc8051.arma3launcher.repo.Response;
import java.io.File;
diff --git a/src/main/java/de/mc8051/arma3launcher/utils/FileUtils.java b/src/main/java/de/mc8051/arma3launcher/utils/FileUtils.java
new file mode 100644
index 0000000..14fe4d4
--- /dev/null
+++ b/src/main/java/de/mc8051/arma3launcher/utils/FileUtils.java
@@ -0,0 +1,68 @@
+package de.mc8051.arma3launcher.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Created by gurkengewuerz.de on 27.03.2020.
+ */
+public class FileUtils {
+
+ public static final Charset DEFAULT_CHARSET;
+ private static final char[] DIGITS_LOWER;
+ private static final char[] DIGITS_UPPER;
+
+ public static String sha1Hex(File f) throws IOException, NoSuchAlgorithmException {
+ return encodeHexString(sha1(f));
+ }
+
+ public static byte[] sha1(File file) throws IOException, NoSuchAlgorithmException {
+ MessageDigest digest = MessageDigest.getInstance("SHA-1");
+ InputStream fis = new FileInputStream(file);
+ int n = 0;
+ byte[] buffer = new byte[8192];
+ while (n != -1) {
+ n = fis.read(buffer);
+ if (n > 0) {
+ digest.update(buffer, 0, n);
+ }
+ }
+ return digest.digest();
+ }
+
+ public static String encodeHexString(byte[] data) {
+ return new String(encodeHex(data));
+ }
+
+ public static char[] encodeHex(byte[] data) {
+ return encodeHex(data, true);
+ }
+ public static char[] encodeHex(byte[] data, boolean toLowerCase) {
+ return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+ }
+
+ protected static char[] encodeHex(byte[] data, char[] toDigits) {
+ int l = data.length;
+ char[] out = new char[l << 1];
+ int i = 0;
+
+ for(int var5 = 0; i < l; ++i) {
+ out[var5++] = toDigits[(240 & data[i]) >>> 4];
+ out[var5++] = toDigits[15 & data[i]];
+ }
+
+ return out;
+ }
+
+ static {
+ DEFAULT_CHARSET = StandardCharsets.UTF_8;
+ DIGITS_LOWER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+ DIGITS_UPPER = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+ }
+}
diff --git a/src/main/java/de/mc8051/arma3launcher/utils/Humanize.java b/src/main/java/de/mc8051/arma3launcher/utils/Humanize.java
new file mode 100644
index 0000000..8959561
--- /dev/null
+++ b/src/main/java/de/mc8051/arma3launcher/utils/Humanize.java
@@ -0,0 +1,38 @@
+package de.mc8051.arma3launcher.utils;
+
+import java.text.DecimalFormat;
+
+/**
+ * Created by gurkengewuerz.de on 27.03.2020.
+ */
+public class Humanize {
+
+ private static final long K = 1024;
+ private static final long M = K * K;
+ private static final long G = M * K;
+ private static final long T = G * K;
+
+ public static String binaryPrefix(final long value){
+ final long[] dividers = new long[] { T, G, M, K, 1 };
+ final String[] units = new String[] { "TB", "GB", "MB", "KB", "B" };
+ if(value < 1)
+ throw new IllegalArgumentException("Invalid file size: " + value);
+ String result = null;
+ for(int i = 0; i < dividers.length; i++){
+ final long divider = dividers[i];
+ if(value >= divider){
+ result = format(value, divider, units[i]);
+ break;
+ }
+ }
+ return result;
+ }
+
+ private static String format(final long value,
+ final long divider,
+ final String unit){
+ final double result =
+ divider > 1 ? (double) value / (double) divider : (double) value;
+ return new DecimalFormat("#,##0.#").format(result) + " " + unit;
+ }
+}
diff --git a/src/main/resources/arma3launcher.json b/src/main/resources/arma3launcher.json
index e208928..1492c4f 100644
--- a/src/main/resources/arma3launcher.json
+++ b/src/main/resources/arma3launcher.json
@@ -1,5 +1,4 @@
{
- "version": "0.1.1",
"name": "TheTown Client",
"title": "Welcome! :P",
"subtitle": "${name} v${version}",
diff --git a/src/main/resources/project.properties b/src/main/resources/project.properties
new file mode 100644
index 0000000..a2273e2
--- /dev/null
+++ b/src/main/resources/project.properties
@@ -0,0 +1,2 @@
+version=${project.version}
+artifactId=${project.artifactId}
\ No newline at end of file