diff --git a/Mage.Updater/pom.xml b/Mage.Updater/pom.xml
new file mode 100644
index 0000000000..d19343091f
--- /dev/null
+++ b/Mage.Updater/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ mage-root
+ org.mage
+ 0.8.5
+
+ 4.0.0
+
+ org.mage
+ mage-updater
+ Mage Updater
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ com.magefree.update.Main
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java b/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java
new file mode 100644
index 0000000000..f208807ee0
--- /dev/null
+++ b/Mage.Updater/src/main/java/com/magefree/update/ChechsumHelper.java
@@ -0,0 +1,37 @@
+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;
+ }
+}
diff --git a/Mage.Updater/src/main/java/com/magefree/update/Main.java b/Mage.Updater/src/main/java/com/magefree/update/Main.java
new file mode 100644
index 0000000000..24d4523859
--- /dev/null
+++ b/Mage.Updater/src/main/java/com/magefree/update/Main.java
@@ -0,0 +1,147 @@
+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 local = m.readLocalData();
+ HashMap remote = m.downloadAndParseUpdateData();
+ List downloadList = m.findUpdated(local, remote);
+ downloadList.addAll(m.findNew(local, remote));
+ m.downloadAndUpdate(downloadList);
+ m.removeFiles(m.findRemoved(local, remote));
+ }
+
+ public HashMap readLocalData() throws Exception {
+ HashMap result = new HashMap();
+ for (File f : findJars()) {
+ result.put(f.getPath().replaceAll("\\\\", "/"), ChechsumHelper.getSHA1Checksum(f.getPath()));
+ }
+ return result;
+ }
+
+ public List findJars() throws Exception {
+ ArrayList result = new ArrayList();
+ 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 findJarsInDir(String dir) {
+ ArrayList result = new ArrayList();
+ 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 downloadAndParseUpdateData() throws Exception {
+ HashMap result = new HashMap();
+ 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 findUpdated(HashMap local, HashMap remote) {
+ ArrayList result = new ArrayList();
+ 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 findNew(HashMap local, HashMap remote) {
+ ArrayList result = new ArrayList();
+ for (String remoteFile : remote.keySet()) {
+ if (!local.containsKey(remoteFile)) {
+ System.out.println("new jar found - " + remoteFile);
+ result.add(remoteFile);
+ }
+ }
+ return result;
+ }
+
+ public List findRemoved(HashMap local, HashMap remote) {
+ ArrayList result = new ArrayList();
+ 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 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 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");
+ }
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 84a1404045..79ff3d9a3d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,7 +32,7 @@
Mage.Server.Plugins
Mage.Server.Console
Mage.Tests
- mage.updater.client
+ Mage.Updater