rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java
branchclosure
changeset 1556 a936cbe90474
parent 1549 3f4c143ff8f0
child 1571 287b113fa5ac
     1.1 --- a/rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java	Wed May 07 16:47:24 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  }