All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.matrixweb.smaller.internal.Main Maven / Gradle / Ivy

The newest version!
package de.matrixweb.smaller.internal;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.apache.commons.io.IOUtils;

/**
 * @author markusw
 */
public final class Main {

  private Main() {
  }

  /**
   * @param args
   */
  public static void main(final String[] args) {
    try {
      ClassLoader cl = Main.class.getClassLoader();
      final String classpath = System.getProperty("java.class.path");
      if (!classpath.contains(":")) {
        cl = prepareClassPath(classpath);
      }
      Class.forName("de.matrixweb.smaller.internal.Server", true, cl)
          .getMethod("main", String[].class).invoke(null, (Object) args);
    } catch (final IOException e) {
      throw new FatalServerException("Fatal Server Error", e);
    } catch (final IllegalAccessException e) {
      throw new FatalServerException("Fatal Server Error", e);
    } catch (final InvocationTargetException e) {
      throw new FatalServerException("Fatal Server Error", e);
    } catch (final NoSuchMethodException e) {
      throw new FatalServerException("Fatal Server Error", e);
    } catch (final ClassNotFoundException e) {
      throw new FatalServerException("Fatal Server Error", e);
    }
  }

  private static ClassLoader prepareClassPath(final String classpath)
      throws IOException {
    final JarFile jar = new JarFile(classpath);
    try {
      final List urls = copyJarEntries(jar, createTempStorage());
      urls.add(new URL("file:" + classpath));
      return new URLClassLoader(urls.toArray(new URL[urls.size()]), null);
    } finally {
      jar.close();
    }
  }

  private static List copyJarEntries(final JarFile jar, final File temp)
      throws IOException {
    final List urls = new LinkedList();
    final Enumeration e = jar.entries();
    while (e.hasMoreElements()) {
      final JarEntry entry = e.nextElement();
      if (entry.getName().endsWith(".jar")) {
        final File file = copyFile(jar, entry, temp);
        urls.add(new URL("file:" + file.getAbsolutePath()));
      }
    }
    return urls;
  }

  private static File copyFile(final JarFile jar, final JarEntry entry,
      final File temp) throws IOException {
    final File file = new File(temp, entry.getName());
    InputStream is = null;
    try {
      is = jar.getInputStream(entry);
      FileOutputStream os = null;
      try {
        file.getParentFile().mkdirs();
        os = new FileOutputStream(file);
        final byte[] buf = new byte[1024];
        int len = is.read(buf);
        while (len > -1) {
          os.write(buf, 0, len);
          len = is.read(buf);
        }
      } finally {
        IOUtils.closeQuietly(os);
      }
    } finally {
      IOUtils.closeQuietly(is);
    }
    return file;
  }

  private static File createTempStorage() throws IOException {
    final File temp = File.createTempFile("smaller-classpath-", ".dir");
    temp.delete();
    temp.mkdirs();
    temp.deleteOnExit();
    Runtime.getRuntime().addShutdownHook(new Thread() {
      @Override
      public void run() {
        for (final File file : temp.listFiles()) {
          file.delete();
        }
        temp.delete();
      }
    });
    return temp;
  }

  private static class FatalServerException extends RuntimeException {

    private static final long serialVersionUID = 4541747502527240103L;

    /**
     * @param message
     * @param cause
     */
    public FatalServerException(final String message, final Throwable cause) {
      super(message, cause);
    }

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy