Merge branch 'pack-200' of git://github.com/Cosium/getdown

This commit is contained in:
Michael Bayne
2015-08-22 12:21:39 -07:00
3 changed files with 98 additions and 77 deletions
@@ -5,52 +5,6 @@
package com.threerings.getdown.data; package com.threerings.getdown.data;
import java.awt.Color;
import java.awt.Rectangle;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.RandomAccessFile;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.security.AllPermission;
import java.security.CodeSource;
import java.security.GeneralSecurityException;
import java.security.PermissionCollection;
import java.security.Permissions;
import java.security.Signature;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JApplet;
import org.apache.commons.codec.binary.Base64;
import com.samskivert.io.StreamUtil; import com.samskivert.io.StreamUtil;
import com.samskivert.text.MessageUtil; import com.samskivert.text.MessageUtil;
import com.samskivert.util.ArrayUtil; import com.samskivert.util.ArrayUtil;
@@ -58,13 +12,27 @@ import com.samskivert.util.RandomUtil;
import com.samskivert.util.RunAnywhere; import com.samskivert.util.RunAnywhere;
import com.samskivert.util.StringUtil; import com.samskivert.util.StringUtil;
import com.threerings.getdown.launcher.RotatingBackgrounds; import com.threerings.getdown.launcher.RotatingBackgrounds;
import com.threerings.getdown.util.ConfigUtil; import com.threerings.getdown.util.*;
import com.threerings.getdown.util.ConnectionUtil; import org.apache.commons.codec.binary.Base64;
import com.threerings.getdown.util.FileUtil;
import com.threerings.getdown.util.LaunchUtil; import javax.swing.*;
import com.threerings.getdown.util.MetaProgressObserver; import java.awt.*;
import com.threerings.getdown.util.ProgressObserver; import java.io.*;
import com.threerings.getdown.util.VersionUtil; import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLConnection;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.security.*;
import java.security.cert.Certificate;
import java.util.*;
import java.util.List;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.threerings.getdown.Log.log; import static com.threerings.getdown.Log.log;
@@ -626,10 +594,12 @@ public class Application
_txtJvmArgs.clear(); _txtJvmArgs.clear();
// parse our code resources // parse our code resources
if (ConfigUtil.getMultiValue(cdata, "code") == null) { if (ConfigUtil.getMultiValue(cdata, "code") == null
&& ConfigUtil.getMultiValue(cdata, "ucode") == null) {
throw new IOException("m.missing_code"); throw new IOException("m.missing_code");
} }
parseResources(cdata, "code", false, _codes); parseResources(cdata, "code", false, _codes);
parseResources(cdata, "ucode", true, _codes);
// parse our non-code resources // parse our non-code resources
parseResources(cdata, "resource", false, _resources); parseResources(cdata, "resource", false, _resources);
@@ -639,6 +609,7 @@ public class Application
for (String auxgroup : parseList(cdata, "auxgroups")) { for (String auxgroup : parseList(cdata, "auxgroups")) {
ArrayList<Resource> codes = new ArrayList<Resource>(); ArrayList<Resource> codes = new ArrayList<Resource>();
parseResources(cdata, auxgroup + ".code", false, codes); parseResources(cdata, auxgroup + ".code", false, codes);
parseResources(cdata, auxgroup + ".ucode", true, codes);
ArrayList<Resource> rsrcs = new ArrayList<Resource>(); ArrayList<Resource> rsrcs = new ArrayList<Resource>();
parseResources(cdata, auxgroup + ".resource", false, rsrcs); parseResources(cdata, auxgroup + ".resource", false, rsrcs);
parseResources(cdata, auxgroup + ".uresource", true, rsrcs); parseResources(cdata, auxgroup + ".uresource", true, rsrcs);
@@ -925,7 +896,7 @@ public class Application
if (cpbuf.length() > 0) { if (cpbuf.length() > 0) {
cpbuf.append(File.pathSeparator); cpbuf.append(File.pathSeparator);
} }
cpbuf.append(rsrc.getLocal().getAbsolutePath()); cpbuf.append(rsrc.getFinalTarget().getAbsolutePath());
} }
ArrayList<String> args = new ArrayList<String>(); ArrayList<String> args = new ArrayList<String>();
@@ -1030,7 +1001,7 @@ public class Application
ArrayList<URL> jars = new ArrayList<URL>(); ArrayList<URL> jars = new ArrayList<URL>();
for (Resource rsrc : getActiveCodeResources()) { for (Resource rsrc : getActiveCodeResources()) {
try { try {
jars.add(new URL("file", "", rsrc.getLocal().getAbsolutePath())); jars.add(new URL("file", "", rsrc.getFinalTarget().getAbsolutePath()));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(System.err); e.printStackTrace(System.err);
} }
@@ -5,26 +5,23 @@
package com.threerings.getdown.data; package com.threerings.getdown.data;
import com.samskivert.io.StreamUtil;
import com.samskivert.util.FileUtil;
import com.samskivert.util.StringUtil;
import com.threerings.getdown.util.ProgressObserver;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.Comparator;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import com.samskivert.io.StreamUtil;
import com.samskivert.util.FileUtil;
import com.samskivert.util.StringUtil;
import com.threerings.getdown.util.ProgressObserver;
import static com.threerings.getdown.Log.log; import static com.threerings.getdown.Log.log;
/** /**
@@ -41,7 +38,17 @@ public class Resource
_remote = remote; _remote = remote;
_local = local; _local = local;
_marker = new File(_local.getPath() + "v"); _marker = new File(_local.getPath() + "v");
_unpack = unpack; _unpack = unpack;
_isJar = _local.getPath().endsWith(".jar");
_isPacked200Jar = _local.getPath().endsWith(".jar.pack") || _local.getPath().endsWith(".jar.pack.gz");
if(_unpack && _isJar){
_unpacked = _local.getParentFile();
} else if(_unpack && _isPacked200Jar){
String jarExtension = ".jar";
_unpacked = new File(_local.getParent(),
_local.getName().substring(0, _local.getName().lastIndexOf(jarExtension) + jarExtension.length()));
}
} }
/** /**
@@ -60,6 +67,24 @@ public class Resource
return _local; return _local;
} }
/**
* Returns the location of the unpacked resource
*/
public File getUnpacked(){
return _unpacked;
}
/**
* Returns the final target of this resource, wheter it has been unpacked or not
*/
public File getFinalTarget(){
if(shouldUnpack()){
return getUnpacked();
} else{
return getLocal();
}
}
/** /**
* Returns the remote location of this resource. * Returns the remote location of this resource.
*/ */
@@ -132,12 +157,16 @@ public class Resource
public boolean unpack () public boolean unpack ()
{ {
// sanity check // sanity check
if (!_local.getPath().endsWith(".jar")) { if (!_isJar && !_isPacked200Jar) {
log.warning("Requested to unpack non-jar file '" + _local + "'."); log.warning("Requested to unpack non-jar file '" + _local + "'.");
return false; return false;
} }
try { try {
return FileUtil.unpackJar(new JarFile(_local), _local.getParentFile()); if(_isJar){
return FileUtil.unpackJar(new JarFile(_local), _unpacked);
} else{
return com.threerings.getdown.util.FileUtil.unpackPacked200Jar(_local, _unpacked);
}
} catch (IOException ioe) { } catch (IOException ioe) {
log.warning("Failed to create JarFile from '" + _local + "': " + ioe); log.warning("Failed to create JarFile from '" + _local + "': " + ioe);
return false; return false;
@@ -266,8 +295,8 @@ public class Resource
protected String _path; protected String _path;
protected URL _remote; protected URL _remote;
protected File _local, _marker; protected File _local, _marker, _unpacked;
protected boolean _unpack; protected boolean _unpack, _isJar, _isPacked200Jar;
/** Used to sort the entries in a jar file. */ /** Used to sort the entries in a jar file. */
protected static final Comparator<JarEntry> ENTRY_COMP = protected static final Comparator<JarEntry> ENTRY_COMP =
@@ -5,17 +5,14 @@
package com.threerings.getdown.util; package com.threerings.getdown.util;
import java.io.BufferedReader; import com.samskivert.io.StreamUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.jar.JarOutputStream;
import com.samskivert.io.StreamUtil; import java.util.jar.Pack200;
import java.util.zip.GZIPInputStream;
import static com.threerings.getdown.Log.log; import static com.threerings.getdown.Log.log;
@@ -96,4 +93,28 @@ public class FileUtil
} }
return lines; return lines;
} }
public static boolean unpackPacked200Jar(File packedJar, File target){
InputStream packedJarIs = null;
FileOutputStream extractedJarFileOs = null;
JarOutputStream jarOutputStream = null;
try{
extractedJarFileOs = new FileOutputStream(target);
jarOutputStream = new JarOutputStream(extractedJarFileOs);
packedJarIs = new FileInputStream(packedJar);
if(packedJar.getName().endsWith(".gz")){
packedJarIs = new GZIPInputStream(packedJarIs);
}
Pack200.Unpacker unpacker = Pack200.newUnpacker();
unpacker.unpack(packedJarIs, jarOutputStream);
return true;
} catch(IOException e){
log.warning("Failed to unpack packed 200 jar file", "jar", packedJar, "error", e);
return false;
} finally {
StreamUtil.close(jarOutputStream);
StreamUtil.close(extractedJarFileOs);
StreamUtil.close(packedJarIs);
}
}
} }