rt/emul/zip/src/test/java/org/apidesign/bck2brwsr/emul/zip/ZipArchive.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Tue, 24 Feb 2015 11:12:53 +0100
changeset 1787 ea12a3bb4b33
parent 1571 287b113fa5ac
permissions -rw-r--r--
Using year range 2012-2015 in copyright header
jaroslav@694
     1
/**
jaroslav@694
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1787
     3
 * Copyright (C) 2012-2015 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.IOException;
jaroslav@694
    21
import java.io.InputStream;
jaroslav@694
    22
import java.util.zip.ZipEntry;
jaroslav@694
    23
jaroslav@694
    24
/**
jaroslav@694
    25
 *
jaroslav@694
    26
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@694
    27
 */
jaroslav@694
    28
final class ZipArchive {
jaroslav@1556
    29
    private Entry first;
jaroslav@694
    30
jaroslav@694
    31
    public static ZipArchive createZip(InputStream is) throws IOException {
jaroslav@694
    32
        ZipArchive a = new ZipArchive();
jaroslav@694
    33
        readZip(is, a);
jaroslav@694
    34
        return a;
jaroslav@694
    35
    }
jaroslav@694
    36
jaroslav@694
    37
    public static ZipArchive createReal(InputStream is) throws IOException {
jaroslav@694
    38
        ZipArchive a = new ZipArchive();
jaroslav@694
    39
        realZip(is, a);
jaroslav@694
    40
        return a;
jaroslav@694
    41
    }
jaroslav@694
    42
jaroslav@694
    43
    /**
jaroslav@694
    44
     * Registers entry name and data
jaroslav@694
    45
     */
jaroslav@694
    46
    final void register(String entry, InputStream is) throws IOException {
jaroslav@1556
    47
        byte[] arr = new byte[12 * 4096];
jaroslav@1556
    48
        for (int i = 0; i < arr.length; i++) {
jaroslav@694
    49
            int ch = is.read();
jaroslav@694
    50
            if (ch == -1) {
jaroslav@1556
    51
                byte[] tmp = new byte[i];
jaroslav@1556
    52
                FastJar.arraycopy(arr, 0, tmp, 0, i);
jaroslav@1556
    53
                arr = tmp;
jaroslav@694
    54
                break;
jaroslav@694
    55
            }
jaroslav@1556
    56
            arr[i] = (byte) ch;
jaroslav@694
    57
        }
jaroslav@1556
    58
        first = new Entry (entry, arr, first);
jaroslav@694
    59
    }
jaroslav@1556
    60
    
jaroslav@694
    61
    @Override
jaroslav@694
    62
    public String toString() {
jaroslav@694
    63
        StringBuilder sb = new StringBuilder();
jaroslav@1556
    64
        Entry e = first;
jaroslav@1556
    65
        while (e != null) {
jaroslav@1556
    66
            String string = e.name;
jaroslav@1556
    67
            byte[] bs = e.arr;
jaroslav@1556
    68
            sb.append(string).append(" = ").append(toString(bs)).append("\n");
jaroslav@1556
    69
            e = e.next;
jaroslav@694
    70
        }
jaroslav@694
    71
        return sb.toString();
jaroslav@694
    72
    }
jaroslav@694
    73
jaroslav@694
    74
    public void assertEquals(ZipArchive zip, String msg) {
jaroslav@694
    75
        boolean ok = true;
jaroslav@694
    76
        StringBuilder sb = new StringBuilder();
jaroslav@694
    77
        sb.append(msg);
jaroslav@1556
    78
        Entry e = first;
jaroslav@1556
    79
        while (e != null) {
jaroslav@1556
    80
            String string = e.name;
jaroslav@1556
    81
            byte[] bs = e.arr;
jaroslav@1556
    82
            byte[] other = zip.find(string);
jaroslav@1556
    83
            e = e.next;
jaroslav@1556
    84
            
jaroslav@694
    85
            sb.append("\n");
jaroslav@694
    86
            if (other == null) {
jaroslav@1556
    87
                sb.append("EXTRA ").append(string).append(" = ").append(toString(bs));
jaroslav@694
    88
                ok = false;
jaroslav@694
    89
                continue;
jaroslav@694
    90
            }
jaroslav@1556
    91
            if (equals(bs, other)) {
jaroslav@694
    92
                sb.append("OK    ").append(string);
jaroslav@694
    93
                continue;
jaroslav@694
    94
            } else {
jaroslav@1556
    95
                sb.append("DIFF  ").append(string).append(" = ").append(toString(bs)).append("\n");
jaroslav@1556
    96
                sb.append("    TO").append(string).append(" = ").append(toString(other)).append("\n");
jaroslav@694
    97
                ok = false;
jaroslav@694
    98
                continue;
jaroslav@694
    99
            }
jaroslav@694
   100
        }
jaroslav@1556
   101
        e = zip.first;
jaroslav@1556
   102
        while (e != null) {
jaroslav@1556
   103
            String string = e.name;
jaroslav@1556
   104
            if (find(string) == null) {
jaroslav@1556
   105
                sb.append("MISS  ").append(string).append(" = ").append(toString(e.arr));
jaroslav@694
   106
                ok = false;
jaroslav@694
   107
            }
jaroslav@1556
   108
            e = e.next;
jaroslav@694
   109
        }
jaroslav@694
   110
        if (!ok) {
jaroslav@694
   111
            assert false : sb.toString();
jaroslav@694
   112
        }
jaroslav@694
   113
    }
jaroslav@694
   114
jaroslav@694
   115
    public static void readZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   116
        ZipInputStream zip = new org.apidesign.bck2brwsr.emul.zip.ZipInputStream(is);
jaroslav@694
   117
        for (;;) {
jaroslav@694
   118
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   119
            if (en == null) {
jaroslav@694
   120
                return;
jaroslav@694
   121
            }
jaroslav@694
   122
            data.register(en.getName(), zip);
jaroslav@694
   123
        }
jaroslav@694
   124
    }
jaroslav@694
   125
jaroslav@694
   126
    public static void realZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   127
        java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(is);
jaroslav@694
   128
        for (;;) {
jaroslav@694
   129
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   130
            if (en == null) {
jaroslav@694
   131
                return;
jaroslav@694
   132
            }
jaroslav@694
   133
            data.register(en.getName(), zip);
jaroslav@694
   134
        }
jaroslav@694
   135
    }
jaroslav@1556
   136
jaroslav@1556
   137
    private byte[] find(String name) {
jaroslav@1556
   138
        Entry e = first;
jaroslav@1556
   139
        while (e != null) {
jaroslav@1556
   140
            if (e.name.equals(name)) {
jaroslav@1556
   141
                return e.arr;
jaroslav@1556
   142
            }
jaroslav@1556
   143
            e = e.next;
jaroslav@1556
   144
        }
jaroslav@1556
   145
        return null;
jaroslav@1556
   146
    }
jaroslav@1556
   147
jaroslav@1556
   148
    private boolean equals(byte[] bs, byte[] other) {
jaroslav@1556
   149
        if (bs.length != other.length) {
jaroslav@1556
   150
            return false;
jaroslav@1556
   151
        }
jaroslav@1556
   152
        for (int i = 0; i < bs.length; i++) {
jaroslav@1556
   153
            if (bs[i] != other[i]) {
jaroslav@1556
   154
                return false;
jaroslav@1556
   155
            }
jaroslav@1556
   156
        }
jaroslav@1556
   157
        return true;
jaroslav@1556
   158
    }
jaroslav@1556
   159
jaroslav@1556
   160
    private Object toString(byte[] arr) {
jaroslav@1556
   161
        StringBuilder sb = new StringBuilder();
jaroslav@1556
   162
        sb.append("[");
jaroslav@1556
   163
        String sep = "";
jaroslav@1556
   164
        for (int i = 0; i < arr.length; i++) {
jaroslav@1556
   165
            sb.append(sep).append(arr[i]);
jaroslav@1556
   166
            sep = ", ";
jaroslav@1556
   167
        }
jaroslav@1556
   168
        sb.append("]");
jaroslav@1556
   169
        return sb.toString();
jaroslav@1556
   170
    }
jaroslav@1556
   171
jaroslav@1556
   172
    private static final class Entry {
jaroslav@1556
   173
        final String name;
jaroslav@1556
   174
        final byte[] arr;
jaroslav@1556
   175
        final Entry next;
jaroslav@1556
   176
jaroslav@1556
   177
        public Entry(String name, byte[] arr, Entry next) {
jaroslav@1556
   178
            this.name = name;
jaroslav@1556
   179
            this.arr = arr;
jaroslav@1556
   180
            this.next = next;
jaroslav@1556
   181
        }
jaroslav@1556
   182
    }
jaroslav@694
   183
}