1.1 --- a/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java Sun May 11 08:10:28 2014 +0200
1.2 +++ b/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java Sun May 11 12:24:19 2014 +0200
1.3 @@ -20,19 +20,14 @@
1.4 import java.io.ByteArrayOutputStream;
1.5 import java.io.IOException;
1.6 import java.io.InputStream;
1.7 -import java.util.Arrays;
1.8 -import java.util.LinkedHashMap;
1.9 -import java.util.Map;
1.10 -import java.util.Objects;
1.11 import java.util.zip.ZipEntry;
1.12 -import org.apidesign.bck2brwsr.emul.zip.ZipInputStream;
1.13
1.14 /**
1.15 *
1.16 * @author Jaroslav Tulach <jtulach@netbeans.org>
1.17 */
1.18 final class ZipArchive {
1.19 - private final Map<String, byte[]> entries = new LinkedHashMap<>();
1.20 + private Entry first;
1.21
1.22 public static ZipArchive createZip(InputStream is) throws IOException {
1.23 ZipArchive a = new ZipArchive();
1.24 @@ -50,45 +45,29 @@
1.25 * Registers entry name and data
1.26 */
1.27 final void register(String entry, InputStream is) throws IOException {
1.28 - ByteArrayOutputStream os = new ByteArrayOutputStream();
1.29 - for (;;) {
1.30 + byte[] arr = new byte[12 * 4096];
1.31 + for (int i = 0; i < arr.length; i++) {
1.32 int ch = is.read();
1.33 if (ch == -1) {
1.34 + byte[] tmp = new byte[i];
1.35 + FastJar.arraycopy(arr, 0, tmp, 0, i);
1.36 + arr = tmp;
1.37 break;
1.38 }
1.39 - os.write(ch);
1.40 + arr[i] = (byte) ch;
1.41 }
1.42 - os.close();
1.43 - entries.put(entry, os.toByteArray());
1.44 + first = new Entry (entry, arr, first);
1.45 }
1.46 -
1.47 - @Override
1.48 - public int hashCode() {
1.49 - return entries.hashCode();
1.50 - }
1.51 -
1.52 - @Override
1.53 - public boolean equals(Object obj) {
1.54 - if (obj == null) {
1.55 - return false;
1.56 - }
1.57 - if (getClass() != obj.getClass()) {
1.58 - return false;
1.59 - }
1.60 - final ZipArchive other = (ZipArchive) obj;
1.61 - if (!Objects.deepEquals(this.entries, other.entries)) {
1.62 - return false;
1.63 - }
1.64 - return true;
1.65 - }
1.66 -
1.67 +
1.68 @Override
1.69 public String toString() {
1.70 StringBuilder sb = new StringBuilder();
1.71 - for (Map.Entry<String, byte[]> en : entries.entrySet()) {
1.72 - String string = en.getKey();
1.73 - byte[] bs = en.getValue();
1.74 - sb.append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
1.75 + Entry e = first;
1.76 + while (e != null) {
1.77 + String string = e.name;
1.78 + byte[] bs = e.arr;
1.79 + sb.append(string).append(" = ").append(toString(bs)).append("\n");
1.80 + e = e.next;
1.81 }
1.82 return sb.toString();
1.83 }
1.84 @@ -97,32 +76,37 @@
1.85 boolean ok = true;
1.86 StringBuilder sb = new StringBuilder();
1.87 sb.append(msg);
1.88 - for (Map.Entry<String, byte[]> en : entries.entrySet()) {
1.89 - String string = en.getKey();
1.90 - byte[] bs = en.getValue();
1.91 - byte[] other = zip.entries.get(string);
1.92 + Entry e = first;
1.93 + while (e != null) {
1.94 + String string = e.name;
1.95 + byte[] bs = e.arr;
1.96 + byte[] other = zip.find(string);
1.97 + e = e.next;
1.98 +
1.99 sb.append("\n");
1.100 if (other == null) {
1.101 - sb.append("EXTRA ").append(string).append(" = ").append(Arrays.toString(bs));
1.102 + sb.append("EXTRA ").append(string).append(" = ").append(toString(bs));
1.103 ok = false;
1.104 continue;
1.105 }
1.106 - if (Arrays.equals(bs, other)) {
1.107 + if (equals(bs, other)) {
1.108 sb.append("OK ").append(string);
1.109 continue;
1.110 } else {
1.111 - sb.append("DIFF ").append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
1.112 - sb.append(" TO").append(string).append(" = ").append(Arrays.toString(other)).append("\n");
1.113 + sb.append("DIFF ").append(string).append(" = ").append(toString(bs)).append("\n");
1.114 + sb.append(" TO").append(string).append(" = ").append(toString(other)).append("\n");
1.115 ok = false;
1.116 continue;
1.117 }
1.118 }
1.119 - for (Map.Entry<String, byte[]> entry : zip.entries.entrySet()) {
1.120 - String string = entry.getKey();
1.121 - if (entries.get(string) == null) {
1.122 - sb.append("MISS ").append(string).append(" = ").append(Arrays.toString(entry.getValue()));
1.123 + e = zip.first;
1.124 + while (e != null) {
1.125 + String string = e.name;
1.126 + if (find(string) == null) {
1.127 + sb.append("MISS ").append(string).append(" = ").append(toString(e.arr));
1.128 ok = false;
1.129 }
1.130 + e = e.next;
1.131 }
1.132 if (!ok) {
1.133 assert false : sb.toString();
1.134 @@ -150,5 +134,51 @@
1.135 data.register(en.getName(), zip);
1.136 }
1.137 }
1.138 -
1.139 +
1.140 + private byte[] find(String name) {
1.141 + Entry e = first;
1.142 + while (e != null) {
1.143 + if (e.name.equals(name)) {
1.144 + return e.arr;
1.145 + }
1.146 + e = e.next;
1.147 + }
1.148 + return null;
1.149 + }
1.150 +
1.151 + private boolean equals(byte[] bs, byte[] other) {
1.152 + if (bs.length != other.length) {
1.153 + return false;
1.154 + }
1.155 + for (int i = 0; i < bs.length; i++) {
1.156 + if (bs[i] != other[i]) {
1.157 + return false;
1.158 + }
1.159 + }
1.160 + return true;
1.161 + }
1.162 +
1.163 + private Object toString(byte[] arr) {
1.164 + StringBuilder sb = new StringBuilder();
1.165 + sb.append("[");
1.166 + String sep = "";
1.167 + for (int i = 0; i < arr.length; i++) {
1.168 + sb.append(sep).append(arr[i]);
1.169 + sep = ", ";
1.170 + }
1.171 + sb.append("]");
1.172 + return sb.toString();
1.173 + }
1.174 +
1.175 + private static final class Entry {
1.176 + final String name;
1.177 + final byte[] arr;
1.178 + final Entry next;
1.179 +
1.180 + public Entry(String name, byte[] arr, Entry next) {
1.181 + this.name = name;
1.182 + this.arr = arr;
1.183 + this.next = next;
1.184 + }
1.185 + }
1.186 }