rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sun, 11 May 2014 12:24:19 +0200
branchclosure
changeset 1556 a936cbe90474
parent 1549 3f4c143ff8f0
child 1571 287b113fa5ac
permissions -rw-r--r--
Using only emul.mini APIs
jaroslav@694
     1
/**
jaroslav@694
     2
 * Back 2 Browser Bytecode Translator
jaroslav@694
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@694
     4
 *
jaroslav@694
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@694
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@694
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@694
     8
 *
jaroslav@694
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@694
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@694
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@694
    12
 * GNU General Public License for more details.
jaroslav@694
    13
 *
jaroslav@694
    14
 * You should have received a copy of the GNU General Public License
jaroslav@694
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@694
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@694
    17
 */
jaroslav@1549
    18
package org.apidesign.bck2brwsr.emul.zip;
jaroslav@694
    19
jaroslav@694
    20
import java.io.ByteArrayOutputStream;
jaroslav@694
    21
import java.io.IOException;
jaroslav@694
    22
import java.io.InputStream;
jaroslav@694
    23
import java.util.zip.ZipEntry;
jaroslav@694
    24
jaroslav@694
    25
/**
jaroslav@694
    26
 *
jaroslav@694
    27
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@694
    28
 */
jaroslav@694
    29
final class ZipArchive {
jaroslav@1556
    30
    private Entry first;
jaroslav@694
    31
jaroslav@694
    32
    public static ZipArchive createZip(InputStream is) throws IOException {
jaroslav@694
    33
        ZipArchive a = new ZipArchive();
jaroslav@694
    34
        readZip(is, a);
jaroslav@694
    35
        return a;
jaroslav@694
    36
    }
jaroslav@694
    37
jaroslav@694
    38
    public static ZipArchive createReal(InputStream is) throws IOException {
jaroslav@694
    39
        ZipArchive a = new ZipArchive();
jaroslav@694
    40
        realZip(is, a);
jaroslav@694
    41
        return a;
jaroslav@694
    42
    }
jaroslav@694
    43
jaroslav@694
    44
    /**
jaroslav@694
    45
     * Registers entry name and data
jaroslav@694
    46
     */
jaroslav@694
    47
    final void register(String entry, InputStream is) throws IOException {
jaroslav@1556
    48
        byte[] arr = new byte[12 * 4096];
jaroslav@1556
    49
        for (int i = 0; i < arr.length; i++) {
jaroslav@694
    50
            int ch = is.read();
jaroslav@694
    51
            if (ch == -1) {
jaroslav@1556
    52
                byte[] tmp = new byte[i];
jaroslav@1556
    53
                FastJar.arraycopy(arr, 0, tmp, 0, i);
jaroslav@1556
    54
                arr = tmp;
jaroslav@694
    55
                break;
jaroslav@694
    56
            }
jaroslav@1556
    57
            arr[i] = (byte) ch;
jaroslav@694
    58
        }
jaroslav@1556
    59
        first = new Entry (entry, arr, first);
jaroslav@694
    60
    }
jaroslav@1556
    61
    
jaroslav@694
    62
    @Override
jaroslav@694
    63
    public String toString() {
jaroslav@694
    64
        StringBuilder sb = new StringBuilder();
jaroslav@1556
    65
        Entry e = first;
jaroslav@1556
    66
        while (e != null) {
jaroslav@1556
    67
            String string = e.name;
jaroslav@1556
    68
            byte[] bs = e.arr;
jaroslav@1556
    69
            sb.append(string).append(" = ").append(toString(bs)).append("\n");
jaroslav@1556
    70
            e = e.next;
jaroslav@694
    71
        }
jaroslav@694
    72
        return sb.toString();
jaroslav@694
    73
    }
jaroslav@694
    74
jaroslav@694
    75
    public void assertEquals(ZipArchive zip, String msg) {
jaroslav@694
    76
        boolean ok = true;
jaroslav@694
    77
        StringBuilder sb = new StringBuilder();
jaroslav@694
    78
        sb.append(msg);
jaroslav@1556
    79
        Entry e = first;
jaroslav@1556
    80
        while (e != null) {
jaroslav@1556
    81
            String string = e.name;
jaroslav@1556
    82
            byte[] bs = e.arr;
jaroslav@1556
    83
            byte[] other = zip.find(string);
jaroslav@1556
    84
            e = e.next;
jaroslav@1556
    85
            
jaroslav@694
    86
            sb.append("\n");
jaroslav@694
    87
            if (other == null) {
jaroslav@1556
    88
                sb.append("EXTRA ").append(string).append(" = ").append(toString(bs));
jaroslav@694
    89
                ok = false;
jaroslav@694
    90
                continue;
jaroslav@694
    91
            }
jaroslav@1556
    92
            if (equals(bs, other)) {
jaroslav@694
    93
                sb.append("OK    ").append(string);
jaroslav@694
    94
                continue;
jaroslav@694
    95
            } else {
jaroslav@1556
    96
                sb.append("DIFF  ").append(string).append(" = ").append(toString(bs)).append("\n");
jaroslav@1556
    97
                sb.append("    TO").append(string).append(" = ").append(toString(other)).append("\n");
jaroslav@694
    98
                ok = false;
jaroslav@694
    99
                continue;
jaroslav@694
   100
            }
jaroslav@694
   101
        }
jaroslav@1556
   102
        e = zip.first;
jaroslav@1556
   103
        while (e != null) {
jaroslav@1556
   104
            String string = e.name;
jaroslav@1556
   105
            if (find(string) == null) {
jaroslav@1556
   106
                sb.append("MISS  ").append(string).append(" = ").append(toString(e.arr));
jaroslav@694
   107
                ok = false;
jaroslav@694
   108
            }
jaroslav@1556
   109
            e = e.next;
jaroslav@694
   110
        }
jaroslav@694
   111
        if (!ok) {
jaroslav@694
   112
            assert false : sb.toString();
jaroslav@694
   113
        }
jaroslav@694
   114
    }
jaroslav@694
   115
jaroslav@694
   116
    public static void readZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   117
        ZipInputStream zip = new org.apidesign.bck2brwsr.emul.zip.ZipInputStream(is);
jaroslav@694
   118
        for (;;) {
jaroslav@694
   119
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   120
            if (en == null) {
jaroslav@694
   121
                return;
jaroslav@694
   122
            }
jaroslav@694
   123
            data.register(en.getName(), zip);
jaroslav@694
   124
        }
jaroslav@694
   125
    }
jaroslav@694
   126
jaroslav@694
   127
    public static void realZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   128
        java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(is);
jaroslav@694
   129
        for (;;) {
jaroslav@694
   130
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   131
            if (en == null) {
jaroslav@694
   132
                return;
jaroslav@694
   133
            }
jaroslav@694
   134
            data.register(en.getName(), zip);
jaroslav@694
   135
        }
jaroslav@694
   136
    }
jaroslav@1556
   137
jaroslav@1556
   138
    private byte[] find(String name) {
jaroslav@1556
   139
        Entry e = first;
jaroslav@1556
   140
        while (e != null) {
jaroslav@1556
   141
            if (e.name.equals(name)) {
jaroslav@1556
   142
                return e.arr;
jaroslav@1556
   143
            }
jaroslav@1556
   144
            e = e.next;
jaroslav@1556
   145
        }
jaroslav@1556
   146
        return null;
jaroslav@1556
   147
    }
jaroslav@1556
   148
jaroslav@1556
   149
    private boolean equals(byte[] bs, byte[] other) {
jaroslav@1556
   150
        if (bs.length != other.length) {
jaroslav@1556
   151
            return false;
jaroslav@1556
   152
        }
jaroslav@1556
   153
        for (int i = 0; i < bs.length; i++) {
jaroslav@1556
   154
            if (bs[i] != other[i]) {
jaroslav@1556
   155
                return false;
jaroslav@1556
   156
            }
jaroslav@1556
   157
        }
jaroslav@1556
   158
        return true;
jaroslav@1556
   159
    }
jaroslav@1556
   160
jaroslav@1556
   161
    private Object toString(byte[] arr) {
jaroslav@1556
   162
        StringBuilder sb = new StringBuilder();
jaroslav@1556
   163
        sb.append("[");
jaroslav@1556
   164
        String sep = "";
jaroslav@1556
   165
        for (int i = 0; i < arr.length; i++) {
jaroslav@1556
   166
            sb.append(sep).append(arr[i]);
jaroslav@1556
   167
            sep = ", ";
jaroslav@1556
   168
        }
jaroslav@1556
   169
        sb.append("]");
jaroslav@1556
   170
        return sb.toString();
jaroslav@1556
   171
    }
jaroslav@1556
   172
jaroslav@1556
   173
    private static final class Entry {
jaroslav@1556
   174
        final String name;
jaroslav@1556
   175
        final byte[] arr;
jaroslav@1556
   176
        final Entry next;
jaroslav@1556
   177
jaroslav@1556
   178
        public Entry(String name, byte[] arr, Entry next) {
jaroslav@1556
   179
            this.name = name;
jaroslav@1556
   180
            this.arr = arr;
jaroslav@1556
   181
            this.next = next;
jaroslav@1556
   182
        }
jaroslav@1556
   183
    }
jaroslav@694
   184
}