mirror of
https://github.com/magefree/mage.git
synced 2025-12-21 11:02:00 -08:00
[Updater] Added support for non-jar files. Some refactoring. Java-doc. Logging.
This commit is contained in:
parent
d4eee79ec1
commit
eae50ffd83
8 changed files with 331 additions and 378 deletions
|
|
@ -21,7 +21,7 @@
|
||||||
<configuration>
|
<configuration>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>com.magefree.update.Main</mainClass>
|
<mainClass>com.magefree.update.Updater</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
|
||||||
|
|
@ -4,23 +4,35 @@ import java.io.FileInputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Loki
|
||||||
|
*/
|
||||||
public class ChechsumHelper {
|
public class ChechsumHelper {
|
||||||
public static byte[] createChecksum(String filename) throws
|
|
||||||
Exception
|
|
||||||
{
|
|
||||||
InputStream fis = new FileInputStream(filename);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
public static byte[] createChecksum(String filename) throws Exception {
|
||||||
MessageDigest complete = MessageDigest.getInstance("SHA1");
|
InputStream fis = null;
|
||||||
int numRead;
|
MessageDigest complete;
|
||||||
do {
|
|
||||||
numRead = fis.read(buffer);
|
try {
|
||||||
if (numRead > 0) {
|
fis = new FileInputStream(filename);
|
||||||
complete.update(buffer, 0, numRead);
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
complete = MessageDigest.getInstance("SHA1");
|
||||||
|
|
||||||
|
int numRead;
|
||||||
|
do {
|
||||||
|
numRead = fis.read(buffer);
|
||||||
|
if (numRead > 0) {
|
||||||
|
complete.update(buffer, 0, numRead);
|
||||||
|
}
|
||||||
|
} while (numRead != -1);
|
||||||
|
|
||||||
|
return complete.digest();
|
||||||
|
} finally {
|
||||||
|
if (fis != null) {
|
||||||
|
fis.close();
|
||||||
}
|
}
|
||||||
} while (numRead != -1);
|
}
|
||||||
fis.close();
|
|
||||||
return complete.digest();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// see this How-to for a faster way to convert
|
// see this How-to for a faster way to convert
|
||||||
|
|
@ -28,9 +40,9 @@ public class ChechsumHelper {
|
||||||
public static String getSHA1Checksum(String filename) throws Exception {
|
public static String getSHA1Checksum(String filename) throws Exception {
|
||||||
byte[] b = createChecksum(filename);
|
byte[] b = createChecksum(filename);
|
||||||
String result = "";
|
String result = "";
|
||||||
for (int i=0; i < b.length; i++) {
|
for (int i = 0; i < b.length; i++) {
|
||||||
result +=
|
result +=
|
||||||
Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
|
Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
package com.magefree.update;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for file operations.
|
||||||
|
*
|
||||||
|
* @author noxx
|
||||||
|
*/
|
||||||
|
public class FileHelper {
|
||||||
|
|
||||||
|
private FileHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets .jar files from specified folder.
|
||||||
|
*
|
||||||
|
* @param dir Folder to scan for rile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<File> findJarsInDir(String dir) {
|
||||||
|
ArrayList<File> result = new ArrayList<File>();
|
||||||
|
File directory = new File(dir);
|
||||||
|
if (directory.exists() && directory.isDirectory()) {
|
||||||
|
for (File jar : directory.listFiles(jarFileFilter)) {
|
||||||
|
result.add(jar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets non-dir files from specified folder.
|
||||||
|
*
|
||||||
|
* @param dir Folder to scan for rile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static List<File> findAllFilesInDir(String dir) {
|
||||||
|
ArrayList<File> result = new ArrayList<File>();
|
||||||
|
File directory = new File(dir);
|
||||||
|
if (directory.exists() && directory.isDirectory()) {
|
||||||
|
for (File jar : directory.listFiles(anyFileFilter)) {
|
||||||
|
result.add(jar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all files from the list.
|
||||||
|
*
|
||||||
|
* @param files
|
||||||
|
*/
|
||||||
|
public static void removeFiles(List<String> files) {
|
||||||
|
for (String filename : files) {
|
||||||
|
File f = new File(filename);
|
||||||
|
if (f.exists()) {
|
||||||
|
f.delete();
|
||||||
|
System.out.println("File has been deleted: " + filename);
|
||||||
|
} else {
|
||||||
|
System.out.println("ERROR. Couldn't find file to delete: " + filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters out dirs.
|
||||||
|
*/
|
||||||
|
private static final FilenameFilter anyFileFilter = new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return dir.isFile();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters out jars.
|
||||||
|
*/
|
||||||
|
private static final FilenameFilter jarFileFilter = new FilenameFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return name.endsWith(".jar");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
package com.magefree.update;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
private final static String URL_PREFIX = "http://download.magefree.com/update/";
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
Main m = new Main();
|
|
||||||
HashMap<String, String> local = m.readLocalData();
|
|
||||||
HashMap<String, String> remote = m.downloadAndParseUpdateData();
|
|
||||||
List<String> downloadList = m.findUpdated(local, remote);
|
|
||||||
downloadList.addAll(m.findNew(local, remote));
|
|
||||||
m.downloadAndUpdate(downloadList);
|
|
||||||
m.removeFiles(m.findRemoved(local, remote));
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> readLocalData() throws Exception {
|
|
||||||
HashMap<String, String> result = new HashMap<String, String>();
|
|
||||||
for (File f : findJars()) {
|
|
||||||
result.put(f.getPath().replaceAll("\\\\", "/"), ChechsumHelper.getSHA1Checksum(f.getPath()));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<File> findJars() throws Exception {
|
|
||||||
ArrayList<File> result = new ArrayList<File>();
|
|
||||||
result.addAll(findJarsInDir("mage-client/lib"));
|
|
||||||
result.addAll(findJarsInDir("mage-client/plugins"));
|
|
||||||
result.addAll(findJarsInDir("mage-server/lib"));
|
|
||||||
result.addAll(findJarsInDir("mage-server/plugins"));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<File> findJarsInDir(String dir) {
|
|
||||||
ArrayList<File> result = new ArrayList<File>();
|
|
||||||
File directory = new File(dir);
|
|
||||||
if (directory.exists() && directory.isDirectory()) {
|
|
||||||
for (File jar : directory.listFiles(new FilenameFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(File dir, String name) {
|
|
||||||
return name.endsWith(".jar");
|
|
||||||
}
|
|
||||||
})) {
|
|
||||||
result.add(jar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> downloadAndParseUpdateData() throws Exception {
|
|
||||||
HashMap<String, String> result = new HashMap<String, String>();
|
|
||||||
URL url = new URL(URL_PREFIX + "update-data.txt");
|
|
||||||
URLConnection urlConnection = url.openConnection();
|
|
||||||
urlConnection.connect();
|
|
||||||
Scanner scanner = new Scanner(urlConnection.getInputStream());
|
|
||||||
while (scanner.hasNextLine()) {
|
|
||||||
String[] lines = scanner.nextLine().split(" ");
|
|
||||||
if (lines.length == 2) {
|
|
||||||
result.put(lines[1], lines[0]);
|
|
||||||
System.out.println("jar " + lines[1] + ", checksum " + lines[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findUpdated(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String remoteFile : remote.keySet()) {
|
|
||||||
if (local.containsKey(remoteFile)) {
|
|
||||||
if (!local.get(remoteFile).equals(remote.get(remoteFile))) {
|
|
||||||
System.out.println("jar need to be updated - " + remoteFile);
|
|
||||||
result.add(remoteFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findNew(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String remoteFile : remote.keySet()) {
|
|
||||||
if (!local.containsKey(remoteFile)) {
|
|
||||||
System.out.println("new jar found - " + remoteFile);
|
|
||||||
result.add(remoteFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findRemoved(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String localFile : local.keySet()) {
|
|
||||||
if (!remote.containsKey(localFile)) {
|
|
||||||
System.out.println("deleted jar found - " + localFile);
|
|
||||||
result.add(localFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void downloadAndUpdate(List<String> downloadList) throws IOException {
|
|
||||||
for (String filename : downloadList) {
|
|
||||||
URL url = new URL(URL_PREFIX + filename);
|
|
||||||
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
|
||||||
urlConnection.connect();
|
|
||||||
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
|
||||||
System.out.println("downloading " + filename);
|
|
||||||
try {
|
|
||||||
InputStream in = urlConnection.getInputStream();
|
|
||||||
File f = new File(filename);
|
|
||||||
if (!f.exists())
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
FileOutputStream out = new FileOutputStream(filename);
|
|
||||||
byte[] buf = new byte[4 * 1024];
|
|
||||||
int bytesRead;
|
|
||||||
while ((bytesRead = in.read(buf)) != -1) {
|
|
||||||
out.write(buf, 0, bytesRead);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("i/o exception - " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
System.out.println(filename + " error status : " + urlConnection.getResponseMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFiles(List<String> files) {
|
|
||||||
for (String filename : files) {
|
|
||||||
File f = new File(filename);
|
|
||||||
if (f.exists()) {
|
|
||||||
f.delete();
|
|
||||||
} else {
|
|
||||||
System.out.println("ERROR. File was found but currently not found");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
214
Mage.Updater/src/main/java/com/magefree/update/Updater.java
Normal file
214
Mage.Updater/src/main/java/com/magefree/update/Updater.java
Normal file
|
|
@ -0,0 +1,214 @@
|
||||||
|
package com.magefree.update;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLConnection;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mage Updater for updating Mage based on metadata from remote server.
|
||||||
|
*
|
||||||
|
* @author Loki, noxx
|
||||||
|
*/
|
||||||
|
public class Updater {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL to get metadata and files from.
|
||||||
|
*/
|
||||||
|
private final static String URL_PREFIX = "http://download.magefree.com/update/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main. Application Entry Point.
|
||||||
|
*
|
||||||
|
* @param args No args are used.
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
Updater m = new Updater();
|
||||||
|
|
||||||
|
// check files on local machine
|
||||||
|
HashMap<String, String> local = m.readLocalData();
|
||||||
|
|
||||||
|
// request information for files on update server
|
||||||
|
HashMap<String, String> remote = m.downloadAndParseUpdateData();
|
||||||
|
|
||||||
|
// compare to find updated files
|
||||||
|
List<String> downloadList = m.findUpdated(local, remote);
|
||||||
|
downloadList.addAll(m.findNew(local, remote));
|
||||||
|
|
||||||
|
// download and replace
|
||||||
|
m.downloadAndUpdate(downloadList);
|
||||||
|
|
||||||
|
// remove odd files
|
||||||
|
m.removeFiles(m.findRemoved(local, remote));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets lists of files on local machine.
|
||||||
|
* For each such file an map's entry is created with path and checksum.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public HashMap<String, String> readLocalData() throws Exception {
|
||||||
|
HashMap<String, String> result = new HashMap<String, String>();
|
||||||
|
for (File f : findFiles()) {
|
||||||
|
result.put(f.getPath().replaceAll("\\\\", "/"), ChechsumHelper.getSHA1Checksum(f.getPath()));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get required files.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public List<File> findFiles() throws Exception {
|
||||||
|
ArrayList<File> result = new ArrayList<File>();
|
||||||
|
result.addAll(FileHelper.findAllFilesInDir("mage-client/lib"));
|
||||||
|
result.addAll(FileHelper.findAllFilesInDir("mage-client/plugins"));
|
||||||
|
result.addAll(FileHelper.findAllFilesInDir("mage-server/lib"));
|
||||||
|
result.addAll(FileHelper.findAllFilesInDir("mage-server/plugins"));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads metadata from remote server getting checksums for files.
|
||||||
|
* This information will be used to find out what files should be downloaded and replaced or removed locally.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public HashMap<String, String> downloadAndParseUpdateData() throws Exception {
|
||||||
|
HashMap<String, String> result = new HashMap<String, String>();
|
||||||
|
URL url = new URL(URL_PREFIX + "update-data.txt");
|
||||||
|
URLConnection urlConnection = url.openConnection();
|
||||||
|
urlConnection.connect();
|
||||||
|
Scanner scanner = new Scanner(urlConnection.getInputStream());
|
||||||
|
while (scanner.hasNextLine()) {
|
||||||
|
String[] lines = scanner.nextLine().split(" ");
|
||||||
|
if (lines.length == 2) {
|
||||||
|
result.put(lines[1], lines[0]);
|
||||||
|
//System.out.println("jar " + lines[1] + ", checksum " + lines[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the list of files that have been updated and should be replaced.
|
||||||
|
* The fact of being changed is determined based on checksum received from remote server.
|
||||||
|
*
|
||||||
|
* @param local List of local files with check sums to be compared with remote.
|
||||||
|
* @param remote List of remove files with check sum to be compared with local.
|
||||||
|
*
|
||||||
|
* @return List of files to be replaced with newer versions.
|
||||||
|
*/
|
||||||
|
public List<String> findUpdated(HashMap<String, String> local, HashMap<String, String> remote) {
|
||||||
|
ArrayList<String> result = new ArrayList<String>();
|
||||||
|
for (String remoteFile : remote.keySet()) {
|
||||||
|
if (local.containsKey(remoteFile)) {
|
||||||
|
if (!local.get(remoteFile).equals(remote.get(remoteFile))) {
|
||||||
|
//System.out.println("jar need to be updated - " + remoteFile);
|
||||||
|
result.add(remoteFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> findNew(HashMap<String, String> local, HashMap<String, String> remote) {
|
||||||
|
ArrayList<String> result = new ArrayList<String>();
|
||||||
|
for (String remoteFile : remote.keySet()) {
|
||||||
|
if (!local.containsKey(remoteFile)) {
|
||||||
|
//System.out.println("new jar found - " + remoteFile);
|
||||||
|
result.add(remoteFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds files that should be removed.
|
||||||
|
*
|
||||||
|
* @param local List of local files with check sums to be compared with remote.
|
||||||
|
* @param remote List of remove files with check sum to be compared with local.
|
||||||
|
*
|
||||||
|
* @return List of files to be removed.
|
||||||
|
*/
|
||||||
|
public List<String> findRemoved(HashMap<String, String> local, HashMap<String, String> remote) {
|
||||||
|
ArrayList<String> result = new ArrayList<String>();
|
||||||
|
for (String localFile : local.keySet()) {
|
||||||
|
if (!remote.containsKey(localFile)) {
|
||||||
|
//System.out.println("deleted jar found - " + localFile);
|
||||||
|
result.add(localFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads files and updated them.
|
||||||
|
*
|
||||||
|
* @param downloadList
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void downloadAndUpdate(List<String> downloadList) throws IOException {
|
||||||
|
for (String filename : downloadList) {
|
||||||
|
URL url = new URL(URL_PREFIX + filename);
|
||||||
|
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
||||||
|
urlConnection.connect();
|
||||||
|
|
||||||
|
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
||||||
|
downloadFile(filename, urlConnection);
|
||||||
|
} else {
|
||||||
|
System.out.println(filename + " error status : " + urlConnection.getResponseMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Downloads specified file.
|
||||||
|
*
|
||||||
|
* @param filename
|
||||||
|
* @param urlConnection
|
||||||
|
*/
|
||||||
|
private void downloadFile(String filename, HttpURLConnection urlConnection) {
|
||||||
|
System.out.println("Downloading " + filename);
|
||||||
|
try {
|
||||||
|
InputStream in = urlConnection.getInputStream();
|
||||||
|
File f = new File(filename);
|
||||||
|
if (!f.exists()) {
|
||||||
|
f.getParentFile().mkdirs();
|
||||||
|
System.out.println("Directories have been created: " + f.getParentFile().getPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
FileOutputStream out = new FileOutputStream(filename);
|
||||||
|
byte[] buf = new byte[4 * 1024];
|
||||||
|
int bytesRead;
|
||||||
|
|
||||||
|
while ((bytesRead = in.read(buf)) != -1) {
|
||||||
|
out.write(buf, 0, bytesRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("File has been updated: " + filename);
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("i/o exception - " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes files from the list.
|
||||||
|
*
|
||||||
|
* @param files
|
||||||
|
*/
|
||||||
|
public void removeFiles(List<String> files) {
|
||||||
|
FileHelper.removeFiles(files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
<?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">
|
|
||||||
<parent>
|
|
||||||
<artifactId>mage-root</artifactId>
|
|
||||||
<groupId>org.mage</groupId>
|
|
||||||
<version>0.8.5</version>
|
|
||||||
</parent>
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
|
|
||||||
<name>Mage Client Updater</name>
|
|
||||||
<artifactId>mage-updater-client</artifactId>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
|
||||||
<configuration>
|
|
||||||
<archive>
|
|
||||||
<manifest>
|
|
||||||
<mainClass>com.magefree.update.Main</mainClass>
|
|
||||||
</manifest>
|
|
||||||
</archive>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
package com.magefree.update;
|
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
|
|
||||||
public class ChechsumHelper {
|
|
||||||
public static byte[] createChecksum(String filename) throws
|
|
||||||
Exception
|
|
||||||
{
|
|
||||||
InputStream fis = new FileInputStream(filename);
|
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
|
||||||
MessageDigest complete = MessageDigest.getInstance("SHA1");
|
|
||||||
int numRead;
|
|
||||||
do {
|
|
||||||
numRead = fis.read(buffer);
|
|
||||||
if (numRead > 0) {
|
|
||||||
complete.update(buffer, 0, numRead);
|
|
||||||
}
|
|
||||||
} while (numRead != -1);
|
|
||||||
fis.close();
|
|
||||||
return complete.digest();
|
|
||||||
}
|
|
||||||
|
|
||||||
// see this How-to for a faster way to convert
|
|
||||||
// a byte array to a HEX string
|
|
||||||
public static String getSHA1Checksum(String filename) throws Exception {
|
|
||||||
byte[] b = createChecksum(filename);
|
|
||||||
String result = "";
|
|
||||||
for (int i=0; i < b.length; i++) {
|
|
||||||
result +=
|
|
||||||
Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
package com.magefree.update;
|
|
||||||
|
|
||||||
import java.io.*;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.net.URLConnection;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
private final static String URL_PREFIX = "http://download.magefree.com/update/";
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
Main m = new Main();
|
|
||||||
HashMap<String, String> local = m.readLocalData();
|
|
||||||
HashMap<String, String> remote = m.downloadAndParseUpdateData();
|
|
||||||
List<String> downloadList = m.findUpdated(local, remote);
|
|
||||||
downloadList.addAll(m.findNew(local, remote));
|
|
||||||
m.downloadAndUpdate(downloadList);
|
|
||||||
m.removeFiles(m.findRemoved(local, remote));
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> readLocalData() throws Exception {
|
|
||||||
HashMap<String, String> result = new HashMap<String, String>();
|
|
||||||
for (File f : findJars()) {
|
|
||||||
result.put(f.getPath().replaceAll("\\\\", "/"), ChechsumHelper.getSHA1Checksum(f.getPath()));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<File> findJars() throws Exception {
|
|
||||||
ArrayList<File> result = new ArrayList<File>();
|
|
||||||
result.addAll(findJarsInDir("mage-client/lib"));
|
|
||||||
result.addAll(findJarsInDir("mage-client/plugins"));
|
|
||||||
result.addAll(findJarsInDir("mage-server/lib"));
|
|
||||||
result.addAll(findJarsInDir("mage-server/plugins"));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<File> findJarsInDir(String dir) {
|
|
||||||
ArrayList<File> result = new ArrayList<File>();
|
|
||||||
File directory = new File(dir);
|
|
||||||
if (directory.exists() && directory.isDirectory()) {
|
|
||||||
for (File jar : directory.listFiles(new FilenameFilter() {
|
|
||||||
@Override
|
|
||||||
public boolean accept(File dir, String name) {
|
|
||||||
return name.endsWith(".jar");
|
|
||||||
}
|
|
||||||
})) {
|
|
||||||
result.add(jar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, String> downloadAndParseUpdateData() throws Exception {
|
|
||||||
HashMap<String, String> result = new HashMap<String, String>();
|
|
||||||
URL url = new URL(URL_PREFIX + "update-data.txt");
|
|
||||||
URLConnection urlConnection = url.openConnection();
|
|
||||||
urlConnection.connect();
|
|
||||||
Scanner scanner = new Scanner(urlConnection.getInputStream());
|
|
||||||
while (scanner.hasNextLine()) {
|
|
||||||
String[] lines = scanner.nextLine().split(" ");
|
|
||||||
if (lines.length == 2) {
|
|
||||||
result.put(lines[1], lines[0]);
|
|
||||||
System.out.println("jar " + lines[1] + ", checksum " + lines[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findUpdated(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String remoteFile : remote.keySet()) {
|
|
||||||
if (local.containsKey(remoteFile)) {
|
|
||||||
if (!local.get(remoteFile).equals(remote.get(remoteFile))) {
|
|
||||||
System.out.println("jar need to be updated - " + remoteFile);
|
|
||||||
result.add(remoteFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findNew(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String remoteFile : remote.keySet()) {
|
|
||||||
if (!local.containsKey(remoteFile)) {
|
|
||||||
System.out.println("new jar found - " + remoteFile);
|
|
||||||
result.add(remoteFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> findRemoved(HashMap<String, String> local, HashMap<String, String> remote) {
|
|
||||||
ArrayList<String> result = new ArrayList<String>();
|
|
||||||
for (String localFile : local.keySet()) {
|
|
||||||
if (!remote.containsKey(localFile)) {
|
|
||||||
System.out.println("deleted jar found - " + localFile);
|
|
||||||
result.add(localFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void downloadAndUpdate(List<String> downloadList) throws IOException {
|
|
||||||
for (String filename : downloadList) {
|
|
||||||
URL url = new URL(URL_PREFIX + filename);
|
|
||||||
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
|
||||||
urlConnection.connect();
|
|
||||||
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
|
||||||
System.out.println("downloading " + filename);
|
|
||||||
try {
|
|
||||||
InputStream in = urlConnection.getInputStream();
|
|
||||||
File f = new File(filename);
|
|
||||||
if (!f.exists())
|
|
||||||
f.getParentFile().mkdirs();
|
|
||||||
FileOutputStream out = new FileOutputStream(filename);
|
|
||||||
byte[] buf = new byte[4 * 1024];
|
|
||||||
int bytesRead;
|
|
||||||
while ((bytesRead = in.read(buf)) != -1) {
|
|
||||||
out.write(buf, 0, bytesRead);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("i/o exception - " + e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
System.out.println(filename + " error status : " + urlConnection.getResponseMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeFiles(List<String> files) {
|
|
||||||
for (String filename : files) {
|
|
||||||
File f = new File(filename);
|
|
||||||
if (f.exists()) {
|
|
||||||
f.delete();
|
|
||||||
} else {
|
|
||||||
System.out.println("ERROR. File was found but currently not found");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue